CTFに挑戦してみた
初めまして、ruruです。実は、数か月前からフォレンジックの分野に興味が沸き、この前にCTFがあるインターンに参加しモチベーションが高いので、忙しいですがCTFを頑張り始めました!
忙しいため、あまり自己紹介等はないですが、今後時間があれば投稿していきます。
問題文
日本語訳: SOCチームは最近のブリーチ後、疑わしい巨大なファイルを発見し、ファイルを開くと、典型的なログでなく巨大な暗号化されたテキストのブロックを確認しました。もしかしたら、何か隠されているかもしれません。あなたは、このファイルを用いて、本当の目的を明らかにしてください。チームは貴方の情報解明力に期待しています!!
Logs.Dataをダウンロードしてください。
といった具合ですね。(私自身が、翻訳を適当にしたのでもしかしたら日本語が変かもしれませんが、、)
解方
まず、ファイルをLinuxのterminalでダウンロードする際、気を付けるべきことがあります。
CTFのEasyのファイルは基本的にマルウェアは入っていませんが、本来であればマルウェアが埋め込まれていたりするので、直接ダウンロードは御法度です。
では、どうやってダウンロードするんでしょうか??
まず、右クリックでファイルを押すと、、、
このような画面が出てきますので、copy link addressでファイルのurlをコピーし、linuxでこのコマンドを打ちます。
wget https://challenge-files.picoctf.net/c_amiable_citadel/929daf6ef01bba32b165e0a7c649ff4c953f2af21c28b024e8af5276b7716de5/logs.txt
VMでダウンロードすると安全です
そして、ダウンロードしたファイルを即、確認します。
ls
そして、CTFをやっていく際に重要なのが、ヒント以前に問題文です。
ファイルの解析が必要とのことなので、まずは
cat logs.txt
めちゃくちゃ何かいているか意味わかりませんが、文字を見ると、、、
🧐 Base64エンコードの典型的な兆候
ヒントなしにBase64だと判断できる主な根拠は、その構造的な特性と使用されている文字セットにあります。
1. 使用されている文字セットの制限
Base64は、データ(通常はバイナリデータ)をテキスト形式で安全に転送するために設計されています。そのため、Base64のエンコード結果には、以下の64種類の文字とパディング文字しか使われません。
大文字アルファベット: A-Z (26文字)
小文字アルファベット: a-z (26文字)
数字: 0-9 (10文字)
記号: + と / (2文字)
パディング(詰め物)文字: =
ファイルの内容が、主にこれらの65文字(=含む)だけで構成されていて、他の特殊文字(!や@など、または制御文字)がほとんど、または全く見られない場合、Base64である可能性が非常に高いと判断します。
2. パディング文字「=」の存在
Base64は、元のデータが3バイト(24ビット)の倍数でない場合、最後にパディングとして**=または==**が追加されます。
ファイルやデータの末尾に**=や==が一つまたは二つ存在し、その前の文字群が前述の64文字で構成されている場合、これは最も強力なBase64のヒント**の一つとなります。
3. 文字の出現頻度と長さの規則性
Base64は3バイトを4文字に変換するため、エンコード後の文字列の長さは4の倍数になります(パディング文字=を含む)。
文字列の長さが4で割り切れるかどうかを確認します。
Base64は、テキストデータというよりはバイナリデータを強引にテキスト化したものなので、一般的な英文や日本語の自然な文章では見られないような、文字の出現頻度に偏りがあることも判断材料になります。
4. 特定のファイル形式やコンテキスト
プロのホワイトハッカーやセキュリティエンジニアは、データがBase64でエンコードされている可能性が高い特定の状況やファイル形式を知っています。
メールの添付ファイル: MIME形式で転送されるファイルの内容。
ウェブのCookieやURLパラメータ: 特に非常に長い、意味不明な文字列の場合。
設定ファイルや暗号鍵: 設定ファイル内などに直接バイナリデータを埋め込む必要がある場合。
マルウェアの構成ファイル: 解析を難しくするために、ペイロード(実際の攻撃コード)をBase64などで隠蔽していることが非常に多いです。
うちのgemini曰く、そうらしいので64進数で暗号化されていることが確認できます。
従って、Linuxのコマンドでまず64進数を復号していきます。
コードは下記になります。
base64 logs.txt > output.txt
そして、ここで重要なポイントがどうしてbase64で暗号化またはテキストに変換するのでしょうか?です。
基本的にbase64で暗号化するのではなく基本的に、バイナリデータ(画像、実行ファイルなど)を、メールやHTTPなどのテキストベースのシステムで安全に転送するために、一時的にテキスト形式に変換するエンコード方式という特性があります。
従って、現在テキスト表示されていますがjpgに変換してみましょう!!
(CTFは特性の組み合わせで、解方にたどり着くまでトライするのみです)
txt→jpgに変換する際のコマンドは下記になります。
cat logs.txt | logs.txt -d > decoded.jpg
そして、jpgで開くとこのような画像が出てきます。
jpgを開くコマンドは
display decoded.jpg
が表示されます。そして、謎の英数字が混じった文字列が確認できますね。
gptでもいいですが、画像からテキストを抽出するツールを適当に探して使用しても問題ないです!笑
抽出したテキストは
7069636F4354467B666F72656E736963735F616E616C797369735F69735F616D617A696E675F65633139383466637D
となります。
で、これに関しては確実にbase 16です。
では、base 16を復号化すると、、、、、
じゃーーん!!!Flagが表示されました。
入力すると、、、、
ということなのでこのCTFはクリアです。
CTFは、基本的にEasyだろうと全然心を折ってきますし、知識の幅が膨大です。
なので、わからなくても気落ちせず、ひたすら "どうして" を考え、経験値を増やし、問題のパターンや作者の意図を掴めるのではないかと思います。
では、みなさんご元気で!!
追記: CTFの大会に来年出場し、情報処理を2027年の新年にとれるようにしたいですね、、、、本当に






