💀

DEADFACE CTF 2024 簡易writeup (OSINT問メイン)

2024/10/21に公開

あるDiscordサーバでチームメンバーの募集を見て、"Ultimate Detective"の一員として土壇場で参加したCTF。

とりあえずOSINTカテゴリは全完できたので、簡易的なwriteupを投稿する(なお、問題文をコピーし忘れるという痛恨のミスにより、筆者の普段のwriteupに比べてかなり簡易的となっていることをご承知いただきたい)。

DEADFACE CTF 2024について

  • 開催時間は 2024/10/18 (Fri) 09:00 CDT ~ 2024/10/19 (Sat) CDT 19:00
    • 日本時間で 2024年10月18日(金) 23:00 ~ 2024年10月20日(日) 09:00
    • 筆者が参加したのは2024年10月19日(土)の夜から
  • ストーリー形式のCTF
    • ストーリーはこちら: https://ctf.deadface.io/story
    • DEADFACEというハッカー集団を探ることが軸となる
    • Ghost Townという(シナリオ上の架空の)フォーラムがあり、ここでDEADFACEメンバーのやり取りを見ることができる
  • Jeopardy形式
  • 多ジャンル

OSINTカテゴリ

Cup of Compromised Joe (20 pts)

カフェを特定する問題。以下の画像が渡され、このカフェがある都市と郵便番号を答える必要がある。

文字情報が少ないが、拡大するとVan Nessと読める。アメリカの道路標示のように見える。

与えられた画像を単純にGoogle Lensに通すだけだと有用な情報が出てこない。そこで画像に検索ワード "Van Ness" を追加してGoogle Lensに通す。

すると、以下のサイトがヒットする。雰囲気が一致した画像が含まれている。
https://www.restaurantji.com/ca/fresno/cafe-van-ness-/

Google Mapsからも場所が一致していることを確認できる。
https://g.co/kgs/7G1Ws3d

住所データより、Flagは以下の通り。

flag{Fresno-93704}

Compromised Immune System (25 pts)

ハッカー集団が「Albert Bourlaの経歴を調べることにより、彼のパスワードを特定できた」と主張しているという問題。Albert Bourlaはファイザー社のCEOであり、実在の人物であるため「パスワードを特定できた」はフィクションであろう。

Flag形式は flag{ペットの犬の名前1*学位論文のpublish年$ペットの犬の名前2+勲章の受章日(MM-DD-YYYY)}

ペットの名前はAlbert Bourla petなどで検索するとLinkedInの投稿がヒットすることをeruさんが特定。名前はSimbaCharlie であることが確認できる。

https://www.linkedin.com/posts/albert-bourla_happy-national-pet-day-today-were-giving-activity-7051554863888883712-St5C

そしてP4LさんがAlbertの学位論文を特定。1991年。

https://www.didaktorika.gr/eadd/handle/10442/2520?locale=en

勲章の名前はthe Golden Cross of the Order of the Redeemerと問題文で示されており、ニュース記事を検索するとヒットする。2022年4月5日
https://www.jpost.com/international/article-703800

これよりFlagは以下の通り。ペットの名前は順不同でも通るかもしれない。
flag{Charlie*1991$Simba+04-05-2022}

Hidden in Plain Site (125 pts)

「ハッカー組織DEADFACEのラップトップを回収したところ、この画像を得た。画像には、隠された宝物がこの場所にある(“Hidden Treasure Here”)とタグ付けされていた。識別コード(identification code)を特定せよ。識別コードはGから始まる。」という問題。

道路名にモザイクが掛けられたストリートビューのスクリーンショットが渡される。

これ自体は何の変哲もないスクリーンショットで、データが隠されているといったこともない。また、Google Lensに入れても何もヒットしない。また、Geoguessr的にボラードを使って調査してみようとも考えたが、合致するものが見当たらない。

そうなると、手がかりはこの看板と、DEADFACEがアメリカを拠点にしていることからアメリカであると推測できること程度である。

なかなかGoogle Lensにヒットせず、SMMC……?BMHC……?などと潰れた文字を推測しながらGoogle Mapsを検索したり、アメリカの地名(Californiaなど)を付け加えてGoogle検索したりするも、正体はつかめなかった。

