nmap

nmap

nmap [ <Scan Type> ...] [ <Options> ] { <target specification> }

版本:nmap-7.70-1.x86_64.rpmhtml

命令行格式:https://svn.nmap.org/nmap/docs/nmap.usage.txt(老是最新)python

目標格式

nmap命令行中中除了選項或選項參數其他均爲目標主機格式。linux

TARGET SPECIFICATION:
  Can pass hostnames, IP addresses, networks, etc.
  Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
  -iL <inputfilename>: Input from list of hosts/networks
  -iR <num hosts>: Choose random targets
  --exclude <host1[,host2][,host3],...>: Exclude hosts/networks
  --excludefile <exclude_file>: Exclude list from file

當掃描目標是hostname時nmap會經過DNS解析地址。若是不特別指出--resolve-all選項nmap只會對NDS返回的第一個IP地址進行掃描。(一般一個域名對應多個IP地址是用來作負載的例如大型門戶網站會根據用戶的網絡聯通、電信、移動等返回訪問最快的站點)web

  • CIDR-style addressing:www.baidu.com/24或者123.125.115.110/24(包括網絡號和廣播地址)shell

  • 192.168.0-255.1-254數據庫

  • 192.168.3-5,7.1(192.168.3.1, 192.168.4.1, 192.168.5.1, 192.168.7.1)緩存

  • 可使多個目標組合192.168.0-255.1-254 192.168.3-5,7.1(IP條目可使命令行中能夠接受的格式,每一個條目必須用一個或多個空格,製表符或換行符分隔)安全

  • -iL (Input from list) 指定要從文件中的目標列表,文件中能夠有#開頭和結尾的註釋 服務器

  • -iR (Choose random targets) 隨機生成num hosts個主機IP(自動去除私有,組播和一些未分配的地址) 網絡

    nmap -n -iR 10 -sL | cut -d" " -f 5 >nmap_random_target.txt 不過須要整理一下文件開頭和結尾

無聊了能夠查看一些開了web服務的網站 nmap -Pn -sS -p 80 -iR 0 --open

  • --exclude [, [,...]] (Exclude hosts/networks) 指定要從掃描中排除的以逗號分隔的目標列表
  • --excludefile (Exclude list from file) 指定要從掃描中排除的文件中的目標列表,文件中能夠有#開頭和結尾的註釋

主機發現

因爲掃描端口的速度並不快,因此主機發現步驟是必要的。固然這個也取決於你的角色定位或任務目標,網絡管理員可能只對運行某項服務的主機感興趣,或者你在作資產發現。好比我曾經作過一個全端口掃描主機發現的項目,總公司怕分公司隱瞞資產同時規避掉主機掃描出漏洞。

