[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 安全技術 > 網絡 > 正文
使用ICMP協議來進行主機探測
本文出自: 作者: (2001-07-26 09:00:00)
主機探測對攻擊者來將是很重要的一步,通過對主機的信息搜尋,才能很好的下一步的進攻,當然對主機探測來說有很多方法,主機某些服務的BANNER,一些使用的應用程序,或者使用工具來檢測主機,如NMAP,在WEB上有www.netcraft.com來簡單的估測主機。下面所講的是使用ICMP協議來探測主機,主要也是可以了解ICMP這個協議,這裡最主要的也是將這個ICMP協議,呵呵。

  1,ICMPECHO(Type8)和ECHOReply(Type0)

  我們使用一個ICMPECHO數據包來探測主機地址是否存活(當然在主機沒有被配置為過濾ICMP形式),通過簡單的發送一個ICMPECHO(Type 8)數據包到目標主機,如果ICMPECHOReply(ICMPtype0)數據包接受到,說明主機是存活狀態。

  如果沒有就可以初步判斷主機沒有在線或者使用了某些過濾設備過濾了ICMP的REPLY。

|------------------------------------------------------------- 

|| 

|------ICMPECHOrequest------|

||HOST|--->|HOST||

||A|<-----------------------|B||

|||如果存活或者沒有過濾||| 

|------將返回ICMPRCHOREPLY------|

|| 

-------------------------------------------------------------- 

  這種機制就是我們通常所用的ping命令來檢測目標主機是否可以ping到。

  下面是兩個LINUX機器的演示:

  [root@xundi/root]#ping192.168.5.5

  PING192.168.5.5(192.168.5.5)from192.168.5.1:56(84)bytesofdata.

  64bytesfrom192.168.5.5:icmp_seq=0ttl=255time=4.4ms

  64bytesfrom192.168.5.5:icmp_seq=1ttl=255time=5.9ms

  64bytesfrom192.168.5.5:icmp_seq=2ttl=255time=5.8ms 

  ---192.168.5.5pingstatistics---

  3packetstransmitted,3packetsreceived,0%packetloss 

  round-tripmin/avg/max=4.4/5.3/5.9ms

  下面是snort所顯示的信息包:

  01/26-13:16:25.746316192.168.5.1->192.168.5.5

  ICMPTTL:64TOS:0x0ID:6059 

  ID:5721Seq:1ECHO

  89D78E3827630B0008090A0B0C0D0E0F...8'c..........

  101112131415161718191A1B1C1D1E1F................

  202122232425262728292A2B2C2D2E2F!"#$%&'()*+,-./

  303132333435363701234567

  01/26-13:16:25.746638192.168.5.5->192.168.5.1

  ICMPTTL:255TOS:0x0ID:6072 ID:5721Seq:1ECHOREPLY

  89D78E3827630B0008090A0B0C0D0E0F...8'c.......... 

  101112131415161718191A1B1C1D1E1F................ 

  202122232425262728292A2B2C2D2E2F!"#$%&'()*+,-./ 

  303132333435363701234567

  0481631

____________________________________________________________ 

|8位類型|代碼=0|校驗和|

|_____________|______________|_____________________________|

|表示符|序列號| 

|____________________________|_____________________________| 

|Optiondata| 

|__________________________________________________________|

  上面是ICMPECHOrequest&replay報文

  安全建議:在你的邊緣路由或者防火牆阻塞來自INTERNET的ICMPECHOrequests

  2,ICMPSWEEP

  使用ICMPECHO輪詢多個主機稱為ICMPSWEEP(或者PingSweep).

  對小的或者中等網絡使用這種方法來探測主機是一種比較可接受的行為,但對一些大的網絡如CLASSA,B,這種方法就顯的比較慢,原因是Ping在處理下一個之前將會等待正在探測主機的回應。

  fping(http://ftp.tamu.edu/pub/Unix/src/)是一個UNIX工具,可以並行發送大量的請求,這使的它處理起來比普通的PING工具更為快速,它也可以由gping工具來傳遞IP地址,gping是一個用來產生IP地址列表的工具。fping也可以使用-d選項來解析探測的機器。

  另外也有一個工具也可以並行處理ICMPSWEEP,並能解析被探測主機的主機名,它就是我們常用的NMAP(http://www.insecure.org),由Fyodor編寫.

  對WINDOWS來講,一個比較有名的ICMPSWEEP工具就是Rhino9的pinger,不知大家用過沒有,它掃描速度確實比較快。可以和NMAP,fping相比美。

  *但上面有點要注意的是,如果你使用解析被探測主機名的方法來進行PING探測,你就會在權威DNS服務器中留下你(攻擊者)的LOG記錄。

  下面的例子是使用NMAP對20個IP地址進行ICMPSWEEP的演示,因為我的機器沒有使用NAME服務器,所以使用_n選項來關閉自動解析主機名,其中三台機器,兩台是FREEBSD3.4-RELEASE,一台是WINDOWS2000ProfessinolBETA3,三台機器都有回應,當然如果你沒有NAME服務器由不關閉自動解析主機名選項,探測就會非常慢: 

  #nmap-sP-PI-n192.168.0.1-20

  StartingnmapV.2.54BETA1byfyodor@insecure.org(www.insecure.org/nmap/)

  Host(192.168.0.1)appearstobeup. Host(192.168.0.2)appearstobeup.

  Host(192.168.0.3)appearstobeup.

  Nmapruncompleted--20IPaddresses(3hostsup)scannedin1seconds

  安全建議:在你的邊緣路由或者防火牆阻塞來自INTERNET的ICMPECHOrequests

  3,BroadcastICMP

  通過發送ICMPECHOrequest到廣播地址或者目標網絡地址可以簡單的來反映目標網絡存活主機。這樣的請求會廣播到目標網絡中的所有主機,所有存活的主機都將會發送ICMP ECHOREPLY到攻擊者的源IP地址。這種技術的主機探測只適用目標網絡的UNIX主機,WINDOWS機器將不產生ICMPECHOREPLY給目標是廣播地址或網絡地址的ICMP ECHOREQUEST,但這種行為是正常的操作,可以參考RFC1122(http://www.ietf.org/rfc/rfc1122.txt.), 它是這樣描述的,如果我們發送ICMPECHOREQUEST給一個IP廣播地址或者IP多播地址,它可以沒有任何回應的丟棄。(我不知道其這個ping-b的選項是怎得到的,我查詢linux,freebsd, WINDOWS都沒有關-b的選項,所以請大家解釋。但我還是把示例寫進去。)

  下面是一個演示,當發送ICMPECHOREQUEST給網絡廣播地址的時候期望得到主機的回應,其中的兩台是FREEBSD主機,一台是WIN2K主機,WIN2K 沒有回應: 

  #ping-b192.168.0.255 

  WARNING:pingingbroadcastaddress

  PING192.168.0.255(192.168.0.255)from192.168.0.1:56(84)bytesofdata.

  64bytesfrom192.168.0.2:icmp_seq=0ttl=255time=4.1ms

  64bytesfrom192.168.0.3:icmp_seq=0ttl=255time=5.7ms(DUP!) 

  ---192.168.0.0pingstatistics--- 

  1packetstransmitted,1packetsreceived,+1duplicates,0%packetloss 

  round-tripmin/avg/max=4.1/4.9/5.7ms

  下面個例子是發一個PING到網絡地址,出現的現象同樣: 

  #ping-b192.168.0.0 WARNING:pingingbroadcastaddress

  PING192.168.0.0(192.168.0.0)from192.168.0.1:56(84)bytesofdata.

  64bytesfrom192.168.0.2:icmp_seq=0ttl=255time=4.1ms

  64bytesfrom192.168.0.3:icmp_seq=0ttl=255time=5.7ms(DUP!)

  ---192.168.0.0pingstatistics--- 

  1packetstransmitted,1packetsreceived,+1duplicates,0%packetloss 

  round-tripmin/avg/max=4.1/4.9/5.7ms

  注意:ICMP廣播如果有很多機器回應的話會造成拒絕服務。

  安全建議:在邊緣路由上阻塞IP直接廣播。

  4,Non-ECHOICMP(端口不可達ICMP)

  在ICMP協議中不光光只有ICMPECHO的ICMP查詢信息類型,在ICMP掃描技術中也用到Non-ECHOICMP技術(不僅僅能探測主機,也可以探測網絡設備如路由)。其中ICMP報文的類型包括如下:

  ECHO(Request(Type8),Reply(Type0))--回顯應答,

  Time Stamp(Request(Type13),Reply(Type14))--時間戳請求和應答,

  Information(Request (Type15),Reply(Type16))--信息請求和應答,

  和AddressMask(Request(Type17),Reply (Type18))--地址掩碼請求和應答等。

  具體的就請看RFC1122和RFC1812--http://www.ietf.org/rfc/rfc1812.txt.

  下面是關利用Non-ECHOICMP查詢信息的兩個用法 

  --TimeStamp(RequestandReply)和AddressMask(RequestandReply). 

  --ICMPTimeStampRequest(Type13)和Reply(Type14)

  ICMPTimeStampRequest和Reply允許一個節點查詢另一個節點的當前時間,返回值是自午夜開始計算的豪秒數。發送者可以初始化標識符和序列號,請求端還填寫發起時間戳,然發送報文給應答系統。應答系統接受請求,填寫接受和傳送的時間戳,把信息類型改變為REPLY--應答並送回給發送者。返回值是自午夜開始計算的豪秒數。

  (上面這些術語在ICMP報文圖上會體現。) 

0481631

____________________________________________________________

|8位類型|代碼=0|校驗和|

|_____________|______________|_____________________________|

|表示符|序列號| 

|____________________________|_____________________________|

|Originatetimestamp發起時間戳|

|__________________________________________________________|

|Receivetimestamp接受時間戳|

|__________________________________________________________|

|Transmittimestamp傳送時間戳| 

|__________________________________________________________|

  ICMP時間戳請求和應答報文

  根據RFC1122的描述:一個主機可以執行Timestamp和TimestampReply.但必須遵循如下原則: --在處理時間戳請求時應該最小化可變性延遲(Minimumvariabilitydelay)。 

  --接受主機必須"回答"每個它接受到的時間戳請求。 

  --請求是一個IP廣播地址或者IP多播地址的ICMP時間戳請求可以丟棄。

  --在ICMP時間戳回應裡的IP源地址必須與響應的時間戳請求信息的源地址相同。 

  --如果在時間戳請求中接受到源路由器選項,返回路由必須為保留並為時間戳返回選項TimestampReplyoption設置源路由選項。接受一個ICMP時間戳回應(ICMP TimestampReply)會揭露一個存活主機或者網絡設備的信息。

  在下面的例子中,使用了發送ICMPTimeStampRequest,我使用了icmpush--http://hispahack.ccc.de/ .   下面是對REDHAT6.1,內核為2.2.12機器的測試:[root@stan/root]#icmpush-tstamp192.168.0.2 linux->13:48:07//當然你那裡測試可能會顯示這個域名。

  Snort的分析: 

  01/26-13:51:29.342647192.168.0.3->192.168.0.2 

  ICMPTTL:254TOS:0x0ID:13170 

  TIMESTAMPREQUEST 

  8816D8D9028B633D0000000000000000......c=........ 

  01/26-13:51:29.342885192.168.0.2->192.168.0.3 

  ICMPTTL:255TOS:0x0ID:6096

  TIMESTAMPREPLY 

  8816D8D9028B633D0288501802885018......c=..P...P. 

  2ADE1C00A0F9*.....

  但根據作者發送這個ICMP時間戳請求的時候WINDOWSNTWRKS4.0SP4機器上,NT是沒有反應的,因為我沒有NTWRKS4.0 SP4機器,所以沒有辦法進行測試,所以作者是認為這個是可以判斷有些系統,因為系統對ICMP時間戳的反應是不同的。

  關ICMPAddressMaskRequest(Type17)和Reply(Type18)[ICMP地址掩碼請求和應答]:

  CMP地址掩碼請求用無盤系統在引導過程中獲取自己的子網掩碼,這個過程無盤系統在引導過程中用RARP獲取IP地址是類似的。地址掩碼請求也用當一個節點想知道接口的地址掩碼地址時使用。其中應答的信息中包含接口地址的掩碼。

0481631

____________________________________________________________

|8位類型|代碼=0|校驗和| 

|_____________|______________|_____________________________|

|表示符|序列號|

|____________________________|_____________________________| 

|32位子網掩碼|

|__________________________________________________________|

  ICMP地址掩碼請求和應答報文

  RFC1122描述一個系統不能不發送地址掩碼的應答,除非它是一個授權地址掩碼代理。作為授權代理,它必須進行特殊配置,以發送這些應答。

  通常一個地址掩碼的請求是由網關了應答的。如果從一系統接受到一個地址掩碼應答,就表明這個存活主機是一個授權代理系統,它可以被攻擊者用來獲得你的網絡配置情況,這些信息包括你的內部網絡結構,路由表。

  下面是對LINUX機器和WINDOWS機器的地址掩碼請求,兩個系統都沒有ICMP地址掩碼的應答。發送一個ICMP地址掩碼請求到廣播地址192.168.0.255, 並偽造了源IP為192.168.0.58。 

  [root@linuxicmpush-2.2]#icmpush-vv-mask-sp192.168.0.58192.168.0.255 

  ->ICMPtotalsize=12bytes 

  ->Outgoinginterface=192.168.0.2 

  ->MTU=1500bytes 

  ->Totalpacketsize(ICMP+IP)=32bytes

  ICMPAddressMaskRequestpacketsentto192.168.0.255(192.168.0.255) 

  ReceivingICMPreplies...

  ----------------------------------------------------- 

  192.168.0.58... 

  Type=AddressMaskRequest(0x11) 

  Code=0x0Checksum=0x7730 Id=0x1BESeq#=0x8700 

  ----------------------------------------------------- 

  icmpush:ProgramfinishedOK 

  -*>Snort!<*-Version1.5 

  ByMartinRoesch(roesch@clark.net,www.clark.net/~roesch) 

  Kernelfilter,protocolALL,rawpacketsocket 

  DecodingEthernetoninterfaceeth0 

  02/15-13:47:37.179276192.168.5.3->192.168.5.255 

  ICMPTTL:254TOS:0x0ID:13170 

  ADDRESSREQUEST 

  B9038E4900000000...I....

  都沒有接受到LINUX機器和NT機器上的應答。

  通過發送ICMP地址掩碼請求到本地網絡路由器的時候,我們接受到一個應答: 

  -*>Snort!<*

  - Version1.5

  ByMartinRoesch(roesch@clark.net,www.clark.net/~roesch)

  DecodingEthernetoninterfaceeth0 

  01/30-09:33:00.711595Host13->Destination_Router

  ICMPTTL:254TOS:0x0ID:13170

  ADDRESSREQUEST

  9002041700000000........ 

  01/30-09:33:00.717388Destination_Router->Host

  ICMPTTL:63TOS:0x0ID:367 ADDRESSREPLY

  90020417FFFFFFF80000000000000000................

  000000000000......

  [上面的真實IP地址和路由IP地址去掉了]
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
FREEBSD中使用IPFW來過濾ICMP服務 (2001-09-13 07:00:00)
使用ICMP協議來進行主機探測 (2001-07-26 09:00:00)
IP基礎--6.ICMP協定 (2001-06-04 12:10:00)
 

★  樊強制作 歡迎分享  ★