Google Lensの言語・地域設定を再確認し、根気強く探していたところ、LinkedIn上に似たような画像がヒットした。しかし、このリンク先からは画像が辿れなかった(Googleのクローラが巡回した時点ではページに載っていたのだろう)。

ということで、Google Lens検索結果を再度Google Lensに通す。これにより、その画像によりマッチした情報を得られる(勝手に「多段Google Lens」と呼んでいるが、この手法に正式名称はあるのだろうか)。

この検索結果より、どうやら看板はRMHC(Ronald McDonald House Charities)を示していたことがわかる。なお、「Ronald McDonald」は日本では「ドナルド・マクドナルド」として知られているキャラクターのことで、RMHCは日本で「ドナルド・マクドナルド・ハウス」と称される施設のことである。

1問目がカリフォルニアであったこともあり、まずはカリフォルニアのRMHCを探して見るが特に出てこない。

雑にアイデア出しとしてChatGPTに頼ってみると、コロラド州やユタ州などが提示される。ChatGPTの発言は有用とは限らないので精査する必要があるが、地形を考えると妥当な指摘ではないだろうかと思う。

ということで Colorado RMHC などで検索してみると、Ronald McDonald House Charities of Southern Coloradoがヒットする。外観は近いようだ。

https://maps.app.goo.gl/xsBaDmVy9sh8AdjF7

ストリートビューからも場所が一致していることが確認できる。

だが、何が求められているのかわからない。何かヒントはないだろうかとRMHC Southern ColoradoのGoogleレビューや画像を探したり、OSMのタグなどを確認したが、さすがにFlagに繋がりそうなものはなかった。

ということで問題文をよく読み返すと "Hidden Treasure Here" とある。文字通り「宝探し」ということであれば、ジオキャッシングではないだろうか。

ということでジオキャッシングのサイトを開き、当該地点付近のマップを表示すると、ストリートビュー地点の近傍に投稿されているものがある。

この G から始まる識別コードがFlagだった。
flag{GC41VBN}

Let's Meet! (200 pts)

DEADFACEのメンバーがリアルで会おうとしているので、その場所を突き止めて11桁のPlusCodeで示してほしいという問題。問題文にはGhost Townのリンクが示されている。
https://ghosttown.deadface.io/t/lets-meet/62/8

写真が投稿されている。これはニューヨーク公共図書館本館の内部であり、おそらく素材サイトなどから流用されたものである。

そしてFlagとして11桁のPlusCodeを求められているのだが、新宿で例えると、このサイズのグリッドを意味している。仮に「ニューヨーク公共図書館本館」だとして、そのどこにあたるのかを示す必要がある。

それゆえ、具体的な場所を特定する手がかりがGhost Townなどに含まれているのではないか……と推測しいていたが、特に得られる情報がなかった。

すると、チームのeruさんから「たまに(フォーラムの)内容を書き換えていることがある」との指摘があった。確かに、フォーラムの✎アイコンをクリックすると、その投稿の編集差分が閲覧できる。

