Nmap 概要 (ESP)

Tip

AWS Hackingを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hackingを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)
Az Hackingを学び、実践する: HackTricks Training Azure Red Team Expert (AzRTE) HackTricks Trainingの全カタログ を閲覧して、評価トラック(ARTA/GRTA/AzRTA)と Linux Hacking Expert (LHE) を確認してください。

HackTricksをサポート
nmap -sV -sC -O -n -oA nmapscan 192.168.0.1/24

パラメータ

スキャンする IPs

  • <ip>,<net/mask>: IP を直接指定します
  • -iL <ips_file>: IP リスト
  • -iR <number>: ランダムな IP の数。--exclude <Ips>--excludefile <file> で除外できます。

機器検出

デフォルトで Nmap は探索フェーズを実行します: -PA80 -PS443 -PE -PP

  • -sL: 侵襲的ではなく、ターゲットを列挙するだけで名前解決のために DNS リクエストを行います。たとえば www.prueba.es/24 のように全ての IP が対象かを確認するのに有用です。
  • -Pn: No ping。全てがアクティブであることが分かっている場合に有用(そうでないとかなり時間を失う可能性があり、また偽陰性を生むこともあります)。探索フェーズを省略します。
  • -sn : No port scan。偵察フェーズ完了後にポートスキャンを行いません。比較的ステルスで、小規模ネットワークのスキャンに向きます。権限がある場合は ACK (-PA) を 80 に、SYN(-PS) を 443 に送り、echo と Timestamp を送信します。権限がない場合は常にフル接続を行います。ターゲットがネットワークの場合は ARP(-PR) のみを使用します。ほかのオプションと併用すると、他のオプションのパケットだけが落とされます。
  • -PR: Ping ARP。自ネットワーク内のホストを解析する際のデフォルトで、ping より高速です。ARP パケットを使いたくない場合は --send-ip を使用します。
  • -PS <ports>: SYN パケットを送信し、SYN/ACK が返れば open(RST を返して接続を終わらせる)、RST が返れば closed、無応答なら unreachable。権限がない場合は自動的にフル接続が使われます。ポート未指定なら 80 に投げます。
  • -PA <ports>: 前者と同様ですが ACK を送ります。両方を組み合わせると検出精度が上がります。
  • -PU <ports>: 逆の目的で、通常閉じていると予想されるポートに送ります。一部のファイアウォールは TCP 接続のみチェックします。closed なら port unreachable、別の ICMP が返るか無応答なら destination unreachable と扱われます。
  • -PE, -PP, -PM : ICMP PINGS: echo reply、timestamp、addressmask。ターゲットがアクティブか確認するために送信します。
  • -PY<ports>: デフォルトで 80 に SCTP INIT プローブを送信。INIT-ACK(open) や ABORT(closed)、無応答や ICMP unreachable(inactive) が返ることがあります。
  • -PO <protocols>: ヘッダにプロトコル番号を指定(デフォルトは 1(ICMP), 2(IGMP), 4(Encap IP))。ICMP/IGMP/TCP(6)/UDP(17) の場合はプロトコルヘッダを送信し、それ以外は IP ヘッダのみを送ります。ヘッダの不正により Protocol unreachable や同プロトコルからの応答で稼働可否を判断します。
  • -n: DNS 無効
  • -R: 常に DNS を使う
  • --system-dns: Nmap の並列スタブ解決器ではなく OS のリゾルバを強制使用します。/etc/hosts、split-DNS、リゾルバプラグインが Nmap の直接クエリと異なる結果を返す場合に有用。遅くなります。Nmap 7.96 以降はフォワードルックアップも並列化されているため、互換性目的以外では通常不要です。
  • --dns-servers <server[,server],...>: リバースルックアップに特定の DNS サーバを強制使用します。内部評価で authoritative や内部リゾルバを直接問い合わせたい場合や、-sL/リバース DNS トラフィックをテスターのデフォルトリゾルバから逃がしたい場合に有用です。

ポートスキャン手法

  • -sS: 接続を完了しないため痕跡を残しにくい(権限が必要)。デフォルトで使用されます。
  • -sT: 接続を完了するため痕跡を残しますが、権限不要で確実に使えます。
  • -sU: UDP 用で遅い。主な対象: DNS(53), SNMP(161,162), DHCP(67,68)。(-sU53,161,162,67,68): open(reply), closed(port unreachable), filtered(別の ICMP), open/filtered(無応答)。open/filtered の場合、-sV が多くのプローブを送りバージョン検出を試み、実際の状態を特定できることがあります。時間が大幅に増加します。
  • -sY: SCTP。接続確立に失敗するためログが残らず、-PY と同様に動作します。
  • -sN,-sX,-sF: Null, Fin, Xmas。いくつかのファイアウォールをすり抜け情報を引き出すことがあります。標準準拠のマシンは SYN/RST/ACK が立っていない要求には RST で応答するはずという前提に基づく: open/filtered(無応答), closed(RST), filtered(ICMP unreachable)。Windows, Cisco, BSDI, OS/400 では信頼性が低い。Unix 系では有効。
  • -sM: Maimon スキャン。FIN と ACK フラグを送る BSD 向けの手法で、現在は全て closed を返す場合があります。
  • -sA, sW: ACK と Window。ファイアウォール検出に使い、ポートが filtered かどうかを判別します。-sW は open/closed をウィンドウ値で区別します: open (RST で window != 0), closed (RST で window = 0), filtered (ICMP unreachable または無応答)。すべてのマシンがこの挙動をするわけではないので、すべて closed なら機能していない、いくつか open なら正常、多く open で少数 closed なら逆に動作している、などの判断になります。
  • -sI: Idle scan。アクティブなファイアウォールがあり、特定の IP に対してフィルタしないことが分かっている場合(または単に匿名性を確保したい場合)に zombie スキャナを利用します(全ポートで動作)。可能な zombie を探すには ipidseq スクリプトか exploit auxiliary/scanner/ip/ipidseq を使います。このスキャンは IP パケットの IPID 値に基づきます。
  • --badsum: チェックサムを誤った値で送信します。通常ホストは破棄しますが、ファイアウォールは何らかの応答を返すことがあり、ファイアウォール検出に使います。
  • -sZ: “Weird” SCTP スキャナ。cookie echo フラグメントでプローブを送ると、open の場合はドロップされ、closed の場合は ABORT で応答されるはずです。init で通らないファイアウォールを通過することがありますが、filtered と open の区別ができないのが欠点です。
  • -sO: プロトコル IP スキャン。時にはプロトコルすら識別できないような不正・空ヘッダを送ります。ICMP unreachable protocol が来れば closed、unreachable port が来れば open、別のエラーなら filtered、無応答なら open|filtered と判断します。
  • -b <server>: FTPhost –> 別ホスト経由でホストをスキャンするために使います。別のマシンの FTP に接続し、そこからターゲットポートへファイル送信を依頼して応答から開閉を判断します。書式: [<user>:<password>@]<server>[:<port>]。ほとんどの FTP サーバはこれを許可しなくなっており、実用性は低いです。

フォーカス解析

-p: スキャンするポート指定。全 65,535 ポートを選ぶには: -p- または -p all。Nmap は人気度に基づく内部分類を持ち、デフォルトでは上位 1000 ポートを使います。-F (fast scan) では上位 100。–top-ports でその数の上位ポートを分析できます(1〜65,335)。ポートはランダム順でチェックされます。これを防ぐには -r を使います。個別指定も可能: 20-30,80,443,1024-(後者は 1024 以降を意味)。プロトコルでグループ指定も可能: U:53,T:21-25,80,139,S:9。Nmap の人気ポート内で範囲を選ぶこともできます: -p [-1024] は nmap-services に含まれるポートのうち 1024 までを分析します。–port-ratio は 0〜1 の比率で最も一般的なポートだけを分析します。

-sV バージョン検出。強度は 0〜9 で調整、デフォルトは 7。

–version-intensity 強度を調整します。値が小さいほど最も可能性の高いプローブのみを送り、全ては送らないため UDP スキャン時間を大幅に短縮できます。

–version-light--version-intensity 2 の別名。広いレンジや遅い UDP サービスへの初回パスで非常に有用。

–version-all--version-intensity 9 の別名。すべてのプローブを強制し、稀なプローブにしか応答しないサービスに有用。

–allports nmap-service-probes により除外されているポート(特に TCP/9100)でもバージョン検出を強制します。プリンタや raw socket リスナに対してはプローブデータを印刷させてしまうことがあるので注意。

