Nmapを使用して開いているポートをスキャンする方法
序章
ネットワーキングは、多くの新進のシステム管理者にとって広範で圧倒的なトピックです。 さまざまなレイヤー、プロトコル、インターフェイス、およびそれらを理解するために習得する必要のある多くのツールとユーティリティがあります。
TCP / IPおよびUDPネットワーキングでは、ポートは論理通信のエンドポイントです。 1つのIPアドレスで、Webサーバー、アプリケーションサーバー、ファイルサーバーなどの多くのサービスが実行されている場合があります。 これらの各サービスが通信するために、各サービスは特定のポートでリッスンして通信します。 サーバーに接続するときは、IPアドレスとポートに接続します。
多くの場合、使用するソフトウェアがポートを指定します。 たとえば、https://digitalocean.com
に接続すると、安全なWebトラフィックのデフォルトポートであるポート443
でdigitalocean.com
サーバーに接続します。 これがデフォルトであるため、ブラウザがポートを追加します。
このチュートリアルでは、ポートについて詳しく説明します。 netstat
プログラムを使用して開いているポートを識別し、nmap
プログラムを使用してネットワーク上のマシンのポートの状態に関する情報を取得します。 完了すると、一般的なポートを識別し、システムをスキャンして開いているポートを探すことができます。
ノート: このチュートリアルでは、IPv4セキュリティについて説明します。 Linuxでは、IPv6のセキュリティはIPv4とは別に維持されます。 たとえば、「nmap」はデフォルトでIPv4アドレスをスキャンしますが、適切なオプションが指定されている場合はIPv6アドレスもスキャンできます(nmap-6)。
VPSがIPv6用に構成されている場合は、IPv4とIPv6の両方のネットワークインターフェイスを適切なツールで保護することを忘れないでください。 IPv6ツールの詳細については、次のガイドを参照してください。LinuxVPSでIPv6を使用するようにツールを構成する方法
ポートを理解する
OSIネットワークモデルには多くの層があります。 トランスポート層は、主に異なるサービスとアプリケーション間の通信に関係する層です。
このレイヤーは、ポートが関連付けられているメインレイヤーです。
ポート構成を理解するには、用語に関するある程度の知識が必要です。 次の説明を理解するのに役立ついくつかの用語を次に示します。
-
ポート:オペレーティングシステム内に実装されたアドレス可能なネットワークロケーション。さまざまなアプリケーションまたはサービス宛てのトラフィックを区別するのに役立ちます。
-
インターネットソケット:IPアドレスと関連するポート番号、およびデータの処理に使用される転送プロトコルを指定するファイル記述子。
-
Binding :アプリケーションまたはサービスがインターネットソケットを使用して、入力および出力しているデータを処理するときに実行されるプロセス。
-
リスニング:サービスは、サービスのクライアントからの要求を待機するために、ポート/プロトコル/ IPアドレスの組み合わせにバインドしているときに、ポートを「リッスン」していると言われます。
リクエストを受信すると、リッスンしているのと同じポートを使用して、クライアントとの接続を確立します(適切な場合)。 使用されるインターネットソケットは特定のクライアントIPアドレスに関連付けられているため、サーバーが他のクライアントの要求を同時にリッスンして処理することを妨げることはありません。
- ポートスキャン:ポートスキャンは、開いているポートとその背後にあるサービスとオペレーティングシステムに関する情報を取得する目的で、多数のシーケンシャルポートへの接続を試みるプロセスです。
共通ポートの識別
ポートは、1
から65535
の範囲の番号で指定されます。
-
1024
より下の多くのポートは、LinuxおよびUnixライクなオペレーティングシステムが重要なネットワーク機能にとって重要であると見なすサービスに関連付けられているため、サービスを割り当てるにはroot権限が必要です。 -
1024
と49151
の間のポートは、「登録済み」と見なされます。 これは、IANA(Internet Assigned Numbers Authority)にリクエストを発行することにより、特定のサービスのために(非常に緩い意味で)それらを「予約」できることを意味します。 これらは厳密には強制されませんが、特定のポートで実行される可能性のあるサービスに関する手がかりを与えることができます。 -
49152
と65535
の間のポートは登録できず、私的使用をお勧めします。
利用可能なポートの数が非常に多いため、特定のポートにバインドする傾向のあるサービスの大部分を気にする必要はありません。
ただし、どこにでもあるため、知っておく価値のあるポートがいくつかあります。 以下は非常に不完全なリストにすぎません。
- 20 :FTPデータ
- 21 :FTP制御ポート
- 22 :SSH
- 23 :Telnet(安全ではない、ほとんどの用途には推奨されません)
- 25 :SMTP
- 43 :WHOISプロトコル
- 53 :DNSサービス
- 67 :DHCPサーバーポート
- 68 :DHCPクライアントポート
- 80 :HTTP-暗号化されていないWebトラフィック
- 110 :POP3メールポート
- 113 :IRCネットワークでのID認証サービス
- 143 :IMAPメールポート
- 161 :SNMP
- 194 :IRC
- 389 :LDAPポート
- 443 :HTTPS-安全なWebトラフィック
- 587 :SMTP-メッセージ送信ポート
- 631 :CUPS印刷デーモンポート
- 666 :DOOM-このレガシーゲームには実際には独自の特別なポートがあります
これらは、ポートに一般的に関連付けられているサービスのほんの一部です。 それぞれのドキュメント内で、構成しようとしているアプリケーションに適したポートを見つけることができるはずです。
ほとんどのサービスは、デフォルト以外のポートを使用するように構成できますが、クライアントとサーバーの両方が非標準のポートを使用するように構成されていることを確認する必要があります。
/etc/services
ファイルを見ると、いくつかの一般的なポートのリストを取得できます。
- less /etc/services
一般的なポートとそれに関連するサービスのリストが表示されます。
Output. . .
tcpmux 1/tcp # TCP port service multiplexer
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
daytime 13/tcp
daytime 13/udp
netstat 15/tcp
qotd 17/tcp quote
msp 18/tcp # message send protocol
. . .
システムによっては、複数のページが表示されます。 SPACE
キーを押してエントリの次のページを表示するか、Q
を押してプロンプトに戻ります。
これは完全なリストではありません。 あなたはすぐにそれを見ることができるでしょう。
開いているポートの確認
開いているポートをスキャンするために使用できるツールは多数あります。 ほとんどのLinuxディストリビューションにデフォルトでインストールされているのはnetstat
です。
次のパラメーターを指定してコマンドを発行することにより、実行しているサービスをすばやく見つけることができます。
- sudo netstat -plunt
次のような結果が表示されます。
OutputProto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 785/sshd
tcp6 0 0 :::22 :::* LISTEN 785/sshd
これは、サービスに関連付けられているポートとリスニングソケットを示し、UDPプロトコルとTCPプロトコルの両方を一覧表示します。
nmap
ツールは、ポートを識別するために使用できるもう1つの方法です。
Nmapの使用
ネットワークの保護の一部には、脆弱性テストの実行が含まれます。 これは、攻撃者と同じ方法でネットワークに侵入し、弱点を発見しようとすることを意味します。
このために利用可能なすべてのツールの中で、nmap
はおそらく最も一般的で強力です。
次のように入力して、UbuntuまたはDebianマシンにnmap
をインストールできます。
- sudo apt-get update
- sudo apt-get install nmap
このソフトウェアをインストールすることの副次的な利点の1つは、改善されたポートマッピングファイルです。 このファイルを見ると、ポートとサービスの間のはるかに広範な関連付けを確認できます。
- less /usr/share/nmap/nmap-services
次のような出力が表示されます。
Output. . .
tcpmux 1/tcp 0.001995 # TCP Port Service Multiplexer [rfc-1078]
tcpmux 1/udp 0.001236 # TCP Port Service Multiplexer
compressnet 2/tcp 0.000013 # Management Utility
compressnet 2/udp 0.001845 # Management Utility
compressnet 3/tcp 0.001242 # Compression Process
compressnet 3/udp 0.001532 # Compression Process
unknown 4/tcp 0.000477
rje 5/udp 0.000593 # Remote Job Entry
unknown 6/tcp 0.000502
echo 7/tcp 0.004855
echo 7/udp 0.024679
echo 7/sctp 0.000000
. . .
このファイルには、約2万行のほかに、インターネットでの調査スキャン中に発見されたそのポートのオープン頻度を一覧表示する3番目の列などの追加フィールドもあります。
nmapを使用したポートのスキャン
Nmapは、ホストに関する多くの情報を明らかにすることができます。 また、ターゲットシステムのシステム管理者に、誰かが悪意を持っていると思わせることもできます。 このため、所有しているサーバーで、または所有者に通知した状況でのみテストしてください。
nmap
クリエーターは、scanme.nmap.org
にあるテストサーバーを提供します。
これ、または独自のサーバーは、nmapを実行するための適切なターゲットです。
nmapで実行できる一般的な操作を次に示します。 一部のクエリで部分的な結果が返されないように、すべてをsudo権限で実行します。 一部のコマンドは、完了するまでに時間がかかる場合があります。
ホストオペレーティングシステムをスキャンします。
- sudo nmap -O scanme.nmap.org
ネットワーク検出部分をスキップして、ホストがオンラインであると想定します。 これは、他のテストで「注:ホストがダウンしているようです」という応答を受け取った場合に役立ちます。 これを他のオプションに追加します。
- sudo nmap -PN scanme.nmap.org
指定されたIPアドレスでDNS逆引き参照を実行せずにスキャンします。 これにより、ほとんどの場合、結果が高速化されます。
- sudo nmap -n scanme.nmap.org
すべての共通ポートではなく、特定のポートをスキャンします。
- sudo nmap -p 80 scanme.nmap.org
TCP接続をスキャンするために、nmapはターゲットポートを使用して3ウェイハンドシェイク(以下で説明)を実行できます。 次のように実行します。
- sudo nmap -sT scanme.nmap.org
UDP接続をスキャンするには、次のように入力します。
- sudo nmap -sU scanme.nmap.org
すべてのTCPおよびUDPオープンポートをスキャンします。
- sudo nmap -n -PN -sT -sU -p- scanme.nmap.org
TCPの「SYN」スキャンは、TCPが接続を確立する方法を利用します。
TCP接続を開始するために、要求側は「同期要求」パケットをサーバーに送信します。 次に、サーバーは「同期確認応答」パケットを送り返します。 次に、元の送信者が「確認応答」パケットをサーバーに送り返し、接続が確立されます。
ただし、「SYN」スキャンは、最初のパケットがサーバーから返されるときに接続をドロップします。 これは「ハーフオープン」スキャンと呼ばれ、接続が完了しないためにそのポートに関連付けられたアプリケーションがトラフィックを受信しないため、ポートを密かにスキャンする方法として宣伝されていました。
これは、より高度なファイアウォールの採用と多くの構成での不完全なSYN要求のフラグ付けにより、ステルスとは見なされなくなりました。
SYNスキャンを実行するには、以下を実行します。
- sudo nmap -sS scanme.nmap.org
よりステルスなアプローチは、無効なTCPヘッダーを送信することです。これは、ホストがTCP仕様に準拠している場合、そのポートが閉じている場合にパケットを送り返す必要があります。 これは、Windowsベース以外のサーバーで機能します。
「-sF」、「-sX」、または「-sN」フラグを使用できます。 それらはすべて、私たちが探している応答を生成します。
- sudo nmap -PN -p 80 -sN scanme.nmap.org
ホストで実行されているサービスのバージョンを確認するには、このコマンドを試してください。 サーバーからのさまざまな応答をテストすることにより、サービスとバージョンを判別しようとします。
- sudo nmap -PN -p 80 -sV scanme.nmap.org
最後に、nmapを使用して複数のマシンをスキャンできます。
「-」または「/24」でIPアドレスの範囲を指定して、一度に複数のホストをスキャンするには、次のようなコマンドを使用します。
- sudo nmap -PN xxx.xxx.xxx.xxx-yyy
または、次のようなコマンドを使用して、ネットワーク範囲をスキャンして利用可能なサービスを探します。
- sudo nmap -sP xxx.xxx.xxx.xxx-yyy
使用できるコマンドの組み合わせは他にもたくさんありますが、これでネットワークの脆弱性の調査を開始できます。
結論
ポート構成とサーバー上の攻撃ベクトルを検出する方法を理解することは、情報とVPSを保護するための1つのステップにすぎません。 しかし、それは本質的なスキルです。
どのポートが開いているか、およびそれらのポートで接続を受け入れるサービスからどのような情報を取得できるかを検出すると、サーバーをロックダウンするために必要な情報が得られます。 悪意のあるユーザーは、マシンから漏洩した無関係な情報を使用して、既知の脆弱性を悪用したり、新しい脆弱性を開発したりする可能性があります。 彼らが理解できることが少なければ少ないほど良い。