そして古いリンク先(https://tinyurl.com/mc4vnuxc)を開くと、MeetHere.jpg というファイルが得られる。

ファイル名が変わっているのが怪しい。念のためうさみみハリケーンの「青い空を見上げればいつもそこに白い猫」を使ってファイルを開いてみると、このファイルにはメタデータが残っていることが確認できた。
また、 ///beyond.donkey.excavating という文字列も存在している。

これはwhat3wordsの記法であるため、同サイトから検索すると、セントラル・フロリダ大学の図書館前を示していることがわかる。つまり、ニューヨーク公共図書館本館は釣りだったというわけだ。
https://what3words.com/beyond.donkey.excavating

この地点をPlusCodeのサイトで確認し、11桁に調整する。

以下がFlagとなる。
flag{76WWJQ2X+28}

解いている最中はOSINTとステガノグラフィの複合問題という風に感じたが、結局のところ単にメタデータを使うだけなので、OSINT問の範囲に収まっていると言えるだろう。

Missing Persons (300 pts)

行方不明になったJake Grahambellの行方を追えという問題。名前以外の情報がない。

素直に名前をググるとXのアカウントがヒットする。
https://x.com/OpticSeltzer69

プロフィールのリンク先にはGitHubアカウントが示されている。ランダム生成っぽいID。
https://github.com/Adorable-Welcome-268

TruthTHE TRUTHなるリポジトリが存在している。陰謀論みがある。

TheTruthは特に得られるものがなさそう。
https://github.com/Adorable-Welcome-268/TheTruth

一方、TRUTHの方は拡張子なしでPythonスクリプトが置いてある。FTPサーバに接続するもののようだ。
https://github.com/Adorable-Welcome-268/TRUTH

難読化もされておらず、親切にコメントも書いてある。しかし、肝心のホスト名やユーザ名、パスワードが隠されている。

def connect_to_ftp():
    # FTP connection details
    ftp_host = "TRUTH"
    ftp_port = 21  # Default FTP port
    ftp_user = "username"  # Find me elsewhere!
    ftp_pass = "password"  # Find me elsewhere!

わざわざGitHubに置くんだし、コミット履歴を遡ると何かあるのではないか?

お!最初のコミットにはホスト名あるじゃん!と思ったが、グローバルIPではなくローカルIPだった。

def connect_to_ftp():
    # FTP connection details
    ftp_host = "10.10.1.23"
    ftp_port = 21  # Default FTP port
    ftp_user = "username"  # Replace with actual username
    ftp_pass = "password"  # Replace with actual password

ここで、リポジトリのフォーク数が5あることに気付く。
kabirdjainというユーザがフォークしたリポジトリには、3.208.232.204 というIPが示されている。ログインにコケることは承知で、試しにこのIP宛てに適当なユーザ名でFTPログインを1回試行してみると、ログインを蹴られることが確認できた。つまり、FTPサーバがこのIPアドレス上に存在しており、適切なIDとパスワードを入手すればログインできると推察できる。

https://github.com/kabirdjain/TRUTH/commit/3fb0db59f54be83c0ad672482b6471a09fdeb358#diff-dc273117482b4429ada500ecd2e0c75532454194892cb901ca64cc7df369fdf6R19

で、そのIDとパスワードはどこにあるのだろう。ダメ元でランダム生成っぽいIDを検索してみると、Redditがヒットした。怪しい。

めちゃくちゃ怪しい。
https://www.reddit.com/user/Adorable-Welcome-268/?rdt=55866

とにかく、このユーザのReddit投稿を追ってみる。何かに執着して調べて陰謀論にハマり、ロシアに向かったことが匂わされており、資料と思われる画像などもヒットする。

そして、最新のコメントはDiscordのサーバ招待リンクだった。

サブアカウントで潜入を試みると、botが動いているサーバに参加できた。
指示を読む限り、botにDMで話しかけるとよいらしい。

Jakeが調査中に執着していた場所に基づく1単語を答えよとのこと。DiscordサーバにはRedditの投稿と似たような画像が投稿されていた。





Lensに通してみると、エベレストの画像や、ホイットニー山に登山する画像が投稿されていることがわかる。Jakeは「山」に執着していたのでは?と思い、mountain, mount, summit, peak, pass...などの単語を試みたが、botが煽ってくるだけで不正解だった。

そこで、ロシア語で書かれた手書きの画像を画像検索してみる。すると、以下のサイトがヒットする。

https://dyatlovpass.com/gallery-case-files-330-339

Dyatlov Passとは何だろうか……?と検索してみると、以下の事件がヒットする。
https://ja.wikipedia.org/wiki/ディアトロフ峠事件

要は雪山登山中に発生した怪事件ということのようだ。おそらく、Jakeが執着していたのはこの事件だろう。

そしてもう一度ヒントを読み返す。

The secret is 1 word, based on the location Jake was obsessed with during his investigation.

定冠詞 the である。つまり、特定の場所を意味しているのではないか。
ということで、dyatlovが求められているワードだと判断し、入力したところ無事正解した。

先ほどのGitHubリポジトリにあったスクリプトのユーザ名とパスワードを書き換えて実行すると、FTPサーバ上にFlagが存在していることが判明する。

flag{dyatlov-unlikelyplaceforaparty}

THEY HAVE ME IN A PRISON deep in the mountain, tell me family I love them. DAMN YOU DYATLOV PASS

Flagは以下の通り。
flag{dyatlov-unlikelyplaceforaparty}

これにてOSINTカテゴリを全完したと思われる。

おまけ:他カテゴリ

筆者は基本的にOSINT CTFメインで取り組んでいるため、普通のCTFがきわめて苦手である。ここからはおまけとしてご笑覧いただければ幸いである。

[Cereal Killer] Cereal Killer 01 (25 pts)

バイナリが渡される。Linux版とWindows版が用意されているが、内容は同一ではないか。

とりあえず実行するとこんな感じ。パスワードを入れるとFlagが出てくる仕組みか。

>.\ck-2024-re04.exe
This year, America's politicians are weighing in on the IMPORTANT issues...!
As in, which spooky cereal is best?
Mr. Robert F. Kennedy, Jr. has a favorite spooky cereal.  Tear apart this
binary and see if you can figure out what it is!


Please enter the password: <パスワードを入力>
ACCESS DENIED!!!

点数からしてバイナリ解析の基本なんだろうなあ……と思いつつ、なんもわからんので後半まで放置していた。朝方、ググって2023年のwriteupを見つけた。

https://yocchin.hatenablog.com/entry/2023/10/23/230100

どうやら同じ名前の問題が去年も存在していたらしい。deadface定番問題なのだろうか?

ということで見よう見まねでGhidraに放り込むと、文字列の比較が走っているように思われた。おそらくここがpassword判定だろうか。後回しにした弊害として眠気で頭が働かないが、そのままChatGPTに投げると「文字が反転している」とのこと。leerobboではなくobboreelとなるが、別の関数も通してあるのでこれはpasswordではない。

ここで呼ばれている関数はこれ。ChatGPT曰く「何文字オフセットするかはわからないがシーザー暗号」と。

obboreel を適当にずらす。

Please enter the password: booberry


CONSPIRACY THEORY ACCESS GRANTED, Mr. Kennedy!!!
Here is your booster shot for today! Have a nice breakfast, Sir!

*********** FLAG INNOCULATED!!! ***********

flag{The-M0st-Fam0us-Nephew-Loves-B00B3rry!}

*********** FLAG INNOCULATED!!! ***********

Flagを得た。

[Traffic Analysis] Data Breach (25 pts)

パケット解析の問題。PCAPファイルが渡される。Wiresharkで読んで flag{ で検索すると出る。

[Traffic Analysis] Wild Wild West (50 pts)

同じくWiresharkで読んで flag{ で検索すると出る(もう少し筋の良い解き方がありそう)、

[Phantom Operators] Big Fish (10 pts)

「従業員がフィッシングの被害に遭った。攻撃者のIPは?」という趣旨の問題。
添付ファイルとして、フィッシングに遭った際の通信を記録したPCAPファイルが渡される。

フィッシングサイトに送信、ということはHTTP POSTだろうと思ってWiresharkでフィルタをかけると1件ヒット。

このDestinationのIPアドレスがFlagとなる。

flag{45.55.201.188}

[Phantom Operators] Password (10 pts)

Big Fishから連続する問題。この人物がフィッシングサイトに送信したパスワードを当てる必要がある。パスワードは先ほどと同一パケットに記録されていた。

flag{S4rt0RIS19&&}

[Steganography] Offsite Targets (25 pts)

写真が渡される。また、リンク先の(模擬的な)フォーラムでは、攻撃者同士がやりとりしている様子が確認できる。

フォーラム上で「いつものパスワードだよ」と書かれており、そのパスワードをsteghideに通せばFlagが得られる。

[Steganography] Price Check (100 pts)

CSVファイルが渡される。

0と255の2値で、2色で塗り分けたらQRコードになりそうな雰囲気がある(特に端部のマーカーがそれっぽい)

ということでスプレッドシートに読み込んで条件付き書式を設定する。
なんか欠けている気もするが、クルクルで読むと無事にFlagが得られた。

Discussion