-O OS 検出

–osscan-limit 適切なホストスキャンには少なくとも 1 つの open ポートと 1 つの closed ポートが必要です。これが満たされない場合、OS 推定を行わないようにして時間を節約します。

–osscan-guess OS 検出が完璧でない場合に推定をより積極的に試みます。

スクリプト

–script |||[,…]

デフォルトスクリプトを使うには -sC または –script=default

利用可能なタイプ: auth, broadcast, default, discovery, dos, exploit, external, fuzzer, intrusive, malware, safe, version, vuln

  • Auth: 利用可能な認証関連スクリプトを実行
  • Default: 基本的なデフォルトツールスクリプトを実行
  • Discovery: ターゲットや被害者から情報を取得
  • External: 外部リソースを使うスクリプト
  • Intrusive: ターゲットに対して侵入的とみなされるスクリプトを使用
  • Malware: マルウェアやバックドアによって開かれた接続をチェック
  • Safe: 非侵襲的なスクリプトを実行
  • Vuln: よく知られた脆弱性を検出
  • All: 利用可能な NSE 拡張スクリプトをすべて実行

スクリプト検索例:

nmap –script-help=“http-*” -> http- で始まるもの

nmap –script-help=“not intrusive” -> intrusive を除くすべて

nmap –script-help=“default or safe” -> いずれかまたは両方に属するもの

nmap –script-help=“default and safe” –> 両方に属するもの

nmap –script-help=“(default or safe or intrusive) and not http-*”

–script-args =,={=},={,}

–script-args-file

–script-help ||||all[,…]

–script-trace —> スクリプトの進行情報を提供します

–script-updatedb

スクリプトを使うには、単に: nmap –script Script_Name target –> スクリプトとスキャナの両方が実行されるため、スキャナオプションも追加可能です。"safe=1" を追加して安全なスクリプトのみを実行することもできます。

タイムコントロール

Nmap は秒・分・ms 単位で時間を指定可能: –host-timeout 引数 900000ms, 900, 900s, 15m は同じ意味

Nmap はスキャン対象のホスト数をグループ分けし、ブロック単位で解析します。そのブロックがすべて解析されるまで次のブロックに進まない(ユーザへはブロック完了まで更新が届かない)ため、大きなグループのほうが最適になります。クラス C のデフォルトは 256 です。

これは –min-hostgroup –max-hostgroup で変更できます(並列スキャングループサイズを調整)。

並列スキャナ数も制御できますが、Nmap はネットワーク状況に基づく自動制御を内蔵しているためあまり変更しない方が良いです: –min-parallelism ; –max-parallelism

RTT タイムアウトを変更できますが通常は不要です: –min-rtt-timeout , –max-rtt-timeout , –initial-rtt-timeout

試行回数を変更できます: –max-retries

ホストのスキャン時間を変更できます: –host-timeout

各テスト間の遅延を設定してスキャンを遅くできます: –scan-delay , –max-scan-delay

1 秒あたりのパケット数を変更できます: –min-rate , –max-rate

フィルタされているか閉じているポートは応答が非常に遅い場合があります。開いているものだけに興味がある場合は: –defeat-rst-ratelimit で高速化できます。

Nmap の攻撃度合いを定義するには: -T paranoid|sneaky|polite|normal|aggressive|insane

-T (0-1)

-T0 –> 1 ポートずつスキャンし次のスキャンまで 5 分待つ

-T1 と T2 –> 非常に似ており、それぞれ 15 秒と 0.4 秒待つ

-T3 –> デフォルト(並列スキャン含む)

-T4 –> –max-rtt-timeout 1250ms –min-rtt-timeout 100ms –initial-rtt-timeout 500ms –max-retries 6 –max-scan-delay 10ms

-T5 –> –max-rtt-timeout 300ms –min-rtt-timeout 50ms –initial-rtt-timeout 250ms –max-retries 2 –host-timeout 15m –max-scan-delay 5ms

Firewall/IDS

ファイアウォール/IDS はポートへのアクセスを許可せずパケットを解析します。

-f パケットを分割します。デフォルトではヘッダ後を 8 バイト単位でフラグメントします。サイズ指定は ..mtu(これと同時に -f は使わないでください)。オフセットは 8 の倍数でなければなりません。Version scanners と scripts は fragmentation をサポートしません

-D decoy1,decoy2,ME Nmap はスキャンを送りますが発信元を別 IP に偽装します。これにより実際の発信元を隠します。リストに ME を入れると Nmap はそこに自分を置きます。完全にマスクするには自分の前に 5〜6 個入れると良いでしょう。ランダム IP は RND: で生成可能。TCP のバージョン検出で非接続方式のときは動作しないことがあります。内部ネットワーク内にいる場合はアクティブな IP を使う方が良いです。でないとあなたが唯一のアクティブなホストだとすぐに気づかれます。

ランダム IP を使う例: nmap -D RND:10 Target_IP

-S IP Nmap があなたの IP を正しく検出しない場合に指定します。相手に別のスキャン元だと信じ込ませる用途にも使えます。

-e 使用するインタフェースを選択

多くの管理者は全体の利便性のために特定の送信元ポートからのパケットをすべて許すルールを作ることがあります(20,53,67 など)。これを突くには送信元ポートを指定してパケットを送ります: nmap –source-port 53 IP

–data 16 進データ送信例: –data 0xdeadbeef や –data \xCA\xFE\x09

–data-string 通常の文字列送信例: –data-string “Scan conducted by Security Ops, extension 7192”

–data-length Nmap は通常ヘッダのみ送りますが、これで追加の乱数バイト数を付加できます

IP パケットを完全に設定するには –ip-options を使います

送受信パケットのオプションを見たい場合は –packet-trace を指定します。IP オプションと Nmap 使用例の詳細は http://seclists.org/nmap-dev/2006/q3/52 を参照してください。

–ttl

–randomize-hosts 攻撃の痕跡を目立たなくするためにホスト順をランダム化

–spoof-mac <MAC address, prefix, or vendor name> MAC を変更する(例: Apple, 0, 01:02:03:04:05:06, deadbeefcafe, 0020F2, Cisco)

–proxies プロキシを使用する。プロキシによっては Nmap が望むほど多くの接続を維持しないため、並列性を調整する必要があるかもしれません: –max-parallelism

-sP ARP による自ネットワーク内のホスト検出

多くの管理者は特定ポートから来るパケットをすべて通すルールを作ることがあります(20,53,67 など)。その場合送信元ポートを指定してパケットを送ると効果的です: nmap –source-port 53 IP

出力

-oN file 通常出力

-oX file XML 出力

-oS file Script kiddies 出力

-oG file Greppable 出力。まだ使えますが非推奨;自動化には XML の方が新機能がまず追加されるため推奨です。--resume を使いたい場合は -oN を維持し、機械処理用には -oX/-oA を優先してください。

-oA file -oS 以外すべて

–webxml XML のスタイルシート参照を https://nmap.org/svn/docs/nmap.xsl に変更し、別マシンで HTML として開きやすくします。

–stylesheet <path|url> カスタム XSL スタイルシートを使用。--webxml は公式ホスト済みスタイルシートへのショートカットです。

-v level 冗長性レベル

-d level デバッグレベル

–reason host と state の理由を表示

–stats-every time 指定時間ごとに進捗を表示

–packet-trace 送出パケットを確認。フィルタ指定も可能: –version-trace や –script-trace

–open open, open|filtered, unfiltered を表示

–resume file 中断したスキャンを normal (-oN) または grepable (-oG) 出力ファイルから再開します。現在のワークフローでは再開可能性のために -oN を保ち、パース用に -oX を併用するのが一般的です。

Example for parsing/HTML conversion workflows:

# Send only XML to stdout for tooling
nmap -sV -oX - 10.10.10.0/24

# Portable HTML-friendly XML
nmap -sV --webxml -oX scan.xml 10.10.10.10

その他

-6 は IPv6 を許可する

-A は -O -sV -sC –traceroute と同じ

実行時

Nmap 実行中にオプションを変更できます:

v / V 表示の詳細度(verbosity)を上げる / 下げる

d / D デバッグレベルを上げる / 下げる

p / P パケットトレースをオン / オフにする

? 実行時インタラクションのヘルプ画面を表示する

Vulscan

Nmap のスクリプトで、サービスのバージョン情報をオフラインの DB(他の重要なものからダウンロードされたもの)と照合し、考えられる脆弱性を返します

