Metasploitを用いたペネトレーションテスト(ポートスキャン編)

ペネトレーションテスト(侵入テスト)とは,ネットワークに接続されているコンピュータシステムに対し,実際に既知の技術を用いて侵入を試みることで,システムに脆弱性がないかどうかテストする手法のことです.

今回はペネトレーションテストに関する記事の初回ということで,攻撃の事前準備として行われる,ポートスキャンと呼ばれる調査活動を,Kali Linux内のMetasploitを利用して実際に行ってみたいと思います.

※注意
本記事の内容は犯罪行為を助長するものではありません.紹介している手法はペネトレーションテストではありますが,他人のサーバに行うことはサイバー攻撃と取られてもおかしくない内容です.サイバー攻撃は立派な犯罪ですので,必ず自身の管理下にあるサーバやネットワークに対してのみ行うようにしてください.倫理観および責任感,ITリテラシーのある方のみ記事を参考にしていただけると幸いです.

この記事の目的

  • Kali Linuxの簡単な使い方を理解する
  • Metasploitの簡単な使い方を理解する
  • ポートスキャンの方法と,得られる情報について理解する
  • 攻撃者の心理を考えることで,セキュリティ確保に活かす

ポートスキャンとは

相手ホストにダメージを与える,もしくは侵入するといったとき,事前の準備として,ポートスキャンと呼ばれる調査を行います.これは「外部から対象サーバへアクセスが可能か?」「脆弱性のあるサービスが動いていないか?」を調べる作業です.
元来ネットワーク管理者がポートの状態確認のために行う調査ですが,クラッカは侵入前調査のためにこれを悪用しているのです.

IPAより

実際にポートスキャンを行うことにより,不要なポートが開放されていることでどのような情報が流出してしまう可能性があるのかを理解し,正しくポートの設定を行うことの重要性を再確認していきたいと思います.

ペネトレーションテストを行う環境

ホストOS:macOS High Sierra
利用する仮想環境:VirtualBox
攻撃を行うゲストOS:Kali Linux
ペネトレーションテストツール:Metasploit
攻撃を受けるゲストOS:Metasploitable2(Ubuntu)

※本記事では,Kali Linux及びMetasploitable2の環境構築は行いません.公式ドキュメントや別の記事を参考にして環境構築を行ってください.またペネトレーションテストを行う際は,インターネットに繋がっていない状態で行うことを推奨します.ネットワークアダプタの設定はホストオンリーアダプタ,もしくは内部ネットワークにしてください.

Kali Linuxとは

Kali Linuxは,高度な侵入テストとセキュリティ監査を目的としたDebianベースのLinuxディストリビューションです.
Kaliには,侵入テスト,セキュリティ研究,コンピュータフォレンジック,リバースエンジニアリングなど,さまざまな情報セキュリティタスクに合わせて作られた数百のツールが含まれています.
(日本語訳)

公式ドキュメントより

Mac内にVirtualBoxを利用して,Kali Linuxの仮想環境を構築し,ペネトレーションテストを行います.

Metasploitとは

Metasploitは,オープンソースなコンピュータセキュリティに関するプロジェクトで,脆弱性,ペネトレーションテスト,侵入検知システム,シェルコードのアーカイブ,アンチフォレンジクス(コンピュータ・フォレンジクスによる解析への対抗技術)などを主な守備範囲としたプロジェクトの名称である.
また,本プロジェクトのその成果ソフトウェアとしてよく知られるMetasploit Frameworkの省略名としてもしばしば用いられる.

Wikipediaより

本記事でもMetasploit Frameworkの意で,Metasploitと呼称しています.
Kali LinuxにはデフォルトでMetasploitがインストールされているので,ペネトレーションテスト環境にKali Linuxを利用している場合はインストール作業を行う必要がありません.

Metasploitable2とは

Metasploitableは,意図的に脆弱なLinux仮想マシンです.このVMは,セキュリティトレーニングの実施,セキュリティツールのテスト,および一般的な侵入テスト手法の実践に使用できます.
(日本語訳)

公式ドキュメントより

