【Writeup】4-Girls Petit CTF
概要
こんにちは。Katherineです。
2023/12/23-24に行われたSECCON電脳会議に参加しました。その中で23日に実施されたCTF for Girls(ctf4g)の4-Girls Petit CTFに参加しました。すでにいくつかのWriteupがあるので、このブログは需要がありそうなForensicsとCryptoの300ptsのWriteupを書きます。
はじめに
過去にも何回かCTF for Girlsのワークショップに参加しましたが、初心者向けのコンテンツが多いので、まだまだCTF初心者の私にとって大変助かりました。今回のハンズオンセクションでCTFがあることに対して凄く期待しました。
参加した結果、なんと「1位」になりました!!!
途中の順位はずっと20-30前後で全然勝てると思わなかったです。最後の15分内で同じ島に座っているメンバーのお助けがあって、300ptsの問題を3問連続解きました。終了してからScoreboardをみてびっくりしました。(オレンジ色のは私です)
解いた分野はわりと平均的だな(笑)
本業のおかげ(?)で、知識は広く浅くて、全分野はある程度知っているが、詳しくないです。なので解き方は全然素人で、Flagを取ればいいです(笑)。
Writeup
本題に戻ります。
Check the Connection(Forensics, 300pts)
説明には「怪しい通信が行われるようだ」と書いてあります。CheckTheConnection.exeが添付されています。このファイルを実行したら、不審な通信が行われるのこと?
でも、まずはこのファイル本当にPEファイルなのかバイナリ上で確認します。
マジックナンバーはMZなので、Windowsの実行ファイルですね。
無料のヒントでは「実行時の通信をWiresharkなどで観察してみましょう」と書いてあります。実行して、キャプチャーした通信からflagか何かが出てくるということかな?ただし、実機で不審なファイルを実行するのは危ない(何が仕込まれたかわからない)ので、動的解析用のWindows仮想マシンで実行します。
本業はフォレンジック調査をやっているので、マルウェア解析を行う時もあります。そのためにFlare VMという環境を用意しました。(仮想環境を整備してから今回ははじめに使いますが…)
ヒントにはWiresharkと書いてありますので、まずはWiresharkでCaptureした状態で実行してみます。
最初にデフォルトのままで開始を押して、「CheckTheConnection.exe」を実行したが、何もキャプチャーしませんでした。何回か試しても無理だったので、オプションを押して設定を確認します。キャプチャー対象のネットワークが間違えたのかと思いながら、Ethernet0を変更して、再度実行します。
できました!!
通信内容を確認します。
xxx[.]girls[.]seccon[.]jpにクエリしているみたいので、キャプチャー対象はあっていますね。
ただし、flagみたいのものは出てこないです。もしかして暗号化されたのか?(当時は時間がないから、Wiresharkもそんなに慣れないし、すぐに別のツールを試すという発想があった)
当時に思いついたのは、Fiddlerです。今まで使ったことはないですが、HTTPS通信内容を復号してくれるみたいな話は聞いたことありますので、使ってみます。
Flare VMをインストール際に、すでにFiddlerはインストールされたので、そのまま使えばいいです。
使ったことがないからとりあえず色々なところを押してみます。Fileを押したら、Capture Trafficがあります。Fiddlerはキャプチャー機能あるのは知らなかったです。キャプチャーした上でそのまま実行ファイルを実行したら、フラグが出てくるのかな?
出た!!
URLのところに「hxxp[:]//xxx[.]girls[.]seccon[.]jp/?flag=ctf4g{Turkey0rFriedChicken?}」が出て、フラグはctf4g{Turkey0rFriedChicken?}です。
まさかそんな簡単にできました。Fiddlerはいいツールですね。今後も色んな使い方を学ばないと。
Lost 1 bit(Crypto, 300pts)
これは時間内に誰も解けなかった問題です。
CTFが終わったら、いつもチームSmallPotatoesのCrypto担当に解き方を聞きました。5分くらいで解いて、流石プロ!彼によるとRSAの基礎がわかれば解けるものです。
RSA暗号(RSAあんごう)とは、桁数が大きい合成数の素因数分解が現実的な時間内で困難であると信じられていることを安全性の根拠とした公開鍵暗号の一つである。(Wikipediaより)
まず、問題にはRSAの公開鍵が壊れて、正常な公開鍵で暗号化したフラグを復号できなくなったという話です。やり方としては壊れた公開鍵から正常な秘密鍵を作成できれば、フラグを復号してflagゲットできます。
「BrokenPublicKey.pem」という壊れた公開鍵が添付されました。
中身を確認すると、いつものものより短いなと感じます。
Kali上、OpenSSLコマンドでこの公開鍵の情報を確認します。
openssl rsa -text -pubin < BrokenPublicKey.pem
Modulusのものをコピーして、bitに戻すためにCyberChefで加工します。
RSA modulusとは、整数 n が二つの素数 p, q の積で、しかも p, q のビット数が等しいような n をいう。 たとえば、(p,q)=(41,43), n=pq=1763(p,qは6bit)のようなnである。(Weblioより)
「:」を除いて、From Base16(16進数なので)でbitにします。
「72533820720637104994983352305588578807017206952256671310266412008279910230758」が出てきます。
あれ?おかしいな~
Modulusは素数pと素数qの積であり、偶数が出ています。偶数の素数は2しかなく、RSAアルゴリズムは素因数分解の難しさを利用しているので、2を割るだけで分解できちゃいます。あんまり意味ないじゃん。念のため、Factor DBで確かめます。
やはり2個以上のものが出てきます。だから壊れたといいます。
タイトルにはLost 1 bitと書いてあるので、1 bitが足りないということかもしれません。先程の数字を1足して、Factor dbで確認します。
2個の素数っぽいものが出てきました。
254897751484130908614273015259691754349
284560457274778357141534334879457165091
この二つの数字はpとqだと仮定します。
(Factor dbに登録されていない場合はsieveなどを使って素因数分解してください)
bitを直したので、残りは正常な秘密鍵を作成するだけです。
Githubにあるrsatool.pyを使って、秘密鍵を作成します。
インストール方法は上記のリンクから確認できます。
python rsatool.py -f PEM -o key.pem -p 254897751484130908614273015259691754349 -q 284560457274778357141534334879457165091
先程わかったpとqを入れて実行して、正確な秘密鍵(key.pem)を作成します。
これを使ってCyberChefでflagを復号してみます。
まずはBase64デコードして、そしてRSA Decryptで先程作ったkey.pem内容を貼り付けて、Encryption SchemeはRSAES-PKCS1-V1_5を選んでたらflagが出てきました。(Encryption schemeについて知りたい方は↓↓)
flag:ctf4g{Cookin3mins}
Cookin3min... これを解く、3分は無理だな(笑)
以上Writeupでした。
初めてWriteupを書くので、足りていないところはたくさんあると思いますが、これから頑張っていきます。