The DBs it uses are:

  1. Scipvuldb.csv | http://www.scip.ch/en/?vuldb
  2. Cve.csv | http://cve.mitre.org
  3. Osvdb.csv | http://www.osvdb.org
  4. Securityfocus.csv | http://www.securityfocus.com/bid/
  5. Securitytracker.csv | http://www.securitytracker.com
  6. Xforce.csv | http://xforce.iss.net
  7. Exploitdb.csv | http://www.exploit-db.com
  8. Openvas.csv | http://www.openvas.org

Nmap フォルダにダウンロードしてインストールするには:

wget http://www.computec.ch/projekte/vulscan/download/nmap_nse_vulscan-2.0.tar.gz && tar -czvf nmap_nse_vulscan-2.0.tar.gz vulscan/ && sudo cp -r vulscan/ /usr/share/nmap/scripts/

さらに DB パッケージをダウンロードして /usr/share/nmap/scripts/vulscan/ に追加する必要があります

使用方法:

すべてを使用するには: sudo nmap -sV –script=vulscan HOST_TO_SCAN

特定の DB を使用するには: sudo nmap -sV –script=vulscan –script-args vulscandb=cve.csv HOST_TO_SCAN

If you have Internet access, Nmap’s official vulners NSE script is usually the quickest maintained alternative for version-based enrichment:

nmap -sV --script vulners --script-args mincvss=7.0 <IP>

このスクリプトは safeexternalvuln カテゴリに属します。-sV の精度に依存するため、サービスのバナーが一般的だったりプロキシ越しの場合はヒットを手動で検証してください。

最近の実用的な注意点 (7.94+)

  • Nmap 7.94 以降、UDP ポートスキャン(-sU)とバージョン検出(-sV)は同じ nmap-service-probes ペイロードソースを使用します。スキャンフェーズからの UDP 応答は即座にバージョンマッチングに使われ得るため、-sU -sV --version-light は大規模またはパケットロスの多い範囲に対する良い初回アプローチになりました。
  • Nmap 7.94 以降、-sV は DTLS の背後に隠れた UDP サービスもプローブできるようになっており、UDP プロトコルを DTLS でラップする近代的な管理用/ICS 機器に有用です。
  • Nmap 7.95 では大量の新しいサービスフィンガープリントが追加され(grpcmysqlxremotemousetuya など)、さらに ICS に焦点を当てた NSE カバレッジ(hartip-infoiec61850-mms など)も追加されました。OT や組み込み機器をスキャンする場合、早期にカスタムプローブを追加するよりも Nmap の更新がより重要になることがあります。
  • Nmap 7.96 以降、順引き DNS ルックアップも並列化されました。大規模なホスト名リストが今はずっと高速になったため、--system-dns はパフォーマンスのためではなく互換性の問題がある場合に通常は reserved すべきです。

Speed Up Nmap Service scan x16

According to this post you can speed up the nmap service analysis by modifying all the totalwaitms values in /usr/share/nmap/nmap-service-probes to 300 and tcpwrappedms to 200.

Moreover, probes which do not have a specifically defined servicewaitms use a default value of 5000. Therefore, we can either add values to each of the probes, or we can compile nmap ourselves and change the default value in service_scan.h.

If you don’t want to change the values of totalwaitms and tcpwrappedms at all in the /usr/share/nmap/nmap-service-probes file, you can edit the parsing code such that these values in the nmap-service-probes file are completely ignored.

制限された環境向けに静的リンクされた Nmap をビルドする

ハードニングされた、または最小限の Linux 環境(containers、appliances)では、動的リンクされた Nmap バイナリはランタイムローダーや共有ライブラリ(例: /lib64/ld-linux-x86-64.so.2、libc.so)が欠けているために失敗することがよくあります。独自に静的リンクされた Nmap をビルドし、NSE データをバイナリと一緒にバンドルすることで、システムパッケージをインストールせずに実行できるようになります。

大まかな手順

  • Docker 経由でクリーンな amd64 Ubuntu ビルダーを使用する。
  • OpenSSL と PCRE2 を静的ライブラリとしてビルドする。
  • libpcap/libdnet を同梱して動的依存を避けつつ、Nmap を静的リンクでビルドする。
  • NSE スクリプトとデータディレクトリをバイナリにバンドルする。

ターゲットアーキテクチャの確認(例)

uname -a
# If building from macOS/ARM/etc., pin the builder arch:
docker run --rm --platform=linux/amd64 -v "$(pwd)":/out -w /tmp ubuntu:22.04 bash -lc 'echo ok'

ステップ1 — ツールチェーンを準備する

set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
apt-get update && apt-get install -y --no-install-recommends \
build-essential ca-certificates curl bzip2 xz-utils pkg-config perl python3 file git \
automake autoconf libtool m4 zlib1g-dev

ステップ 2 — OpenSSL (1.1.1w) を静的にビルド

OSSL="1.1.1w"
curl -fsSLO "https://www.openssl.org/source/openssl-$OSSL.tar.gz"
tar xzf "openssl-$OSSL.tar.gz" && cd "openssl-$OSSL"
./Configure no-shared no-zlib linux-x86_64 -static --prefix=/opt/ossl
make -j"$(nproc)" && make install_sw
cd /tmp

ステップ 3 — PCRE2 (10.43) を静的にビルド

PCRE2=10.43
curl -fsSLO "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-$PCRE2/pcre2-$PCRE2.tar.bz2"
tar xjf "pcre2-$PCRE2.tar.bz2" && cd "pcre2-$PCRE2"
./configure --disable-shared --enable-static --prefix=/opt/pcre2
make -j"$(nproc)" && make install
cd /tmp

ステップ4 — 静的な Nmap (7.98) をビルドする

NMAP=7.98
curl -fsSLO "https://nmap.org/dist/nmap-$NMAP.tar.bz2"
tar xjf "nmap-$NMAP.tar.bz2" && cd "nmap-$NMAP"
export CPPFLAGS="-I/opt/ossl/include -I/opt/pcre2/include"
export LDFLAGS="-L/opt/ossl/lib -L/opt/pcre2/lib -static -static-libstdc++ -static-libgcc"
export LIBS="-lpcre2-8 -ldl -lpthread -lz"
./configure \
--with-openssl=/opt/ossl \
--with-libpcre=/opt/pcre2 \
--with-libpcap=included \
--with-libdnet=included \
--without-zenmap --without-ndiff --without-nmap-update
# Avoid building shared libpcap by accident
sed -i -e "s/^shared: /shared: #/" libpcap/Makefile || true
make -j1 V=1 nmap
strip nmap

要点

  • -static, -static-libstdc++, -static-libgcc は静的リンクを強制する。
  • –with-libpcap=included/–with-libdnet=included を使用するとシステムの共有ライブラリを回避できる。
  • sed の調整により、存在する場合は共有 libpcap ターゲットを無効化する。

ステップ5 — バイナリとNSEデータをバンドルする

mkdir -p /out/nmap-bundle/nmap-data
cp nmap /out/nmap-bundle/nmap-linux-amd64-static
cp -r scripts nselib /out/nmap-bundle/nmap-data/
cp nse_main.lua nmap-services nmap-protocols nmap-service-probes \
nmap-mac-prefixes nmap-os-db nmap-payloads nmap-rpc \
/out/nmap-bundle/nmap-data/ 2>/dev/null || true

tar -C /out -czf /out/nmap-linux-amd64-static-bundle.tar.gz nmap-bundle

検証と運用メモ

  • アーティファクト上で file を使い、それが静的にリンクされていることを確認する。
  • NSE データをバイナリと一緒に保持して、Nmap がインストールされていないホストでもスクリプトの整合性が保たれるようにする。
  • 静的バイナリであっても、実行が AppArmor/seccomp/SELinux によってブロックされる可能性がある。DNS/egress は引き続き機能する必要がある。
  • 決定論的ビルドは、不透明な “static” バイナリをダウンロードすることに比べ、サプライチェーンリスクを低減する。

ワンライナー (Dockerized)

