週末の思索:私がローカルISPをハッキングした手順、そしてインターネットで身を守るための一般的なアドバイス、学び

長文を読む時間のない読者へ: 時間差SQLインジェクションについて最低限の知識がある読者を想定しています。技術用語を読みたくない場合は、結末の重要なアドバイス、学びまでスクロールダウンしてください。

先週、長い週末を過ごすため、故郷であるNagpurを訪れました。私はNagpurのあらゆるものを深く愛していますが、インターネットだけは別です。十分なFUPの光通信やブロードバンドを提供するまともなインターネットサービスプロバイダ(ISP)がないからです。家族は某ローカルISPの1か月2Mbps 50GBのプランで手を打っています。

FUPとは?
多くのISPは、通信量が制限に達すると速度を落とすFair Usage Policyという制度を採用しています。例えばデータ通信量が50GBを越えると、その後私は512kbpsで我慢しなければなりません。

ISPはユーザに現在の使用量を示すインターフェースを(公式には)提供していません。FUP制限を越えているのかどうか全く分からないのは非常に落ち着かないものです。

外の気温が43、44度になると、家の中で過ごすしかありません。最初の目的はISPがいかにしてユーザのデータ使用量の情報を管理しているのか理解することでした。ルータの管理コンソール(192.168.2.1)にログインし、すぐにインターネット接続の情報(PPPOE)を示すページに進みました。そこでゲートウェイIPアドレスを見つけました。ゲートウェイIPアドレスは、全てのインターネットトラフィックが通過する、ルータやコンピュータのIPアドレスです。全てのユーザをインターネットにつなげる大きなルータのようなものだと考えてください。それが私のインターネット使用量が記録されていく場所のはずです。

私はZenmap(Windows向けnmapのGUI版)を使い、そのゲートウェイIPアドレスで開いているポートを調べ始めました。すると、面白いことに、次のポートが開いていました。

  • ポート80 – http
  • ポート443 – https
  • ポート3306 – mysql

ポート80と443が開いていましたので、私はすぐにゲートウェイIPアドレスをブラウザで開き、ユーザ管理ポータルのログインページを見つけました。これが探していたパネルです。

customer management portal

自分のPPPOEユーザネームと初期設定パスワードを入力してみると、ヤッター、ログインできました。これで現在の使用量を見たり、初期設定パスワードを変えたり、他にも多くの操作が可能になります。この情報をざっと見て、私のISPのファウルプレイを確信しました。実際にISPが提供しているのは、約束された50GBではなく、30GBのFUPだったのです。

この事実は、私の中のハッカー魂が起動して機能し始めるのに十分でした。ログインページに行き、基本的なSQLインジェクションの入力を試みたところ、ラッキーにも、そのうちの1つがうまく行き、誰か別の人のアカウントにログインできました。そのユーザネームは’a’から始まっていたので、データベースにある1番目のユーザネームでまず間違いないでしょう。SQLインジェクションによって、ユーザネームとパスワードのチェックを迂回し、存在する1番目のユーザとしてログインできたのでした。エラーベースのSQLインジェクションが使えたのかどうかを調べるため、私はさらに多くのSQLインジェクションクエリを試しました。残念ながら、エラーはすべて無効にされていました。他のオプションでもやってみましたが、どれも機能しないようでした。

xkcd
注釈:
左から1コマ目:息子さんの学校です。コンピュータにトラブルが起きました。
2コマ目:- まあ、息子が何か壊したんでしょうか。- それなんですが…
3コマ目:- あなたは息子さんに本当にRobert’);DROP TABLE Students;–と名付けたのですか?
– ええ。LITTLE BOBBY TABLEと呼んでいます。
4コマ目:- 今年の生徒の記録を紛失してしまったんですよ。喜んでくださるといいのですが。
– これからはデータベース入力のサニタイジングをしてくださいね。

StackExchangeは技術者以外の一般向けに、SQLインジェクションを分かりやすく説明しています。

