CyberChef の基本的な使い方を紹介します。
CyberChef (サイバーシェフ) は 英国政府通信本部 (GCHQ) が開発した万能変換ツールです。 https://gchq.github.io/CyberChef/
入門ハンズオンCyberChef
View Slide
目 次・本資料について・CyberChef 基礎知識・実践編- ハッシュ値計算 - ファイルタイプ判定- 文字列抽出 - バイナリ閲覧- CIDR 計算 - URL 抽出- URI 分解 - テキスト比較- Code beautify - 1列→ 1行- 1行→ 1列 - ハッシュ値抽出- Base64 デコード - Office ファイルからの URL の抽出- PDF ファイルからの URL の抽出 - 国際化ドメイン名と Punycode- 分割して処理する・解答編
本資料について
本資料について・本資料は、CyberChef に初めて触れる、または多少使ったことはあるが何ができるのかよく知らない……という方向けに作成したものです・実際にファイルやテキストを分析しながら、次のことを学んでいただくことを目的としています公開版では問題ファイルは提供していません。ご了承ください- CyberChef の基本的な使用法- 簡単で使う機会の多いレシピの使い方・場合によっては CyberChef 以外に使えるツールなども併せて紹介します・入門者を対象としているので、すでにバリバリ使いこなしている方には物足りない内容となっています。ご了承ください
CyberChef基礎知識※ CyberChef を使ったことがある方は飛ばして大丈夫です
CyberChef is 何?・CyberChef (サイバーシェフ) は、英国政府通信本部 (GCHQ) が開発した Web アプリケーション・”The Cyber Swiss Army Knife” を自称する高機能ツール- Swiss Army Knife とはナイフのほか缶切り・栓抜きなど多数の機能を持つマルチツールのこと・各種エンコード・デコード、データ変換、圧縮解凍、テキスト処理など、行うことができる処理 (Operations) は数百にのぼる・オープンソースであり、誰でも無料で使用可能・↓の URL にアクセスすればすぐ使えるhttps://gchq.github.io/CyberChef/
CyberChef のメリットCyberChef には多くの優れた点がある・機能が豊富これさえあれば数百の処理を一元的に行うことができる・始めやすい会員登録やインストールが不要・直感的に操作できるGUI 操作。事前に文法を覚えたりする必要がない・処理を繋げられる前の処理の結果を次の処理に渡せる。複雑な処理も一発で終了
CyberChef のメリット・ブラウザだけで機能するChrome と Firefox がサポートされている・オフラインでも使える事前に DL しておく必要があるが、完全オフラインでも使える※隔離された環境でも利用できるし、機微なデータをネットに晒すことなく処理できる・レシピをセーブ・ロードできる以前作ったレシピを再利用できるもちろん他の人が作ったレシピを読み込むことも可能※ネット環境を必要とする機能もあるがごく一部
オンライン版 vs ダウンロード版・CyberChef はブラウザ上ですべての処理を行い、外のサーバにデータを送ったりすることはない・とはいえ、インターネット上のツールに機微なデータを渡すべきではない・セキュリティ調査では機微なデータを扱うことも多いので、あらかじめダウンロードしローカルに保存したものを使うことを推奨・ダウンロードは画面左上の “Download CyberChef” から
CyberChef の画面
Operations使える機能のリスト各分類をクリックすると個々の機能が出てくるマウスオーバーすると説明文が読めるダブルクリックするか、中央部の “Recipe” にドラッグ&ドロップすることでレシピに追加できる
Operations“Search…” では機能の検索ができるよく使う機能は名前を覚えておこうしかし、そのものズバリでなくても拾ってくれるので、とりあえずやりたいことを検索してみるのも手例えば、いわゆるシーザー暗号は “ROT13” という名前だが、それを知らなくても ”caesar” で検索すればちゃんと見つけることができる
Recipe実行する機能をセットにしたものドラッグ&ドロップで機能の順番を入れ替えられるまた、🚫を押して機能を無効化できる処理の順番は基本的に上からだが、分岐や繰り返しもできる図の場合、一番下の “Jump” の次に一番上の“Label” へジャンプし、これを 10回繰り返す(結果として間の “From Base64” が11回実行される)ゴミ箱のアイコンでレシピをまとめて削除できる(間違って押さないように!)
Recipe中央の “BAKE!” が実行ボタン左の “STEP” はステップ実行押すたびに各処理を一つずつ順番に実行していく右の “Auto Bake” にチェックを入れていると、“BAKE!” を押さなくても自動で実行が始まるチェックしていると、ちょっと入力をいじっただけで再処理が始まってしまうので、時間のかかる処理を行うときは外しておいた方が無難
Recipeフロッピーディスクのアイコンをクリックすると今セットしているレシピをセーブ (保存) できるフォルダのアイコンをクリックすると保存済のレシピをロード (読み込み)できる
Recipeここに名前を入力して “SAVE”自分の作ったレシピのほか、他の人が作ったレシピもこの部分にコピペすれば一気にロードできる
Input処理する前のデータ (入力) を指定する入力には次のものが指定できる・テキスト (白い部分に直接入力もしくはコピペ)・ファイル・フォルダタブを増やして、複数の入力に対して同じレシピを使うこともできるゴミ箱のアイコンで入力をまとめて全部削除できる(間違って押さないように!)
Input① ② ③ ④ ⑤① タブを追加② フォルダを入力として指定③ ファイルを入力として指定④ ゴミ箱。入力として指定されているすべてを削除⑤ ペインレイアウトをリセット (使い方がよくわからない……)
Output処理結果が出てくるファイルとして保存したり、クリップボードにコピーすることができる表示した時点から入力もしくはレシピが変化しており、「表示が最新の状態ではない場合」には “Output” の文字の隣に時計のアイコンが出現する
Output① ② ③ ④ ⑤① ファイルとして保存② クリップボードにコピー③ 入力を出力で置き換える (異様に時間かかるので使わない方がいい)④ 元に戻す⑤ “Output” ペインを最大化
実践編
ハッシュ値計算・CyberChef はハッシュ値の計算を得意としており、およそ必要となりそうなハッシュ値はなんでも計算できる・セキュリティ調査目的では MD5、SHA-1、SHA-256 がよく用いられているしかも困ったことに人や組織によってインジケータにどれを使うかがまちまちなので、結局 3種類とも計算し調べることになる・そこで便利なのが “Generate all hashes”。上記の 3種類をはじめとするすべてのハッシュ値をまとめて計算してくれるただ相応に時間がかかるのが欠点
ハッシュ値計算 – ハンズオン・Q1: Hash me!・Q01 のフォルダに入っている “Hashme.bin” の MD5、SHA-1、SHA-256 ハッシュ値を計算してください・まとめて一度に計算してもいいし、それぞれ別個に計算しても構いません
ハッシュ値取得 – 代替ツール・右クリックメニューの「プロパティ」にタブ「ハッシュ値」を追加する “HashTab” や複数ファイルのハッシュ値をまとめて計算できる “HashMyFiles” “HashSum” などのツールが使える・CyberChef は「入力 (1つ)→レシピ→出力」という構造上、複数ファイルについて計算して結果を比較するような使い方には向いていないその点では専用ツールに優位性がある
ファイルタイプ判定・ファイルタイプについてはバイナリエディタでマジックナンバーを見ることで判別できる拡張子は偽装されている場合もあるのであまり信用できない・有名なマジックナンバー (4D 5A = MZ など) は覚えておくと便利だが、何百種類もあるマジックナンバーを丸暗記するのは現実的ではない・そこで専用ツールが用いられることが多いが、CyberChef でも “Detect File Type” でファイルタイプを判定できる
ファイルタイプ判定 – ハンズオン・Q02: Detect me!・Q02 のフォルダに入っている “00~05.nanikore” のファイルタイプを判定してください・一部 “Detect File Type” だけでは正確にわからないファイルも含まれています適宜調査して本当は何なのか特定してください
ファイルタイプ判定 – 代替ツール・Windows 環境では、”TrID” およびその GUI 版である “TrIDNet” (要.NET Framework)が有名・うさみみハリケーン同梱の「青い空を見上げればいつもそこに白い猫」も標準で TrID と同等の判別能力がある (ほかにもいろいろできるが……)・Linux なら “file” コマンドが使える
文字列抽出・ファイルによっては、役立つ情報が文字列という形でファイル内に格納されていることがある・例えば通信先や呼び出す API の名称など・CyberChef では “Strings” でできるデフォルトでは “Minimum length” が 4になっているが、これでは短すぎてゴミが大量に出てくるので、とりあえず 7~8文字程度でスタートするとよい・”Display Total” にチェックを入れると “Total found: xx” と見つかった文字列の数を教えてくれる
文字列抽出 – ハンズオン・Q03: picoCTF 2019 から “Glory of the Garden”・Q03 のフォルダに入っている “garden.jpg” からフラグを見つけてくださいフラグの形式は “picoCTF{xxxxxx}” です・本問はカーネギーメロン大学が実施している picoCTF からお借りしましたhttps://picoctf.org/
文字列抽出 – 代替ツール・Windows の場合 “Bintext” が有名・「青い空を見上げればいつもそこに白い猫」も使える。日本語に強い・Linux なら “strings” コマンドが有効
バイナリ閲覧・ファイルを 16進数の塊として確認するには、通常バイナリエディタ (ヘキサエディタ) と呼ばれるツールが必要になるが、見るだけならば CyberChef でも可能・”To Hexdump” がそれ。通常のバイナリエディタのように「アドレス」「コード」「対応する文字」の順に表示してくれる・ただし、文字の表示形式の都合で、一部のマジックナンバーは日本でよく知られた見た目と違うので注意例えば .xls など、MS Office 2003 以前のファイルのマジックナンバー”D0 CF 11 E0 A1 B1 1A E1”は、Windows ANSI では “ミマ.爍ア.・” だが CyberChef では“ÐÏ.ࡱ.á” になる
バイナリ閲覧 – ハンズオン・Q04: Message from Hex・Q04 のフォルダ内にある “hex.nanikore” に隠されたメッセージを解読してください
バイナリ閲覧 - 代替ツール・基本的に専用のバイナリエディタの使用を推奨ただ、バイナリエディタを導入できない環境などでは CyberChef が役立つ・国産のバイナリエディタとして “Sterling” “Binary Editor BZ” などが有名・海外製では、PE や OLE のデータ構造に対応した “McAfee FileInsight” などが有用
CIDR 計算・現代の TCP/IP では、サブネットの範囲を CIDR 表記と呼ばれる表現で表すのが一般的(例: 192.168.0.0/16)・/ に続く数字が 8の倍数であれば、その範囲がわかりやすいが、それ以外の場合はいちいち計算するのが面倒・CyberChef なら CIDR 表記から IP アドレスの範囲を一発で計算してくれる“Parse IP range” がそれ
CIDR 計算 – ハンズオン・Q05: Private or Public・IPv4 アドレス 172.30.1.1 が 172.16.0.0/12 の範囲に含まれるか調べてください
CIDR 計算 – 代替ツール・インターネット上には計算ツールが多数ある2つ紹介するが他に好みのものがあればそれでも構わない・ネットワーク計算ツールhttps://www.softel.co.jp/labs/tools/network/・CMAN サブネットマスク電卓https://note.cman.jp/network/subnetmask.cgi
URL 抽出・”Extract URLs” で、入力に含まれる URL (http:// や https:// などで始まるもの) を抽出して表示する・いちいち自分で正規表現を書いたりする必要がなく簡単に使える。非常に便利・”Extract IP addresses” も使えるv4・v6 に対応しているほか、ローカル IP アドレスを除外するオプションも付いている・”Extract domains” は微妙。”index.html” のようなものもドメイン扱いしてしまう・そのほか、日付、メールアドレスなどを抽出可能
URL 抽出・”Extract URLs” をはじめとする抽出系と相性のいい Operation をいくつかご紹介・”Filter” : ある語句 (正規表現で指定) を含むものだけに絞る“Invert condition” にチェックを入れれば「ある語句を含まない」ものに絞ることも可能・”Sort” : 並べ替え・”Unique” : 重複を削除・CyberChef はログ分析の類にはあまり適していないが (というか容量の大きなファイル自体苦手)、ごく簡単な処理ならこれらでできることもある
URI 分解・やたらと長くて大量の引数が付いた URI はそのままでは何だかわかりにくい・”Parse URI” を使えば複雑な URI を分解できる・パーセントエンコードも自動で直してくれる
URI 分解・実際に使ってみたところ。元の URI はこれ↓https://elaws.e-gov.go.jp/result?allDocument=0&searchTargetAll=1&searchTextBox=%E7%A0%B4%E7%94%A3&serchSelect=and&searchTarget_array=Constitution%2CAct%2CCabinetOrder%2CImperialOrder%2CMinisterialOrdinance%2CRule&classification_array=%E6%86%B2%E6%B3%95%2C%E5%88%91%E4%BA%8B%2C%E8%B2%A1%E5%8B%99%E9%80%9A%E5%89%87%2C%E6%B0%B4%E7%94%A3%E6%A5%AD%2C%E8%A6%B3%E5%85%89%2C%E5%9B%BD%E4%BC%9A%2C%E8%AD%A6%E5%AF%9F%2C%E5%9B%BD%E6%9C%89%E8%B2%A1%E7%94%A3%2C%E9%89%B1%E6%A5%AD%2C%E9%83%B5%E5%8B%99%2C%E8%A1%8C%E6%94%BF%E7%B5%84%E7%B9%94%2C%E6%B6%88%E9%98%B2%2C%E5%9B%BD%E7%A8%8E%2C%E5%B7%A5%E6%A5%AD%2C%E9%9B%BB%E6%B0%97%E9%80%9A%E4%BF%A1%2C%E5%9B%BD%E5%AE%B6%E5%85%AC%E5%8B%99%E5%93%A1%2C%E5%9B%BD%E5%9C%9F%E9%96%8B%E7%99%BA%2C%E4%BA%8B%E6%A5%AD%2C%E5%95%86%E6%A5%AD%2C%E5%8A%B4%E5%83%8D%2C%E8%A1%8C%E6%94%BF%E6%89%8B%E7%B6%9A%2C%E5%9C%9F%E5%9C%B0%2C%E5%9B%BD%E5%82%B5%2C%E9%87%91%E8%9E%8D%E3%83%BB%E4%BF%9D%E9%99%BA%2C%E7%92%B0%E5%A2%83%E4%BF%9D%E5%85%A8%2C%E7%B5%B1%E8%A8%88%2C%E9%83%BD%E5%B8%82%E8%A8%88%E7%94%BB%2C%E6%95%99%E8%82%B2%2C%E5%A4%96%E5%9B%BD%E7%82%BA%E6%9B%BF%E3%83%BB%E8%B2%BF%E6%98%93%2C%E5%8E%9A%E7%94%9F%2C%E5%9C%B0%E6%96%B9%E8%87%AA%E6%B2%BB%2C%E9%81%93%E8%B7%AF%2C%E6%96%87%E5%8C%96%2C%E9%99%B8%E9%81%8B%2C%E7%A4%BE%E4%BC%9A%E7%A6%8F%E7%A5%89%2C%E5%9C%B0%E6%96%B9%E8%B2%A1%E6%94%BF%2C%E6%B2%B3%E5%B7%9D%2C%E7%94%A3%E6%A5%AD%E9%80%9A%E5%89%87%2C%E6%B5%B7%E9%81%8B%2C%E7%A4%BE%E4%BC%9A%E4%BF%9D%E9%99%BA%2C%E5%8F%B8%E6%B3%95%2C%E7%81%BD%E5%AE%B3%E5%AF%BE%E7%AD%96%2C%E8%BE%B2%E6%A5%AD%2C%E8%88%AA%E7%A9%BA%2C%E9%98%B2%E8%A1%9B%2C%E6%B0%91%E4%BA%8B%2C%E5%BB%BA%E7%AF%89%E3%83%BB%E4%BD%8F%E5%AE%85%2C%E6%9E%97%E6%A5%AD%2C%E8%B2%A8%E7%89%A9%E9%81%8B%E9%80%81%2C%E5%A4%96%E4%BA%8B&lawNo1=&lawNo2=&lawNo3=&lawNo4=&dayPromulgation1_0=&dayPromulgation1_1=&dayPromulgation1_2=&dayPromulgation1_3=&dayPromulgation2_0=&dayPromulgation2_1=&dayPromulgation2_2=&dayPromulgation2_3=&dayPromulgation1=&dayPromulgation2=&lawDayFrom1=0&selectMenu=0&searchBtn=1・どんな引数があって何の値が指定されているか一目でわかるようになった
テキスト比較・大部分一緒なのだが、細部が違う 2つのテキストの差分を知りたい場合がある・CyberChef では “Diff” が使える・”Input” に境界 (Sample delimiter) で区切られた 2つのテキストを入力して BAKE!境界は任意に指定できるので、テキスト中になさそうな文字 (列) を指定するといい
テキスト比較 – ハンズオン・Q06: Moby Dick・Q06 のフォルダを開き、中にある “MD.txt” “MD2.txt” の内容を比較して差分を調べてください・差分の文字をまとめるとメッセージが現れます。そのメッセージが答えです
テキスト比較 – 代替ツール・Windows 環境では “WinMerge” が有名・オンラインでは ”difff” がシンプルで使いやすいhttps://difff.jp/
Code beautify・調査対象のコードが難読化されている場合、力ずくで解読するのは難しい・CyberChef ではコードを読みやすくするため、いくつかの言語について “(○○) beautify”が搭載されている・”Syntax highlighter” も併用するとさらに読みやすくなる
Code beautify – ハンズオン・Q07: Deobfuscate it・Q07 のフォルダにある Javascript コード “JS.txt” を解読し、その動作を明らかにしてくださいJS.txt の中身
Code beautify – 代替ツール・オンラインツールがいろいろ出回っているようだJavascript なら、例えば “Online JavaScript Beautifier”https://beautifier.io/・「○○ beautifier」などで検索すると出てくるかもただしオンラインツールには機微なコード (インシデント関係など) を上げるべきではない
1列→1行・表計算ソフトなどで列 (縦方向) に整理した大量のデータを、1行 (横方向) に並べたい場合があるデータの量によっては手作業でやるのは大変・“Fild / Replace” を使えば一瞬で終了!
1列→1行・例えば、”,” (カンマ) で区切る場合は、改行を , に置換すればいい・”Find / Replace” をレシピにセット、”Find” に “¥n” (¥ はバックスラッシュ) ※を入力このとき、右端の “REGEX (正規表現)” を変更しないこと・”Replace” には “,” を入力すれば OK※うまくいかない場合、¥n を ¥r¥n に変えればうまくいくことがある
1列→1行 – ハンズオン・Q08: Many many IoCs・マルウェアの通信先ドメインのリストを入手しました (という設定)Q08 のフォルダ内の “IoC.txt” がそれ全部で 400個もあります・これらをまとめてフィルタリングソフトにぶち込んでブロックしたいフィルタリングソフトは (禁止ドメイン 1),(禁止ドメイン 2), … と、カンマで区切ってやれば何個でも一気に設定できるものとします・設定を一度で終わらせるため、ドメイン名のリストをカンマで区切られた 1行の形式に変換してください
1行→1列・逆に「特定の文字で区切られた 1行のデータを列に並べなおす」こともできる・やり方は一緒で、”Find / Replace” で区切り文字を改行に変換するだけ・いったん並べてしまえば、”Sort” で並べ替え、”Unique” で重複の削除などもできる
ハッシュ値抽出・URL や IP アドレスと違い、ハッシュ値を抽出するのには少し工夫が必要正規表現 (“Regular expression”) の力を借りる必要がある・MD5・SHA-1・SHA-256 の 3種類のハッシュ値にマッチする正規表現は次のとおり(¥b[0-9a-zA-Z]{32}¥b|¥b[0-9a-zA-Z]{40}¥b|¥b[0-9a-zA-Z]{64}¥b)
Base64 デコード・CyberChef では様々なエンコード・デコードを行えるが、中でもよく使うのが Base64・エンコードは “To Base64” で、デコードは “From Base64” でそれぞれ行える・例えば “5YWl6ZaA44OP44Oz44K644Kq44OzQ3liZXJDaGVm” を Base64 デコードすると“入門ハンズオンCyberChef” になる
Base64 デコード・Base64 は大小英数字と “+”, “/”, “=” からなる文字列それを利用して正規表現にマッチさせることができる・具体的には ”Regular expression” で次のように設定する[0-9a-zA-Z+/=]{30,} これが Base64 の基本形・{30,} の部分は「30文字以上」を表す。この数字は適宜調節する{30,100} のように上限を設けることもできる・これを応用すれば、いろいろ入り混じったデータの中から Base64 部分だけを取り出すことができる・場合によって細かい調整が必要になる場合がある
Base64 デコード・例としてメールデータから添付ファイルを取り出してみる・↓の枠内の部分がエンコードされた添付ファイル。矢印部分から、Base64 エンコードであることがわかる
Base64 デコード・レシピに ”Regular expression” を追加、添付ファイル部分にマッチさせるマッチした部分の確認のため、とりあえず “Output format” を “Highlight matches”(マッチした部分の色を変えて強調) に設定・改行で分かれた部分が全部別物扱いされてしまっていることが色分けからわかる
Base64 デコード・正規表現を [0-9a-zA-Z+/=¥r¥n]{30,} に書き換える (改行を含む文字列にマッチさせる)と改行の問題は解決する・30文字以上では短すぎて関係ない部分にもあちこちマッチしてしまうので、100文字(もっと大きくても大丈夫) に増やす
Base64 デコード・先頭の “kmmqhwyu0” は関係ないのでマッチしないようにしたい正規表現の先頭に “^” (¥b でも可) を追加する完成した正規表現は ^[0-9a-zA-Z+/=¥r¥n]{100,} ※青字は基本形から変更した部分・”Output format” を “List matches” (マッチした部分を抽出) に変更※先頭に変な改行が残っているが、後の “From Base64” はデフォルトで改行を除去する設定になっているので、デコードに支障はない
Base64 デコード・満を持して ”From Base64” を追加するとデコード成功!・フロッピーディスクのアイコンからファイルとして保存もできるし、そのまま CyberChef で分析してもいい
Base64 デコード・先頭の “PK..” から ZIP ファイルの仲間であることが推測できるダメ押しに “Detect File Type” すると MS Office (2007~) ファイルであることが判明・他にもハッシュ値を計算したり文字列や URL などを抽出したり……ファイルを保存せず CyberChef 上だけでもいろいろできることがわかる
Base64 デコード – ハンズオン・Q09: Egg, bacon, sausage and SPAM・不審なファイルが添付された怪しいメールを受信しました (という設定)Q09 のフォルダに入っている “suspicious-mail.eml” がそれです・添付ファイルを CyberChef 上で取り出してください(メーラーで開いて保存すればすぐですが、不審なファイルをむやみに保存したくないですよね……?)・なおこのファイルは、見た目はともかく中身はマルウェアでも何でもないので保存してしまっても害はありません
Office ファイルからの URL の抽出・MS Office 2007 以降のファイルフォーマット (.docx、.xlsx、.pptx など) は、XML 文書と関連ファイルを ZIP 圧縮したもの(2003 以前のファイル形式は OLE2 でまったく異なる)・そのため各種解凍ソフトなどで解凍して直接中身の文書を見たり編集したりできるCyberChef でも “Unzip” で解凍して中身を表示できる
Office ファイルからの URL の抽出・中身の多くは XML ファイル (≒テキストファイル) なので URL などを簡単に抽出できる・実際にやってみると大量に出てくるが、ほとんどはファイルフォーマットに起因する怪しくない URL (microsoft.com や openxmlformats.org など)
Office ファイルからの URL の抽出・これらの正規 URL は分析の邪魔になるのでフィルタ (“Filter”) で除外してしまう・除外リスト- http://schemas.openxmlformats.org- http://schemas.microsoft.com- http://purl.org- http://www.w3.org・”Invert condition” にチェックを入れることまた、”.” はバックスラッシュでエスケープすること(エスケープしないと、”.” は「任意の一文字」にマッチしてしまう)
Office ファイルからの URL の抽出・フィルタリング後に残った URL はファイルフォーマットに起因する URL ではないので、調査する価値があるこのように、調査対象を絞り込むことが可能
Office ファイルからの URL の抽出 – ハンズオン・Q10: Unknown Remarkable Literals・Q09 で取り出した添付ファイルから URL を抽出して、不審な URL を見つけてください・Q09 を事前に実施していない方は Q10 のフォルダに “Suspicious.xlsm” があるのでそれを使ってください
PDF ファイルからの URL の抽出・PDF ファイルは Unzip の必要がなくそのまま抽出できる(実はなんでも抽出できるわけではないが、話が長くなるのでここでは触れない)・Office ファイルと同様多くの PDF ファイルにはファイルフォーマット由来の URL が含まれるので、 フィルタで除外することを推奨- http://www.w3.org- http://ns.adobe.com- http://purl.org・これらのファイルをよく扱うなら、あらかじめ “Extract URLs” と “Filter” をセットしたレシピを作って保存しておくといい
国際化ドメイン名と Punycode・従来ドメイン名はアルファベット、数字、ハイフン、ドットのみで表現されていたが、“ドメイン名例.jp” のようにそれ以外の文字、例えば仮名や漢字も使えるようになったこれを国際化ドメイン名という・国際化ドメイン名はそのままでは DNS が対応できないので、アルファベットや数字の文字列に変換する必要があるその変換形式が “Punycode”・CyberChef は国際化ドメイン名と Punycode でのドメイン名を互いに変換できる“From Punycode” ”To Punycode” を使うどちらも “Internationalised domain name” にチェックを入れておくこと
国際化ドメイン名と Punycode – ハンズオン・Q11: Puny puny・Q10 で” Suspicious.xlsm” から抽出した不審な URL は Punycode で表現されていますこれを元のドメイン名 (国際化ドメイン名) に変換し、怪しいサイトかどうか評価してください・Q10 を事前に実施していない方は、Q11 のフォルダに “URL.txt” があるのでそれに記載の URL を使ってください
分割して処理する・”Fork” は「指定した区切り文字によって入力を分割し、分割後を 1単位として以後の処理を実施させる」働きを持つ Operation・”Split delimiter” で分割のための区切り文字を、”Merge delimiter” で出力時の区切り文字をそれぞれ指定する・例えば “Split delimiter” に “¥n” (改行) を指定すれば、1行ごとに次の処理を行わせることができる・”Fork” で分割されたものを再度まとめるには “Merge” を用いる
分割して処理する・”Fork” は応用の利く機能でいろいろな使い方が考えられるが、例として↓の文字列をデコードしてみよう44GT44KM44GvMeWAi+ebruOBruODluODreODg+OCr+OBp+OBmeOCiA==*44GT44KM44GvMuWAi+ebruOBruODluODreODg+OCr+OBoOOCiA==*44GT44KM44GvM+WAi+ebruOBruODluODreODg+OCr+OBp+OBlOOBluOBhOOBvuOBmQ==*44GT44KM44GvNOWAi+ebruOBruODluODreODg+OCr+OBoOOBnA==*44GT44KM44GvNeWAi+ebruOBruODluODreODg+OCr+OBoOOBo+OBpuOBlQ==*44GT44KM44GvNuWAi+ebruOBruODluODreODg+OCr+OBoOOCuuODqQ==*44GT44KM44GvN+WAi+ebruOBruODluODreODg+OCr+OBoOOBo+OBpuOBsA==*44GT44KM44GvOOWAi+ebruOBruODluODreODg+OCr+OBp+OBguOCiw==*44GT44KM44GvOeWAi+ebruOBruODluODreODg+OCr+OBp+OBlOOCj+OBmQ==*44GT44KM44GvMTDlgIvnm67jga7jg5bjg63jg4Pjgq/jgojjgIHli5jpgZXjgYTjgZfjgarjgYTjgafjgojjga3vvIE=・この文字列は Base64 エンコードされた各ブロックが “*” で連結されているものそのまま Base64 デコードしようとしてもうまくいかない各ブロックごとにデコードする必要がある
分割して処理する・”Fork” をレシピにセット、”Split delimiter” に “*”、“Merge delimiter” に “¥n” (改行) をそれぞれ指定・続いて “From Base64” をセットするとブロックごとにデコードできる
分割して処理する – ハンズオン・Q12: The fork in the left hand・マルウェア (ダウンローダ) が実行する PowerShell スクリプトを 10種類入手しました(という設定)Q12 のフォルダに入っている “ps.txt” がそれです・このスクリプトを解読し、マルウェアの通信先 URL をすべて特定してください・PowerShell のオプション “-enc” は “-EncodedCommand” を省略して表現したもので、Base64 エンコードされた文字列をコマンドとして実行する働きをもちます
解答編
Q01 – Hash me!・”Generate all hashes” を使うのが簡単
Q01 – Hash me!・もちろん専用の Operation で個別に求めてもいい・解答MD5: f221a4ccafec690101c59f726c95b646SHA-1: 2098e4b62eaab213cbee73ba40fe4f1b8901a782SHA-256: 94aa32a2c9c1d2db78318d9c68262c2f834abe26b6e9a661700324b55fdd5709
Q02 – Detect me!・解答00.nanikore: PE (Portable Executable, Windows 実行ファイル)マジックナンバー “4D 5A” (MZ) が目印
Q02 – Detect me!・余談 (というかどうでもいい話)ハッシュ値を計算して調べるとわかるが、これは Windows 標準の “Notepad.exe”
Q02 – Detect me!・01.nanikore“Detect File Type” では MS Office (2007~) ファイルのいずれかというところまでしかわからない(他の判定ツールの中にはズバリで特定できるものもあるので各自試してみてください)
Q02 – Detect me!・01.nanikore試しに “Unzip” してみると “word/(なんとか).xml” という XML ファイルが複数見つかることから、MS Word で作成されたことがわかる解答: DOCX ファイル (MS Word 2007~)
Q02 – Detect me!・02.nanikore“Detect File Type” してみると、これまた MS Office (~2003) ファイルのいずれかということまでしかわからない
Q02 – Detect me!・02.nanikore手がかりを得るため “Strings” をかけてみると、作成したソフトの名前がそのまま記載されているのが見つかる解答: DOC ファイル (MS Word ~2003)
Q02 – Detect me!・余談 (というかどうでもいい話)01.nanikore と 02.nanikore の拡張子をそれぞれ .docx、.doc に変更して Word などのソフトで見るとわかるが、実は両者は文書としての見た目はまったく同じものしかしファイルフォーマットはまったく異なるいくつも問題ファイルを作るのが面倒だったので流用しただけ01.docx 02.doc
Q02 – Detect me!・解答03.nanikore: PDFマジックナンバー “25 50 44 46” (%PDF) があるので直接見てもわかりやすい
Q02 – Detect me!・解答04.nanikore: PNGマジックナンバー “89 50 4E 47 0D 0A 1A 0A” (.PNG….) は SHIFT-JIS では “臼NG….” になる
Q02 – Detect me!・余談”Render Image” をレシピに入れれば画像を描画できる“Play Media” なら動画や音声ファイルも再生可能 (ただし容量のデカいファイルは苦手)右下はオープンソースのセキュリティアニメ「こうしす!」の CM※ を再生したところ※ https://www.nicovideo.jp/watch/so30343184 面白いし勉強にもなるので個人的におすすめのシリーズ
Q02 – Detect me!・05.nanikore“Detect File Type” は何も見つけられず、「暗号化か圧縮されてるんじゃね」的なことを言ってるがまずは落ち着いて中身を見てみよう
Q02 – Detect me!・05.nanikore実際の中身はこれだけ最初の “!#/bin/bash” はシェルスクリプトの先頭に記載される「シバン」というもの(知らなくてもググればすぐわかる)解答: シェルスクリプト (テキストファイルでも間違いではないが、△)
Q03 – picoCTF 2019 から “Glory of the Garden”・一見単なる庭の写真だが、このファイルの中にフラグが隠されている
Q03 – picoCTF 2019 から “Glory of the Garden”・フラグを見つけるの自体はごく簡単で、”Strings” の結果の最後に含まれているフラグの書式から、”picoCTF{}” の 9文字+中身で 10文字以上になることがわかっているので、最初からある程度大きな文字数で調べることができる (図では 12文字)解答:picoCTF{more_than_m33ts_the_3y3eBdBd2cc}
Q03 – picoCTF 2019 から “Glory of the Garden”・TIPSフラグの形式が最初から分かっているので、それで “Filter” してしまえば目 grep も必要なくて楽
Q03 – picoCTF 2019 から “Glory of the Garden”・余談JPEG ファイルは “FF D8” から始まり “FF D9” で終わるように定められている (らしい)(“FF D9” 以降にデータを記録することもできるが画像ビューアには無視される)本ファイルのフラグが隠されているのはまさに “FF D9” の直後からなので、本来の画像の後ろに後から付け足したということそのため画像ビューアで見ても何も見つからないのだが、本来不自然な状態ではあるので、それを検出できるツールもある青い空を見上げればいつもそこに白い猫
Q04 – Message from Hex・”To Hexdump” を使うと答えが見える。Strings などではダメ解答: リア充爆発
Q05 – Private or Public・”Parse IP range” を使うと、172.16.0.0/12 の範囲は 172.16.0.0 から 172.31.255.255の間とわかる。172.30.1.1 はこの範囲内である解答: 含まれる・172.16.0.0/12 はクラス B のプライベートアドレスの範囲
Q06 – Moby Dick・”MD.txt” の中身を “Input” にコピペした後、境界となる任意の文字列を置いて”MD2.txt” の中身を再びコピペ (順番は逆でもOK) し ”Diff” をレシピにセット・境界文字列は何でもいいが、同じ文字列がテキスト中に存在すると失敗してしまうので、なるべく「なさそう」なものを設定しよう図では “====” にした
Q06 – Moby Dick・2つのテキストの差分にあたる文字には色が付いている上から抜き出せばそのまま答えになっている解答: Diff is useful.
Q07 – Deobfuscate it・元のコードは短いが、ワンライナーで構造がつかみにくいうえ、文字が 16進数に変換されており、人間が読むにはちょっと苦しい・”Javascript Beautify” と “Syntax highlighter” を使うとぐっと読みやすくなる
Q07 – Deobfuscate it・整形後のコードは、大雑把に言って 3つの部分に分かれている- 配列 “_0xcb2d” の定義- 関数 “hi()” の定義- 関数 “hi()” を実行
Q07 – Deobfuscate it・関数 “hi()” は配列 “_0xcb2d” の要素を使って定義しているが、要するに“console.log(‘Hello World!’)” という処理をしているだけのようだ・”console.log” は渡された値をブラウザのコンソールに表示するメソッド (ググればわかる)解答: ブラウザのコンソールに “Hello World!” という文字列を表示する
Q07 – Deobfuscate it・余談 (というかどうでもいい話)・難読化する前のコードはこれ
Q08 – Many many IoCs・テキストとして Input した場合レシピに “Find / Replace” を追加、”Find” に “¥n”、”Replace” に “,” をそれぞれ設定解答:長すぎるので略
Q08 – Many many IoCs・ファイルそのものを Input した場合レシピに “Find / Replace” を追加、”Find” に “¥r¥n”、”Replace” に “,” をそれぞれ設定解答:長すぎ(ry
Q09 – Egg, bacon, sausage and SPAM・添付ファイルは Base64 でエンコードされている“ms-excel.sheet.macroEnabled” とか “filename=”Suspicious.xlsm“” とかのメタデータからMS Excel のマクロ有効化ブックっぽいなと当たりがつけられる添付ファイルのデータ
Q09 – Egg, bacon, sausage and SPAM・”Regular expressuion” を使って正規表現で Base64 部分を抽出するのは実践編と一緒まったく一緒でも芸がないのでここでは先頭に残ってしまった余計なデータを除去する別の方法をご紹介この部分が残ってしまった……
Q09 – Egg, bacon, sausage and SPAM・方法1“Drop bytes” で無理矢理余計な部分を削除する“Length” には 13※ を設定する※改行コードが残っててもデコードに支障はないので、9~12 でも可
Q09 – Egg, bacon, sausage and SPAM・方法2“Tail” を使う“Tail” は本来最後の n 行を取り出す Operation だが、”Number” にマイナスの値 (-n) を設定すると、先頭の n 行以外の部分を取り出すことができるこれを利用して、-2※ を設定すると余計な部分を除去できる※改行コードが残っててもデコードに支障はないので、-1 でも可
Q09 – Egg, bacon, sausage and SPAM・どれかしらの方法で過不足なく Base64 エンコード部分を抽出できたら、”From Base64”でデコード解答: 下画像の “Output” 部分に見えてるやつ・Q10 に続く……
Q09 – Egg, bacon, sausage and SPAM・余談 (というかどうでもいい話)・”suspicious-mail.eml” をメーラーで開いた状態控えめに言って怪しさしかない
Q10 – Unknown Remarkable Literals・Q09 の続き (用意されたファイルを使っても OK)・デコードした添付ファイルは MS Office (2007~) である (ファイルの先頭が “PK..” であることからも、ZIP 系のファイルであることがわかる)これはデコード前にメタデータから推測したことと整合的である
Q10 – Unknown Remarkable Literals・MS Office (2007~) であれば “Unzip” で中身の XML ファイルなどを取り出せる・さらに “Extract URLs” で URL を抽出
Q10 – Unknown Remarkable Literals・出てきた URL の大部分は、openxmlformats.org などファイルフォーマットに起因する不審でない URL。これらを “Filter” で除くと楽・Filter なり目 grep なり使って探すと、正体不明の URL が1個だけ発見できる解答: http://xn--ihq082e.site/maliciouspage.php・Q11 に続く……
Q11 – Puny puny・Q10 の続き(用意された URL を使っても OK)・Q10 で発見された謎の URL はドメイン名が “xn--” で始まることから、Punycode で表現されていることがわかる国際化ドメイン名に直せば何か情報が得られるかもしれない
Q11 – Puny puny・後の処理のためにドメイン名部分だけを取り出す。コピペして新しく Input に入れても OKだが、ここでは前回のレシピにそのままつなげるためちょっと工夫するやり方は一例で、他にもいろいろ方法はあるはず・”Extract domains” でドメイン名を取り出す。ところが、ドメイン名ではない部分“maliciouspage.php” も取り出されてしまうこの部分はいらない……
Q11 – Puny puny・”Head” で 1行目だけ取り出す“Head” は “Tail” の逆で、先頭から n 行を取り出す Operation今回は先頭行だけ残したいので、”Number” には 1 を設定
Q11 – Puny puny・”From Punycode” をレシピに追加“Internationalised domain name” に必ずチェックを入れること・”xn--ihq082e.site” は “不正.site” という国際化ドメイン名になることがわかるまあ、名前的に不正サイトなんでしょうね※……解答: 不正.site (不正サイトという設定)※実際には “不正.site” はこういうときの例示用に取得されたドメインで、本物の不正サイトではなくアクセスしても無害
Q11 – Puny puny・余談この不審な URL がどこに書き込まれていたのかというと、実は VBA コード中のコメントよってユーザの意図に反してこの URL にアクセスすることは基本的にない・URL 抽出は簡単で強力だが、「抽出されたものがどこにある何でどういう働きをするのか」はきちんと確認すべきマルウェアの場合、わざと目につきやすいところにダミーアドレスが混ぜてあることもあるそうだコメントなので、プログラムとして動作しない
Q12 – The fork in the left hand・”ps.txt” には “Powershell -w hidden -enc (Base64 エンコードされたコマンド)” のコマンド列が 10個入っているBase64 エンコードされている部分をまずデコードする必要がある・当該部分を力ずくでコピペしてもいいが、”Regular expression” で Base64 部分を取り出すと楽※図では Input にファイル”ps.txt” を指定しているが、内容を Input にコピペしても OK
Q12 – The fork in the left hand・1行ごとにデコードするため、”Fork” をレシピにセット (delimiter は両方とも “¥n” )・続いて ”From Base64” でデコードすると難読化されたコマンド列が出てくる
Q12 – The fork in the left hand・難読化のためにやたらと挿入されている「`」と「”+”」 を “Find / Replace” で削除・個別に消してもいいが、今回は置換先の文字列が同じ (というか「ない」) なので、正規表現を用いて “(`|”¥+”)” と指定すれば一発で全部消すことができる
Q12 – The fork in the left hand・あとは “Extract URLs” で抽出すれば終了解答: http://127.0.0.1/virus.exehttp://127.0.0.2/malicious.exehttp://127.0.0.3/iwas.exehttp://127.0.0.4/verytired.exehttp://127.0.0.5/tomake.exehttp://127.0.0.6/this.exehttp://127.0.0.7/sample.exehttp://127.0.0.8/question.exehttp://127.0.0.9/tsukareta.exehttp://127.0.0.10/otsukaresamadeshita.exe※全部ローカルループバックアドレス (として予約されたアドレス) なので実際にはアクセスしても何も落ちてはこない
まとめ・CyberChef は誰でも気軽に使えるうえ、工夫次第でいろいろできる強力なツール・本資料では小技の類に終始したが、使いこなせば本格的なマルウェアの難読化などにも対処できる・ぜひ各自で創意工夫のうえ、いいレシピができたら共有してください
Make Your Own Recipe!!