主機發如今namp中有時候叫ping掃秒,因此大部分的主機發現過程當中的端口掃描選項以P開頭(猜的( ̄▽ ̄)")

HOST DISCOVERY:
  -sL: List Scan - simply list targets to scan
  -sn: Ping Scan - disable port scan
  -Pn: Treat all hosts as online -- skip host discovery
  -PS/PA/PU/PY[portlist]: TCP SYN/ACK, UDP or SCTP discovery to given ports
  -PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
  -PO[protocol list]: IP Protocol Ping
  -n/-R: Never do DNS resolution/Always resolve [default: sometimes]
  --dns-servers <serv1[,serv2],...>: Specify custom DNS servers
  --system-dns: Use OS's DNS resolver
  --traceroute: Trace hop path to each host

若是沒有給出主機發現選項,nmap發送ICMP echo request請求,443端口TCP SYN數據包,80端口TCP ACK數據包和一個ICMP timestamp request。至關於默認值-PE -PS443 -PA80 -PP

對於沒有特殊權限的unix shell用戶默認探測是connect調用

nmap -sn 192.198.99.1

  • -sL (List Scan)

    簡單地列出指定的每一個網絡主機,而不向目標主機發送任何數據包。默認狀況下,Nmap仍在主機上執行反向DNS解析以瞭解其名稱。

  • -sn (No port scan)舊版本爲-sP

    此選項僅作主機發現不作後續的端口掃描和-P*組合使用(不包括-Pn(跳過主機發現,直接端口掃描))

  • -Pn (No ping)

    跳過主機發現直接執行端口掃描

  • -PS (TCP SYN Ping)

    原理:TCP三次握手

    此選項發送一個設置了SYN標誌的空TCP數據包(默認80端口),-PS22和-PS22-25,80,113,1050,35000。

    端口open返回SYN+ACK,爲正常TCP三次握手第二步,而後運行nmap主機內核返回RST終止正在進行的鏈接以響應意外的SYN / ACK,而不是由Nmap自己。端口關閉返回RST數據包。

  • -PA (TCP ACK Ping)

    原理:對於一條不存在的鏈接,發送ACK包會直接返回RST中斷這條請求。

ACK ping僞裝存在一個established TCP connection,可是這個鏈接並不存在,目標主機端口開放或關閉都會返回一個RST數據包。此選項並不能判斷端口狀態,不過如果返回RST則代表主機是存活的。

ACKping對繞過無狀態防火牆有些用處,像Linux主機防火牆iptables/netfilter的--syn選項過濾(若--state則相似於狀態防火牆)。

若防火牆爲狀態防火牆stateful firewall會直接丟棄這類沒有存在它的會話表中的怪異鏈接。

ps:我見過的企業就沒發現過無狀態防火牆,都是有狀態的。並且都是遵循最小化原則,你要什麼端口開什麼端口,最後再來個默認拒絕(T_T)。

無回覆版本

有回覆(端口開啓或關閉都會返回RST)

  • -PU (UDP Ping)

    原理:向一臺沒有開啓對應端口的UDP數據包,返回一個ICMP destination port unreachable消息。

    默認向目標主機發送 UDP 端口40125(極不可能開啓的端口)。

    關於paloads:數據包內容也可能受--data, - data-string和--data-length選項的影響。(the section called 「UDP payloads: nmap-payloads

這種狀態防火牆後面的默認拒絕的鳥你都不會鳥。

  • -PY (SCTP INIT Ping)

    SCTP除了電信運營商專網可能再用通常的企業不會用,我對協議也不瞭解,略過。

  • -PE; -PP; -PM (ICMP Ping Types)

    ICMP echo, timestamp, and netmask request ping回聲請求時間戳請求,子網掩碼請求

    通常商用防火牆都能準肯定義容許什麼樣的ping能夠回覆

  • -PO (IP Protocol Ping)

    IP協議ping,沒有指定協議的話默認發送 IP packets for ICMP (protocol 1), IGMP (protocol 2), and IP-in-IP (protocol 4)

  • -PR (ARP Ping)

    當給定目標地址爲本地網絡的時候默認進行ARP掃描,這個比ICMP準確的多,通常的主機自帶防火牆可能默認屏蔽icmp請求可是ARP請求通常確定會回覆(禁用用--send-ip)

    對於IPV6來講-PR用鄰居發現協議。

    若是你本機上有目標主機ARP緩存也會發送ARP請求數據包,測試了。

    這玩意不太好實驗,沒有兩臺實體機,一用arp -d 就從新請求,還好我聰明想到了用不存在主機測試一下。

  • --disable-arp-ping (No ARP or ND Ping)

    禁用IPV4的ARP和IPV6的neighbor discovery

  • --traceroute (Trace path to host)

    多目標主機作traceroute

  • -n (No DNS resolution)

    不進行地址解析。IP地址反向解析

  • -R (DNS resolution for all targets)

    對斷定存活主機進行地址解析,IP地址反向解析

  • --resolve-all (Scan each resolved address)

    有點詭異的是這個參數按照字面理解應當是對全部掃描的地址無論主機存不存活都進行反向地址解析,可是它的實際意思是對給定的域名,返回超過兩個多個IP地址的所有進行掃描。

    更加詭異的是我在man手冊和官網的最新man手冊中都沒有這個選項說明也用不了。

  • --system-dns (Use system DNS resolver)

    默認狀況下,Nmap經過將查詢直接發送到主機上配置的名稱服務器,而後偵聽響應來反向解析IP地址。許多請求(一般是幾十個)是並行執行的。

    指定此選項以改成使用系統解析程序(經過getnameinfo調用一次一個IP)。這種狀況較慢且不多有用。系統解析器始終用於正向查找(從主機名獲取IP地址)。

  • --dns-servers [, [,...]] (Servers to use for reverse DNS queries)

    使用多個NDS服務器可能更快一些,而且隱祕一些。但此選項更多用途用於掃描專用網絡能夠確認53端口開放主機,而後每次使用一個dns地址來掃描。

端口掃描

-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
  -sU: UDP Scan
  -sN/sF/sX: TCP Null, FIN, and Xmas scans
  --scanflags <flags>: Customize TCP scan flags
  -sI <zombie host[:probeport]>: Idle scan
  -sY/sZ: SCTP INIT/COOKIE-ECHO scans
  -sO: IP protocol scan
  -b <FTP relay host>: FTP bounce scan

通用選項格式是-s , 是能表明某一類掃描的突出字符如-sU,U表明UDP

狀態 詳細的參數說明
Open 端口開啓,數據有到達主機,有程序在端口上監控
Closed 端口關閉,數據有到達主機,沒有程序在端口上監控
Filtered 數據沒有到達主機,返回的結果爲空,數據被防火牆或者是IDS過濾(正常來講會有迴應)
UnFiltered 數據有到達主機,可是不能識別端口的當前狀態,只有用於映射防火牆規則集的ACK掃描會將端口分類爲此狀態,
Open|Filtered 端口沒有返回值,主要發生在UDP、IP、FIN、NULL和Xmas掃描中
Closed|Filtered 只發生在IP ID idle掃描

使用nmap的障礙是你得正確選擇合適的掃描選項。

  • -sS (TCP SYN scan)

    half-open半開掃描,利用TCP三次握手過程。沒有被過濾的話確定有迴應。

    nmap 目標主機 nmap 狀態
    SYN SYN+ACK RST open
    SYN RST closed
    SYN 屢次重傳無迴應 filtered
    SYN ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13) filtered
    SYN SYN open參考https://nmap.org/misc/split-handshake.pdf
  • -sT (TCP connect scan)

    SYN scan沒有設置或不是特權用戶默認用此設置。

    nmap 目標主機 nmap 狀態
    SYN SYN+ACK ACK open
    SYN RST closed
    SYN 屢次重傳無迴應 filtered
    SYN ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13) filtered
    SYN SYN open參考https://nmap.org/misc/split-handshake.pdf
  • -sU (UDP scans)

    DNS, SNMP, and DHCP (registered ports 53, 161/162, and 67/68)是最經常使用的UDP服務端口。特色:慢