というわけで、他に考えられるのは時間差ブラインドSQLインジェクションだけです。データベースに真偽を尋ねる参照を行い、その応答によって理論を導くという非常に時間のかかる方法です。

当然、これを手動で行おうとは思いません。Hyper-Vの仮想マシンにKALI Linuxインスタンスを起動させ、SQLMAP(自動SQLインジェクションツール)に、私に代わって朝までに全てのハードワークを行うよう命令しました。時間差SQLインジェクションを行う場合は、忍耐が必要なのです。

KALI Linuxは、侵入テストに使われる、高度な侵入テストLinuxディストリビューションです。Hyper-VWindowsに標準搭載されているVirtualBoxの代替手段です。

翌朝起きると、管理ソフトウェアの管理ユーザのユーザネームとパスワード4組を含むテーブルのダンプができていました。次に、管理ログインページが表示されないかと、ゲートウェイIPに/adminを追加してみたところ、当たりでした。

問題は、パスワードが一方通行でハッシュ化されていたことです。私はハッシュを見て、それがMD5ハッシュ(32文字)だとすぐに分かりました。’MD5 変換’でgoogle検索し、検索結果の最初のリンクを開いて元の値が取得できるよう祈りながらハッシュをペーストしました。結果、4つのハッシュのうち、2つを変換することができました。それらは同一で非常にシンプルだったからです。パスワードが何であったかは、このハッシュd8578edf8458ce06fbc5bb76a58c5ca4を変換してみれば分かります。とてもシンプルでしょう。

そのユーザネームとパスワードでログインし、船を手中におさめました。

しかし、このユーザは、ユーザのスピードの最小値を変更するといった上位権限は持っていませんでした。

そこで他のハッシュが、別のいくつかのWebサイトで変換できないか試し始めました。幸運にもそのうちの1つで、ハッシュの変換に成功し、大文字、小文字、数字と特殊文字を含む9文字のパスワードを取得できました。このようなパスワードは一般的に安全だと考えられていますが、MD5の変換は容易であり、短いパスワードは、たとえ特殊文字を含めたとしても常に問題があるという事実をしっかり自覚しなければなりません。

管理画面で得られた情報は次のとおりです。

  • 全てのユーザネームとMD5パスワードハッシュ。このISPは全員に初期設定パスワードを使っており、しかも1つのパスワードの使い回しだったため、ごく簡単に変換できました。
  • 各アカウントが1つのMACアドレスに紐付けられていたのは良い点。つまり、たとえ私が誰かのユーザネームとパスワードを持っていても、それだけでは使えません。悪い点は、管理画面でMACアドレスも分かってしまったので、ルータ設定をすれば自分のMACアドレスを容易に偽装してどんなユーザネーム、パスワードでも使えてしまうこと。実際には試しませんでしたが、確実にログインできるはずです。
  • 私には興味のない電話番号、email、住所などその他様々な情報。

インターネットユーザと開発者に共有したい、今回私が学んだこと:

  • 複数のWebサイトで同じパスワードを使い回さないこと。中には簡単に侵入できるWebサイトもあるので、漏れたパスワードでハッカーはあなたの別のアカウントにもアクセスできてしまいます。
  • LastPass、1Password、KeePassのようなツールを使ってWebサイトごとに異なるパスワードを生成し、保存しましょう。これらのツールでは、2段階認証を有効にすることも忘れずに。(LastPassにサインアップする場合は、私の紹介リンクを使ってください)
  • Gmail、Facebook、Github、銀行など重要なアカウントでは2段階認証を利用し、Google認証システムなどのアプリを使いましょう。
  • 開発者は、パスワードやその他慎重に扱うべき情報にMD5を使うのは止めましょう。よほどのエキスパートでない限り、ログインシステムを自ら実装しないことです。良いオープンソースを利用するのが正解です。

注記:

  1. 私が侵入した抜け道は、ソフトウェアの最新のリリースでは修正されているようです。
  2. このプロセスにおけるいくつかの重要なステップ、情報を意図的に省略しています。
  3. ぜひ、あらゆる議論、質問、異議をコメント欄に残してください。