CyberChef 超入門 (例題付き)
お久しぶりです。しなもんです。
今回は最近日本でもファンを増やしている便利ツール、"CyberChef" をご紹介します。
- CyberChef とは?
- 初めての CyberChef:〇〇などない
- 例題1:Coin Challenge!
- 例題2:Et tu, Brute?
- 例題3:dots&dushes
- 例題4:reversible hash
- 例題5:X-channel light rays
- 応用編:Emotet ダウンローダからの通信先の抽出
- まとめ
- 参考資料
CyberChef とは?
CyberChef (サイバーシェフ) とは、英国政府通信本部 (GCHQ) が開発した無料の Web アプリです。
ブラウザでアクセスすればすぐ使えます。
"The Cyber Swiss Army Knife" (サイバー・スイスアーミーナイフ) と自称しているとおり、データの変換、圧縮展開など多岐にわたる操作を簡単に行うことができます。
「シェフ」をモチーフとした、シンプルでちょっと可愛らしいインターフェースが特徴的です。
しかし実は、一つ一つの機能自体はそれほど目新しいものではなく、プログラムを組めば実行出来たり、すでにツールが存在していたり、OS の標準機能でできるものも多いです。
それにもかかわらず CyberChef が人気を集めているのは、次のような優れた特徴を備えているためです。
豊富な機能
随時追加されていることもあり全貌はよくわかりませんが、CyberChef で実行可能な機能 (Operations) は数百にのぼります。
使い始めるのが簡単
CyberChef を始めるのに必要なことは、ブラウザで上記の URL (もしくはダウンロードしてきた HTML ファイル) にアクセスすることだけです。
インストールや会員登録は不要で、最初から全機能をフルに使えます。
直感的に操作可能
CyberChef の基本的な使い方は、
「右上の "Input" に入力値 (文字列のほかファイルやフォルダも指定できる) を入力」
→「左のリストから使いたい機能を選択」
→「"BAKE!"」
→「右下の "Output" に結果が出力される」
というシンプルなものです。
大量の文法を覚えたりする必要がなく、自分の好きな機能だけ好きなように使えるのでとっつきやすいのがうれしいところです。
開発者自身、 "CyberChef encourages both technical and non-technical people to explore data formats, encryption and compression." (意訳:CyberChef は技術者とそうでない人の両方にとって、データフォーマット、暗号、圧縮について調査するための力になります) と、特別な技術のない人の使用を想定していることを明言しています。
処理を繋げて表現できる
CyberChef の誇る数百のオペレーションは単品で動作するだけではありません。
一つ目の処理の結果 (出力) を次の処理に入力として渡すことができます。
つまり「最初の処理→次の処理→その次の処理→……」といくつもの処理を組み合わせることで複雑な操作を行うことが可能になります。
しかも処理を繋げるために特別なことは何も必要なく、単に Recipe を下に追加していくだけで済みます。
さらにプログラミング言語のような「分岐」「繰り返し」までも可能です。
ブラウザだけで機能する
CyberChef はすべての処理を Web ブラウザ上で行います。
ちなみに公式には Google Chrome と Mozilla Firefox がサポートされています*1。
そのためブラウザ以外の何かを別途インストールする必要はありませんし、2系でしか動かないツールと 3系でしか動かないツールを共存させるために四苦八苦……というようなことも起こりません。
隔離された環境でも使える
CyberChef は Web アプリですが、左上の "Download CyberChef" からダウンロードしておけば、オフライン環境で使用することもできます*2。
例えばマルウェアの解析やインシデントの調査など、データの処理をインターネットにつながっていない環境で実施したいときがあります。
ダウンロード版 CyberChef はそうした用途にも使うことができます。
"REMnux"、"Tsurugi Linux"、"FLARE VM"、"Commando VM" などのセキュリティ調査用ディストリビューションには最初から CyberChef が入っています。
Recipe をセーブ/ロードできる
作成した Recipe は書き出して保存しておくことができます。一度作った Recipe は作り直さなくても読み込むだけでまた使うことができます。
また有志が公開している Recipe を読み込ませれば、まったく同じ処理を手元で再現することも簡単です。
このように非常に便利に使えるのですが、難点もあります。
処理速度が微妙・大きなファイルが苦手
レシピにもよるのですが、正直処理速度は速いとは言い難いです。
"Auto Bake" にチェックを入れていると、ちょっと入力値やレシピをいじるたびに再処理が始まり待たされることになるので、ある程度複雑なことをするときはチェックを外しておくことをおすすめします。
また大きなファイルを扱うのは苦手です。
初めての CyberChef:〇〇などない
それでは実際に問題を解きながら CyberChef の基本的な使い方を練習しましょう。
問題
次の文字列を解読してください。
49%DB%FE%58%DB%FE%C8%DB%FE%C8%DB%FE%59%DB%FE%2A%CB%FE%08%08%3E%29%DB%FE%58%DB%FE%69%DB%FE%C8%DB%FE%98%DB%FE%3B%CB%FE%08%08%3E%F8%DB%FE%EA%CB%FE%
解説
まずは与えられた文字列を "Input" にコピペします。
「(数字もしくは大文字アルファベット 2文字) + %」がたくさんつながっています。
試しに「% エンコード」で検索すると、「パーセントエンコーディング」「URL エンコード」などと呼ばれるエンコードがあることがわかります。
ところが、パーセントエンコーディングでは「% + (2文字)」の形をとるので、本問の「(2文字) + %」とは順番が逆です。
逆順に並べ替えればパーセントエンコードとしてデコードできそうです。
左上の検索ボックスで "reverse" と検索します。
検索結果に表れた "Reverse" を 中央部の "Recipe" にドラッグ&ドロップするか、ダブルクリックします。
Output では文字の順番が逆転していることがわかります。
再び検索ボックスに "percent" と入力すると、検索結果の中に "URL Decode" が現れるので、これを "Recipe" ("Reverse" より下) へドラッグ&ドロップもしくはダブルクリックします。
特に答えの書式は指定されていませんが、意味のある言葉が出てきたのでこれが答えと考えていいでしょう。
解答:No Silver Bullet
今回作成したレシピは "Recipe" のフロッピーディスクのボタンを押して保存することができます。また、隣のフォルダのボタンからはレシピを読み込むことができます。
今回のレシピは単純なのであまりありがたみがありませんが、オプションをたくさん指定したり正規表現の入力を必要としたりする処理もありますし、用途によっては処理が十数段階にのぼることもあるので、そうした場合にはセーブ/ロード機能が役に立ちます。
さらに隣のゴミ箱のボタンを押すとレシピをまとめて削除できます。レシピ作成中に間違って押さないように気をつけましょう。
例題1:Coin Challenge!
いくつか例題を用意しましたので CyberChef でどんなことができるかもう少し試してみましょう。 ちなみに問題自体もだいたい CyberChef でつくりました。
問題
次の URL に掲載された画像から、チャレンジコインの表面 (左側) に記載された暗号を解読してください。
https://www.antiphishing.jp/news/info/20201208.html
解説
コインの表面にはそのままでは意味が分からない文字列が記載されています。
真上から時計回りに読み取ると次のとおりになります*3。
53 54 4f 50 2e 20 54 48 49 4e 4b 2e 20 43 4f 4e 4e 45 43 54 2e
これを "Input" にコピペします。
数字と f までのアルファベットの組み合わせなので 16進数が関係していると推測できます。
そこで検索ボックスで "Hex" と検索し、出てきた "From Hex" を "Recipe" に入れます("From Charcode" でも解けます)。
解答:STOP. THINK. CONNECT.
(参考:https://stopthinkconnect.jp/)
何をしたらいいか全然わからない場合には、"Magic" を試してみるといいでしょう。
CyberChef が自動でいろいろ試してくれて、良さそうな結果が出てくるレシピを選んでくれます。
いつでもうまくいくわけではありませんが……
例題2:Et tu, Brute?
問題
次の文字列を解読してください。
V2toIGZyb3J1IHJpIEZscXFkcHJxJ3YgaGJodiBsdiB3a2ggZnJvcnUgcmkgd2toIHZuYi4=
解説
最後に = が付いているのがヒントで、ここからこの文字列が Base64 という方式でエンコードされていることが推測できます。
Base64 は様々な種類の文字やデータを電子メールで扱うための規格 "MIME" で規定されているエンコード方式で、メールの世界を中心に広く使われています。
エンコード後「全体が 4の倍数にならない場合は足りない数だけ = で埋める」という仕組みなので、最後に = が付いていることが多いです。(もちろんたまたま 4の倍数になった場合には何も付かないことになります)
さて、"From Base64" でデコードしましたがまだ読める文章にはなりません。
デコード結果:Wkh froru ri Flqqdprq'v hbhv lv wkh froru ri wkh vnb.
文頭が大文字、末尾が . (ピリオド) などと英語に似た特徴を持っていますがまったく読めません。
しかし、" 'v" は英語の " 's" にそっくりですし、"wkh" ”froru” "ri" などまったく同じ文字の並びが複数回現れます。
単純な規則で文字を置き換えただけの可能性が高いです。
v と s は アルファベットにおいて 3文字分離れているので、試しに他の文字列にもこの変換を試してみましょう。
"wkh" → "the"
"froru" → "color"
”ri” → "of"
この線で良さそうです。
このように、アルファベットを決まった数だけずらして作る暗号を「シーザー暗号」といいます。
古代ローマの指導者ユリウス・カエサル (ジュリアス・シーザー) が用いた世界最古の暗号といわれています。
さて、CyberChef でもシーザー暗号は解くことができますが、「シーザー暗号」という名前では搭載されていません。
しかし説明文でカエサルに言及されているので、"caesar" で検索すればしっかり見つけることができます。
"ROT13" がそれです。
デフォルトでは 13文字ずらす設定*4になっているので、これを "-3" (もしくは "23") に設定します。
解答:The color of Cinnamon's eyes is the color of the sky.*5
例題3:dots&dushes
問題
次の QR コードに隠された URL を探し出してください。
解説
QR コードはスマートフォンや携帯電話、もしくは専用機器で読み取ることが多いと思いますが、CyberChef も QR コードを読むことができます。
QR コードを画像ファイルとして保存した後、"Input" の "Open file as input" でその画像を読み込み、レシピには "Parse QR Code" を設定します。
. と - だけからなる謎の文字列が出てきました。
点のような文字と線のような文字から構成されるところからみて、これはモールス符号であると考えてよいでしょう。
もちろんモールス符号も CyberChef で変換できます。
"morse" と検索して出てくる "From Morse Code" をレシピに追加します。
もうほとんど答えは見えてるのですが、せっかくなので全部小文字に揃えておきましょう。
"lower case" などと検索して出てくる "To Lower case" をレシピの最後に加えます。
解答: https://am7cinnamon.hatenablog.com/
パズルならともかく、実務ではモールス符号なんてまず使わない……と私も長い間思っていたのですが、最近になって検知回避のためモールス符号を悪用するフィッシングサイトが観測されたそうです。
例題4:reversible hash
問題
MD5 でハッシュ化すると次のようになる文字列を特定し、その SHA-256 ハッシュ値を求めてください。(注:SHA-256 は SHA-2 の 256 ビットバージョン)
2c103f2c4ed1e59c0b4e2e01821770fa
解説
ハッシュ値とは、元のデータをハッシュ関数と呼ばれる計算手順に従い計算することで得られる特定の長さの文字列です。
詳しくはこちらをご覧ください。
ハッシュ値 (ハッシュ関数) にはいくつかの重要な性質がありますが、その中の 1つに「ハッシュ値から元のデータを復元することはできない」というものがあります。
そのため理論的には、元の文字列を特定しなければならない本問は解けないはずです。
しかし、もし元となった文字列が有名であったり、誰でも思いつくような単純なものであれば、誰かがすでに計算しているはずですし、調べれば出てきそうなものです。
というわけで、"2c103f2c4ed1e59c0b4e2e01821770fa" を検索エンジンで調べます。
これらのページのどれかしらをご覧いただければ、元の文字列が "Password123!" であったことがすぐわかるはずです。
パスワードはシステム内部ではハッシュ値として保存していることが多いですが*6、このような安直な文字列ではハッシュ化している意味がなく、事実上平文が丸見えなのと変わらないことが実感できます。
"Password123!" は一応大文字・小文字・数字・記号を全部含んでいるのですが、全然安全ではないということです。
さて、ご覧になったサイトによってはもう答えが書いてあるのですが、念のためCyberChef で確かめてみましょう。
"Input" に "Password123!" と入力します。
そのまま "SHA-2" でもよいのですが、せっかくなので MD5 も含めて全部計算してしまいましょう。
"Generate all hashes" でまとめて計算できます。
MD5 で確かに"2c103f2c4ed1e59c0b4e2e01821770fa" になることを確認できました。
解答:a109e36947ad56de1dca1cc49f0ef8ac9ad9a7b1aa0df41fb3c4cb73c1ff01ea
例題5:X-channel light rays
問題
下の写真はある観光地付近で撮影されたものです。その観光地を特定してください。
(実際には読者の方には解けません。雰囲気だけ味わってください。)
解説
どこにでもありそうなベンチと、どこにでもありそうな地面しか写っておらず、いまいち手がかりのない写真です。撮影が下手なせいもありますけど。
観光地だということがわかっているので、当たりをつけて調べることはできると思いますが、簡単ではないでしょう。
それでも解くことができるのならば、「写真として目に見えている以外の情報があるのではないか」と推測できます。
JPG などの画像データには、"Exif" というデータを含むことができます。
Exif にはカメラの機種や撮影日時のほか、機器の設定次第では位置情報も含まれることがあります。
Exif を見ることができるツールはいろいろあるのですが、CyberChef でもできます。
"Input" から画像ファイルを読み込み、検索ボックスで "Exif" と検索して出てくる "Extract EXIF" をレシピに追加します。
矢印で示した "GPSLatitude" が緯度、"GPSLongitude" が経度を表しています。
バッチリ位置情報が残っていたということです。
これを Googleマップなどの緯度・経度で座標指定できるオンラインマップに入力すれば答えがわかります。
(実際の撮影地店は矢印付近で、ピンの立っている位置から少し離れています)
解答:東京タワー (芝公園)
このように、写真には Exif という形で位置情報が残っていることがあり、簡単に見ることができます。
そのため、本問のような観光地ならともかく、自宅の周辺などで撮影した写真を不用意に公開すると、場合によっては危険なことになりかねません。
大手の SNS ではこれを防ぐために、画像データのアップロード時点で自動的に削除する仕様になっているそうです (はてなブログもその仕様で、本問を読者の方が解けないのはそのためです)。
位置情報を利用するつもりがないなら、機器側・アプリ側で記録しない設定にしておくとよいでしょう。*7
せっかくなので東京タワーも撮ってきました。たまたまなんですが、ちょっと珍しいライトアップだったようです。
応用編:Emotet ダウンローダからの通信先の抽出
パズルのような問題ばかり解いてきましたが、CyberChef は本格的なセキュリティ調査にも活用できます。
その一例として、最近まで大流行していたマルウェア "Emotet" のダウンローダを CyberChef で解析し、通信先 (Emotet 本体のダウンロード元) を特定する様子を示します。
CyberChef のポテンシャルを感じ取っていただければ幸いです。
重要な注意点
ここで扱っているのは本物のマルウェアです。
安易に真似したり、検体を入手したりしないでください。
特にマルウェアの扱いに慣れていない方、安全に解析できる環境を持っていない方は絶対にやめてください。
前提
- Emotet はメールを通じて感染を広げるマルウェアです。詳しくは専門機関やセキュリティ企業のレポートなどをご覧ください。
- メールに直接添付されていたり、本文中のリンクなどからダウンロードされた Word ファイル (DOC ファイル) がダウンローダとして機能します。DOC ファイルを開きマクロを有効化すると*8 PowerShell などのプログラムを通じて特定の URL へアクセスし、Emotet 本体がダウンロードされます。*9
- マルウェアの通信先は、「プロキシログから通信の有無を調べる」「アクセスをブロックして感染を防ぐ」などの処置の起点になるので、対応上できるだけ早く特定すべき情報です。
- 今回のレシピは「とりあえず通信先がわかればいいだろう」という程度の志で作ったもので、あまり洗練されていません。ご了承ください。
- 検体によって細部が違うので、今回のレシピがすべての Emotet ダウンローダに通用するわけではありません。
- 解析した検体は SHA-256:87cccfbf24ec4787cc20e07cfd4f09ad67411698bd37854407087fb7ac721a1d です。
解析!
1. 検体を Input します。
2. "Strings" で文字列を抽出します。通信先の情報は一番長い文字列に含まれているので、抽出される文字列が一つになるように "Minimum Length" を調節します。ここでは 2000 で実施しています。
"Display Total" にチェックを入れると全部で何個抽出されたか表示されるので参考にします (後の処理の邪魔になるので次の段階に移る前に外しておきます)。
3. "w]xm[v" という文字列が大量に入っていることがわかります。
"Find/Replace" でこれを削除します。デフォルトでは検索対象が正規表現 (Regex) になっているので "Sinple string" にします。
4. 2行目以降の "IAAgAC......" で始まる部分は Base64 エンコードされています。画像には写っていませんが末尾が "==" になっています。
先頭の "nc" の部分はいらないので Base64 部分だけを残すようにします。
"Regular expression" をレシピに追加し、"Regex" に "[0-9a-zA-Z+/=]{30,}" と入力、"Output format" として "List matches" を選びます。なお、30 の部分は大きすぎたり小さすぎたりしなければ何でも大丈夫です。
これで Base64 部分だけを取り出すことができます。
4α. 先頭の不要な部分を "Drop bytes" で削除するというアプローチも可能です。
実は "nc" の後に余計なスペースがいくつか入っているのですが、これを全部削らなくても以後の処理に影響はないようです。
ここでは Regular Expression を採用して以後の処理に進みます。
5. "From Base64" でデコードします。
ようやく意味のありそうな文字が見えてきましたね。
6. "Decode text" をレシピに追加し、"Encoding" から "UTF-16LE (1200)" を選びます。
何でデコードしたらいいかわからない場合は、"Text Encoding Brute Force" で様々なエンコード方式を試して良さそうなものを選ぶといいでしょう。
7. "Output" の下部に URL を生成しているらしき部分が見えています。
しかし '+' や ')+(' や ')+' が大量に入っていて読みにくくなっています。
これらをまとめて削除します。
"Find/Replace" をレシピに追加、"Find" に「'\)?\+\(?'」と入力します (検索対象は Regex のまま変更しない)。これで括弧の有無にかかわらず一発で削除できます。
8. 「@」の部分で改行するようにします。
"Split" をレシピに追加、"Split delimiter" を「@」に変更します。
続いて同じく Split を追加、Split delimiter を「'」に変更します。*10
9. "w]xm[v" を "http" に置換します。
"Find/Replace" をレシピに追加、検索対象を "Simple string" に変更、"Find" に "w]xm[v"、"Replace" に "http" をそれぞれ入力します。
10. "Extract URL" で URL を抽出します。
今回は URL が 1ヶ所にまとまっているので手動でコピペしても手間にはならないのですが、あちこちに分散している場合やそもそも URL が含まれているかどうか自体不明な場合には Extract URL は重宝します。
11. 抽出された URL はアクセスするとマルウェアが落ちてくる危険なものなので、間違ってアクセスしないよう無害化します。
"Defang URL" で http → hxxp などの加工をして URL として直接アクセスできないようにします。
これで、一度も検体を実行せず CyberChef だけで通信先を明らかにすることができました。
作成したレシピはこのように保存して共有できます。
今回は DOC ファイルから解析しましたが、手元に DOC ファイルが添付されたメールデータがあれば、それを Input にして、添付ファイルをファイルとして保存することなく解析することもできます (正規表現による Base64 部分の抽出とデコードを使います)。
また、マクロ実行時にコマンドプロンプトに渡す "powershell -e ......" といったコマンドからも解析できます。
まとめ
CyberChef は簡単に始められる手軽さと、発想次第で多様な処理ができる自由度を兼ね備えたツールで、ライトに使おうとすればライトに、ヘビーに使おうとすればヘビーに使えるのが魅力です。
今回ご紹介した機能やレシピは CyberChef の可能性のほんの一部です。
是非ご自身でいろいろ試して、新しいレシピを開発してください。
便利なレシピができたら SNS などで紹介していただけると助かります。
参考資料
CyberChef のオペレーションについて解説している記事です。
紹介されている機能はごく一部ではありますが、応用が利いて強力な効果を発揮するものが多いです。ご一読をおすすめします。
実用的なレシピ集です。
著者が DFIR (デジタルフォレンジック・インシデントレスポンス) 技術者のため、紹介されているレシピも実際のインシデント調査などで役立ちそうなものが多いです。
ちなみにこの著者は CyberChef のオンライン講座の講師も務めているようです。
CTF の問題解説という形で CyberChef の使い方を紹介しています。
基本的な問題が多めですが、後半の問題では Register や Jump のようなやや高度な (しかしその分応用が利く) 機能も登場します。
貴重な CyberChef に関する日本語の著書 (同人誌) です。
CyberChef の基本的な使い方のほか、"Data format" の各機能に絞って使用例が紹介されています。
シェル芸 (様々なことをシェルコマンド一発で実行する技術) による処理が併せて載っているのも特徴です。
約 50種類のレシピが載っている電子書籍です。単純な Base64 デコードからマルウェアの難読化解除まで取り扱っています。
著者の本音 (この機能はあんまり使えないぜとか) がちょいちょい見えてクセが強いですが、紹介されているレシピは大変有用です。
(2021/05/17 追記)
より実践的な内容のスライドを作成・公開しました。
もともと身内向けに作成したもので、問題ファイルを公開していないためハンズオンはできないのですが、それでも役立つ小技を多数詰め込みました。
ぜひあわせてご覧ください。
(追記ここまで)
*1:他のブラウザでも使えないわけではないと思いますが、機能によっては動かないことがあるかもしれません。
*2:"HTTP request" などインターネット環境を前提とする一部の機能はもちろん使えなくなります。
*3:真上スタートと気づかなくても、解き方が正しければそのうち答えは見当がつくと思います。
*4:アルファベットは 26文字なので、13文字ずらして暗号化したものは再度 13文字ずらすことで平文に戻すことができます。このように暗号化と復号をまったく同じように行える性質を持つ数字は 13だけなので特別扱いされています。
*5:この Cinnamon はサンリオキャラのシナモンのことです。
*6:単なるハッシュ値ではなく、「ソルト」「ペッパー」「ストレッチング」などを用いてさらに安全性を高めている場合もあります。一方で、普通のハッシュ化すらしていない場合も残念ながらあるようです。
*7:私が撮影に使った機器は最初から記録しない設定になっていました。そのことに気づいていなかったため、せっかく撮ってきた写真に位置情報が入っておらず、わざわざ東京タワーを再訪する羽目になりました。
*8:デフォルト設定では「コンテンツの有効化」ボタンを押すことで発動するため、これさえ押さなければセーフと捉えられがちですが、Word がマクロを自動実行する設定になっていたら開いただけでアウトなので、一度設定を確認しておくことをおすすめします。前任者などから引き継いだパソコンを使っている場合は特に要注意です。
*9:ダウンローダとして機能する文書型マルウェアが PowerShell やコマンドプロンプトなどを悪用するとは限りません。「文書型マルウェア→PowerShell」などと決めつけるのは危険です。
*10:これはやらなくてもそんなに問題ないんですが、最後に少しゴミが残るのを避けるためにこの段階で改行しているものです。おそらくもっとスマートなやり方があると思います。