今回は、Nmapの使い方を題材にしたTryHackMeのRoomに挑戦していきます。
「TryHackMe-Nmap:https://tryhackme.com/room/furthernmap」
準備
まずは、準備をしていきましょう。タスクは、2つあります。
※Chromeで日本語訳しています。見づらいところもありますが、ご了承ください。。。
配備
まずは、「スタートマシン」を選択して、スキャン用のマシンを立ち上げます。
こんな感じで、マシン情報が表示されていれば大丈夫です。
序章
ポートスキャンとは何か?それがなぜ必要なのか?なぜnmapなのか?といったところが簡単に説明されています。
ここは一通り読んでおくことをおすすめします。私のメモは、こんな感じです。
- Webページに接続するとき、port:49534を開いて、サーバーのport:443に接続する場合がある
- コンピュータには、合計65535の使用可能なポートがある
- 多くは標準portとして、登録されている。(HTTP:80、HTTPS:443、Windows NETBIOS:139、SMB:445)
- サーバーが開いているポートがわからないと、ターゲットへの攻撃は不可能(なので、ポートスキャンが大切)
- なぜNmapなのか⇒現在業界標準のツールであるため。ほかのポートスキャンツールが、Nmapの機能に匹敵しないため。
- Nmapは、さまざまな種類のポートスキャンを実行することが可能
- 基本的なポートスキャンは、「各ポートに接続⇒ポートの反応を確認(閉じているか、開いているか、フィルターされているか(主にFW)⇒開いているポートで実行されているサービスを列挙)」
上記を軽く理解したうえで、質問に回答していきましょう。
サーバー上の適切なアプリケーションにトラフィックを転送するために、どのネットワーク構造が使用されていますか?
これは、説明でも出てきましたね。最初「port」だと思ったのですが、「ports」でした。。。
これらのうち、ネットワーク対応のコンピュータで利用できるのはいくつですか?
well-known portsはいくつありますか?
こちらは、Chromeで翻訳すると意味が分からなくなるので、注意が必要です。
well-known portsは、0から1023までのポート番号で、一般的なTCP/IPアプリケーション用に予約されているものですね。
今回は、いくつか聞かれているので「1024」が答えです。
Nmap Switches
続いては、Napmのswitchについて解説されています。
こちらは、問題を解きながら理解していく形ですね。
switchは、nmapに様々な処理を行うように指示するコマンド引数のことらしいです。
「Syn Scan」のヘルプ メニューにリストされている最初のスイッチは何ですか
これはおとなしく、下記のコマンドを実行しちゃいましょう。
nmap -h
答えは、「-sS」ですね。
「UDP スキャン」に使用するスイッチはどれですか?
次は、UDPスキャンですね。
先ほどのスイッチの下にあります。
ターゲットが実行されているオペレーティング システムを検出する場合、どのスイッチを使用しますか?
続いては、OSを検出するスイッチですね。
ここにありました。
Nmap は、ターゲットで実行されているサービスのバージョンを検出するためのスイッチを提供します。このスイッチは何ですか?
サービスのバージョンを検出するための、スイッチですね。
SERVICE/VERSION DETECTIONで見つかると思います。
こちらも問題なしですね。
nmap によって提供されるデフォルトの出力では、ペンテスターに十分な情報が提供されないことがよくあります。冗長性をどのように高めますか?
日本語訳すると難しいので、英語に戻しましょう。
Verbosity level one is good, but verbosity level two is better! How would you set the verbosity level to two?
https://tryhackme.com/room/furthernmap
見た感じ、「verbosity level」を高めるスイッチを探せばよさそうですね。
ありましたね。これによりアウトプットがどのように変わるかは、あとで試してみます。
詳細レベル 1 も良いですが、詳細レベル 2 の方が優れています。詳細レベルを 2 に設定するにはどうすればよいでしょうか。
これは先ほどの()の中にありましたね。「-vv」が答えです。
nmap の結果を 3 つの主要な形式で保存するには、どのスイッチを使用しますか?
OUTPUTで見かけた気がしましたので、探していると
記載がありましたね。「-oA」が答えになります。
nmap の結果を「通常の」形式で保存するには、どのスイッチを使用しますか?
先ほどの上のスイッチにありましたね。「-oN」が正解です。
非常に便利な出力形式: 「grep 可能な」形式で結果を保存するにはどうすればよいでしょうか?
日本語は少しわかりにくいですね。。。
ただ、先ほどと同じところに記載があります。Grepable formatですね。
なので、「-oG」が答えになります。
アグレッシブモードを有効にするにはどうすればいいでしょうか。
MISCのところに、色々有効にするスイッチが記載されてますね。
この中から、すべて有効するスイッチを探せばよさそうです。
答えは、「-A」ですね。
タイミング テンプレートをレベル 5 に設定するにはどうすればよいですか?
タイミングに関するスイッチは、TIMING AND PERFORMANCEを見ればよさそうですね。
レベル5にしたいので、「-T5」が正解ですね。
ポート 80 のみをスキャンするように nmap にどのように指示しますか?
スキャンするポートを絞りたい場合のスイッチを探しましょう。
-p にport rangesをつける形でしょうか。
ポート80のみなので、-p 80が正解っぽいですね。
ポート 1000-1500 をスキャンするように nmap にどのように指示しますか?
スイッチは先ほどと同じものを利用するっぽいですね。
1000-1500なので、おそらく「-p 1000-1500」が正解ですね。
すべてのポートをスキャンするように nmap にどのように指示しますか?
これはわからなかったので、少し調べました。
「-p-」が答えです。「-p 0-65535」の省略形みたいな扱いでしょうかね。
nmap スクリプト ライブラリからスクリプトを有効にするにはどうすればよいでしょうか
SCRIPT SCANに記載がありました。
「–script=」が答えになりますね。
「脆弱性」カテゴリのすべてのスクリプトをどのようにアクティブにしますか?
日本語だと少し意味が分からないので、英語で考えましょう。
How would you activate all of the scripts in the “vuln” category?
https://tryhackme.com/room/furthernmap
先ほどのスイッチを使って、vulnを有効にする感じですね。
「–script=vuln」でいいと思います。
Nmap Switchesに関しては、これで終了です。
機能が充実しているので、覚えるというよりは、ヘルプ見て使えるようになるとかが大切なのかな。。。
【スキャンの種類】概要
ここは説明を読んで、理解できたら完了にしましょう。
私のメモを、ここに残しておきます。
- -sT:TCP接続スキャン
- -sS:SYN(harf-open)スキャン
- -sU:UDPスキャン
- 下記は一般的ではない
- -sN:TCP Null スキャン
- -sF:TCP FIN スキャン
- -sX:TCP Xmas スキャン
【スキャンの種類】TCP Connect スキャン
TCP Connect スキャンに関する説明があります。
最後に少しだけ、問題がありますね。
とりあえず、説明を理解していきましょう。
- TCP Connect スキャンは、3 Way Handshakeを実行することで機能する
- つまり、各TCPポートへ接続し、応答によってサービスが開いているかを確認
- 閉じたポートに送信した場合、RSTフラグを設定したTCPパケットが応答される
- 開いているポートに送信した場合、SYN/ACKフラグが設定されたTCPパケットが応答される
- FWがある場合、多くのFWはパケットをDROPするように構成されている。
そのため、TCP SYNリクエストを送信しても何も返却がない。これは、FWによって保護されているとみなすことができる。 - RST TCPパケットで応答するようにFWを構成することで、閉じているように装う動きをすることができる。
LinuxのIPtablesでは、「iptables -I INPUT -p tcp –dport -j REJECT –reject-with tcp-reset」で対応が可能。
こうすることで、読み取りが非常に困難になることがある。
問題があるので、回答を載せておきます。
TCPプロトコルの適切な動作を定義している RFC はどれですか?
これは、説明の上の方にありましたね。
ポートが閉じている場合、サーバーはこれを示すためにどのフラグを送り返す必要がありますか?
これは私のメモにもあります。
FWは、「RST」を応答して、閉じていることを装う動きをすることで読み取られにくくするということができます。
【スキャンの種類】SYNスキャン
続いては、SYNスキャンについてですね。
色々説明が書かれているので、読んでいきます。
- SYNスキャンは、ハーフオープンスキャン、ステルススキャンとも呼ばれる
- SYN/ACKを受信したあとに、RSTを応答することで、完全に3 Way Handshakeを確立させない
- 古い侵入検知システムは、完全な3 Way Handshakeを監視しているので、回避することができる
- 一般的に、接続が完全に確立されてからログが記録されるため、SYNスキャンが記録されないことが多い
- 3 Way Handshakeを完了(および切断)する手間がないので、TCP Connectスキャンより高速
- Linuxで正しく動作するには、sodu権限が必要。rawパケットを作成する機能が必要なため。
- 不安定なサービスにSYNスキャンをするとダウンする可能性がある
では、問題を回答していきましょう。
SYN スキャンには他に 2 つの名前がありますが、それらは何ですか?
これはかんたんですね。
ハーフオープンとステルスを英語で書いてください。
Nmap は Sudo 権限なしで SYN スキャンを使用できますか (Y/N)?
答えは、Noですね。
sodu権限が必要で、理由は、rawパケットを作成する機能が必要だからですね。
【スキャンの種類】UDPスキャン
UDPスキャンについての説明を読んでいきます。
- UDPはターゲットポートにパケットを送り続けて、成功することを期待するだけ
- UDPは、品質よりも速度に依存する接続(ビデオ共有など)でよく使われる
- 確認応答がないので、スキャンは大幅に困難になる
- パケットを送信した場合、応答がなければ、開いているかFWで保護されているか(特定は困難)
- めったにないが応答が返却されたら、オープンしているとしてマークされる
- ICMPパケットで応答された場合、閉じたポートと認識される
UDPは応答がないからこそ、実際に開いているのかを判定するのが難しいということですね。
では、問題を解いていきましょう。
UDP ポートが Nmap スキャンに応答しない場合、何とマークされますか?
UDPは、開いているかFWでDROPされているかわからないので、「open|filtered」がマークされますね。
UDPポートが閉じている場合、慣例により、ターゲットは「ポートに到達できません」というメッセージを送り返す必要があります。そのためにどのプロトコルを使用しますか?
こちらも説明にありました。ポートに到達できないというメッセージを含む ICMP (ping) パケットで応答する必要がありますね。
【スキャンの種類】NULL, FIN and Xmas
NULLスキャン、FINスキャン、Xmasスキャンについて、解説が載っています。
ここも同様に理解してから、問題に進むようにしましょう。
- 一般的にはあまり利用されていないスキャン方法
- NULLスキャンは、フラグがない状態でTCP要求を送信する。RFCに従って、ポートが閉じている場合は、RSTが応答される。
- FINスキャンは、NULLスキャンが完全に空のパケットを送信するのに対して、FINフラグを使用して送信する。
ポートが閉じていることを、RSTが応答されることで確認をする。 - Xmasスキャン:こちらも基本的にはRST応答を期待する。不正な形式のTCPパケットを送信することでスキャンする。
- RFC793で、開いているポートは全く応答しないということを義務付けているだけである。
- 例えば、Microsoft Windowsなどは、実際ポートが開いているかに関係なく、不正な形式のTCPパケットに対しては、RSTで応答する。⇒これは、すべてのポートが閉じているように表示されてしまう。
では、問題に解答していきましょう。
表示されている 3 つのスキャン タイプのうち、URG フラグを使用するのはどれですか?
こちらは、説明に合った通り「xmasスキャン」になりますね。
NULL、FIN、Xmas スキャンが一般的に使用されるのはなぜですか?
日本語的には少しおかしそうですね。
どちらかというと、「NULL、FIN、Xmasはどのような目的で使われるのが一般的か」というような感じでしょうか。
だとすると、この目的は、FWの回避だとあったので、「firewall evasion」が答えになります。
すべてのポートで RST を使用して NULL、FIN、または Xmas スキャンに応答する一般的なOSはどれですか?
これは、私のメモにもありました。「Microsoft Windows」が答えになります。
【スキャンの種類】ICMP Network スキャン
スキャンの説明については、これで最後ですね。
こちらはポートスキャンではなく、どのIPアドレスにアクティブなホストが含まれているかを確認するためのスキャンのようです。
- 指定されたネットワークの可能な各IPアドレスにICMPパケットを送信する。
応答が受信されれば、そのIPアドレスは有効となる。 - これを、ping sweepという。
- 必ずしも正確ではないが、ベースとしてやっておく価値がある。
問題に解答していきます。
Nmap を使用して 172.16.xx ネットワーク (ネットマスク: 255.255.0.0) で ping スイープを実行するにはどうすればよいでしょうか? (CIDR表記)
Class BのネットワークのCIDRは、/16なので、「nmap -sn 172.16.0.0/16」が答えですね。
【NSE】概要
今までは、スキャンについて色々学んでましたが、ここからはNSEになっています。
NSEは、Luaで記述されており、脆弱性のスキャンからExploitの自動化まで、色々なことができるようです。
- safe:ターゲットに影響を与えない
- intrusive:ターゲットに影響を与える可能性がある
- vuln:脆弱性のスキャン
- exploit:脆弱性の悪用する
- auth:実行中のサービスの認証を回避しようとする (例: FTPサーバーに匿名でログインする)
- brute:サービスを実行するための認証情報をブルートフォースしようとする
- discovery:ネットワークに関する詳細情報を実行中のサービスに照会する (たとえば、SNMP サーバーに照会)
ほかにもいろいろあるようですが、また実際に使ってみて覚えようかなと思います。
では、回答していきます。
NSE スクリプトはどの言語で書かれていますか?
Luaですね。
実稼働環境で実行するのが非常に悪い考えであるスクリプトのカテゴリはどれですか?
ターゲットに影響がある、「intrusive」が問題でしょう。
【NSE】連携
ここは、使い方が載っているだけですね。
とくにつかっていれば、覚えれそうなので、問題だけ解いて終わります。
ftp-anon.nseスクリプトが取ることができるオプションの引数は何ですか?
ということで、下記を実行してみました。
nmap --script-help ftp-anon.nse
リンクを開いてみます。
引数は、「maxlist」らしいです。
【NSE】スクリプトの検索
ここも基本的には使い方の説明なので、問題だけ回答していきます。
/usr/share/nmap/scripts/示された方法のいずれかを使用して、ディレクトリ 内の「smb」スクリプトを検索します。SMB サーバーの基盤となるOSを決定するスクリプトのファイル名は何ですか?
今回は、ls -lを使って、検索してみようと思います。
ll /usr/share/nmap/scripts/*smb*
smbに対応するスクリプトが色々ありますが、「smb-os-discovery.nse」ですね。
このスクリプトを読んでください。それは何に依存していますか?
スクリプトを読めと言われているので、おとなしく読みましょう。
cat /usr/share/nmap/scripts/smb-os-discovery.nse
依存関係を探すと、「smb-brute」と記載がありました。
ファイアウォールの回避
通常のWindowsホストは、デフォルトのファイアウォールですべてのICMPパケットをブロックするので、Nmapはこのファイアウォール構成を持つホストを無効とし、まったくスキャンを行わなくなります。
なので、これを回避する方法が必要です。
- ホストをスキャンする前に、いちいちpingを実行させないようにして、Nmapが常にターゲットホストを生きているものとして扱う。
- ただし、非常に長い時間がかかってしまうので、注意が必要。
では、問題に解答していきましょう。
多くの場合ブロックされ、-Pnスイッチ を使用する必要がある単純な (そして頻繁に依存する) プロトコルはどれですか?
-Pnスイッチは、ICMPパケットをブロックされないようにするためですかね。
[調査]パケットの末尾に任意の長さのランダム データを追加できる Nmap スイッチはどれですか?
nmapのヘルプを見てみます。
nmap -help
「–data-length」がランダムデータを追加すると書いてますね。
実践
ここからは、実践ですね!!(やっと。。。)
では、問題に答えながらやっていきましょう。
ターゲット ( 10.10.253.93) は ICMP (ping) 要求に応答しますか (Y/N)?
では、適当にpingを送ってみましょう。
PING 10.10.253.93 (10.10.253.93) 56(84) bytes of data.
--- 10.10.253.93 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4094ms
要求には応答しなかったので、「N」ですね。
ターゲットの最初の 999 個のポートで Xmas スキャンを実行します — 開いている、またはフィルタリングされていることが示されているポートの数は?
$ sudo nmap -sX -p 1-999 10.10.156.142
Starting Nmap 7.92 ( https://nmap.org ) at 2023-02-09 00:58 JST
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.14 seconds
これではだめでした。pingは通らないので、-Pnをつける必要があります。
$ sudo nmap -sX -p 1-999 10.10.156.142 -Pn -vv
Starting Nmap 7.92 ( https://nmap.org ) at 2023-02-09 01:00 JST
Initiating Parallel DNS resolution of 1 host. at 01:00
Completed Parallel DNS resolution of 1 host. at 01:00, 0.00s elapsed
Initiating XMAS Scan at 01:00
Scanning 10.10.156.142 [999 ports]
XMAS Scan Timing: About 15.52% done; ETC: 01:03 (0:02:49 remaining)
XMAS Scan Timing: About 30.53% done; ETC: 01:03 (0:02:19 remaining)
XMAS Scan Timing: About 45.55% done; ETC: 01:03 (0:01:49 remaining)
XMAS Scan Timing: About 60.56% done; ETC: 01:03 (0:01:19 remaining)
XMAS Scan Timing: About 75.58% done; ETC: 01:03 (0:00:49 remaining)
Completed XMAS Scan at 01:03, 201.93s elapsed (999 total ports)
Nmap scan report for 10.10.156.142
Host is up, received user-set.
Scanned at 2023-02-09 01:00:14 JST for 201s
All 999 scanned ports on 10.10.156.142 are in ignored states.
Not shown: 999 open|filtered tcp ports (no-response)
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 202.00 seconds
Raw packets sent: 1998 (79.920KB) | Rcvd: 0 (0B)
これで、open|filteredが999であることがわかりました。
これには理由があります – それは何ですか?
先ほど、-vvをつけてましたので、理由が書かれていますね。
no responseだということです。
ターゲットの最初の 5000 ポートでTCP SYN スキャンを実行します。開いているポートはいくつありますか?
$ sudo nmap -sS -p 1-5000 10.10.156.142 -Pn -vv
Starting Nmap 7.92 ( https://nmap.org ) at 2023-02-09 01:12 JST
Initiating Parallel DNS resolution of 1 host. at 01:12
Completed Parallel DNS resolution of 1 host. at 01:12, 0.00s elapsed
Initiating SYN Stealth Scan at 01:12
Scanning 10.10.156.142 [5000 ports]
Discovered open port 135/tcp on 10.10.156.142
Discovered open port 21/tcp on 10.10.156.142
Discovered open port 53/tcp on 10.10.156.142
Discovered open port 80/tcp on 10.10.156.142
Discovered open port 3389/tcp on 10.10.156.142
Completed SYN Stealth Scan at 01:13, 37.75s elapsed (5000 total ports)
Nmap scan report for 10.10.156.142
Host is up, received user-set (0.27s latency).
Scanned at 2023-02-09 01:12:25 JST for 38s
Not shown: 4995 filtered tcp ports (no-response)
PORT STATE SERVICE REASON
21/tcp open ftp syn-ack ttl 127
53/tcp open domain syn-ack ttl 127
80/tcp open http syn-ack ttl 127
135/tcp open msrpc syn-ack ttl 127
3389/tcp open ms-wbt-server syn-ack ttl 127
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 37.82 seconds
Raw packets sent: 10017 (440.748KB) | Rcvd: 27 (1.188KB)
これをみると、openは5なのがわかりますね。
ボックスに対してスクリプトを展開します。ftp-anonNmapはポート 21でFTPサーバーに正常にログインできますか? (はい/いいえ)
$ nmap --script=ftp-anon -p 21 10.10.156.142 -vv
Starting Nmap 7.92 ( https://nmap.org ) at 2023-02-09 01:21 JST
NSE: Loaded 1 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 1) scan.
Initiating NSE at 01:21
Completed NSE at 01:21, 0.00s elapsed
Initiating Ping Scan at 01:21
Scanning 10.10.156.142 [2 ports]
Completed Ping Scan at 01:21, 0.26s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 01:21
Completed Parallel DNS resolution of 1 host. at 01:21, 0.00s elapsed
Initiating Connect Scan at 01:21
Scanning 10.10.156.142 [1 port]
Discovered open port 21/tcp on 10.10.156.142
Completed Connect Scan at 01:21, 0.26s elapsed (1 total ports)
NSE: Script scanning 10.10.156.142.
NSE: Starting runlevel 1 (of 1) scan.
Initiating NSE at 01:21
NSE Timing: About 0.00% done
Completed NSE at 01:22, 31.32s elapsed
Nmap scan report for 10.10.156.142
Host is up, received syn-ack (0.26s latency).
Scanned at 2023-02-09 01:21:49 JST for 31s
PORT STATE SERVICE REASON
21/tcp open ftp syn-ack
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_Can't get directory listing: TIMEOUT
NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 1) scan.
Initiating NSE at 01:22
Completed NSE at 01:22, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 32.00 seconds
「ftp-anon: Anonymous FTP login allowed (FTP code 230)」でログインができたことが確認できたかと思います。
まとめ
今回は、Nmapの使い方について勉強するために、TryHackMeのRoomに挑戦してみました。
Nmapは強力なネットワークスキャンツールですが、機能豊富なので使いこなすには時間がかかりそうですね。
色々チャレンジしていきながら、使い方をマスターしていければいいかなと思っています。