MetasploitableもKali Linuxと同様にVirtualBoxを利用して仮想環境を構築しています.

ポートスキャンの実施

nmapコマンドによるPingスキャン

まずはポートスキャンによく利用されるnmapコマンドを用いて,ネットワーク内のPing応答するホストを検出してみたいと思います.本記事の場合,調査対象のネットワークは192.168.56.0/24となります.

# nmap -sP 192.168.56.0/24

Starting Nmap 7.60 ( https://nmap.org ) at 2018-01-16 20:27 JST
Nmap scan report for 192.168.56.1
Host is up (0.00061s latency).                            /* ホストの検出(Ping応答あり) */
MAC Address: 0A:00:27:00:00:00 (Unknown)    /* 検出したNICのMACアドレス */
Nmap scan report for 192.168.56.100
Host is up (0.0010s latency).
MAC Address: 08:00:27:37:ED:1F (Oracle VirtualBox virtual NIC)
Nmap scan report for 192.168.56.102
Host is up (0.00099s latency).
MAC Address: 08:00:27:3F:86:B3 (Oracle VirtualBox virtual NIC)
Nmap scan report for 192.168.56.101
Host is up.
Nmap done: 256 IP addresses (4 hosts up) scanned in 27.94 seconds

これにより,対象ネットワーク内のPing応答のあるホストを検出することができました.この結果をもとに,更に詳しく調査を行うホストを決定します.今回はMetasploitable2のIPアドレスが192.168.56.102なので,192.168.56.102のホストに対して更なる調査を行っていきます.

nmapコマンドによるSYNスキャン

次に調査対象のホストに対して,ポートスキャンを行います.ポートスキャンの手法はハーフオープンスキャンとも呼ばれるSYNスキャンです.この手法はTCPコネクションを完全に確立することがないため,痕跡を残しにくいという特徴があります.

# nmap -sS 192.168.56.102 -O

Starting Nmap 7.60 ( https://nmap.org ) at 2018-01-16 20:28 JST
Nmap scan report for 192.168.56.102
Host is up (0.00037s latency).
Not shown: 977 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
22/tcp   open  ssh               /* SSHが利用する22番ポート */
23/tcp   open  telnet
25/tcp   open  smtp              /* SMTPが利用する25番ポート */
53/tcp   open  domain
80/tcp   open  http              /* HTMLが利用する80番ポート */
111/tcp  open  rpcbind
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
512/tcp  open  exec
513/tcp  open  login
514/tcp  open  shell
1099/tcp open  rmiregistry
1524/tcp open  ingreslock
2049/tcp open  nfs
2121/tcp open  ccproxy-ftp
3306/tcp open  mysql
5432/tcp open  postgresql
5900/tcp open  vnc
6000/tcp open  X11
6667/tcp open  irc
8009/tcp open  ajp13
8180/tcp open  unknown
MAC Address: 08:00:27:3F:86:B3 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 2.6.X                         /* OSの種類とバージョン */
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.9 - 2.6.33
Network Distance: 1 hop

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

これにより,対象ホストのオープン状態のポートを検出することができました.また,-OオプションによりOSの種類とバージョンを検出することも可能です.

nmapコマンドによるバージョンスキャン

ここまでで開いているポートがわかりました.そのポートがWellKnownポートであれば,動いているサービスを予想することができます.しかし,必ずしも予想通りのサービスが稼働しているとは限りません.そこで,そのポートで実際に稼働しているサービスとそのバージョンを検出することができます.

今回はおそらくSSH,SMTP,HTMLが稼働していると考えられる22,25,80番ポートの,より詳細なサービス及びバージョンを検出してみたいと思います.

# nmap -sV 192.168.56.102 -A -v -p 22,25,80

Starting Nmap 7.60 ( https://nmap.org ) at 2018-01-17 01:18 JST
【中略】
Scanning 192.168.56.102 [3 ports]
Discovered open port 22/tcp on 192.168.56.102
Discovered open port 80/tcp on 192.168.56.102
Discovered open port 25/tcp on 192.168.56.102
Completed SYN Stealth Scan at 01:19, 0.03s elapsed (3 total ports)
【中略】
Nmap scan report for 192.168.56.102
Host is up (0.00040s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)            /* SSHのバージョン */
| ssh-hostkey: 
|   1024 60:0f:cf:e1:c0:5f:6a:74:d6:90:24:fa:c4:d5:6c:cd (DSA)
|_  2048 56:56:24:0f:21:1d:de:a7:2b:ae:61:b1:24:3d:e8:f3 (RSA)
25/tcp open  smtp    Postfix smtpd                                           /* SMTPのサービス */
|_smtp-commands: metasploitable.localdomain, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, 
| ssl-cert: Subject: commonName=ubuntu804-base.localdomain/organizationName=OCOSA/stateOrProvinceName=There is no such thing outside US/countryName=XX
| Issuer: commonName=ubuntu804-base.localdomain/organizationName=OCOSA/stateOrProvinceName=There is no such thing outside US/countryName=XX
| Public Key type: rsa
| Public Key bits: 1024
| Signature Algorithm: sha1WithRSAEncryption
| Not valid before: 2010-03-17T14:07:45
| Not valid after:  2010-04-16T14:07:45
| MD5:   dcd9 ad90 6c8f 2f73 74af 383b 2540 8828
|_SHA-1: ed09 3088 7066 03bf d5dc 2373 99b4 98da 2d4d 31c6
|_ssl-date: 2018-01-16T16:19:15+00:00; 0s from scanner time.
| sslv2: 
|   SSLv2 supported
|   ciphers: 
|     SSL2_RC4_128_EXPORT40_WITH_MD5
|     SSL2_RC2_128_CBC_EXPORT40_WITH_MD5
|     SSL2_DES_64_CBC_WITH_MD5
|     SSL2_DES_192_EDE3_CBC_WITH_MD5
|     SSL2_RC2_128_CBC_WITH_MD5
|_    SSL2_RC4_128_WITH_MD5
80/tcp open  http    Apache httpd 2.2.8 ((Ubuntu) DAV/2)                    /* HTTPのサービス */
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.2.8 (Ubuntu) DAV/2
|_http-title: Metasploitable2 - Linux
MAC Address: 08:00:27:3F:86:B3 (Oracle VirtualBox virtual NIC)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.9 - 2.6.33
Uptime guess: 0.002 days (since Wed Jan 17 01:16:28 2018)
Network Distance: 1 hop
TCP Sequence Prediction: Difficulty=196 (Good luck!)
IP ID Sequence Generation: All zeros
Service Info: Host:  metasploitable.localdomain; OS: Linux; CPE: cpe:/o:linux:linux_kernel
【中略】
Nmap done: 1 IP address (1 host up) scanned in 21.76 seconds
           Raw packets sent: 23 (1.758KB) | Rcvd: 19 (1.470KB)

これにより,22番ポートはOpenSSH 4.7,25番ポートはPostfix,80番ポートはApache 2.2.8であることがわかりました.他にもSSHやSMTPがサポートしているプロトコルや,HTTPがサポートしているメソッドなど様々な情報が見て取れます.

もし利用しているサービスのバージョンが脆弱性を含むものである場合,この情報をもとに実際に脆弱性を突いた攻撃を実行されてしまう可能性があります.

Metasploitを用いたTCPスキャン

次はいよいよMetasploitを用いたポートスキャンを行います.もし上述のSYNスキャンを利用したポートスキャンが失敗した場合,TCPスキャンを行うことができます.TCPスキャンはSYNスキャンと比較して,痕跡を残してしまう代わりに,より正確な情報を得ることができる可能性があります.

TCPスキャンはnmapコマンドでも行うことができますが,今回はMetasploitの基本的な使い方を理解するためにMetasploitのモジュールを用いて行います.

Metasploitには非常に多くのツールが含まれています.しかし,基本的なコマンドさえ覚えておけばそこまで複雑な操作を行う必要はありません.まずはmsfconsoleコマンドでMatasploitを起動し,利用するモジュールの検索を行います.

Metasploitの起動とモジュールの検索

# msfconsole
msf > search portscan

Matching Modules
================

   Name                                              Disclosure Date  Rank    Description
   ----                                              ---------------  ----    -----------
   auxiliary/scanner/http/wordpress_pingback_access                   normal  WordPress Pingback Locator
   auxiliary/scanner/natpmp/natpmp_portscan                           normal  NAT-PMP External Port Scanner
   auxiliary/scanner/portscan/ack                                     normal  TCP ACK Firewall Scanner
   auxiliary/scanner/portscan/ftpbounce                               normal  FTP Bounce Port Scanner
   auxiliary/scanner/portscan/syn                                     normal  TCP SYN Port Scanner
   auxiliary/scanner/portscan/tcp                                     normal  TCP Port Scanner
   auxiliary/scanner/portscan/xmas                                    normal  TCP "XMas" Port Scanner
   auxiliary/scanner/sap/sap_router_portscanner                       normal  SAPRouter Port Scanner

ポートスキャンに利用するモジュールを検索するためには,search portscanコマンドを実行します.その結果,ポートスキャン関連のモジュールの一覧が表示されるので,表示結果を参考に利用するモジュールを決定します.今回はTCPスキャンを行うのでtcpというモジュールを利用します.

モジュールの選択及び設定の表示

msf > use auxiliary/scanner/portscan/tcp
msf auxiliary(scanner/portscan/tcp) > show options

Module options (auxiliary/scanner/portscan/tcp):

   Name         Current Setting  Required  Description
   ----         ---------------  --------  -----------
   CONCURRENCY  10               yes       The number of concurrent ports to check per host
   DELAY        0                yes       The delay between connections, per thread, in milliseconds
   JITTER       0                yes       The delay jitter factor (maximum value by which to +/- DELAY) in milliseconds.
   PORTS        1-10000          yes       Ports to scan (e.g. 22-25,80,110-900)
   RHOSTS                        yes       The target address range or CIDR identifier
   THREADS      1                yes       The number of concurrent threads
   TIMEOUT      1000             yes       The socket connect timeout in milliseconds

モジュールを選択するにはuse モジュール名コマンドを実行します.次にポートスキャンの設定を行うため,tcpモジュールの設定項目を確認するために,show optionsコマンドを実行します.これにより設定項目の一覧と,デフォルトの値が表示されます.設定項目の内容を変更するにはset 設定項目名 値コマンドを実行します.今回は対象となるホストを指定します.

set rhosts 192.168.56.102

TCPスキャンの実行

msf auxiliary(scanner/portscan/tcp) > run

[+] 192.168.56.102:       - 192.168.56.102:22 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:25 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:23 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:21 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:53 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:80 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:111 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:139 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:445 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:512 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:513 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:514 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:1099 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:1524 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:2049 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:2121 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:3306 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:3632 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:5432 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:5900 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:6000 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:6667 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:6697 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:8009 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:8180 - TCP OPEN
[+] 192.168.56.102:       - 192.168.56.102:8787 - TCP OPEN
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

モジュールを実行するには,runコマンドを実行します.上記の実行結果を見ると,1-10000番ポート中,26個のポートが開いていることが確認できます.

おわりに

これでnmapとMetasploitを用いたポートスキャンは以上になります.
記事タイトルがMetasploitを用いたペネトレーションテストなのですが,大半がnmapの利用方法になってしまいました.ポートスキャンだけであればMetasploitを使わなくてもできてしまいますからね.(笑)Metasploitを利用する利点としては,ポートスキャの結果をデータベースに保存し,他の攻撃に利用するなど,別のモジュールと組み合わせて使えることだと思います.

Metasploitの別のモジュールを利用したペネトレーションテストもまとまり次第,記事にしていきます.

参考文献

https://nmap.org/man/ja/index.html
https://www.hackingtutorials.org/scanning-tutorials/port-scanning-and-os-detection-with-nmap/
https://www.offensive-security.com/metasploit-unleashed/port-scanning/
http://www.nowhere.co.jp/blog/archives/20160720-103752.html