CUBE SUGAR CONTAINER

技術系のこと書きます。

Nmap を使ってシステムに不要なポートが開いていないか調べる

今回はセキュリティの世界では有名な 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 のポートもスキャンもできる。

Port Scanning Techniques

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 でポートスキャンすることで、システムの不要なポートが外部に公開されていないかを確認できる。 繰り返しになるけどポートスキャンといえど攻撃と見なされるので外部のサーバには実行しないように。

コンピュータネットワークセキュリティ

コンピュータネットワークセキュリティ