CpawCTFをやってみる

CTFでググると、「”Capture The Flag”の略で与えられた問題からFlagを取得する競技です。」と出てくると思いますが、ここで説明するCTFはハッキングの競技です。
CTFはリアルタイムのコンテスト(SECCONとか)が主ですが、常設コンテストというか、いつでも解ける問題集みたいなものがあります。(競技プログラミングでいうAOJみたいなもの)
CpawCTFはその中でも一番易しく、CTFの雰囲気を知りたいという方や、
「パソコン何もわからん~、だけどハッキングカッコイイー、ちょっとやってみたーい」って方におすすめです。

VirtualBoxでUbuntu使う方が多いみたいですが、環境作るのめんどくさいので、WSLを使います。

https://ctf.cpaw.site/index.php

サインインしたら解いてみましょう。

Q1.[Misc] Test Problem

flagをここにこんな風に入力してね。というチュートリアルですね。

Q6.[Crypto] Classical Cipher

有名なシーザー暗号ですね。
3文字シフトすればいいだけなので、手でも解けそうですが、せっかくなのでプログラムで解いてみましょう。
シーザー暗号のwikiを見ると↓

https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B6%E3%83%BC%E6%9A%97%E5%8F%B7#%E4%BD%9C%E6%88%90%E6%89%8B%E9%A0%86%E3%81%A8%E4%BD%BF%E7%94%A8%E4%BE%8B

文字 x を n 個のシフトで暗号化した場合A~Zが0~25をすると、(x-n)mod26で復号できると分かります。
ASCIIコード表のA~Zは65~90なのでまず、0~25に直すために、65で減算します。その後(x-n)mod26の計算を行い、65を加算すれば、復号できます。
Pythonだとこんな感じでしょうか。

chr((ord(char) - 65 - SHIFT_NUM) % 26 + 65)

後は小文字大文字に分けて行えばいいだけです。
コードは以下のようになります。

#暗号文
flag = ""
#何文字ずらしたか
SHIFT_NUM = 3
#復号文
plain = ""
for char in list(flag):
    #{}_の場合はそのまま
    if char in '{}_':
        plain += char
    #小文字の変換
    elif ord('a') <= ord(char) <= ord('z'):
        plain = plain + chr((ord(char) - 97 - SHIFT_NUM) % 26 + 97)
    #大文字の変換
    else:
        plain = plain + chr((ord(char) - 65 - SHIFT_NUM) % 26 + 65)
print(plain)

Q7.[Reversing] Can you execute ?

fileコマンドでファイル形式が分かります。

ELFファイルだと分かります。
ELFファイルは実行ファイル形式なので、gccでコンパイル、リンク後のa.out同等、そのまま実行できるはずですが、
おそらくPermission deniedが出ると思います。これは権限が与えられていないため、実行できない状態だと考えられます。
ls -lで見てみると、やはり実行権限が与えられていません。
chmodで権限を変更してみましょう。そしたら実行できるはずです。
chmodの使い方はggってください。

Q8.[Misc] Can you open this file ?

Q7と同様にfileコマンドで調べます。

Composite Document File V2 Documentとあります。
これは.docや.xlsだったりを示しているので、とりあえず.docに変換して、MSWordで開いてみましたが、エラーが出ました。
.docが読めるGoogleDocumentで開いてみたら、開けました。MSWordくん….

Q9.[Web] HTML Page

「ページに表示されている部分以外にも、ページをより良くみせるためのデータが含まれています。」とあるので、とりあえず開発者モードで開いてみます。
headタグ内にありますね。

Q10.[Forensics] River

「この情報から、写真に写っている川の名前を特定して欲しい。」
おそらく位置情報見ればわかるでしょう。GUIの写真アプリで直ぐに見れると思いますが、折角なので、CUIでExif情報を見てみましょう。
Imagemagickをインストールします。

sudo apt-get install imagemagick

identify コマンドでExif情報を表示できます。

identify -verbose river.jpg

位置情報が分かりました。
左から度、分、秒なので、緯度は31+35/60+(69/25)/3600。
経度は130+32/60+(64659/1250)/3600。
“緯度,経度”でgoogle検索すれば場所が分かります。

Q11.[Network]pcap

とりあえずpcapを開いてみます。
tsharkを使います。

sudo apt-get install tshark

-rオプションでpcapを読み込みます。IPアドレスしか分からないので-xオプションで16進ダンプを表示してみます。ビンゴ。

Q12.[Crypto]HashHashHash!

Google検索すれば出てきます…なんかつまんないのでHashCatを使ってみます。HashCatはCUDAが使えるので、つよつよグラボをお持ちの人は、CUDAでの環境構築をお勧めします。
WSL2から、CUDAが使えるようになったみたいですが、なんかエラーが出て環境構築できなかったので、WSLではなく素のWin10(powershell)でやりました。

そもそも環境構築がめんどくせーって方は、Google Colabでもできるので、そちらで試してみても良いかと思います。私のブログに使い方は載せてあります。
GPUを使ってPDFのパスワードを解析する:https://to-son.net/2020/08/14/hashcat-pdf-colab/

SHA1なのでHashcatWikiよりモード100で探索できます。HashcatWiki:https://hashcat.net/wiki/doku.php?id=example_hashes

2070s環境下でブルートフォースでやってみます。

hashcat.exe -m 100 -a 3 -w 4 e4c6bced9edff99740...(ハッシュ文)

10秒で解析できました。cpu環境下だと10分くらいかかるかな…?

Q14.[PPC]並べ替えろ!

ソートすればいいだけですね。pythonとかc++だとソートのstlとかメソッドがあるので楽。

flag = [15, 1, 93, 52, 66, 31, 87, 0, 42, 77, 46, 24, 99, 10, 19, 36, 27, 4, 58, 76, 2, 81, 50, 102, 33, 94, 20, 14, 80, 82, 49, 41, 12, 143, 121, 7, 111, 100, 60, 55, 108, 34, 150, 103, 109, 130, 25, 54, 57, 159, 136, 110, 3, 167, 119, 72, 18, 151, 105, 171, 160, 144, 85, 201, 193, 188, 190, 146, 210, 211, 63, 207]
flag.sort(reverse=True)
print(''.join(map(str, flag)))

Level 1だけざっとやってみましたが、Pwnとか初心者門前払い的な問題はなくとっかかりとしてはすごくいいと思いました。とりあえず全部解いてみようかな。