今回はセキュリティの世界では有名な Nmap というツールを使ってみる。 このツールは、ポートスキャンや簡易な脆弱性スキャナーとして利用される。 例えば不要なポートが外部からアクセスできるようになっていないかを調べることは重要なポイントだ。 Nmap は高機能なので、とても全ては紹介できないから今回は基本的なポートスキャンについて書いてみる。
注意: ポートスキャンは攻撃と見なされるので外部のサーバには実行しないこと
今回使った環境は次の通り。
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.3 LTS Release: 16.04 Codename: xenial $ uname -r 4.4.0-89-generic
インストール
Ubuntu であればリポジトリからインストールできる。
$ sudo apt-get -y install nmap
TCP ポートをスキャンする
試しに何もオプションを付けずに自身のループバックアドレスに対して実行してみよう。 これだけで主要な TCP のポートが開いているかどうかを一気に調べることができる。
$ sudo nmap localhost Starting Nmap 7.01 ( https://nmap.org ) at 2017-08-07 12:32 UTC Nmap scan report for localhost (127.0.0.1) Host is up (0.000045s latency). Not shown: 999 closed ports PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
上記のスキャンで SSH 用の TCP:22 ポートが開いていることが分かった。
もちろんローカルホストで何処のポートが開いているか調べるだけなら ss
なり netstat
コマンドを使うこともできる。
$ ss -tl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:ssh *:* LISTEN 0 128 :::ssh :::*
とはいえ、ここで Listen しているポートがインターネットなど外部からアクセスできるかどうかは、また別問題。 そうした意味では、自前のシステムに外部からスキャンをかけてチェックするのには意味がある。
別のポートも開けてみる
試しに別のポートも開けて実行結果が変わることを確認してみよう。
例として Apache httpd をインストールしてみる。
$ sudo apt-get -y install apache2
ポートスキャンを実行する。
$ sudo nmap localhost Starting Nmap 7.01 ( https://nmap.org ) at 2017-08-07 12:33 UTC Nmap scan report for localhost (127.0.0.1) Host is up (0.000043s latency). Not shown: 998 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
先ほどの結果に加えて TCP:80 (HTTP) も開いたことが分かる。
スキャンのテクニックについて
Nmap には、テクニックと呼ばれるスキャンのやり方がいくつも用意されている。 スキャンをするとき、どういった通信が発生しているのかを確認してみることにしよう。 ちなみに、自前でテクニックを書いて追加することも可能らしい。
通信をキャプチャするために tcpdump をインストールする。
$ sudo apt-get -y install tcpdump
TCP SYN scan
管理者権限をつけて実行したときのデフォルトは TCP SYN scan と呼ばれるテクニックになっている。
これは -sS
オプションを付けたときと同じ。
$ sudo nmap -sS localhost Starting Nmap 7.01 ( https://nmap.org ) at 2017-08-07 12:38 UTC Nmap scan report for localhost (127.0.0.1) Host is up (0.0000040s latency). Not shown: 998 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 1.63 seconds
通信内容を確認すると TCP の SYN フラグのついたパケットを送信している。 それに対して相手が SYN/ACK を返すとポートを Open と見なしているのだろう。 ただし、実際にスリーウェイハンドシェイクは完了させず RST フラグのついたパケットを送って通信を切断している。 RST は Linux Kernel が送っているものかな?
$ sudo tcpdump -i lo "port 80" tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes 12:38:39.661017 IP localhost.36923 > localhost.http: Flags [S], seq 4178950553, win 1024, options [mss 1460], length 0 12:38:39.661036 IP localhost.http > localhost.36923: Flags [S.], seq 3106868738, ack 4178950554, win 43690, options [mss 65495], length 0 12:38:39.661042 IP localhost.36923 > localhost.http: Flags [R], seq 4178950554, win 0, length 0
TCP のセッションを実際には成立させないので、おそらく秘匿性にも優れていると思われる。
TCP connect scan
管理者権限をつけずに実行したり -sT
オプションを指定したときに使われるのが TCP connect scan というテクニックになる。
$ sudo nmap -sT localhost Starting Nmap 7.01 ( https://nmap.org ) at 2017-08-07 12:39 UTC Nmap scan report for localhost (127.0.0.1) Host is up (0.000041s latency). Not shown: 998 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
先ほどと同じように通信内容をキャプチャしてみよう。 すると、今度は SYN > SYN/ACK > ACK というスリーウェイハンドシェイクが完了していることが分かる。 つまり TCP のセッションを実際に成立させているということだ。 おそらく、これはソケットのインターフェースを使って実現しているんだろう。
$ sudo tcpdump -i lo "port 80" tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes 12:39:23.661866 IP localhost.55316 > localhost.http: Flags [S], seq 55539266, win 43690, options [mss 65495,sackOK,TS val 189029 ecr 0,nop,wscale 7], length 0 12:39:23.661872 IP localhost.http > localhost.55316: Flags [S.], seq 3737402388, ack 55539267, win 43690, options [mss 65495,sackOK,TS val 189029 ecr 189029,nop,wscale 7], length 0 12:39:23.661878 IP localhost.55316 > localhost.http: Flags [.], ack 1, win 342, options [nop,nop,TS val 189029 ecr 189029], length 0
TCP のセッションを実際に成立させるので 、おそらく TCP SYN scan に比べると秘匿性は劣ることだろう。
その他、ポートスキャンのテクニックについては以下のページにまとまっている。 もちろんテクニックを選べば UDP のポートもスキャンもできる。
Version Detection
これはテクニックとは異なるけど -sV
オプションをつけると、オープンしているポートで動作しているアプリケーションについての情報も調べることができる。
$ sudo nmap -sV localhost Starting Nmap 7.01 ( https://nmap.org ) at 2017-08-07 12:40 UTC Nmap scan report for localhost (127.0.0.1) Host is up (0.0000070s latency). Not shown: 998 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 8.40 seconds
OS のバージョンとか、さらに詳しい情報まで得たいときは -A
オプションが使える。
$ sudo nmap -A localhost Starting Nmap 7.01 ( https://nmap.org ) at 2017-08-07 12:45 UTC Nmap scan report for localhost (127.0.0.1) Host is up (0.0000090s latency). Not shown: 998 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 e6:bb:3f:fc:95:3f:27:ab:68:45:c6:c1:90:fa:c2:11 (RSA) |_ 256 f7:cc:ba:13:46:ef:c9:e2:74:94:2f:bf:59:ef:19:c6 (ECDSA) 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) |_http-server-header: Apache/2.4.18 (Ubuntu) |_http-title: Apache2 Ubuntu Default Page: It works Device type: general purpose Running: Linux 3.X OS CPE: cpe:/o:linux:linux_kernel:3 OS details: Linux 3.12 - 3.19, Linux 3.8 - 3.19 Network Distance: 0 hops Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 10.89 seconds
まとめ
今回はセキュリティの世界で有名な Nmap というツールを使ってポートスキャンをする方法について書いた。 Nmap でポートスキャンすることで、システムの不要なポートが外部に公開されていないかを確認できる。 繰り返しになるけどポートスキャンといえど攻撃と見なされるので外部のサーバには実行しないように。
- 作者: 八木毅,村山純一,秋山満昭
- 出版社/メーカー: コロナ社
- 発売日: 2015/03/17
- メディア: 単行本
- この商品を含むブログを見る
スマートPythonプログラミング: Pythonのより良い書き方を学ぶ
- 作者: もみじあめ
- 発売日: 2016/03/12
- メディア: Kindle版
- この商品を含むブログ (1件) を見る