STEM CTF: Cyber Challenge 2019 writeup

はじめに

以前延期になったCTFが開催されていたのでやってみた。

In Plain Text Binary RE - 50 points

以下問題文。

Starring: Mary McCormack, Fred Weller, Nichole Hiltz, Todd Williams, Lesley Ann Warren, Paul Ben-Victor, Cristián de la Fuente, Rachel Boston

stringsコマンド実行したらFLAGがあった。

$ strings challenge
MCA{y3ah_sur3_here_y0u_g0}

Turing Test Web - 50 points

以下、問題のページ。秘密の質問をパスすれば良いっぽい。

f:id:kent056-n:20190224152639p:plain

Alan Turingについてググって内容を埋めるだけで良いらしい。難しく考えすぎていて悲しい... f:id:kent056-n:20190224152859p:plain

TODO Web - 100 points

アクセスしてみると以下のようなページがあった。 f:id:kent056-n:20190224150927p:plain

URLhttp://138.247.13.110/todolist/1000/1000の箇所を書き換えると過去のTODOが見れるようだ。
あとは、1000のTODOの中からFLAGが書かれているページを探して終了。以下、solverです。

import requests
import re

baseurl = 'http://138.247.13.110/todolist/'
for i in range(1000):
    payload = {'page': str(i)}
    url = baseurl + str(i) + '/'
    r = requests.get(url)
    print('[*]Requests: ' + url)
    if re.search(r'MCA', r.text):
        print(r.text)
        break;

http://138.247.13.110/todolist/678/にFLAGがあったようです。FLAGはMCA{al3x4_5et_a_r3minder}

f:id:kent056-n:20190224151449p:plain

Warm UP Crypto - 50 points

競技時間以内に解けなかった。以下のwriteupを見たらちょっとした気づきがあったのでメモを残す。 github.com

以下問題文。

Description
Everyone says that PGP is hard to use. Show ‘em how it’s done.

渡されたファイルは以下の4つ。

flag.html.enc
key.enc
mitre-ctf-2019-private.asc
passphrase.txt

とりあえずパスフレーズを確認する。

$ cat passphrase.txt
just use ctfd

適当に秘密鍵をインポートしてみる。

$ gpg --allow-secret-key-import --import mitre-ctf-2019-private.asc
gpg: key CB374E23: secret key imported
gpg: /home/vagrant/.gnupg/trustdb.gpg: trustdb created
gpg: key CB374E23: public key "CTF Competitor (This is private key for a 2019 MITRE CTF Competitor and should not be trusted!) <fake@fake>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
gpg:       secret keys read: 1
gpg:   secret keys imported: 1

秘密鍵のインポートができたら、key.encを復号する。パスフレーズは先ほど確認したものを入力すれば良い。

$ gpg key.enc

You need a passphrase to unlock the secret key for
user: "CTF Competitor (This is private key for a 2019 MITRE CTF Competitor and should not be trusted!) <fake@fake>"
2048-bit RSA key, ID 87BA2B5E, created 2018-12-03 (main key ID CB374E23)

gpg: gpg-agent is not available in this session
gpg: encrypted with 2048-bit RSA key, ID 87BA2B5E, created 2018-12-03
      "CTF Competitor (This is private key for a 2019 MITRE CTF Competitor and should not be trusted!) <fake@fake>"
gpg: key.enc: unknown suffix
Enter new filename [key]: decrypted_key
gpg: Signature made Mon Dec  3 22:48:09 2018 UTC using RSA key ID F2FFFCB4
gpg: Can't check signature: public key not found

これでkey.encの復号は完了。あとは、key.encを復号した結果の鍵を利用してflag.html.encを復号すれば良さそう。
しかし、flag.html.encが何のアルゴリズムで暗号化されているかどうかわからずに競技が終了してしまった。
どうやら鍵長とbinwalkの結果でアルゴリズムを特定することができたらしい。以下、binwalkの実行結果。

$ binwalk flag.html.enc

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             OpenSSL encryption, salted, salt: 0xF61A179-5D7CAE48

最初はファイルサイズからRSAあたりのアルゴリズムかと思っていたが、パスフレーズとソルトを鍵としたAESによって暗号化されているようだ。 ここまでできたら以下のコマンドを実行し、flag.html.encを復号する。

openssl aes-256-cbc -kfile decrypted_key -d -in flag.html.enc -out flag

最後に中身を確認して終了。

<!DOCTYPE html>
<html>
<head>
  <title>MITRE CTF 2019 Homepage.</title>
</head>
<body>
<h1>This is an HTML Page</h1>
<br>
<p>Test Flag please ignore:</p>
<p>MCA{0p3n55l_c0mm4nd_l1ne_ch4ll3ng3_fl4g}</p>
<p style="display:none;">MCA{66b2f50cd2d6b9622c6be902ee2b0976badb4684}</p>
</body>
</html>

おわりに

最近のcrypto難しくないですか...

参考

https://wiki.openssl.org/index.php/Enc
https://github.com/swag-wafu/mitre-2019/blob/master/PGP.md
https://jemsec.blog.so-net.ne.jp/2013-02-10
https://gist.github.com/reggi/4459803#file-openssl-list-cipher-commands