Shikata Ga Nai

Private? There is no such things.

OTP Bypass Account Takeover to Admin Panelを訳してみた

Hello there, ('ω')ノ

 

OTPバイパスアカウントの乗っ取りを管理パネルに。

 

脆弱性:

 OTPバイパス

 アカウントの乗っ取り

 

記事:

 https://logicbomb.medium.com/otp-bypass-account-takeover-to-admin-panel-ft-header-injection-16f2982a0136

 

ターゲットは、OTP認証が実装されたオンライン教育プラットフォームで。

OTPベースのログインがある場合は。

誰もが最初に頭に浮かぶのは「それをバイパスする方法」で。

最初にブルートフォースを試みたところ。

IPベースのレート制限が実装されていることがわかって。

つまり、クライアントIP、またはアップストリームサーバに提示されるIPを。

変更すると、OTPブルートフォースのレート制限をバイパスできるようになって。

 

クライアントがプロキシの背後にある場合は。

プロキシはクライアントのIPアドレスを特定のヘッダX-Forwarded-Forで。

サーバに転送して。

場合によっては、クライアントはこのヘッダを使用して。

自分のIPアドレスをスプーフィングできて。

 

f:id:ThisIsOne:20210909161608p:plain

 

ここで同じことを試すことに。

X-Forwarded-Forヘッダを挿入し、Intruderに渡して。

さまざまなIPアドレス($127.0.0.1$)を持つ。

特定の電話番号のブルートフォースOTP($1111$)を実行して。

Cluster bombをブルートフォース攻撃タイプとして設定して。

 

f:id:ThisIsOne:20210909161729p:plain

 

予想通り、OTPログインを成功させるために。

OTPをブルートフォース攻撃することができて。

 

次に、水平方向の特権昇格を実行することに。

ヘッダーインジェクションが存在することは明らかだったので。

IPアクセス制御、またはレート制限をバイパスする以外に。

ここで悪用できる他の可能性もあることも。

 

以前、WordPress管理者インターフェイスをクライアントのIPアドレスに基づいて。

内部IPのみに制限したことを思い出したので。

ここでそれがどのように機能するか。

 

したがって、許可された内部IPアドレスがヘッダ値に入力されると。

接続が実際にホワイトリストに登録されていないIPアドレスから発信された場合でも。

プロキシは、X-Forwareded-Forヘッダの値を転送して。

攻撃者が制限されたページにアクセスできるようにして。

またはAPIエンドポイント。

 

X-Forward-For: 127.0.0.1」ヘッダが設定されている場合は。

応答サーバは、内部IPによってアクセスされていると見なして。

ユーザが制限されたコンテンツにアクセスできるようにして。

 

ただ、このためには、そのような制限されたページを見つけることが必要で。

通常、管理ページ/パネル管理者/機密のエンドポイントは制限されていて。

下記のブログページで、WordPress管理者インターフェイスにアクセスすると。

200 OKが返ってきて。

 /wp-admin

 

f:id:ThisIsOne:20210909161757p:plain

 

ディレクトリのブルートフォース攻撃は時間の問題で。

IPベースで制限されているエンドポイントが他にあるかどうかを確認して。

そのようなエンドポイントを見つけるためにいくつかの有用なリソースを見つけて。

それらをBurpのIntruderで使用して。

 

https://github.com/ziadab/AdminBomber/blob/master/AdminBomber.py

 

f:id:ThisIsOne:20210909161857p:plain

 

https://github.com/s0md3v/Breacher/blob/master/paths.txt

 

f:id:ThisIsOne:20210909161920p:plain

 

すると、CMSのカタログには、200 OKを提供する下記の管理ページがあって。

水平方向の特権昇格に成功して。

 /cms/_admin/logon.php

 

f:id:ThisIsOne:20210909161820p:plain

 

可能な修正:

信頼できるプロキシとロードバランサーのIP(またはCIDR)のリストを。

指定できるようにして。

リクエストがいずれかからのものでない場合は、X-Forwarded-Forを破棄して。

 

Nginxの機能は下記のとおりで。

リスト(最後のエントリから開始)を確認し、各エントリをチェックして。

信頼できるプロキシのリストであるかどうかを確認して。

リストにないものが見つかった場合は、その前にあるものをすべて破棄して。

 

Best regards, (^^ゞ