Nmap原理02 - 編寫自己的服務探測腳本


編寫自己的服務探測腳本

1. 添加自己的探測腳本

  nmap-service-probes文件的格式將在第二節介紹,本節通過一個例子說明如何添加自己的服務探測腳本。

  AMQP協議,即Advanced Message Queuing Protocol,一個提供統一消息服務 的應用層標准高級消息隊列協議。AMQP協議基於TCP5672端口。

  在shodan上搜索AMQP:

 

 

  可以看到97.74.65.116這個ip下有AMQP服務在運行,並且返回的數據為:AMQP\x01\x01\x00\n.

  找到nmap-service-probes文件中對應的匹配腳本,我們在后面加了[amqp test]作為測試:

 

  nmap掃描輸出:

  可以看到nmap正是使用這條匹配語句完成對服務和版本探測的,如果我們刪掉,nmap會打印讓我們提交指紋的頁面,如下:

  幾點建議:

    1)如果我們想針對具體的應用進行識別,服務探測腳本是一方面,可以根據nmap自帶的進行修改和添加。

    2)服務探測功能有限,還可以使用NSE腳本引擎來實現。

    3)Nmap做的無非是解析返回的結果,進行顯示,如果我們其他工具能夠完成這個功能,沒有必要非得用nmap,python,java解析一樣可以。  

2. nmap-service-probes文件格式

  nmap-service-probes文件是面向行的,#開頭的代表注釋,會被解析器忽略,空白行也會被忽略;其他行是下面指令之一。

Probe指令
  Syntax: Probe <protocol> <probename> <probestring>
 
 例如:

    Probe TCP GetRequest q|GET / HTTP/1.0\r\n\r\n|
    Probe UDP DNSStatusRequest q|\0\0\x10\0\0\0\0\0\0\0\0\0|
    Probe TCP NULL q||
  protocol:必須是TCP或者UDP
  probestring:告訴Nmap發送的數據,格式為:q|.....|。內容類似於C和Perl,支持轉義字符:\0,\a,\n,\r。如果分隔符是你在內容中需要的,也可以換其他的分隔符。
match指令
  Syntax: match <service> <pattern> [<versioninfo>]
  Example:

    match ftp m/^220.*Welcome to .*Pure-?FTPd (\d\S+\s*)/ p/Pure-FTPd/ v/$1/ cpe:/a:pureftpd:pure-ftpd:$1/
    match ssh m/^SSH-([\d.]+)-OpenSSH[_-]([\w.]+)\r?\n/i p/OpenSSH/ v/$2/ i/protocol $1/ cpe:/a:openbsd:openssh:$2/
    match mysql m|^\x10\0\0\x01\xff\x13\x04Bad handshake$| p/MySQL/ cpe:/a:mysql:mysql/
    match chargen m|@ABCDEFGHIJKLMNOPQRSTUVWXYZ|
    match uucp m|^login: login: login: $| p/NetBSD uucpd/ o/NetBSD/ cpe:/o:netbsd:netbsd/a
    match printer m|^([\w-_.]+): lpd: Illegal service request\n$| p/lpd/ h/$1/
    match afs m|^[\d\D]{28}\s*(OpenAFS)([\d\.]{3}[^\s\0]*)\0| p/$1/ v/$2/
  該指令告訴Nmap如何基於探針返回的字符串識別服務,一個探針可能跟着100多match指令;
  service
    匹配成功的服務名稱;
  pattern:
    
格式為:m/[regex]/[opts];regex格式采用Perl語言格式;目前opts支持“i”,代表的含義是匹配不區分大小寫;“s”:代表在‘.’字符后面有新行。

  versioninfo:
    包含很多可選的字段,每個字段都由一個標識符開始,然后是分隔符包含的字段值。下面介紹7個字段:
    p/vendorproductname/ 供應商或者服務明
    v/version/ 應用的版本信息,$1的意思由match指令中第一個()的內容替換;
    i/info/         其他進一步的信息
    h/hostname/      主機名
    o/operatingsystem/  服務在什么操作系統之上
    d/devicetype/     服務運行的設備類型
    cpe:/cpename/[a] nmap通用的指紋格式
    在某些情況下,幫助函數可以用在替換之前, i/$P(3)/;$P()函數將會過濾掉不可打印的字符;另一個幫助函數是 $SUBST().在打印之前做替換;
    v/$SUBST(1,"_",".")/ 意思是在打印$1之前,將'_'替換成'.'打印。
softmatch指令:
  
Example:

    softmatch ftp m/^220 [-.\w ]+ftp.*\r\n$/i
    softmatch smtp m|^220 [-.\w ]+SMTP.*\r\n|
    softmatch pop3 m|^\+OK [-\[\]\(\)!,/+:<>@.\w ]+\r\n$|  
  
格式與match指令類似,主要的不同是掃描將會繼續,在軟匹配之后;但是探針被限制在軟匹配匹配出的服務指定的探針,

ports 和 sslports指令:
 
 Example:

    ports 21,43,110,113,199,505,540,1248,5432,30444
    ports 111,4045,32750-32810,38978
  告訴Nmap探針所要發送數據的端口,僅使用一次,在每個探針的下面。
totalwaitms指令:
  
放棄探針之前所要等待的時間;
tcpwrappedms
指令:
 
 該指令僅用於NULL探針。 如果服務在此計時器用盡之前關閉TCP連接,則該服務標記為tcpwrapped。 否則,匹配繼續照常。
rarity指令:
  用於控制使用探針;
fallback指令:
  
此指令用於指定哪個探針作為回退,如果當前探針沒有匹配項;由於前一個探針可能返回數據很慢,因此可以開啟新的探針,將新探針的結果與前面的匹配。

  具體可參考:https://nmap.org/book/vscan-technique.html#vscan-cheats-and-fallbacks
Exclude指令

  例如:
    Exclude 53,T:9100,U:30000-40000
  此指令從版本掃描中排除指定的端口,僅使用一次,在所有探針之前,文件的頂部。
  目前文件中排除的是Exclude T:9100-9107。因為這幾個端口是打印機端口,可能會導致打印發送的探針。
  --allports指令,可以覆蓋Exclude指令。

 3.參考文獻

  https://nmap.org/book/vscan-fileformat.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM