有線LANに対して、ハッキングをしていきます。
主にポートスキャンについて取り上げます。
まとめ記事(①〜⑯をまとめてます)
【ハッキング・ラボのつくりかた】をやってみた
システム環境
仮想化ソフト
:VirtualBox 6.1.0
ホストOS
:Windows10
ゲストOS1
:Kali Linux 2020.1
ゲストOS2
:Windows7
ゲストOS3
:Windows10
ゲストOS4
:Metasploitable
攻撃端末はゲストOS1、ターゲット端末はホストOS、ゲストOS4です。
IPアドレスはゲストOS1が10.0.0.2、ホストOSが10.0.0.1、ゲストOS4が10.0.0.5です。
Wiresharkについて
WiresharkはLANに流れるデータを取得するソフトウェアです。
ネットワークに関するトラブルを解析したり、未知の通信を解析したりするのに使われます。
Kali LinuxにはデフォルトでWiresharkがインストールされています。
起動方法
以下のコマンドで起動します。
kaliユーザーで行います。
$ wireshark
次に、「Capture」→「Options」から、eth1(ここではNAT)の「Promiscuous」にチェックが入っていることを確認、選択した後、「Start」を押します。
ここでエラーが出るので、指示の通り以下のコマンドを入力します。
$ sudo dpkg-reconfigure wireshark-common
$ sudo usermod -a -G wireshark kali
再度Wiresharkを立ち上げ、上記の操作を行います。
Firefoxを起動して、インターネットを巡回します。
すると、パケットが取得できていることがわかります。
キャプチャしたデータの保存
キャプチャしたデータはpcap形式やpcapng形式で保存します。
「Stop capturing packets」ボタンを押してキャプチャを止めてから、「File」→「Save as」から保存します。
ここでは、pcap形式で保存します。
Xplicoについて
Wiresharkは通信の流れやビット列等を分析するには向いていますが、画像やメール等を解析するにはXplicoが便利です。
Kali Linuxにインストールし、Xplicoを起動します。
# apt install xplico -y
# service apache2 restart
# /etc/init.d/xplico start
http://localhost:9876
にアクセスします。
Usernameにxplico、Passwordにxplicoを入力してログインします。
「New Case」から「Uploading PCAP capture file/s」にチェックし、「Case name」(ここではtestcase)、「External reference」(ここでは空白)を入力し、「Create」ボタンを押します。
「Cases」から作成したCaseを選択し、「New Session」をクリックします。
「Session name」(ここではtestsession)を入力し、「Create」ボタンを押します。
先程Wiresharkで保存したpcap形式のファイルを「Browse...」で選択し、「Upload」ボタンを押し、アップロードします。
アップロードすると、自動的に解析されて画面に解析結果が表示されます。
「Web」→「Images」を選ぶと、キャプチャファイルに含まれていた画像データを表示することもできます。
Wiresharkでnmapのポートスキャンを解析する
ここでは、Wiresharkを使用してnmapのポートスキャンを解析してみます。
nmapには様々なスキャンが用意されていますが、今回は以下を取り上げます。
- TCPフルコネクトスキャン
- TCP SYNスキャン
- UDPスキャン
- Pingスキャン
- FINスキャン
- Xmasスキャン
- Nullスキャン
Wiresharkをバックグランドで起動します。
eth0(ホストオンリーネットワーク)を指定して、キャプチャを開始します。
# wireshark &
TCPフルコネクトスキャン
空いているポートに対して、スキャンしてみます。
$ sudo nmap -sT -p 445 10.0.0.1
Wiresharkの「Statistics」→「Flow Graph」からフロー図を表示します。
まず、SYNパケットが送信されます。
「ターゲット端末が起動」かつ「ポートが開いている」ならば、許可(SYN/ACK)パケットが返ってきます。
その後はACKパケットを送信してコネクションを張ろうとします。
しかし、ターゲット端末のサービスが「つながった」、「拒否した」というログを記録するので、ポートスキャンが露見してしまいます。
また、「ターゲット端末が起動」かつ「ポートが閉じている」なら拒否(RST/ACT)パケットが返ってきます。
$ sudo nmap -sT -p 24 10.0.0.5
「ターゲット端末がダウン」または「フィルタリングされている」なら応答さえ返ってきません。
$ sudo nmap -sT -p 21 10.0.0.1
このように、SYNパケットに対する応答によって、ポートが開いているか判断することができます。
TCP SYNスキャン
空いているポートに対して、スキャンしてみます。
$ sudo nmap -sS -p 445 10.0.0.1
2番目のやり取りまではTCPフルコネクトスキャンと同じですが、この時点でターゲット端末のポートは開いていると判断し、RSTパケットを送信します。
途中で通信を取りやめてしまうので、TCPフルコネクトスキャンと異なり、ログに記録されることもなく、ポートスキャンが露見することもありません。
UDPスキャン
空いているポートに対して、スキャンしてみます。
$ sudo nmap -sU -p 111 10.0.0.5
Wiresharkの「Statistics」→「Flow Graph」からフロー図を表示します。
上記のように応答があると、ポートが開いていると判断できます。
閉じているポートに対して、スキャンしてみます。
ICMP到達不能エラーが返ってきたら、ポートが閉じていると判断できます。
$ sudo nmap -sU -p 2050 10.0.0.5
フィルタリングされたポートに対して、スキャンしてみます。
フィルタリングされるため、ターゲット端末が応答を返すことはありません。
$ sudo nmap -sU -p 53 10.0.0.1
UDPはTCPと違い、パケットの到達性を保証しません。
また、応答なしの場合は数回試行するため時間がかかります。
Pingスキャン
Pingスキャンの実体はPingで疎通確認することです。nmapの仕様では、LANの端末を対象にした場合、ARP要求が用いられます。
空いているポートに対して、スキャンしてみます。
ブロードキャストにARP要求が送られ、ターゲット端末がARP応答を返しています。
$ sudo nmap -sn 10.0.0.1
一方、WANの端末を対象にした場合、nmapは上記の動きに加えて別の動きをします。
これをLANで再現するには、以下のコマンドを実行します。
ブロードキャストにARP要求を送り、ARP応答があったとします。すると、ICMPエコー要求、ICMPタイムスタンプ要求、TCPパケットを送ります。
ターゲット端末からICMPエコー応答、あるいはTCPパケットが返ってくれば稼働していると判断できます。
$ sudo nmap -sn 10.0.0.1 --send-ip
pingコマンドはICMPエコー要求を送信します。
nmapコマンドはファイアウォールがあってICMPエコー応答を返さなくても、TCPパケットには応答を返す可能性があるので、pingコマンドより信頼性が高いといえます。
FINスキャン
nmapには普通ではないパケットを送り、その反応からサービスが稼働しているか確認するスキャンがあります。
FINスキャン、Xmasスキャン、Nullスキャン等がそうです。
ここでは、FINスキャンについて見ていきます。
空いているポートに対して、スキャンしてみます。
FINパケットは通信終了要求に使われます。FINパケットを送信していますが、ポートが空いている場合は、応答がありません。
$ sudo nmap -sF -p 21 10.0.0.5
閉じているポートに対して、スキャンしてみます。
FINパケットを送信したときにTCPパケット(RST/ACK)が返ってくれば、ポートは閉じていると判断できます。
$ sudo nmap -sF -p 24 10.0.0.5
Xmasスキャン
ここでは、Xmasスキャンについて見ていきます。
空いているポートに対して、スキャンしてみます。
TCPパケット(FIN/URG/PUSH)を送信しても、応答がありません。
$ sudo nmap -sX -p 21 10.0.0.5
閉じているポートに対して、スキャンしてみます。
TCPパケット(RST/ACK)が返ってくれば、ポートは閉じていると判断できます。
$ sudo nmap -sX -p 24 10.0.0.5
Nullスキャン
ここでは、Nullスキャンについて見ていきます。
空いているポートに対して、スキャンしてみます。
Nullスキャンでは何のフラグも設定しないTCPパケットを送信します。
応答がないので、ポートは空いていると判断できます。
$ sudo nmap -sN -p 24 10.0.0.5
閉じているポートに対して、スキャンしてみます。
TCPパケット(RST/ACK)が返ってくれば、ポートは閉じていると判断できます。
$ sudo nmap -sN -p 24 10.0.0.5