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サーバーがこれをどのように解釈するかを誰かに説明できますか?.
答えはこのページにあります: 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
.
.
.
_
次の理由から、これはポート転送とは関係がないと思います。
また、Pythonでスクリプトを書くかどうかは関係ないと思います。 HTTPリクエストは、ネットワーク上の単なるデータです。リクエストの受信者は、何が送信されたかを知る方法がありません。提供するリンクにはPythonについての言及はありません。ブラウザでこれを行うことができると私が知る限りでは。
説明からははっきりしませんが、ルーターの管理インターフェースに脆弱性があると思います。ルーターがデフォルトでリモート管理を有効にしたり、無効にしたりできないとは思いませんが、おそらくGPONがこのように構成しています。繰り返しになりますが、CVEの詳細はスリムですが、ここで理解できるのはそれだけです。