【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位」になりました!!!

Scoreboard

途中の順位はずっと20-30前後で全然勝てると思わなかったです。最後の15分内で同じ島に座っているメンバーのお助けがあって、300ptsの問題を3問連続解きました。終了してからScoreboardをみてびっくりしました。(オレンジ色のは私です)

解けた問題

解いた分野はわりと平均的だな(笑)

本業のおかげ(?)で、知識は広く浅くて、全分野はある程度知っているが、詳しくないです。なので解き方は全然素人で、Flagを取ればいいです(笑)。

 

Writeup

本題に戻ります。

Check the Connection(Forensics, 300pts)

問題+0ptヒント

説明には「怪しい通信が行われるようだ」と書いてあります。CheckTheConnection.exeが添付されています。このファイルを実行したら、不審な通信が行われるのこと?

でも、まずはこのファイル本当にPEファイルなのかバイナリ上で確認します。

バイナリ

マジックナンバーはMZなので、Windowsの実行ファイルですね。

無料のヒントでは「実行時の通信をWiresharkなどで観察してみましょう」と書いてあります。実行して、キャプチャーした通信からflagか何かが出てくるということかな?ただし、実機で不審なファイルを実行するのは危ない(何が仕込まれたかわからない)ので、動的解析用のWindows仮想マシンで実行します。

 

本業はフォレンジック調査をやっているので、マルウェア解析を行う時もあります。そのためにFlare VMという環境を用意しました。(仮想環境を整備してから今回ははじめに使いますが…)

Flare VMのデスクトップ

ヒントにはWiresharkと書いてありますので、まずはWiresharkでCaptureした状態で実行してみます。

Wiresharkで通信をキャプチャーする


最初にデフォルトのままで開始を押して、「CheckTheConnection.exe」を実行したが、何もキャプチャーしませんでした。何回か試しても無理だったので、オプションを押して設定を確認します。キャプチャー対象のネットワークが間違えたのかと思いながら、Ethernet0を変更して、再度実行します。

キャプチャーした通信

できました!!

通信内容を確認します。

xxx[.]girls[.]seccon[.]jpにクエリしているみたいので、キャプチャー対象はあっていますね。

ただし、flagみたいのものは出てこないです。もしかして暗号化されたのか?(当時は時間がないから、Wiresharkもそんなに慣れないし、すぐに別のツールを試すという発想があった)

当時に思いついたのは、Fiddlerです。今まで使ったことはないですが、HTTPS通信内容を復号してくれるみたいな話は聞いたことありますので、使ってみます。

Flare VMをインストール際に、すでにFiddlerはインストールされたので、そのまま使えばいいです。

Flare VMにインストールされたネットワーク関連ツール

fiddler

使ったことがないからとりあえず色々なところを押してみます。Fileを押したら、Capture Trafficがあります。Fiddlerはキャプチャー機能あるのは知らなかったです。キャプチャーした上でそのまま実行ファイルを実行したら、フラグが出てくるのかな?

実行ファイルを実行した

出た!!

URLのところに「hxxp[:]//xxx[.]girls[.]seccon[.]jp/?flag=ctf4g{Turkey0rFriedChicken?}」が出て、フラグはctf4g{Turkey0rFriedChicken?}です。

 

まさかそんな簡単にできました。Fiddlerはいいツールですね。今後も色んな使い方を学ばないと。

Lost 1 bit(Crypto, 300pts)

これは時間内に誰も解けなかった問題です。

問題+0ptヒント

CTFが終わったら、いつもチームSmallPotatoesのCrypto担当に解き方を聞きました。5分くらいで解いて、流石プロ!彼によるとRSAの基礎がわかれば解けるものです。

RSA暗号RSAあんごう)とは、桁数が大きい合成数素因数分解が現実的な時間内で困難であると信じられていることを安全性の根拠とした公開鍵暗号の一つである。(Wikipediaより)

 

まず、問題にはRSAの公開鍵が壊れて、正常な公開鍵で暗号化したフラグを復号できなくなったという話です。やり方としては壊れた公開鍵から正常な秘密鍵を作成できれば、フラグを復号してflagゲットできます。

 

「BrokenPublicKey.pem」という壊れた公開鍵が添付されました。

中身を確認すると、いつものものより短いなと感じます。

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より)

CyberChef

「:」を除いて、From Base16(16進数なので)でbitにします。

「72533820720637104994983352305588578807017206952256671310266412008279910230758」が出てきます。

あれ?おかしいな~

Modulusは素数pと素数qの積であり、偶数が出ています。偶数の素数は2しかなく、RSAアルゴリズム素因数分解の難しさを利用しているので、2を割るだけで分解できちゃいます。あんまり意味ないじゃん。念のため、Factor DBで確かめます。

Factor dbの結果

やはり2個以上のものが出てきます。だから壊れたといいます。

タイトルにはLost 1 bitと書いてあるので、1 bitが足りないということかもしれません。先程の数字を1足して、Factor dbで確認します。

2個の素数っぽいものが出てきました。

254897751484130908614273015259691754349
284560457274778357141534334879457165091

この二つの数字はpとqだと仮定します。

(Factor dbに登録されていない場合はsieveなどを使って素因数分解してください)

 

bitを直したので、残りは正常な秘密鍵を作成するだけです。

Githubにあるrsatool.pyを使って、秘密鍵を作成します。

github.com

インストール方法は上記のリンクから確認できます。

公開鍵を作成する

python rsatool.py -f PEM -o key.pem -p 254897751484130908614273015259691754349 -q 284560457274778357141534334879457165091

先程わかったpとqを入れて実行して、正確な秘密鍵(key.pem)を作成します。

key.pem

これを使ってCyberChefでflagを復号してみます。

復号する

まずはBase64デコードして、そしてRSA Decryptで先程作ったkey.pem内容を貼り付けて、Encryption SchemeはRSAES-PKCS1-V1_5を選んでたらflagが出てきました。(Encryption schemeについて知りたい方は↓↓)

qiita.com

flag:ctf4g{Cookin3mins}

Cookin3min... これを解く、3分は無理だな(笑)

 

以上Writeupでした。

初めてWriteupを書くので、足りていないところはたくさんあると思いますが、これから頑張っていきます。