nmap 目標主機 狀態
UDP UDP open
UDP ICMP port unreachable error (type 3, code 3) closed
UDP ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13) filtered
UDP 屢次重傳無迴應 open|filtered

DNS迴應的是不支持狀態查詢,另外的ICMP port unreachble說明這個UDP 53的調用不是系統發出的源端口沒有打開。

  • -sY (SCTP INIT scan)

    略過

  • -sN; -sF; -sX (TCP NULL, FIN, and Xmas scans)

    RFC793 page 65 不包含RST置位的包來到一個close端口返回一個RST,不包含SYN、RST或ACK置位的包來到open端口則丟棄該包,不返回任何東西。

    Null scan (-sN)

    TCP flag header 0x0不設置標誌位

    FIN scan (-sF)

    FIN置位

    Xmas scan (-sX)

    FIN, PSH, and URG置位

    總之這幾個選項沒什麼用,狀態防火牆專治這種花裏胡哨的。能用他們肯定的SYN掃描也能更好的肯定,不能用他們肯定的別的可能還有點但願。

    另外Microsoft Windows, many Cisco devices, BSDI, and IBM OS/400不遵循這個RFC。能夠用他們探測操做系統,可是仍是有更好的操做系統探測手段。總之雞肋。

    nmap 目標主機 狀態
    TCP NULL, FIN, and Xmas 無迴應(重傳兩次) open|filtered
    TCP NULL, FIN, and Xmas RST closed
    TCP NULL, FIN, and Xmas ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13) filtered
  • -sA (TCP ACK scan)

    ACK置位,這個選項不能肯定端口開放或者關閉(由於端口open或者close都會返回RST)

    狀態防火牆全部的都不能經過,也不能映射防火牆規則集。

    關於用它映射過濾集,對應的是無狀態防火牆(iptables --syn)和交換機ACL這種未過濾端口ACK容許經過標記爲unfiltered,過濾端口不容許經過標記爲filtered。(未實驗驗證)

    這種掃描用在內網好一點,由於如今還有內網中不一樣區域用交換機ACL訪問控制的,要是出口防火牆通常都是狀態防火牆什麼都不會回覆,除了設置ICMP應答的。雲上環境訪問控制不太瞭解。

    nmap 目標主機 狀態
    ACK 無迴應(重傳兩次) filtered
    ACK RST unfiltered
    ACK ICMP unreachable error (type 3, code 0, 1, 2, 3, 9, 10, or 13) filtered

    狀態防火牆(要是sS掃描80端口會迴應)

  • -sW (TCP Window scan)

    有的操做系統,用的ACK置位探測,RST返回的window size端口開size正,端口關閉size爲0。不過我試了兩種系統都不太管用。還有的連端口過濾沒過濾都肯定不了(涉及到上面的-sA掃描)。80開,443關閉。都返回的window seze 0 個人是路由器基於linux。

  • -sM (TCP Maimon scan)

    略過

  • --scanflags (Custom TCP scan)

    定製TCP標誌位掃描。

  • -sZ (SCTP COOKIE ECHO scan)

    略過

  • -sI [: ] (idle scan)

    暫時搞不懂

  • -sO (IP protocol scan)

    基於IP的協議掃描(TCP、UDP和ICMP等)

    控制的是IP的協議號字段

  • -b (FTP bounce scan)

    略,實現很麻煩,並且如今大部分都不支持了。

