CyberChef について34個のユースケースをまとめた記事が紹介されていました。 ひとつひとつ試していて改めて CyberChef 面白いなぁと思った操作についていくつかメモしました。
処理の制御
Fork
Fork は、指定された区切り文字に基づいて入力データを分割し、その分割された単位に対して Fork より後に置かれた操作を適用していく操作です。 操作された結果は指定した結合文字に基づいてマージされた状態で出力されます。
例えば以下に示すように、区切り文字(split)と結合文字(merge)の両方に改行コードを指定することで、1行ごとにデータ操作をしていくといったことが可能になります。
Fork を無効にすると入力全体に対して操作が実行されることが分かります。
区切り文字と結合文字は別々にすることが可能で、例えば区切り文字に改行コードを指定し、結合文字をカンマにすると1行ずつ処理した結果をカンマで結合して出力といった操作も可能です。 なお、Fork の影響は後続の操作すべてに及びますが、Merge によって閉じることができます。
- 例示レシピ
[{"op":"Fork","args":["\\n","\\n",false]},{"op":"To Base64","args":["A-Za-z0-9+/="]}]
Merge
Fork の影響を閉じる役割を持つ操作です。
例えば 1行ずつ操作したあとで、それらをまとめて MD5 にすることができます。
Merge を無効にすると MD5 の操作も1行ずつ実行されてしまっていることが分かります。
- 例示レシピ
[{"op":"Fork","args":["\\n","\\n",false]},{"op":"To Base64","args":["A-Za-z0-9+/="]},{"op":"Merge","args":[]},{"op":"MD5","args":[]}]
Label
条件付きジャンプや固定ジャンプのジャンプ先として使用します。 詳細は Jump の説明を参照ください。
Jump
指定したラベルに戻って操作を繰り返すことができます。ジャンプする回数が指定できるので、単純に指定回数だけループしたい場合に利用できます。
例えば base64 を5回ほど繰り返す場合の例は以下の通りです。
- 例示レシピ
[{"op":"Label","args":["muzan"]},{"op":"From Base64","args":["A-Za-z0-9+/=",true]},{"op":"Jump","args":["muzan",4]}]
- 例示データ
Vm0xd1MySXlVbkppUld4V1lteHdjRlZxUmtkaWJIQlhXWHBXVGxaWGVFcFdWelZoVTJ4T1JrNVVUbGhpUjFKSVdUSjRRMDB5VGtaUFYwWllVbTVDZWxkVVNuTlJNbEowVkd0b1YySnNXa3RWTUdRMFRXeHdSMkZGY0dGTmEzQlpWREZTUjJFeFNYbGFSelZhWVd0d1lWZHFTbGRYUlRsVlVtMXdhRlpWYjNsWGExSktUVVp2ZUdKR2FGVmlXRUp3VkZSQ2QyTnNVa2hpUlVwVVRWVmFXVlJzYUhkaE1ERnpWMnBXVkZaWFRURmFSbVJMVTFkRmVWcEhkRTVpVjJoMlYydFdUMUV4VG5KaVJXaFRZbTVDYjFwV1ZrdE5iR1IwWWtWT1QxWXdiRFpXYkdoV1VGRTlQUT09
Conditional Jump
指定したラベルに戻って操作を繰り返すことができます。入力に対して正規表現で条件を指定することができ、一致する場合/一致しない場合にジャンプするといった操作が可能です。また、繰り返しの最大回数を指定できます。
以下は Answer という文字列が入力に現れるまでジャンプを繰り返す場合の例です。
- 例示レシピ
[{"op":"Label","args":["muzan"]},{"op":"From Base64","args":["A-Za-z0-9+/=",true]},{"op":"Conditional Jump","args":["Answer",true,"muzan",100]}]
バイナリ操作
Swap endianness
入力データをビッグエンディアンからリトルエンディアン、またはその逆に切り替える操作。 データは16進数または生のバイトで読み込むことができ、入力されたものと同じ形式で返されます。
Take bytes
入力データから指定されたバイト数のスライスを出力する操作。 負の値を使用することもでき、その場合はデータの末尾から指定のバイト数のスライスを出力します。
Disassemble x86
入力データをディスアセンブルする操作。
Remove null bytes
入力データからNULL バイトを取り除く操作です。 バイナリを ASCII 文字として出力したときにこの操作を使うことで無用な NULL 文字を取り除くことができます。
- 例示レシピ
[{"op":"From Base64","args":["A-Za-z0-9+/=",true]},{"op":"From Hex","args":["Auto"]},{"op":"Remove null bytes","args":[]}]
- 例示データ
NTcwMDY4MDA2ZjAwMjAwMDc0MDA2ZjAwNmMwMDY0MDAyMDAwNzkwMDZmMDA3NTAwMjAwMDc0MDA2ZjAwMjAwMDczMDA3MDAwNjUwMDYxMDA2YjAwM2YwMDBhMDA0ZTAwNjUwMDc2MDA2NTAwNzIwMDIwMDA2ZjAwNzAwMDY1MDA2ZTAwMjAwMDc5MDA2ZjAwNzUwMDcyMDAyMDAwNmQwMDZmMDA3NTAwNzQwMDY4MDAyMDAwNmYwMDY2MDAyMDAwNzkwMDZmMDA3NTAwNzIwMDIwMDA2ZjAwNzcwMDZlMDAyMDAwNjEwMDYzMDA2MzAwNmYwMDcyMDA2NDAwMmUwMDIwMDAwYTAwNDEwMDZlMDA3MzAwNzcwMDY1MDA3MjAwMjAwMDZmMDA2ZTAwNmMwMDc5MDAyMDAwNzcwMDY4MDA2MTAwNzQwMDIwMDA0OTAwMjAwMDYxMDA3MzAwNmIwMDIwMDA2ZjAwNjYwMDIwMDA3OTAwNmYwMDc1MDAyZQ==
To Hexdump
入力データを Hexdump 形式で出力する操作です。
From Hexdump
入力データを Hexdump 形式で読み取り ASCII 文字列として出力する操作です。
Microsoft Script Decoder
Microsoft のカスタムエンコーディングでエンコードされた Microsoft Encoded Script ファイルをデコードします。
これらのファイルは多くの場合、VBS (Visual Basic Script) ファイルがエンコードされて .vbe
拡張子でリネームされていたり、
JS (JScript) ファイルが .jse
拡張子でリネームされていたりします。 (とのこと。機械翻訳)
- 例示データ
#@~^RQAAAA==-mD~sX|:/TP{~J:+dYbxL~@!F@*@!+@*@!&@*eEI@#@&@#@&.jm.raY 214Wv:zms/obI0xEAAA==^#~@
圧縮・展開
Raw Inflate
deflate アルゴリズムを使用して圧縮されたデータをヘッダなしで展開します。
Gunzip
deflate アルゴリズムで圧縮されたデータを gzip ヘッダで展開します。
Zlib Inflate
deflate アルゴリズムで圧縮されたデータを zlib ヘッダで解凍します。
Unzip
PKZIPアルゴリズムを使用してデータを解凍し、ファイルごとに表示します。 パスワード付きの場合でも対応しています。
URL操作
Extract URLs
入力からURLを抽出します。抽出にはプロトコル (http, ftp など) が必要です。
Extract Domains
入力からドメイン形式の文字列を抽出します。
Defang URL
入力にあるURLを「Defangs」します。つまり、URLが無効になり、悪意のあるリンクを誤ってクリックしてしまうリスクを無力化します。 これは、悪意のあるリンクやIOCを扱う場合によく使用されます。
正規表現・文字列検索置換など
具体的な使い方は冒頭でも触れた以下のサイトが参考になります。
- GitHub - mattnotmax/cyberchef-recipes: A list of cyber-chef recipes and curated links
https://github.com/mattnotmax/cyberchef-recipes
Find / Replace
入力データに文字列置換をする操作です。 検索文字列には正規表現に加えて、単純な文字列、拡張文字列(\n、\r、\t など)に対応しています。
Regular expression
入力データを検索するために正規表現を利用します。事前に定義されたパターンのリストから選択することもできます(IPv4 形式など)。
Register
入力からデータを抽出し、それをレジスタに格納し、引数として後続の操作に渡すことができます。
その他
HTTP request
HTTP リクエストを行い、レスポンスを返します。この操作は、GET、POST、PUTなどの異なる HTTP メソッドをサポートしています。
ヘッダは、 Key: Value
の形式で一行ずつ追加することができます。
レスポンスのステータスコードと公開されているヘッダの限定された選択は、「Show response metadata」オプションをチェックして表示することができます。 セキュリティ上の理由から、ブラウザによって公開されるレスポンスヘッダは限られています。
Generic Code Beautify
C, C++, C#, Java, PHP, JavaScript などの C スタイルの言語を清書します。 なお、完全に動作するとは限らず、結果として得られるコードも動作しなくなる可能性があると注意書きがされていました。
JSON Beautify
JSON コードのインデントとプリティッティングを行います。
From Base
与えられた数値ベースから10進数に変換します。
Extract EXIF
画像からEXIFデータを抽出します。
EXIFデータは、画像(JPEG、JPG、TIFF)や音声ファイルに埋め込まれたメタデータです。
Head
UNIXのヘッドユーティリティのような操作。最初の n 行を取得します。
n に負の値を入力することで、最後の n 行以外のすべての行を選択することができます。
区切り文字を変更して、行の代わりにカンマなどを指定することもできます。
Remove whitespace
入力データから空白文字を取り除く操作です。
参考文献
GitHub - mattnotmax/cyberchef-recipes: A list of cyber-chef recipes and curated links
https://github.com/mattnotmax/cyberchef-recipesGitHub - gchq/CyberChef: The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis
https://github.com/gchq/CyberChef
更新履歴
- 2021/02/08 新規作成
- 2021/02/08 画像と例示データが壊滅的に誤っていたのを修正