[Linux] ポートスキャンを行う - nmap

不必要にポートを開放していると、そこからアタックを仕掛けられることがあります。 またSSHを22番などデフォルトのポートで開放している場合もターゲットにされやすいため、別のポート番号にしておくのも定石だったりもします(諸説ありますが個人的にはピンポンダッシュを防げるのでいつも変更しています)。

不特定多数がアクセスできる状態にあるサーバや端末は、少なともリリース前にはポートスキャンをかけておくのがおすすめです。

nmapのインストール

macOSの場合はbrewで一発です。

$ brew install nmap

Linuxなどの場合はyumで一発です。

$ sudo yum install nmap

今回はmacOSで作業しますが使い方はどの環境でも同じです。v7.70が入りました。

$ nmap --version
Nmap version 7.70 ( https://nmap.org )
Platform: x86_64-apple-darwin17.3.0
Compiled with: liblua-5.3.3 openssl-1.0.2n nmap-libssh2-1.8.0 libz-1.2.11 nmap-libpcre-7.6 nmap-libpcap-1.7.3 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: kqueue poll select

nmapでポートスキャン

基本的なスキャン

nmapコマンドにIPアドレスやホスト名を指定することで、1,000個のTCPポートをスキャンしてくれます。

$ nmap localhost

以下、実行例です。

$ nmap localhost

Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-29 16:28 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00058s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 959 closed ports, 35 filtered ports

PORT    STATE SERVICE
80/tcp  open  http
110/tcp open  pop3
143/tcp open  imap
631/tcp open  ipp
993/tcp open  imaps
995/tcp open  pop3s

STATEの種類

STATE列はそれぞれ以下のような意味を持ちます。

STATE 状態
open ポートが開いている
closed アクセス可能だがLISTENしているアプリケーションはいない
filtered パケットフィルタリングされており判別不可能
unfiltered アクセス可能だがopenかclosedか判別不可能
open/filtered ポートが開いているかパケットフィルタリングされているか判別不可能
closed/filtered ポートが閉じているかパケットフィルタリングされているか判別不可能

nmapのオプション

-A : OSやバージョン情報を表示

-Aオプションでサーバの種類やOSなどを表示することができます。もちろん外部から取得できる物に限られます。以下の例ではWebサーバがApacheであることやそのバージョンなどを取得することができました。

$ nmap -A localhost

Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-29 16:53 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00064s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 966 closed ports, 28 filtered ports

PORT    STATE SERVICE    VERSION
80/tcp  open  http       Apache httpd 2.4.33 ((Unix) PHP/7.1.23)
|_http-server-header: Apache/2.4.33 (Unix) PHP/7.1.23
|_http-title: Site doesn't have a title (text/html).
110/tcp open  tcpwrapped
143/tcp open  tcpwrapped
631/tcp open  ipp        CUPS 2.2
| http-methods: 
|_  Potentially risky methods: PUT
| http-robots.txt: 1 disallowed entry 
|_/
|_http-server-header: CUPS/2.2 IPP/2.1
|_http-title: Home - CUPS 2.2.5
993/tcp open  imaps?
995/tcp open  pop3s?

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 24.02 seconds

-p : ポート番号を指定する

-pでポート番号を指定できます。これは単一のポート番号はもちろんですが、-p 1-1024のように範囲を指定することもできます。

試しに全ポートをスキャンしたらlocalhostにも関わらず12分近くかかりましたw

$ nmap -p 1-65535 localhost

Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-29 17:01 JST
Strange read error from 127.0.0.1 (22 - 'Invalid argument')
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00032s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 65514 closed ports

PORT      STATE    SERVICE
80/tcp    open     http
110/tcp   open     pop3
143/tcp   open     imap
631/tcp   open     ipp
993/tcp   open     imaps
995/tcp   open     pop3s
5037/tcp  open     unknown
12080/tcp open     unknown
12110/tcp open     unknown
12143/tcp open     unknown
12443/tcp open     unknown
12993/tcp open     unknown
12995/tcp open     unknown
15292/tcp open     unknown
15393/tcp open     unknown
56814/tcp open     unknown
56825/tcp open     unknown
57889/tcp open     unknown
60507/tcp filtered unknown
61403/tcp open     unknown
65106/tcp open     unknown

Nmap done: 1 IP address (1 host up) scanned in 717.65 seconds

UDPポートを調べたい場合はnmap -p U53、明示的にTCPを指定する場合はnmap -p T123とします。

-sU : UDPポートをスキャン

-sUオプションでUDPポートのスキャンができるのですが、一般ユーザーで実行するとroot権限が必要と怒られてしまうので、sudoなどで実行します。

$ nmap -sU localhost
You requested a scan type which requires root privileges.
QUITTING!

今度は動きました。

$ sudo nmap -sU localhost
Password:

Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-29 17:22 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000039s latency).
Other addresses for localhost (not scanned): ::1
All 1000 scanned ports on localhost (127.0.0.1) are closed (500) or open|filtered (500)

Nmap done: 1 IP address (1 host up) scanned in 3.50 seconds

-O : OSを検出する

-Oオプションで指定したホストのOSを調査します。 これも確実にわかるわけではないのですが、何らかのヒントがある場合はそれをもとに推察してくれます。

$ sudo nmap -O mi53.net 

Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-29 17:25 JST
Nmap scan report for mi53.net (13.112.155.59)
Host is up (0.011s latency).
rDNS record for 13.112.155.59: ec2-13-112-155-59.ap-northeast-1.compute.amazonaws.com
Not shown: 997 filtered ports

PORT    STATE  SERVICE
53/tcp  open   domain
80/tcp  open   http
443/tcp closed https

Aggressive OS guesses: Linux 2.6.9-55.0.2.EL (Red Hat Enterprise Linux) (89%), Linux 2.6.17 (Mandriva) (87%), Linux 2.6.18 (CentOS 5.2) (87%), Linux 2.6.18 - 2.6.32 (87%), Linux 2.6.18 (Centos 5.3) (87%), Linux 2.6.8 (Debian 3.1) (87%), Linux 2.6.18 (86%), Linux 4.3 (86%), Linux 2.6.9-022stab078.19-enterprise (CentOS 4.2 x86) (86%), Riverbed Steelhead Mobile Controller 4.0.3 (86%)
No exact OS matches for host (test conditions non-ideal).

OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 9.62 seconds

回答は以下の通り。

$  uname -a
Linux ip-XXX-XXX-XXX-XXX 4.14.106-79.86.amzn1.x86_64 #1 SMP Tue Mar 19 00:48:07 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/os-release 
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"

参考ページ