setodaNote

忘れる用のメモ書き for Cybersecurity

CyberChef のオペレーションめも

CyberChef について34個のユースケースをまとめた記事が紹介されていました。 ひとつひとつ試していて改めて CyberChef 面白いなぁと思った操作についていくつかメモしました。

処理の制御

Fork

Fork は、指定された区切り文字に基づいて入力データを分割し、その分割された単位に対して Fork より後に置かれた操作を適用していく操作です。 操作された結果は指定した結合文字に基づいてマージされた状態で出力されます。

例えば以下に示すように、区切り文字(split)と結合文字(merge)の両方に改行コードを指定することで、1行ごとにデータ操作をしていくといったことが可能になります。

f:id:soji256:20210208212453p:plain
1行ごとにデータ操作がされる例

f:id:soji256:20210208212729p:plain
Fork の動作イメージ

Fork を無効にすると入力全体に対して操作が実行されることが分かります。

f:id:soji256:20210208212509p:plain
Fork を無効にした場合の出力

区切り文字と結合文字は別々にすることが可能で、例えば区切り文字に改行コードを指定し、結合文字をカンマにすると1行ずつ処理した結果をカンマで結合して出力といった操作も可能です。 なお、Fork の影響は後続の操作すべてに及びますが、Merge によって閉じることができます。

  • 例示レシピ
[{"op":"Fork","args":["\\n","\\n",false]},{"op":"To Base64","args":["A-Za-z0-9+/="]}]

Merge

Fork の影響を閉じる役割を持つ操作です。

例えば 1行ずつ操作したあとで、それらをまとめて MD5 にすることができます。

f:id:soji256:20210208212340p:plain
Fork された操作の結果の MD5 を計算する例

Merge を無効にすると MD5 の操作も1行ずつ実行されてしまっていることが分かります。

f:id:soji256:20210208212359p:plain
Mergeを無効にした場合の出力

  • 例示レシピ
[{"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回ほど繰り返す場合の例は以下の通りです。

f:id:soji256:20210208212847p:plain
Base64 を5回繰り返し適用する場合の例

  • 例示レシピ
[{"op":"Label","args":["muzan"]},{"op":"From Base64","args":["A-Za-z0-9+/=",true]},{"op":"Jump","args":["muzan",4]}]
  • 例示データ
Vm0xd1MySXlVbkppUld4V1lteHdjRlZxUmtkaWJIQlhXWHBXVGxaWGVFcFdWelZoVTJ4T1JrNVVUbGhpUjFKSVdUSjRRMDB5VGtaUFYwWllVbTVDZWxkVVNuTlJNbEowVkd0b1YySnNXa3RWTUdRMFRXeHdSMkZGY0dGTmEzQlpWREZTUjJFeFNYbGFSelZhWVd0d1lWZHFTbGRYUlRsVlVtMXdhRlpWYjNsWGExSktUVVp2ZUdKR2FGVmlXRUp3VkZSQ2QyTnNVa2hpUlVwVVRWVmFXVlJzYUhkaE1ERnpWMnBXVkZaWFRURmFSbVJMVTFkRmVWcEhkRTVpVjJoMlYydFdUMUV4VG5KaVJXaFRZbTVDYjFwV1ZrdE5iR1IwWWtWT1QxWXdiRFpXYkdoV1VGRTlQUT09

Conditional Jump

指定したラベルに戻って操作を繰り返すことができます。入力に対して正規表現で条件を指定することができ、一致する場合/一致しない場合にジャンプするといった操作が可能です。また、繰り返しの最大回数を指定できます。

以下は Answer という文字列が入力に現れるまでジャンプを繰り返す場合の例です。

f:id:soji256:20210208212912p:plain
Answer という単語が出現するまで Jump を繰り返す例

  • 例示レシピ
[{"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 文字を取り除くことができます。

f:id:soji256:20210208213206p:plain
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 拡張子でリネームされていたりします。 (とのこと。機械翻訳)

f:id:soji256:20210207233915p:plain
例示されていたサンプル

  • 例示データ
#@~^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アルゴリズムを使用してデータを解凍し、ファイルごとに表示します。 パスワード付きの場合でも対応しています。

f:id:soji256:20210207234406p:plain:w464
Unzip 操作

URL操作

Extract URLs

入力からURLを抽出します。抽出にはプロトコル (http, ftp など) が必要です。

Extract Domains

入力からドメイン形式の文字列を抽出します。

Defang URL

入力にあるURLを「Defangs」します。つまり、URLが無効になり、悪意のあるリンクを誤ってクリックしてしまうリスクを無力化します。 これは、悪意のあるリンクやIOCを扱う場合によく使用されます。

f:id:soji256:20210207234943p:plain
Defang URL 操作

正規表現・文字列検索置換など

具体的な使い方は冒頭でも触れた以下のサイトが参考になります。

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)や音声ファイルに埋め込まれたメタデータです。

UNIXのヘッドユーティリティのような操作。最初の n 行を取得します。

n に負の値を入力することで、最後の n 行以外のすべての行を選択することができます。

区切り文字を変更して、行の代わりにカンマなどを指定することもできます。

Remove whitespace

入力データから空白文字を取り除く操作です。

参考文献

更新履歴

  • 2021/02/08 新規作成
  • 2021/02/08 画像と例示データが壊滅的に誤っていたのを修正