Cryptographic/Compression Algorithms
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
コードが右シフトと左シフト、XORおよびいくつかの算術演算を使用している場合、それは暗号化アルゴリズムの実装である可能性が高いです。ここでは、各ステップを逆にすることなく使用されているアルゴリズムを特定する方法をいくつか示します。
CryptDeriveKey
この関数が使用されている場合、第二のパラメータの値を確認することで使用されているアルゴリズムを見つけることができます:
可能なアルゴリズムとその割り当てられた値の表はここで確認できます:https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
RtlCompressBuffer/RtlDecompressBuffer
指定されたデータバッファを圧縮および解凍します。
CryptAcquireContext
ドキュメントから:CryptAcquireContext関数は、特定の暗号サービスプロバイダー(CSP)内の特定のキーコンテナへのハンドルを取得するために使用されます。この返されたハンドルは、選択されたCSPを使用するCryptoAPI関数への呼び出しで使用されます。
CryptCreateHash
データストリームのハッシュを開始します。この関数が使用されている場合、第二のパラメータの値を確認することで使用されているアルゴリズムを見つけることができます:
可能なアルゴリズムとその割り当てられた値の表はここで確認できます:https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
時には、特別でユニークな値を使用する必要があるため、アルゴリズムを特定するのが非常に簡単です。
最初の定数をGoogleで検索すると、次のような結果が得られます:
したがって、逆コンパイルされた関数はsha256計算機であると推測できます。 他の定数を検索すると(おそらく)同じ結果が得られます。
コードに重要な定数がない場合、.dataセクションから情報を読み込んでいる可能性があります。 そのデータにアクセスし、最初のDWORDをグループ化し、前のセクションで行ったようにGoogleで検索できます:
この場合、0xA56363C6を検索すると、AESアルゴリズムのテーブルに関連していることがわかります。
3つの主要な部分で構成されています:
初期化ステージ/:0x00から0xFFまでの値のテーブル(合計256バイト、0x100)を作成します。このテーブルは一般に置換ボックス(またはSBox)と呼ばれます。
スクランブリングステージ:前に作成したテーブルをループし(0x100回のイテレーションのループ)、各値を半ランダムなバイトで修正します。この半ランダムなバイトを作成するために、RC4キーが使用されます。RC4キーは1バイトから256バイトの長さである可能性がありますが、通常は5バイト以上を推奨します。一般的に、RC4キーは16バイトの長さです。
XORステージ:最後に、平文または暗号文は前に作成した値とXORされます。暗号化と復号化の関数は同じです。これには、作成された256バイトを必要に応じて何度もループします。これは通常、逆コンパイルされたコードで**%256(mod 256)**として認識されます。
逆アセンブル/逆コンパイルされたコードでRC4を特定するには、サイズ0x100の2つのループ(キーを使用)を確認し、その後、2つのループで前に作成された256の値と入力データのXORを行うことを確認します。おそらく%256(mod 256)を使用します。
置換ボックスとルックアップテーブルの使用
特定のルックアップテーブル値(定数)の使用によりAESを区別することが可能です。注意:定数はバイナリに保存されるか、 _動的に作成される可能性があります。
暗号化キーは16で割り切れる必要があります(通常32B)し、通常は16BのIVが使用されます。
それを使用するマルウェアはあまり見られませんが、例(Ursnif)があります。
アルゴリズムがSerpentかどうかは、その長さ(非常に長い関数)に基づいて簡単に判断できます。
次の画像では、定数0x9E3779B9が使用されていることに注意してください(この定数はTEA(Tiny Encryption Algorithm)などの他の暗号アルゴリズムでも使用されています)。 また、ループのサイズ(132)と逆アセンブル命令およびコード例におけるXOR操作の数にも注意してください:
前述のように、このコードは非常に長い関数として任意の逆コンパイラ内で視覚化できます。内部にジャンプがないためです。逆コンパイルされたコードは次のように見えることがあります:
したがって、マジックナンバーと初期XORを確認し、非常に長い関数を見て、長い関数のいくつかの命令を実装と比較することでこのアルゴリズムを特定することが可能です(例えば、7ビット左シフトと22ビット左回転)。
対称アルゴリズムよりも複雑です。
定数はありません!(カスタム実装は特定が難しい)
KANAL(暗号アナライザー)はRSAに関するヒントを示すことができず、定数に依存しています。
行11(左)には+7) >> 3
があり、行35(右)には+7) / 8
があります。
行12(左)はmodulus_len < 0x040
を確認しており、行36(右)はinputLen+11 > modulusLen
を確認しています。
3つの関数:Init、Update、Final
初期化関数が似ています。
Init
定数を確認することで両方を特定できます。sha_initにはMD5にはない1つの定数があります:
MD5 Transform
より多くの定数の使用に注意してください。
より小さく、データの偶発的な変更を見つけるために効率的です。
ルックアップテーブルを使用します(したがって、定数を特定できます)。
ルックアップテーブル定数を確認してください:
CRCハッシュアルゴリズムは次のようになります:
認識可能な定数はありません。
アルゴリズムをPythonで書いて、オンラインで類似のものを検索してみることができます。
グラフはかなり大きいです:
それを認識するための3つの比較を確認してください:
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)