ポートスキャンとサービス識別#
この部分では、nmap
の一般的なパラメータの組み合わせの使い方を重点的に紹介します。これは私がずっと理解したいと思っていたことでもあり、記事を書く機会を借りて整理してみます。
この記事では、既知のホストに対してポートスキャンを行う方法を最初に紹介し、最後に前の記事で残した問題を補足します:
nmap zmap massca
を使用して C クラスのスキャンを行います。
御剣高速 TCP 全ポートスキャンツール#
純粋なポートスキャンツールに属します。
このツールは、特定の IP セグメント内の詳細な全ポート検出を対象としています。ダウンロードリンクは提供しませんが、簡単に見つけられます。ソフトウェアを使って私のウェブサイトの実際の IP をスキャンして結果を確認してください:
いくつかのポートはスキャンできませんが、速度は非常に速いです。
censys.io#
これはオンラインサーバースキャンサイトで、ウェブサイトのサーバー情報をスキャンできます。とりあえずポートスキャンツールに分類します:
スキャン速度は非常に速く、私が使用しているのは Tencent Cloud の CDN であることを認識し、サーバーの実際の IP と 3 つのポートをスキャンしました(まだ全てはスキャンできていませんが)、お勧めです!
nmap#
自分でインターネットで nmap の使い方を探す場合、各師匠の使い方が異なり、nmap のバージョン更新によるパラメータの効果の変化などの理由から、
異なる師匠のところで異なる説明や使い方を見かけるかもしれません(落とし穴にハマった人は、自分がハマった穴に特に気を使います)。
したがって、公式ドキュメントを直接確認してください:https://nmap.org/book/man.html
公式の中国語ドキュメントもありますが、これはNmap4.5.0
バージョンに基づいて紹介されており、この記事を書いている時点でのNmap
のバージョンは7.70
です。
したがって、最新の使い方を確認するには、Google Chrome で英語のドキュメントを翻訳して見るのが良いでしょう。
nmap のインストールと設定#
Linux
、例えばKali
には標準で含まれているので、ここでは触れません。私たちがここでダウンロードするのはWindows
用の便利版です:
ダウンロードが完了したら、まず環境変数を設定しましょう。これで毎回nmap
のディレクトリに入ってコマンドラインを開く必要がなくなります:
nmap のパラメータ説明#
nmap
には 6 種類の一般的なポート状態があります:
Openは、ターゲットコンピュータ上のアプリケーションがそのポートで接続/パケットをリッスンしていることを示します。
Closedは、ポートにアプリケーションがリッスンしていないことを示します。
Filteredは、ファイアウォール、フィルター、またはその他のネットワーク障害物がポートをブロックしていることを意味し、Nmapはそれがopenかclosedかを判断できません。
unfilteredは、ポートがNmapの探査に応答する場合、Nmapはそれらが開いているか閉じているかを判断できません。
open|filtered、closed|filteredは、nmapがポートがこれらの2つの状態のどちらにあるかを判断できないことを示します。
以下は公式文書から翻訳したパラメータで、部分ごとに解説します。
参考記事:
ターゲットの選択:
ホスト名、IPアドレス、ネットワークなどを渡すことができます。
例:scanme.nmap.org、microsoft.com / 24、192.168.0.1; 10.0.0-255.1-254
-iL <inputfilename>:ホスト/ネットワークリストから入力
-iR <num hosts>:ランダムなターゲットを選択
--exclude <host1 [,host2] [,host3],...>:ホスト/ネットワークを除外
--excludefile <exclude_file>:ファイルから除外リストを取得
これは非常に簡単です:
- ウェブサイトをスキャン:
nmap soapffz.com
- 内部ネットワークセグメントをスキャン:
nmap 192.168.2.0/24
またはnmap 192.168.2.3-5
ターゲット選択のここでのパラメータは基本的に使われません。
ホスト発見:
-sL リストスキャン、指定されたターゲットIPをリストアップするだけで、ホスト発見は行いません。
-sn と -sPは同じで、pingスキャンのみを使用してホストを発見し、ターゲットホストのポートはスキャンしません。
-Pn すべての指定されたホストを開いていると見なし、ホスト発見プロセスをスキップします。
-PS TCP SYN ping、SYNフラグが設定された空のTCPパケットを送信します。デフォルトポートは80ですが、ポートを指定することもできます。
-PA TCP ACK ping、ACKフラグが設定された空のTCPパケットを送信します。デフォルトポートは80ですが、ポートを指定することもできます。
-PU UDP ping、指定されたポートに空のUDPパケットを送信し、TCPのみをフィルタリングするファイアウォールを通過できます。
-PR ARP pingを使用します。
-n/-R -nはドメイン名解決を使用せず、スキャンを加速します。-RはターゲットIPの逆ドメイン名解決を行い、スキャンは少し遅くなります。
-dns-servers カスタムDNS解決サーバーアドレス
--system-dns:OSのDNSリゾルバーを使用します。
-traceroute ターゲットホストのルート追跡
-sn
と-Pn
は対立しており、前者はping
スキャンを使用し、ポートスキャンを無効にし、後者はping
スキャンを無効にします。この 2 つのオプションがある理由は何でしょうか?
ホストが ping リクエストをブロックしている場合、Nmap はそのホストが起動していないと考えるかもしれません。これにより、Nmap はポートスキャン、サービスバージョン識別、オペレーティングシステム識別などのさらなる検出を行うことができなくなります。この問題を克服するために、Nmap のホスト検出機能を無効にする必要があります。このオプションを指定すると、Nmap はターゲットホストが起動していると見なし、全ての検出作業を行います。したがって、一般的にはこの 2 つのオプションの前に後者を使用することを好みます。
一般的には-Pn
オプションを使用することをお勧めします。
また、ドメイン名解決は時間を浪費することがあります。デフォルトでは時々ドメイン名を解決しますが、私は-n
を設定して DNS 解決を一切行わないことをお勧めします。
スキャン方法:
-sS / sT / sA / sW / sM:TCP SYN / Connect() / ACK / Window / Maimonスキャン
-sS TCP同期スキャン (TCP SYN)、すべてのTCP接続を開く必要がないため、この技術は通常半開スキャン(half-open)と呼ばれます。この技術の最大の利点は、ほとんどのシステムがこれをシステムログに記録しないことです。ただし、SYNパケットをカスタマイズするにはroot権限が必要です(Windowsでは管理者権限が必要です)。
-sT TCP connect()スキャン、TCPの三者間ハンドシェイク接続を確立して情報を伝達します。このスキャンは簡単に検出され、ターゲットホストのログに大量の接続要求とエラーメッセージが記録されます。一般的には使用をお勧めしません。
-sA ACKスキャン、原理はターゲットホストにACKパケットを送信することで、ターゲットホストのポートが開いているかどうかに関わらず、応答としてRSTパケットが返されます。RSTパケットのTTLを判断することでポートが開いているかどうかを判断します。TTL値が64未満であればポートは開いており、64を超えていればポートは閉じています。この高度なスキャン方法は通常ファイアウォールを通過するために使用されます。
-sW スライディングウィンドウスキャン、ACKスキャンに非常に似ています。
-sM 探査パケットはFIN/ACKです。RFC 793 (TCP) によれば、ポートが開いているか閉じているかに関わらず、このような探査にはRSTパケットで応答する必要があります。しかし、Urielは、ポートが開いている場合、多くのBSDベースのシステムがこの探査パケットを単に破棄することに気付きました。
-sU:UDPスキャン、唯一のUDPスキャン方式です。
UDPスキャンの結果はTCPスキャンの結果ほど信頼性が高くありませんが、ペネトレーションテスト担当者はUDPスキャンを軽視すべきではありません。結局のところ、UDPポートは価値のあるサービスプログラムを示す可能性があります。しかし、UDPスキャンの最大の問題はパフォーマンスの問題です。Linuxカーネルによって制限され、1秒間に最大1回ICMP Port Unreachableメッセージを送信します。この速度で、1台のホストの65536のUDPポートを完全にスキャンするには、必ず18時間以上かかります。
最適化方法は主に以下の通りです:
1.並行UDPスキャンを行う;
2.一般的なポートを優先的にスキャンする;
3.ファイアウォールの後ろでスキャンする;
4.--host-timeoutオプションを有効にして、応答が遅すぎるホストをスキップします。
もし私たちがターゲットホストが開いているUDPポートを見つける必要がある場合、スキャン速度を向上させるために、53ポート(DNS)と161ポート(SNMP)のみをスキャンします。
コマンドnmap -sU 192.168.56.103 -p 53,161を使用できます。
-sN / sF / sX:TCP Null、FINおよびXmasスキャン
NULLスキャンは、制御ビットを設定しません。FINスキャンはFINフラグのみを設定します。XMASスキャンはFIN、PSH、URGのフラグを設定します。ターゲットホストがRSTフラグを含む応答データを返す場合、そのポートは閉じていることを示します。ターゲットホストが何の応答も返さない場合、そのポートは開いているかフィルタリングされている状態です。
NULLスキャンは、サーバーにフラグなしのパケットを送信し、サーバーの応答を待つ逆向きのスキャン方法です。このスキャン方法は、前述のスキャン方法よりもはるかに隠密ですが、この方法の正確性は低いです。主な用途は、オペレーティングシステムがWindowsであるかどうかを判断することです。なぜなら、WindowsはRFC 793標準に従わず、ポートが開いているか閉じているかに関わらずRSTパケットを返すからです。
しかし、NULLには以下のような欠点もあります。
1. NULLメソッドの精度は高くなく、ポートの状態が正確に返されないことがあります。
2. ターゲットホストのオペレーティングシステムを取得するには、パラメータ(-O)を使用して、いくつかのオペレーティングシステムを正確に判断できない場合は、パラメータ(-osscan-guess)を追加できます。
3. NULLスキャンはフィルタリングされやすいです。
--scanflags <flags>:カスタムTCPスキャンフラグ
-sI <zombie host [:probeport]>:アイドルスキャン
-sIオプションを使用すると、指定されたゾンビホストを介してスキャンデータパケットが送信されます。本機はターゲットホストと直接通信しません。相手のネットワークにIDSがある場合、IDSはスキャンを開始したホストをゾンビホストと見なします。
-sY / sZ:SCTP INIT / COOKIE-ECHOスキャン
SCTP INITスキャンはTCP SYNスキャンに似ており、完全なSCTP関連を確立するのではなく、半開の接続を開きます。ターゲットポートがINIT-ACKデータパケットで応答する場合、そのポートは開いていることを示します。ABORTデータパケットで応答する場合、そのポートは閉じており、応答がない場合、そのポートはフィルタリングされているとマークされます。もちろん、ICMP到達不能メッセージ(タイプ3、コード0、1、2、3、9、10、または13)を受信した場合もフィルタリングされているとマークされます。
ターゲットポートが開いている場合、以前に関連リクエストを発起していないSCTP COOKIE ECHOデータパケットは破棄されます。ポートが閉じている場合、SCTP ABORTデータパケットが返されます。したがって、このスキャン技術はフィルタリングとオープンを区別できず、閉じたポートのみを区別できます。
-sO:IPプロトコルスキャン
-b <FTP中継ホスト>:FTPリバウンドスキャン
パラメータ説明から、-sT
オプションはデフォルトであり、最も推奨されないことがわかります。一般的には半開スキャン-sS
を使用します。
ファイアウォールが存在する可能性がある場合、-sA
またはsW
オプションを使用してファイアウォールを回避するスキャンを試みることができます。
また、-sU
UDP スキャン方式を使用して一般的な UDP ポートを探査することもできます。意外な発見があるかもしれません。
スキャンポートおよびスキャンポートの方法:
-p <ポート範囲>:指定されたポートのみをスキャンします。
例:-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
--exclude-ports <ポート範囲>:スキャンから指定されたポートを除外します。
-F:クイックモード - デフォルトスキャンよりも少ないポートをスキャンします。一般的には100個の一般的なポートのみをスキャンします。
-r:ポートを連続してスキャンし、小から大へスキャンします。
--top-ports <number>:最も一般的な<number>ポートをスキャンします。例えば、最も一般的な300個のポートをスキャンするには:--top-ports 300
--port-ratio <ratio>:ポートが<ratio>より一般的であるかどうかをスキャンします。
個人的な提案として、ホストポートのクイック概要を取得する際には--top-ports 1000
オプションを使用することをお勧めします。
完全なスキャンレポートを取得したい場合は、すべてのポートをスキャンする必要があります-p1-65535
。
サービス / バージョン検出:
-sV:開いているポートを探査してサービス/バージョン情報を特定します。
すべてのNmap検出がフィードバックを得られるわけではないため、検出の強度を設定する必要があります。サービス検出には3つのレベルがあります。
レベルが高いほど、検出プロセス中の試行回数が多くなり、サービスを識別する可能性が高くなります。
--version-intensity <level>:0(明るい)から9(すべてのプローブを試みる)まで設定します。
--version-light:最も可能性の高いプローブを制限します(強度2)。
--version-all:すべてのプローブを試みます(強度9)。
--version-trace:詳細なバージョンスキャン活動を表示します(デバッグ用)。
-sV
は使用をお勧めしますが、後の-A
オプションの機能にはこの機能が含まれています。
スクリプトスキャン:
-sC:--script = defaultに相当します。
--script = <Lua scripts>:<Lua scripts>はカンマ区切りのリストです。
ディレクトリ、スクリプトファイルまたはスクリプトカテゴリ。
--script-args = <n1 = v1,[n2 = v2,...]>:スクリプトにパラメータを提供します。
--script-args-file = filename:ファイル内でNSEスクリプトargsを提供します。
--script-trace:送信および受信されたすべてのデータを表示します。
--script-updatedb:スクリプトデータベースを更新します。
--script-help = <Lua scripts>:スクリプトに関するヘルプを表示します。
<Lua scripts>はカンマ区切りのスクリプトファイルリストまたはスクリプトのカテゴリです。
-sC
は使用をお勧めしますが、後の-A
オプションの機能にはこの機能が含まれています。
オペレーティングシステム検出:
-O:OS検出を有効にします。
--osscan-limit:OS検出を有望なターゲットに制限します。
--osscan-guess:OSをより積極的に推測します。
ここでの--osscan-guess
は、相手のホストシステムを知りたいときに役立つかもしれません。
時間とパフォーマンス:
<time>オプションを使用して秒単位で、または'ms'(ミリ秒)、's'(秒)、'm'(分)、または'h'(時間)を追加します(例:30m)。
-T <0-5>:タイミングテンプレートを設定します(高いほど速い)。
paranoid(0):スキャン周期は5分で、並行して複数のデータを送信しません。このモードのスキャンはIDSに検出されません。
sneaky(1):スキャン周期は15秒で、並行して複数のデータを送信しません。
polite(2):スキャン周期は0.4秒で、並行して複数のデータを送信しません。
normal(3):このモードでは、複数のターゲットに同時に複数のパケットを送信します。Nmapのデフォルトモードであり、スキャン時間とネットワーク負荷の間で自動的にバランスを取ります。
aggressive(4):このモードでは、Nmapは各ターゲットホストを5分間スキャンし、その後次のホストをスキャンします。応答を待つ時間は1.25秒を超えません。
insane(5):このモードでは、Nmapは各ターゲットホストを75秒間スキャンし、その後次のホストをスキャンします。応答を待つ時間は0.3秒を超えません。
速いスキャンには欠点もあります。スキャン周期が速すぎると、ファイアウォールやIDSに簡単に検出され、記録される可能性があります。
ファイアウォールは、ポート周期が短すぎるものをスキャンとして認識し、ブロックすることが多いです。
--min-hostgroup / max-hostgroup <size>:並行ホスグループスキャンサイズ
--min-parallelism / max-parallelism <numprobes>:探査の並行化
--min-rtt-timeout / max-rtt-timeout / initial-rtt-timeout <time>:探査の往復時間を指定します。
--max-retries <tries>:ポートスキャン探査の再送信の上限数。
--host-timeout <time>:この後にターゲットを放棄します。
--scan-delay / -max-scan-delay <time>:プローブ間の遅延を調整します。
--min-rate <number>:パケット送信速度を秒あたり<number>以上に設定します。
--max-rate <number>:パケット送信速度を秒あたり<number>以下に設定します。
時間とパフォーマンスに関しては、一般的に指定された並行数やパケット送信速度を詳細に設定することはありません。
タイミングテンプレートはデフォルトで-T3
、つまりnormal
であり、最適化は行いません。
ファイアウォール / IDS の回避と防御:
-f; --mtu <val>:パケットを分割します(指定されたMTUを選択できます)。このオプションは、相手に私たちの探査パケットを認識させないためのものです。
このオプションを指定すると、Nmapは8バイトまたはそれ以下のデータサイズのパケットを使用します。
-D <decoy1,decoy2 [,ME],...>:スキャンを隠すためのデコイを使用します。このオプションでは、偽のIP、つまりデコイのIPを指定する必要があります。
このオプションを有効にすると、Nmapは探査データパケットを送信する際に、いくつかのソースアドレスが偽のIP(デコイ)のデータパケットを混ぜます。この機能は、本機の実際のIPを隠すことを目的としています。つまり、相手のログには本機の実際のIPが記録されます。RNDを使用してランダムな偽のIPアドレスを生成するか、RND:numberのパラメータを使用して<number>個の偽のIPアドレスを生成できます。指定したデコイホストはオンラインである必要があり、そうでないとターゲットホストが簡単にクラッシュします。また、過剰なデコイを使用するとネットワークが混雑する可能性があります。特にクライアントのネットワークをスキャンする場合は、この状況を避けるべきです。
-S <IP_Address>:ソースアドレスを偽装します。
ソースアドレス偽装の原理は、自分のIPを他のIPに偽装してターゲットホストをスキャンし、ターゲットホストの追跡を欺くことです。
例えば、1.1.1.1に偽装する場合:パラメータ-S 1.1.1.1を使用して1.1.1.1でスキャンし、ファイアウォールに1.1.1.1からのスキャン行為だと誤認させます。
使用する際は、-eと一緒に使用することに注意してください。指定したい偽装対象のIPに加えて、返されるIPアドレスも指定する必要があります。
-e <iface>:指定したインターフェースを使用します。
-g / -source-port <portnum>:指定されたポート番号を使用します。
--proxies <url1,[url2],...>:HTTP / SOCKS4プロキシを介した中継接続。
--data <hex string>:送信するデータパケットにカスタムペイロードを追加します。
--data-string <string>:送信するデータパケットにカスタムASCII文字列を追加します。
--data-length <num>:送信されたパケットにランダムデータを追加します。
--ip-options <options>:指定されたIPオプションを持つパケットを送信します。
--ttl <val>:IPの生存時間フィールドを設定します。
--spoof-mac <mac address / prefix / vendor name>:MACアドレスを偽装します。
--badsum:擬似TCP / UDP / SCTPチェックサムを使用してパケットを送信します。
ファイアウォールが存在する可能性がある場合、-F
オプションを使用して探査パケットのサイズを小さくし、ファイアウォールを回避することができます。
-D
オプションを使用して偽の IP を構築することもよく使用されますが、RND
を使用してランダムな偽の IP アドレスを生成するオプションはお勧めしません。生成された IP に対応するデコイホストがオフラインまたは存在しない場合、ターゲットホストにスキャンコマンドを送信できず、ターゲットホストがクラッシュする可能性が高くなります。
お勧めは、特定のウェブサイトの IP(ping を禁止されているウェブサイトを除く)を ping して、そのウェブサイトの IP をデコイホストとして使用することです。
Me
を使用して自分の実際のアドレスを示すことができます。例えば、soapffz.com
のウェブサイトの IP と私のコンピュータの実際の IP を一緒に使用してnmap.org
を迅速にスキャンします:
nmap -F -D 140.143.2.176,ME nmap.org
出力レポート:
-oN / -oX / -oS / -oG <file>:通常のスキャン出力、XML、s | <rIpt kIddi3、Grepable形式で、指定されたファイル名に保存します。
-oA <basename>:3つの主要な形式を一度に出力します。
-oN:通常の出力で、ランタイム情報や警告情報を表示しません。
-oX:生成されたXML形式のファイルはHTML形式に変換でき、Nmapのグラフィカルユーザーインターフェースで解析でき、データベースにインポートするのにも便利です。
したがって、結果をXMLファイルとして保存することをお勧めします。
-oS:対話ツール出力に似た出力。
-oG:Grep使用に便利なファイルを生成します。このファイル形式はすでに古くなっていますが、依然として人気があります。この形式のファイルは、コメント(#で始まる)と情報行で構成されています。情報行には6つのフィールドが含まれ、各フィールドのフィールド名とフィールド値はコロンで区切られ、フィールド間はタブで区切られています。これらのフィールドの名前はそれぞれHost、Ports、Protocols、Ignored State、OS、Seq Index、IP ID Seq、Statusです。この形式のファイルは、grepやawkなどのUNIXコマンドを使用してスキャン結果を整理するのに便利です。
使用の便宜上、-oAオプションを使用してスキャン結果を標準形式、XML形式、Grep形式で一度に出力できます。それぞれ.nmap、.xml、.gnmapファイルに保存されます。
-v:詳細レベルを増加させます(-vvまたはそれ以上のレベルを使用すると、より良い効果が得られます)。
-d:デバッグレベルを上げます(-ddまたはそれ以上のレベルを使用すると、より良い効果が得られます)。
--reason:ポートが特定の状態にある理由を表示します。
--open:開いている(または開いている可能性のある)ポートのみを表示します。これは非常にお勧めです。
--packet-trace:送信および受信されたすべてのパケットを表示します。
--iflist:ホストインターフェースとルーティングを印刷します(デバッグ用)。
--append-output:指定された出力ファイルを上書きするのではなく、追加します。
--resume <filename>:中止したスキャンを再開します。
--stylesheet <path / URL>:XML出力をHTMLに変換するためのXSLスタイルシート。
--webxml:Nmap.Orgからの参照スタイルシートで、より移植性のあるXML用。
--no-stylesheet:XML出力に関連付けられたXSLスタイルシートを防ぎます。
-open -vv
オプションを使用して詳細情報を出力し、開いているかもしれないポートのみを含めることをお勧めします。
レポート出力には、-oX
を使用して.XML
レポートを生成するか、直接-oA
オプションを使用して.nmap .xml .gnmap
の 3 つのレポートを一度に出力することをお勧めします。
雑多な情報:
-6:IPv6スキャンを有効にします。
-A:オペレーティングシステム検出、バージョン検出、スクリプトスキャン、ルート追跡を有効にします。
--datadir <dirname>:カスタムNmapデータファイルの場所を指定します。
--send-eth / -send-ip:生のイーサネットフレームまたはIPパケットを送信します。
--privileged:ユーザーが完全な特権を持っていると仮定します。
--unprivileged:ユーザーが生のソケット権限を欠いていると仮定します。
-V:バージョン番号を印刷します。
-h:このヘルプ要約ページを印刷します。
-A
オプションを使用すると、次の 4 つのコマンドを同時に使用することになります:
サービスバージョン識別(-sV)
オペレーティングシステム識別(-O);
スクリプトスキャン(-sC);
トレースルート(–traceroute)。
NSEスクリプト
の脆弱性探査スクリプト部分については、この記事では紹介しません。なぜなら、この記事はポートとサービスのスキャンに焦点を当てており、脆弱性のスキャンは次回の脆弱性スキャナーで紹介する予定です。
nmap の一般的なスキャン#
** nmap を実行中に、他のプログラミングと同様に「ブレークポイント」を打つことができ、キーボードの d キーを押すだけで済みます。実行の進捗を知りたい場合は、X キーを押してください。**
私たちは上記で学んだパラメータを使用して、以下の私のウェブサイトをスキャンします(CDN を回避して実際の IP を取得したと仮定します。CDN ノードをスキャンしても意味がありません)。
最終的に期待する結果は:
1 つのコマンドで、すべての開いているポートを取得し、ポートで開いているサービスを推測し、サーバーのバージョン情報を推測し、できるだけ時間を節約することです。
そうです、私は自分を打ちます.jpg
まず、デフォルトの-sT
スキャン方式を試して、100 個の一般的なポートを迅速にスキャンし、詳細情報を表示します:
nmap -sT -F -vv 140.143.2.176
1. 結果から、ping
に 1.05 秒、DNS
クエリに 3.86 秒を消費したことがわかります。2. 私は直接ip
をスキャンしているので、DNS
をクエリする必要はありません。スキャン方式は完全な TCP 三者間ハンドシェイクです。
次に、ping
を無効にし、TCP
同期スキャン、つまり半開スキャン
を使用して、より速いスキャン速度で、各ポートのサービスおよびバージョン情報を取得し、一般的な 1000 個のポートをスキャンし、DNS
クエリを禁止します:
nmap -vv -Pn -sS -T4 -sV --top-ports 1000 -n 140.143.2.176
1. スキャン方式がSYN Stealth Scan
、つまり SYN 秘密スキャンに変わったことがわかります。2. スキャンするポートの数を増やした後、前回よりも 1 つ多くの888
ポートをスキャンしました。3. さらに-sV
オプションを追加した後、スキャンレポートにVERSION
という列が追加され、サービスのバージョンが表示されました。
消費した時間は少しだけ増えましたが、スキャン結果は前回よりも包括的になりました。
私たちは先ほどの基盤の上に、-sA
ACK スキャン方式を使用し、より迅速な方法で、すべてのポートをスキャンし、できるだけオペレーティングシステムを探査します:
nmap -vv -Pn -sA -T5 -sV -p1-65535 -O --osscan-guess -n 140.143.2.176
同じ条件下で、-sA
オプションは-sS
よりも時間を消費することがわかります。
したがって、一般的には相手にファイアウォールが存在する場合にのみ-sA
オプションを使用することをお勧めします。通常は-sS
を使用するだけで十分です。
sA/sW/sM
の 3 つの探査方法の時間消費の順序は:sM
> sW
> sA
です。
他の 3 つのスキャン方法sN/sF/sX
はまだ使用していませんので、後で必要になったときに紹介します。
最後に、私が現在知っているすべてのポートと詳細情報をスキャンするための最も時間を節約するnmap
コマンドを示します:
nmap -v -Pn -sS -T5 -sV -p1-13000 --version-light -O --osscan-guess -n 140.143.2.176
結果は以下の通りです(時間を節約するために、最初の 13000 個のポートのみをスキャンしました):
やはり私の12315
ポートは一般的なポートには含まれておらず、範囲を指定するまでスキャンされませんでした。
オペレーティングシステムの推測は最も可能性が高いのはLinux4.4
またはLinux4.0
であり、実際には3.10
です。
しかし、このコマンドは完璧ではありません。なぜなら、私は範囲を指定したからです。できるだけ早くすべてのポートをスキャンしたいのです。
しかし、-sS
でもあまり効果がなく、上記の 2 つの例からわかるように、nmap
は全ポートスキャンにはあまり向いていません。
後で紹介する無状態ポートスキャナーMasscan
と組み合わせて使用することで、「精密誘導」を実現できます。
zmap#
ZMap はオープンソースのネットワークスキャンツールで、研究者が全ネットワークを迅速に検出するのを助けます。たった 1 台のマシンと十分な上りネットワーク速度があれば、ギガビットイーサネットの理論値速度に達し、45 分で全ネットワークの IPv4 アドレスをスキャンできます。
これは、前述のcensys.io
の管理者が開発したツールです。
GitHub アドレス:
zmap
は Windows をサポートしていませんので、ここではUbuntu Desktop 18.04.1 LTS
を使用してzmap
をインストールして使用します。
実行:sudo apt install zmap -y
でインストールが完了します。
一般的なパラメータは以下の通りです:
-p, –target-port=port:スキャンする必要があるTCPポート番号(例えば443)。
-o, –output-file=name:スキャン結果をファイルに出力します。
-b, –blacklist-file=path:ブラックリストファイル、つまりスキャン範囲から除外するアドレス。conf/blacklist.exampleファイルに例があります。各行に1つのネットワークセグメントを書きます。例えば192.168.0.0/16。
-n, –max-targets=n、検出の上限範囲。数字(例えば-n 10000)またはスキャンアドレス空間のパーセンテージにすることができます。
-N, –max-results=n:一定数の結果を受信した後、スキャンを終了します。
-t, –max-runtime=secs:最大スキャン(パケット送信)時間。
-r, –rate=pps:パケット送信速度(パケット/秒)。
-B, –bandwidth=bps:パケット送信帯域幅(ビット/秒)。
-c, –cooldown-time=secs:応答を受け取る時間(デフォルトは8)。
-T, –sender-threads=n:パケット送信のスレッド数(デフォルトは1)。
-P, –probes=n:各IPに送信されるプローブの数(デフォルトは1)。
-s, –source-port=port|range:パケット送信のソースポート(s)。
-S, –source-ip=ip|range:パケット送信のソースIP、またはIPアドレス範囲。
-G, –gateway-mac=addr:パケット送信のゲートウェイMACアドレス。
-i, –interface=name:ネットワークポート。
–list-probe-modules:利用可能なプローブモジュールをリストします。
-M, –probe-module=name:プローブモジュールを選択します(デフォルトはtcp_synscan)。
–probe-args=args:プローブモジュールのパラメータを設定します。
–list-output-fields:選択したプローブモジュールをリストします。
出力オプション:ZMapはユーザーが独自の出力モジュールを定義および作成することを許可します。出力モジュールは、プローブモジュールの戻り結果を処理し、ユーザーに表示します。
–list-output-modules:すべての出力モジュールをリストします。
-O, –output-module=name:出力モジュールを設定します。
–output-args=args:出力モジュールのパラメータを設定します。
-f, –output-fields=fields
選択した出力モジュールをリストします:–output-filter
出力モジュールフィルター:追加オプション。
-C, –config=filename:特別なオプションを含む設定ファイルを読み込みます。
-q, –quiet:サイレントモード。
-g, –summary:スキャン終了後に設定と結果の概要を印刷します。
-v, –verbosity=n:ログのレベル(0-5、デフォルトは3)。
-h, –help:ヘルプを表示します。
-V, –version:バージョンを印刷します。
zmap
の-p
オプションは指定ポートを指定しますが、1-65535
のようなパラメータは使用できません。
zmap
の用途は、特定の範囲内のホストの特定の指定ポートが開いているかどうかをスキャンすることに偏っています。例えば:
zmap -p 80 1.2.3.4 10.0.0.3:1.2.3.4,10.0.0.3の80ポートをスキャンします。
zmap -p 80 10.0.0.0/8 192.168.0.0/16:2つのサブネットの80ポートをスキャンします。
zmap -p 80:インターネット上でtcp/80のホストを探し、stdoutに出力します。
zmap -N 5 -B 10M -p 80:5つのHTTPサーバーを見つけ、10Mb/sでスキャンします。
zmap
を使用して一時的にbaidu.com
の C クラスセグメント:123.125.114.1/24 の8080
ポートをスキャンします:
基本的に 1 秒でスキャンが完了しますが、これはこの記事の目的である指定ホストのすべてのポートをスキャンすることにはあまり関係がないため、ここではこれ以上詳しく説明しません。
Masscan#
Masscan は、最も速いインターネットポートスキャナーとされ、最速で 6 分以内にインターネット全体をスキャンできます。
masscan
はWindows
でも使用できますが、MinGW
などのコンパイル環境を設定する必要があるため、ここではUbuntu
環境を使用してデモを行います。
インストール方法:
sudo apt-get install git gcc make libpcap-dev -y
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make
どこでもmasscan
コマンドを使用できるようにするには、次のコマンドを実行します:
cd ~
cp masscan/bin/masscan /bin
masscan
の一般的なオプション:
-p スキャンするポートを指定します。複数のポートを指定する場合はカンマで区切ります。
--rate パケット送信速度を指定します。実際の帯域幅に基づいて設定します。私の光ファイバーは20Mなので、通常は1000で十分です。1〜2MのVPNでは、100で十分です。これは大まかな見積もりです。
--open-only 開いているポートのみを表示します。
--banners バナーを取得します。
-c カスタムスキャン設定ファイルを使用します。
-oL スキャン結果を指定ファイルに保存します。
--excludefile スキャンしないIPセグメントを除外します。
この記事の元々の目標、指定 IP のすべてのポートをスキャンするには:
masscan -p1-65535 140.143.2.176
このコマンドを使用すると、nmap
の-sS
よりも速度が遅くなります。これは、デフォルトでは、
Masscan のスキャン速度は 1 秒あたり 100 パケットであり、非常に遅いからです。
また、--rate
オプションを使用して値を指定することもできます。デフォルトの 100 パケット送信速度と、加速した送信速度の結果を比較します:
masscan -p1-65535 140.143.2.176 --rate 1000 > 1.txt
masscan -p1-65535 140.143.2.176 > 2.txt
このように、送信パケット数とスキャンされたポート数は反比例します。
他のパラメータ、保存、設定の読み込みなどについては、特に言うことはありません。核心は、単にポートを指定してスキャンすることです。
ポートスキャンとサービス識別のまとめ#
もし単に一般的なポートをスキャンするだけなら、御剣高速 TCP 全ポートスキャンツール
やcensys.io
で十分です。
もちろん、条件が整えば、直接nmap
を使用することを強くお勧めします。上記のパラメータの説明と使い方を最終的に以下のようにまとめます:
デフォルトのスキャン方式-sTは推奨されず、-sSオプションを使用することをお勧めします。
デフォルトは-T3レベルで、日常のスキャンには-T4を使用できます。
-Aオプションは多くのものをスキャンしすぎるため、一般的には-sVと-O --osscan-guessを使用するだけで十分です。
ポートスキャン時には
また、nmap
にはホスト探査部分など、私がすべて比較していない多くの使い方があります。後で使用する際にこの記事を更新します。
もちろん、nmap
の-sS
スキャンを一般的なポートと、ポートに対応するサービス情報を推測することと、masscan
の全ポートスキャンを組み合わせることで、
基本的にこの記事の目的である、指定サーバーのすべてのポートと情報をスキャンすることができます。
この記事は完結です。