今回は、セキュリティ問題を確認するための基本中の基本とも言うべき
ポートスキャン
について、nmap を使った方法と、実際に実施した結果を書いていく。
主な内容は以下の通り。
なお、nmap は脆弱性検査に使われるものであるが、
攻撃するための事前情報収集などにも利用されうる。
このため、自分の責任範囲外のサイトなどに適用した場合、ハッキング行為とみなされる恐れがある。
よって、利用する際には、これまで記載してきた環境のように、
自分のネットワーク内にある、自分のサイトや機器の脆弱性診断
に限って利用すべきであることにご注意頂きたい。
■nmap のインストール
nmap は非常に多機能なポートスキャンツール。
自分のサイトに不要なポートが開いていないか、
利用している OS やツールのバージョンは何か、などを調べることができる。
正直、
全てのオプションを使いこなすのは相当難しいのではないか、
と思うが、いくつか知っているだけでも十分に有益。
よってまずはこれをインストールする。
インストール自体は非常に簡単。
root@raspi-03# apt-get install nmap -y
で終了。
ということで、早速使ってみる。
■基本的な使い方とその挙動
nmap のオプションやその意味などについては、
nmap.org
https://nmap.org/
にまとめられている。
その他、日本語で解説しているサイトもたくさんあるので、自分にあったものを使えばよいと思う。
ひとまず私の場合、以下のパターンについて、
実際の結果とともに、
どんな挙動をしているのか、
をパケットキャプチャしながら調べてみた。
■最も基本的な使い方
nmap は、オプションと対象の IP address を指定するだけで使える。
多分これが一番シンプルな使い方。
今回のトライアル環境では、三号機から
・WiFi AP であり、
・FTP サーバーでもあり、
・Web サーバーでもある
一号機に nmap を試してみた。
コマンドと結果は以下の通り。
root@attacker:~# nmap 192.168.0.1 Starting Nmap 6.47 ( http://nmap.org ) at 2017-07-24 13:25 UTC Nmap scan report for 192.168.0.1 # 192.168.0.1 の結果だよ Host is up (0.0076s latency). # Host は生きている Not shown: 997 closed ports # 閉じてる 997 ポートは結果示さず PORT STATE SERVICE # ポートと状態、サービスをリスト化 21/tcp open ftp # TCP 21 番ポートが FTP server 22/tcp open ssh # TCP 22 番ポートが SSH server 80/tcp open http # TCP 80 番ポートが HTTP server MAC Address: B8:27:EB:1D:1D:7B (Raspberry Pi Foundation) # MAC アドレスとベンダーを表示 Nmap done: 1 IP address (1 host up) scanned in 45.47 seconds
おー。面白い。
動かしているサービスのポート以外は開いていなさそうだ。よかった。
■同一ネットワーク内の機器を調べる
検査対象の IP address が分かっている場合はいいが、
DHCP で何に割り当てられたのかが分からない場合もある。
そんな場合は、ネットマスクを指定して、
ローカルネットワークに接続されている全ての機器を調べることもできる。
root@attacker:~# nmap -e wlan0 192.168.0.0/24 Starting Nmap 6.47 ( http://nmap.org ) at 2017-07-26 12:06 UTC Nmap scan report for 192.168.0.1 # 一号機に対する結果 Host is up (0.0079s latency). Not shown: 997 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 80/tcp open http MAC Address: B8:27:EB:1D:1D:7B (Raspberry Pi Foundation) Nmap scan report for 192.168.0.21 # 二号機に対する結果 Host is up (0.0087s latency). Not shown: 999 closed ports PORT STATE SERVICE 22/tcp open ssh MAC Address: B8:27:EB:09:86:87 (Raspberry Pi Foundation) Nmap done: 256 IP addresses (2 hosts up) scanned in 304.76 seconds
見事に二号機も見つけ出してスキャンしてくれているではないか。
感心感心。
でも、どうやって見つけたり調べたりしているのだろう?
ちょっと気になったので、wireshark でパケットを覗いてみた。
まずはどの IP address が生きているのかを確認するために、
かたっぱしから ARP パケットを投げているみたい。
なるほど。これで返事した奴は生きている、という風に判断しているのね。
じゃぁポートはどうやって?ということで、
以降のパケットを見てみると、こちらも総当たり。
生きていることが分かった IP address の各ポートに
片っ端から SYN パケットを投げている。
で、これに RST/ACK を返しているポートは close、
SYN/ACK を返すポートは開いている、と判断してるみたい。
なるほどなるほど。
Web でちょこちょこっと調べた時は『ふーん』ぐらいであんまり頭に残らなかったが、
実際にパケットを見てみると、すごくよく分かる。
■OS 及びツールのバージョンを調べる
基本的な使い方だけでも結構な事が分かるが、
オプションを指定することで、もっといろんな事が分かる。
例えば、-A というオプションをつけると、
相手の OS や起動しているサービスのバージョンなどが分かる。
ということで、対象を再び一号機に絞ってやってみる。
*ちなみに、-e は通信インターフェースを指定するオプション。
*今回は ethernet を繋ぎながら一号機のネットワークに WiFi 接続していたため、wlan0 を指定。
root@attacker:~# nmap -e wlan0 -A 192.168.0.1 Starting Nmap 6.47 ( http://nmap.org ) at 2017-07-26 12:27 UTC Nmap scan report for 192.168.0.1 Host is up (0.057s latency). Not shown: 997 closed ports PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.2 22/tcp open ssh (protocol 2.0) |_ssh-hostkey: ERROR: Script execution failed (use -d to debug) 80/tcp open http Apache httpd 2.4.10 ((Raspbian)) |_http-title: Test Site # サイト名まで分かる。 1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at http://www.insecure.org/cgi-bin/servicefp-submit.cgi : SF-Port22-TCP:V=6.47%I=7%D=7/26%Time=59788ADA%P=arm-unknown-linux-gnueabih SF:f%r(NULL,29,"SSH-2\.0-OpenSSH_6\.7p1\x20Raspbian-5\+deb8u3\r\n"); MAC Address: B8:27:EB:1D:1D:7B (Raspberry Pi Foundation) Device type: general purpose Running: Linux 3.X # Linux 3.X だと言われている。実際は Raspbian Jessie OS CPE: cpe:/o:linux:linux_kernel:3 OS details: Linux 3.11 - 3.14 # 3.11 -- 3.14 の間、と想定されている Network Distance: 1 hop Service Info: OS: Unix TRACEROUTE HOP RTT ADDRESS 1 57.01 ms 192.168.0.1 OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 45.85 seconds
うーん、結構見れるもんだなー。
特に service のバージョンが分かるのはよい。
アップデートがうまくできているか、とかが確認できそう。
ただ、逆に古いものを使いつづけていたりすると、
こういった検査によって攻撃者にもバレる、ということだ。
どうやって推測しているか、が分かるかと思い、
こっちでもパケットキャプチャしてみた。
どうやら、開いてるポートにいろんな情報を投げ、
その反応によって OS を推測しているようなのだが、正直よくわからなかった・・・。
*まだまだ知識が浅いなぁ・・・。
■ツールのバージョンだけを調べる
ちなみに、ツールのバージョンだけを調べる場合は、-sV でよいみたい。
こっちの方が当然早い。
root@attacker:~# nmap -e wlan0 -sV 192.168.0.1 Starting Nmap 6.47 ( http://nmap.org ) at 2017-07-26 12:41 UTC Nmap scan report for 192.168.0.1 Host is up (0.093s latency). Not shown: 997 closed ports PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.2 22/tcp open ssh (protocol 2.0) 80/tcp open http Apache httpd 2.4.10 ((Raspbian)) 1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at http://www.insecure.org/cgi-bin/servicefp-submit.cgi : SF-Port22-TCP:V=6.47%I=7%D=7/26%Time=59788DF9%P=arm-unknown-linux-gnueabih SF:f%r(NULL,29,"SSH-2\.0-OpenSSH_6\.7p1\x20Raspbian-5\+deb8u3\r\n"); MAC Address: B8:27:EB:1D:1D:7B (Raspberry Pi Foundation) Service Info: OS: Unix Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 27.42 seconds
■UDP ポートについて調べる
これまでは TCP ポートについて調べていたが、
UDP についても -sU オプションで検査可能。
*ただ、TCP よりだいぶ時間は掛かる。数十分レベル?
root@attacker:~# nmap -e wlan0 -sU 192.168.0.1 Starting Nmap 6.47 ( http://nmap.org ) at 2017-07-26 12:48 UTC Nmap scan report for 192.168.0.1 Host is up (0.0092s latency). Not shown: 995 closed ports PORT STATE SERVICE 67/udp open|filtered dhcps 68/udp open|filtered dhcpc 123/udp open ntp 5001/udp open|filtered commplex-link 5353/udp open zeroconf MAC Address: B8:27:EB:1D:1D:7B (Raspberry Pi Foundation) Nmap done: 1 IP address (1 host up) scanned in 1097.28 seconds
今回始めてやってみたけど、そこそこ開いてるもんだな・・・。
一号機は dhcp サーバーなので、dhcp 関係が開いているのは理解できる。
ntp も分かる。
情報処理安全確保支援士試験の勉強をしていた時に、
確か、DHCP や NTP は UDP だから云々という話をやった記憶がある。
実際に見てみると、なるほど、これのことか、と自分の頭の線が繋がるなぁ。
まぁそれはよいとして、それ以外が分からない。自分でも知らないものだ。
Wiki によれば、UDP の 5001 番は
Iperf (Tool for measuring TCP and UDP bandwidth performance)
とのこと。一号機にも nmap とか入れているから、それが影響しているのかな?
5353 は Wiki には乗ってなかったが、zeroconf で調べてみると、
同一ネットワークに接続している別マシンを、ホスト名指定だけで見つける、と言うものらしい。
DNS がなくても通信できるようにする仕組みのようだが、うん、今度にしよう。
多分 WiFi アクセスポイントにする際に入れた、hostapd が関係してるのだと思う。
もうちょっと勉強が必要だな。
ちなみに、こちらも結局 UDP ポート総当たりで確認している模様。
面白いもんだ。
■まとめ
ということで、今回は超基本的な脆弱性検査の第一歩として、nmap を試してみた。
パケットを見ることで、どういう挙動で調べているのか、もよく分かった。
実際にやってみると、やっぱり面白い。
ということで、まとめとして今回のポイントを以下に記載しておく。
・IP address を指定すると、開いてるポートを教えてくれる。
・ネットマスク指定ならネットワーク上の全機器を調査。
・機器の生死は IP address 総当たりの ARP パケットで確認!
・ポートは SYN パケットをこれまた総当たりで送信。返事をみて開け閉め確認!
・OS やサービスのソフト、そのバージョンも調べられる!
・UDP だって検査可能!
じゃぁこの検査結果はどうやって使うの?の一例を、次回以降記載したいと思う。