脆弱性診断 – ポートスキャン –


今回は、セキュリティ問題を確認するための基本中の基本とも言うべき

ポートスキャン

について、nmap を使った方法と、実際に実施した結果を書いていく。

主な内容は以下の通り。

  1. nmap のインストール
  2. 基本的な使い方とその挙動
  3. まとめ

なお、nmap は脆弱性検査に使われるものであるが、

攻撃するための事前情報収集などにも利用されうる。

このため、自分の責任範囲外のサイトなどに適用した場合、ハッキング行為とみなされる恐れがある。

よって、利用する際には、これまで記載してきた環境のように、

自分のネットワーク内にある、自分のサイトや機器の脆弱性診断

に限って利用すべきであることにご注意頂きたい。



■nmap のインストール

nmap は非常に多機能なポートスキャンツール。

自分のサイトに不要なポートが開いていないか、

利用している OS やツールのバージョンは何か、などを調べることができる。

正直、

全てのオプションを使いこなすのは相当難しいのではないか、

と思うが、いくつか知っているだけでも十分に有益。

よってまずはこれをインストールする。

インストール自体は非常に簡単。

root@raspi-03# apt-get install nmap -y

で終了。

ということで、早速使ってみる。



■基本的な使い方とその挙動

nmap のオプションやその意味などについては、

nmap.org
https://nmap.org/

にまとめられている。

その他、日本語で解説しているサイトもたくさんあるので、自分にあったものを使えばよいと思う。

ひとまず私の場合、以下のパターンについて、

実際の結果とともに、

どんな挙動をしているのか、

をパケットキャプチャしながら調べてみた。

  1. 最も基本的な使い方
  2. 同一ネットワーク内の機器を調べる
  3. OS 及びツールのバージョンを調べる
  4. ツールのバージョンだけ調べる
  5. UDP ポートについて調べる



■最も基本的な使い方

 

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 を試してみた。

パケットを見ることで、どういう挙動で調べているのか、もよく分かった。

実際にやってみると、やっぱり面白い。

ということで、まとめとして今回のポイントを以下に記載しておく。

今回の Point!・nmap は多機能ポートスキャンツール。apt-get install nmap で簡単インストール。
・IP address を指定すると、開いてるポートを教えてくれる。
・ネットマスク指定ならネットワーク上の全機器を調査。
・機器の生死は IP address 総当たりの ARP パケットで確認!
・ポートは SYN パケットをこれまた総当たりで送信。返事をみて開け閉め確認!
・OS やサービスのソフト、そのバージョンも調べられる!
・UDP だって検査可能!

じゃぁこの検査結果はどうやって使うの?の一例を、次回以降記載したいと思う。




Copyright (c) 2017 Webmaster of this site All Rights Reserved.
カテゴリー: ラズパイでセキュリティ, 情報処理安全確保支援士 タグ: , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください