基本信息
- https://app.hackthebox.com/machines/570
- 10.10.11.235
端口扫描
22,80,和被过滤的3000:
1 | nmap -sC -sV -Pn 10.10.11.235 |
80
需要加hosts:
1 | 10.10.11.235 drive.htb |
网盘服务,命名由Google Drive变换而来:
Drive
随意注册登录,测试上传只能传一些无害文件,查看可以看到一些公开的文件(除了第一个,其他都是别人传的):
block idor
公开文件没法直接修改id查看非公开,回到自己的面板,可以对自己上传的文件进行reserve即block操作:
这个接口存在IDOR,直接修改ID即可查看他人文件,在id为79的文件中得到用户名和密码:
1 | martin |
martin
得到的用户名密码可以直接ssh登录,查看端口可以发现前面外部被过滤的3000:
gitea
转发端口访问,发现是gitea:
1 | ssh -L 3000:127.0.0.1:3000 martin@10.10.11.235 |
前面drive里得到的信息也提到这个代码仓库,同样使用martin账号密码登录(使用邮箱,或者passwd文件中得到全名martin cruz),:
1 | martin@drive.htb / martinCruz |
发现一个有访问权限的repo:
DoodleGrive
Repo里可以发现一个sh文件,看代码是加密备份sqlite3文件:
1 | 7z a -p'H@ckThisP@ssW0rDIfY0uC@n:)' /var/www/backups/${date_str}_db_backup.sqlite3.7z db.sqlite3 |
backup
几个压缩包分别解压查看sqlite3文件,得到一些hash,其中一条可以破解出tom现在的密码:
1 | 7z x -p'H@ckThisP@ssW0rDIfY0uC@n:)' 1_Nov_db_backup.sqlite3.7z |
user flag
tom用户ssh登录:
doodleGrive-cli
当前用户目录有个suid的doodleGrive-cli,查看说明,测试运行,需要用户名和密码,和之前得到的那些不同:
下载程序到本地分析:
1 | scp tom@10.10.11.235:/home/tom/doodleGrive-cli . |
反编译结果中可以得到可用用户名和密码:
1 | moriarty |
使用得到的用户名密码测试,是用来管理网站那边用户的程序:
这个程序两种利用方式,一种面向二进制选手,另一种是常规web方式
格式化字符串
分析代码,输入过滤了一些特殊字符,然后输入的用户名直接进入到printf中,导致格式化字符串:
- Format Strings Exploitation Tutorial
https://www.exploit-db.com/docs/english/28476-linux-format-string-exploitation.pdf
bof
然后输入密码部分,分配的buffer只有56,但fgets 400,导致溢出,但存在canary:
那二进制方式就很明确了,结合上面的格式化字符串来泄漏canary后进行rop
- Bypassing Canary & PIE - HackTricks
https://book.hacktricks.xyz/reversing-and-exploiting/linux-exploiting-basic-esp/bypassing-canary-and-pie
do_system
程序中也存在do_system函数调用sh,那就是很简单的rop来执行这个函数:
activate_user_account
常规web方式,main_menu的选项5,输入的用户名过滤后拼接到执行的sqlite命令中:
各种常用的命令注入方式都被过滤了,但sqlite可以使用load_extention运行时加载so文件:
- Run-Time Loadable Extensions
https://www.sqlite.org/loadext.html
提权 & root flag
pwn方式
二进制方式,简单分析可以确定canary的索引15,然后就是基础rop去调用do_system,或者直接交给pwntools自动chain,环境变量问题要用绝对路径:
exp.py
1 | from pwn import * |
web方式
自己编译一个so文件:
1 | gcc -shared miao.c -o miao.so -nostartfiles -fPIC |
这里注入也有两种方式,一种是直接闭合用户名后用char函数来指定so路径:
1 | Select option: 5 |
另一种是网站那边创建用户,邮箱使用so路径,然后再回到elf这里加载:
1 | email : /tmp/miao1/miao@miao.so |
so.c
1 | //gcc -shared loadme.c -o loadme.so -nostartfiles -fPIC |
shadow
1 | root:$6$T11qODg0Qumrq9Zn$3t1nyBLHtah8HAmx80RXRCz6.9tPi0GL7GHMCiWquMQGh/TTrukX8jATmZ5MHDDWu0m4My.HGe29XEsDc2R/k1:19598:0:99999:7::: |
参考资料
- Format Strings Exploitation Tutorial
https://www.exploit-db.com/docs/english/28476-linux-format-string-exploitation.pdf - Bypassing Canary & PIE - HackTricks
https://book.hacktricks.xyz/reversing-and-exploiting/linux-exploiting-basic-esp/bypassing-canary-and-pie - Run-Time Loadable Extensions
https://www.sqlite.org/loadext.html