アーティファクトをビルド、バンドルして情報を出力する ```bash docker run --rm --platform=linux/amd64 -v "$(pwd)":/out -w /tmp ubuntu:22.04 bash -lc ' set -euo pipefail export DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y --no-install-recommends \ build-essential ca-certificates curl bzip2 xz-utils pkg-config perl python3 file git \ automake autoconf libtool m4 zlib1g-dev

OSSL=“1.1.1w”; curl -fsSLO “https://www.openssl.org/source/openssl-$OSSL.tar.gz”
&& tar xzf “openssl-$OSSL.tar.gz” && cd “openssl-$OSSL”
&& ./Configure no-shared no-zlib linux-x86_64 -static –prefix=/opt/ossl
&& make -j“$(nproc)“ && make install_sw && cd /tmp

PCRE2=10.43; curl -fsSLO “https://github.com/PCRE2Project/pcre2/releases/download/pcre2-$PCRE2/pcre2-$PCRE2.tar.bz2”
&& tar xjf “pcre2-$PCRE2.tar.bz2” && cd “pcre2-$PCRE2”
&& ./configure –disable-shared –enable-static –prefix=/opt/pcre2
&& make -j“$(nproc)“ && make install && cd /tmp

NMAP=7.98; curl -fsSLO “https://nmap.org/dist/nmap-$NMAP.tar.bz2”
&& tar xjf “nmap-$NMAP.tar.bz2” && cd “nmap-$NMAP”
&& export CPPFLAGS=“-I/opt/ossl/include -I/opt/pcre2/include”
&& export LDFLAGS=“-L/opt/ossl/lib -L/opt/pcre2/lib -static -static-libstdc++ -static-libgcc”
&& export LIBS=“-lpcre2-8 -ldl -lpthread -lz”
&& ./configure –with-openssl=/opt/ossl –with-libpcre=/opt/pcre2 –with-libpcap=included –with-libdnet=included –without-zenmap –without-ndiff –without-nmap-update
&& sed -i -e “s/^shared: /shared: #/” libpcap/Makefile || true
&& make -j1 V=1 nmap && strip nmap

mkdir -p /out/nmap-bundle/nmap-data
&& cp nmap /out/nmap-bundle/nmap-linux-amd64-static
&& cp -r scripts nselib /out/nmap-bundle/nmap-data/
&& cp nse_main.lua nmap-services nmap-protocols nmap-service-probes nmap-mac-prefixes nmap-os-db nmap-payloads nmap-rpc /out/nmap-bundle/nmap-data/ 2>/dev/null || true
&& tar -C /out -czf /out/nmap-linux-amd64-static-bundle.tar.gz nmap-bundle
&& echo “===== OUTPUT =====”; ls -lah /out; echo “===== FILE TYPE =====”; file /out/nmap-bundle/nmap-linux-amd64-static || true ’

</details>

## 参考文献

- [Compiling static Nmap binary for jobs in restricted environments](https://www.pentestpartners.com/security-blog/compiling-static-nmap-binary-for-jobs-in-restricted-environments/)
- [Static Nmap Binary Generator (helper tool)](https://github.com/0x5ubt13/static_nmap_binary_generator)
- [OpenSSL sources](https://www.openssl.org/source/)
- [PCRE2 releases](https://github.com/PCRE2Project/pcre2/releases)
- [Nmap source tarballs](https://nmap.org/dist/)
- [Nmap Change Log](https://nmap.org/changelog.html)
- [Nmap Output Formats](https://nmap.org/book/man-output.html)


> [!TIP]
> AWS Hackingを学び、実践する:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> GCP Hackingを学び、実践する: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Az Hackingを学び、実践する: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> [**HackTricks Trainingの全カタログ**](https://hacktricks-training.com/courses/) を閲覧して、評価トラック(**ARTA/GRTA/AzRTA**)と [**Linux Hacking Expert (LHE)**](https://hacktricks-training.com/courses/lhe/) を確認してください。
>
> <details>
>
> <summary>HackTricksをサポート</summary>
>
> - [**subscription plans**](https://github.com/sponsors/carlospolop) を確認してください!
> - 💬 [**Discord group**](https://discord.gg/hRep4RUj7f)、[**telegram group**](https://t.me/peass) に**参加**し、**X/Twitter**で [**@hacktricks_live**](https://twitter.com/hacktricks_live) を**フォロー**するか、[**LinkedIn page**](https://www.linkedin.com/company/hacktricks/) と [**YouTube channel**](https://www.youtube.com/@hacktricks_LIVE) を確認してください。
> - [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の github repos に PR を送信して hacking tricks を共有してください。
>
> </details>