端口掃描總結

掃描公網IP遇到狀態防火牆的時候只用 -sS -sT -sU,其餘的都不太管用。

端口說明和掃描順序

默認狀況下Nmap會掃描每一個協議最多見的1000個端口。

  • -p (Only scan specified ports)

    特別說明-p只適用於端口掃描,主機發現的直接加到選項後面如

    nmap -PS 80,443 -sS -p 80,443 192.168.99.1

    指定端口選項會覆蓋默認端口掃描

    格式:443 443-445 -p-掃描1-65535

    特別須要說明的是協議掃描-sO 對應的-p指的是協議號0-255

    T: for TCP, U: for UDP, S: for SCTP, or P: for IP

    -p U:53,111,137,T:21-25,80,139,8080會掃描對應的TCP和UDP端口不過須要加上-sU和任意一種TCP掃描選項。如nmap -sU -sY -p U:53,111,137,T:21-25,80,139,8080 8.8.8.8

    還能夠用nmap-services對應的協議名指定端口。協議名支持通配符和? 如-p ftp,http

  • --exclude-ports (Exclude the specified ports from scanning)

    排除要掃描的端口號或協議號。不只是掃描,發現階段也不會掃描這些端口

  • -F (Fast (limited port) scan)

    掃描常見的100個端口而不是1000個

    自定義nmap-services映射文件用--datadir

  • -r (Don't randomize ports)

    按順序發送端口掃描包

  • --port-ratio <decimal number between 0 and 1>

    按照比率掃描nmap-services文件中的端口

  • --top-ports

    掃描nmap-services中的前n個端口

服務和版本探測

原理: https://nmap.org/book/vscan.html

nmap-service-probes 數據庫包含查詢不一樣服務的探測報文 和解析識別響應的匹配表達式

肯定TCP或UDP端口open的時候指定了版本探測,nmap會進行版本探測。

  • -sV (Version detection)

    -A同時打開操做系統探測和版本探測,最新版本-sR合併了

    能夠看到GET / HTTP/1.0 要是在waf後面這種不符合http規範的可能被攔截掉。

  • --allports (Don't exclude any ports from version detection)

    默認狀況下,Nmap版本探測會跳過9100 TCP端口,由於一些打印機簡單地打印送到該端口的 任何數據,這回致使數十頁HTTP get請求,二進制 SSL會話請求等等被打印出來。這一行爲能夠經過修改或刪除nmap-service-probes 中的Exclude指示符改變, 您也能夠不理會任何Exclude指示符,指定--allports掃描全部端口

  • --version-intensity (Set version scan intensity)

    當進行版本掃描(-sV)時,nmap發送一系列探測報文 ,每一個報文都被賦予一個1到9之間的值。 被賦予較低值的探測報文對大範圍的常見服務有效,而被賦予較高值的報文 通常沒什麼用。強度水平說明了應該使用哪些探測報文。數值越高, 服務越有可能被正確識別。 然而,高強度掃描花更多時間。強度值必須在0和9之間。 默認是7。當探測報文經過nmap-service-probes ports指示符 註冊到目標端口時,不管什麼強度水平,探測報文都會被嘗試。這保證了DNS 探測將永遠在任何開放的53端口嘗試, SSL探測將在443端口嘗試,等等。

  • --version-light (Enable light mode)

    輕量級版本探測, --version-intensity 2的別名

  • --version-all (Try every single probe)

    --version-intensity 9別名,保證對每一個端口嘗試每一個探測報文。

  • --version-trace (Trace version scan activity)

    nmap --send-ip -n -Pn -sV --version-trace -sU -p U:53 192.168.99.1

操做系統檢測

  • -O (Enable OS detection)

    開啓操做系統探測,另外-A開啓操做系統和服務版本探測。

  • --osscan-limit (針對指定的目標進行操做系統檢測)

    若是發現一個打開和關閉的TCP端口時,操做系統檢測會更有效。 採用這個選項,Nmap只對知足這個條件的主機進行操做系統檢測,這樣能夠節約時間,必須配合-A或-O使用。

防火牆/IDS逃避和哄騙

  • -f (fragment packets); --mtu (using the specified MTU)

    -f選項要求掃描時(包挺ping掃描)使用小的IP包分片。其思路是將TCP頭分段在幾個包中,使得包過濾器、 IDS以及其它工具的檢測更加困難。

    對於IP分片至少華爲的安全產品會默認開啓IP報文虛擬分片重組功能。至於超時的處理狀況並未說明,並且IP分片也有兩種狀況,正常的IP分片不會像下面我這種第三個包重組完才能知道TCP的目標端口,由於加上IP頭才28字節,因此不可能繞過狀態防火牆過濾的端口。第二種IP分片是UDP和ICMP常發生的應用層給的數據太長超過MTU纔會分片,TCP不太可能發生這種狀況,由於三次握手階段就會協商MSS。除非中間套了好多層用了GRE,IPSEC等。

    須要說明的是IP分片能夠形成網絡攻擊,比如防火牆對一個公網IP開通了80端口訪問我強行將MTU設置的很小,HTTP報文很長的話這種就會形成檢測設備的長時間等待重組會消耗不少內存,通常的串在鏈路當中而且作檢測的只有IPS這種流式引擎設備了。可是網上的資料IP分片攻擊主要指的是ICMP和UDP,例如ping of death不過老系統纔會被這種數據包攻擊。

  • -D [, ][,ME][,...] (Cloak a scan with decoys 誘餌)

    誘餌掃描,爲了使目標主機不容易判斷真實的掃描地址,將本身的真實IP混在大量的掃描之中能夠用誘餌選項,固然誘餌主機最好存活,要否則只有你的包是和目標主機交互的,深刻掃描也容易判斷出真實的掃描地址。固然,這種方式能夠經過路由跟蹤、響應丟棄以及其它主動機制來發現真實IP。

    使用逗號分隔每一個誘餌主機,也可用本身的真實IP做爲誘餌,這時可以使用 ME選項說明。若是在第6個位置或 更後的位置使用ME選項,一些經常使用 端口掃描檢測器(如Solar Designer's excellent scanlogd)就不會報告 這個真實IP。若是不使用ME選項,Nmap 將真實IP放在一個隨機的位置。對版本探測等無效。

    由於我這是局域網並且127,128不存活因此比正常包少點。

  • -S (Spoof source address)

    若是你有多個網卡能夠用-S指定發包的網卡,另外這個選項能夠僞造原地址,而且你的真實地址不會產生包,能夠假裝成別的地址在掃描目標地址。另外更多的做用想得多的能夠發現,我就很少說了。若是要用假的源地址須要配合-e和-Pn使用指定一個接口,而且這種對主機發現階段沒用因此要用-Pn並且最後nmap給的報告就不用看了。

  • -e (Use specified interface)

    指定發包網卡

  • --source-port ; -g (Spoof source port number)

    一個公網IP的數據包要主動進入內網有幾個關口要過,狀態防火牆規則容許,有對應nat規則。nat和防火牆都會創建會話表。假裝源端口也不太管用。可是有的防火牆管理員規則設定的很爛,有的公網IP開了幾個端口,有的全開放。有的甚至將源端口爲53的DNS會話全放過。不妨測一測。

    五元組:源IP地址、目的IP地址、協議號、源端口、目的端口

  • --ttl (Set IP time-to-live field)

    設置TTL字段值

輸出

重點是XML輸出,能夠標準的被其餘程序或語言解析

  • -oN (normal output)

    將命令行輸出結果保存到文件中

  • -oX (XML output)

    輸出成XML格式文件

  • -oG (grepable output)

    適合於grep cut awk之類程序,這種格式化的方便檢索。

  • -oA (Output to all formats)

    爲使用方便,利用-oA 選項 可將掃描結果以標準格式、XML格式和Grep格式一次性輸出。分別存放在 .nmap, .xml和 .gnmap文件中。也能夠在文件名前 指定目錄名,如在UNIX中,使用~/nmaplogs/foocorp/, 在Window中,使用c:\hacking\sco on Windows。

  • -v (Increase verbosity level) , -v (Set verbosity level)

    提升輸出詳細級別,有的時候nmap並不能作出準確判斷,這樣測試者能夠自行找到一些容易忽視的信息。

  • -d (Increase debugging level) , -d (Set debugging level)

    輸出一些比-v更詳細的信息(調試信息)

  • --reason (Host and port state reasons)

    顯示端口狀態或主機存活或不存活緣由

  • --packet-trace (Trace packets and data sent and received)

    跟蹤每個nmap發出去的包,接收到的包,有助於理解nmap工做方式。

    --version-trace顯示版本跟蹤細節

    --script-trace腳本細節

    --packet-trace上面的兩個都包括

  • --open (Show only open (or possibly open) ports)

    只顯示open的端口

  • --iflist (List interfaces and routes)

    輸出網卡列表和路由信息

  • --append-output (Append to rather than clobber output files)

    將輸出結果追加到文件支持oN oG不支持oX

  • --resume (Resume aborted scan)

    若是掃描過程當中中斷如ctrl+c能夠繼續以前的掃描,好多漏洞掃描工具利用它實現暫停功能。支持oN oG 不支持oX輸出的文件

其餘

  • -6 (Enable IPv6 scanning)

    使能IPV6掃描

  • -A (Aggressive scan options)

    啓用大部分經常使用的掃描內容,目前包括

    -O操做系統掃描

    -sV版本掃描

    -sC腳本掃描

    --traceroute路由跟蹤

  • --datadir (Specify custom Nmap data file location)

    指定數據文件存放位置(注意不是輸出)nmap-service-probes, nmap-services, nmap-protocols, nmap-rpc, nmap-mac-prefixes和 nmap-os-fingerprints

不是結束的結束

對於沒有網絡經驗的人最好仍是找一本書而不是官方手冊來看,很困難。其中有的選項沒記錄有的我認爲沒什麼用,有的現階段不會用到,有的理解不能。不過大部分都記錄了。另外我想起來一個python的namp庫(python-nmap),簡單、實用。對於作運維自動化的頗有意思。

另外掃描器還有zmap,masscan。這些具體的區別還沒研究。http://www.91ri.org/10800.html

另外基於這些掃描器的資產收集或者說內網zoomeye開源版實現

基於Python的網絡偵查框架 – IVRE

支持主動偵查和被動偵查

介紹

https://www.freebuf.com/sectool/74083.html

官網

https://ivre.rocks/

下次研究這個。

相關文章
相關標籤/搜索