hacktricks/cryptography/electronic-code-book-ecb.md

6.6 KiB

{% hint style="success" %} AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングの学習と練習: HackTricks Training GCP Red Team Expert (GRTE)

HackTricksのサポート
{% endhint %}

ECB

(ECB) Electronic Code Book - 同じブロックのクリアテキストを暗号文のブロックで置き換える対称暗号化スキーム。これは最も単純な暗号化スキームです。主なアイデアは、クリアテキストをNビットのブロック(入力データのブロックサイズ、暗号化アルゴリズムに依存)に分割し、その後、唯一の鍵を使用して各クリアテキストブロックを暗号化(復号化)することです。

ECBを使用すると、複数のセキュリティ上の影響があります:

  • 暗号化されたメッセージからブロックを削除できる
  • 暗号化されたメッセージからブロックを移動できる

脆弱性の検出

アプリケーションに複数回ログインし、常に同じクッキーを取得すると想像してください。これは、アプリケーションのクッキーが**<username>|<password>であるためです。
次に、同じ長いパスワードを持つ新しいユーザーを2人生成し、ほぼ同じ
ユーザー名を持つようにします。
両方のユーザーの情報が同じ
8バイトのブロックであることがわかります。その後、これがECBが使用されている**ためかもしれないと考えます。

次の例のように、これらの2つのデコードされたクッキーには、何度もブロック**\x23U\xE45K\xCB\x21\xC8**が含まれていることに注意してください。

\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9

\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9

これは、クッキーのユーザー名とパスワードには、複数回文字 "a" が含まれていたためです。異なるブロックは、少なくとも1つの異なる文字(おそらく区切り記号 "|" またはユーザー名に必要な違い)を含んでいました。

さて、攻撃者は、フォーマットが <ユーザー名><区切り記号><パスワード> または <パスワード><区切り記号><ユーザー名> であるかどうかを見つける必要があります。そのために、彼は単に類似して長いユーザー名とパスワードを持つ複数のユーザー名を生成し、フォーマットと区切り記号の長さを見つけるまで続けます:

ユーザー名の長さ: パスワードの長さ: ユーザー名+パスワードの長さ: デコード後のクッキーの長さ:
2 2 4 8
3 3 6 8
3 4 7 8
4 4 8 16
7 7 14 16

脆弱性の悪用

ブロック全体の削除

クッキーのフォーマットを知っている場合(<ユーザー名>|<パスワード>)、ユーザー名 admin をなりすますために、aaaaaaaaadmin という新しいユーザーを作成し、クッキーを取得してデコードします:

\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4

私たちは、以前に単に a を含むユーザー名で作成されたパターン \x23U\xE45K\xCB\x21\xC8 を見ることができます。
次に、最初の8Bのブロックを削除すると、ユーザー名 admin 用の有効なクッキーが得られます:

\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4

ブロックの移動

多くのデータベースでは、WHERE username='admin'; を検索するのと WHERE username='admin '; を検索するのは同じです(余分なスペースに注意)。

したがって、ユーザー admin をなりすます別の方法は次のとおりです:

  • len(<username>) + len(<delimiter) % len(block) となるユーザー名を生成します。ブロックサイズが 8B の場合、username というユーザー名を生成できます。デリミターが | の場合、チャンク <username><delimiter> は 2 つの 8B ブロックを生成します。
  • 次に、なりすましたいユーザー名とスペースを含むブロック数を正確に埋めるパスワードを生成します。例:admin

このユーザーのクッキーは 3 つのブロックで構成されます:最初の 2 つはユーザー名 + デリミターのブロックで、3 番目は(ユーザー名を偽装している)パスワードのブロックです:username |admin

その後、最初のブロックを最後のブロックで置き換えるだけで、ユーザー admin をなりすませることができます:admin |username

参考文献