Kali Linux 網(wǎng)絡(luò)掃描秘籍 第二章 探索掃描(二)

第二章 探索掃描(二)

作者:Justin Hutchens

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

2.7 使用 Scapy 發(fā)現(xiàn)第三層

Scapy 是一種工具去件,允許用戶制作并向網(wǎng)絡(luò)中注入自定義數(shù)據(jù)包收苏。 此工具可以用于構(gòu)建 ICMP 協(xié)議請求,并將它們注入網(wǎng)絡(luò)來分析響應(yīng)。 這個特定的秘籍演示了如何使用 Scapy 在遠(yuǎn)程主機(jī)上執(zhí)行第3層發(fā)現(xiàn)啥容。

準(zhǔn)備

使用 Scapy 執(zhí)行第三層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) ICMP 回顯請求。但是,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描代芜,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù)浓利,你需要至少有一個響應(yīng) ICMP 請求的系統(tǒng)挤庇。在提供的示例中,使用 Linux 和 Windows 系統(tǒng)的組合贷掖。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息嫡秕,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍。此外苹威,本節(jié)還需要使用文本編輯器(如 VIM 或 Nano)將腳本寫入文件系統(tǒng)昆咽。有關(guān)編寫腳本的更多信息,請參閱第一章中的“使用文本編輯器(VIM 和 Nano)”秘籍牙甫。

操作步驟

為了使用 Scapy 發(fā)送 ICMP 回顯請求掷酗,我們需要開始堆疊層級來發(fā)送請求。 堆疊數(shù)據(jù)包時的一個好的經(jīng)驗(yàn)法則是,通過 OSI 按照的各層進(jìn)行處理窟哺。 你可以通過使用斜杠分隔每個層級來堆疊多個層級泻轰。 為了生成 ICMP 回顯請求,IP 層需要與 ICMP 請求堆疊且轨。 為了開始浮声,請使用scapy命令打開 Scapy 交互式控制臺,然后將IP對象賦給變量:

root@KaliLinux:~# scapy Welcome to Scapy (2.2.0) 
>>> ip = IP() 
>>> ip.display() 
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= ip
  chksum= None
  src= 127.0.0.1
  dst= 127.0.0.1
  \options\ 

將新值賦給目標(biāo)地址屬性后旋奢,可以通過再次調(diào)用display()函數(shù)來驗(yàn)證更改泳挥。 請注意,當(dāng)目標(biāo) IP 地址值更改為任何其他值時至朗,源地址也會從回送地址自動更新為與默認(rèn)接口關(guān)聯(lián)的 IP 地址屉符。 現(xiàn)在 IP 對象的屬性已經(jīng)適當(dāng)修改了,我們將需要在我們的封包棧中創(chuàng)建第二層爽丹。 要添加到棧的下一個層是 ICMP 層筑煮,我們將其賦給單獨(dú)的變量:

>>> ping = ICMP() 
>>> ping.display() 
###[ ICMP ]###
  type= echo-request  
  code= 0  
  chksum= None  
  id= 0x0  
  seq= 0x0 

在所提供的示例中,ICMP 對象使用ping變量名稱初始化粤蝎。 然后可以調(diào)用display()函數(shù)來顯示 ICMP 屬性的默認(rèn)配置真仲。 為了執(zhí)行 ICMP 回顯請求,默認(rèn)配置就足夠了初澎。 現(xiàn)在兩個層都已正確配置秸应,它們可以堆疊來準(zhǔn)備發(fā)送虑凛。 在 Scapy 中,可以通過使用斜杠分隔每個層級來堆疊層級软啼。 看看下面的命令集:

>>> ping_request = (ip/ping) 
>>> ping_request.display() 
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= icmp
  chksum= None
  src= 172.16.36.180
  dst= 172.16.36.135
  \options\
###[ ICMP ]###
     type= echo-request
     code= 0
     chksum= None
     id= 0x0
     seq= 0x0

一旦堆疊層級被賦給一個變量桑谍,display()函數(shù)可以顯示整個棧。 以這種方式堆疊層的過程通常被稱為數(shù)據(jù)報(bào)封裝祸挪。 現(xiàn)在已經(jīng)堆疊了層級锣披,并已經(jīng)準(zhǔn)備好發(fā)送請求。 這可以使用 Scapy 中的sr1()函數(shù)來完成:

>>> ping_reply = sr1(ping_request) 
..Begin emission:
.........
Finished to send 1 packets. 
...* 
Received 15 packets, got 1 answers, remaining 0 packets 
>>> ping_reply.display() 
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 28
  id= 62577
  flags=
  frag= 0L
  ttl= 64
  proto= icmp
  chksum= 0xe513
  src= 172.16.36.135
  dst= 172.16.36.180
  \options\ 
###[ ICMP ]###
     type= echo-reply
     code= 0
     chksum= 0xffff
     id= 0x0
     seq= 0x0 
###[ Padding ]###
        load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x00'

在提供的示例中贿条,sr1()函數(shù)賦給了ping_reply變量雹仿。 這將執(zhí)行該函數(shù),然后將結(jié)果傳遞給此變量整以。 在接收到響應(yīng)后胧辽,在ping_reply變量上調(diào)用display()函數(shù)來查看響應(yīng)的內(nèi)容。請注意公黑,此數(shù)據(jù)包是從我們發(fā)送初始請求的主機(jī)發(fā)送的邑商,目標(biāo)地址是 Kali 系統(tǒng)的 IP 地址。 另外凡蚜,注意響應(yīng)的 ICMP 類型是回應(yīng)應(yīng)答人断。 基于此示例,使用 Scapy 發(fā)送和接收 ICMP 的過程看起來很有用番刊,但如果你嘗試對非響應(yīng)的目標(biāo)地址使用相同的步驟含鳞,你會很快注意到問題:

>>> ip.dst = "172.16.36.136" 
>>> ping_request = (ip/ping) 
>>> ping_reply = sr1(ping_request) 
.Begin emission: 
......................................................................... ......................................................................... ........... 
Finished to send 1 packets 
.................................. .................................................................... 
                        *** {TRUNCATED} *** 

示例輸出被截?cái)啵溯敵鰬?yīng)該無限繼續(xù)芹务,直到你使用Ctrl + C強(qiáng)制關(guān)閉。不向函數(shù)提供超時值鸭廷,sr1()函數(shù)會繼續(xù)監(jiān)聽枣抱,直到接收到響應(yīng)。 如果主機(jī)不是活動的辆床,或者如果 IP 地址沒有與任何主機(jī)關(guān)聯(lián)佳晶,則不會發(fā)送響應(yīng),并且該功能也不會退出讼载。 為了在腳本中有效使用此函數(shù)轿秧,應(yīng)定義超時值:

>>> ping_reply = sr1(ping_request, timeout=1) 
.Begin emission: 
....................................................................... ....................................................................... 
Finished to send 1 packets. 
.................................... 
Received 3982 packets, got 0 answers, remaining 1 packets

通過提供超時值作為傳遞給sr1()函數(shù)的第二個參數(shù),如果在指定的秒數(shù)內(nèi)沒有收到響應(yīng)咨堤,進(jìn)程將退出菇篡。 在所提供的示例中,sr1()函數(shù)用于將 ICMP 請求發(fā)送到無響應(yīng)地址一喘,因?yàn)槲词盏巾憫?yīng)驱还,會在 1 秒后退出。 到目前為止提供的示例中,我們將函數(shù)賦值給變量议蟆,來創(chuàng)建持久化和可操作的對象闷沥。 但是,這些函數(shù)不必復(fù)制給變量咐容,也可以通過直接調(diào)用函數(shù)生成舆逃。

>>> answer = sr1(IP(dst="172.16.36.135")/ICMP(),timeout=1) 
.Begin emission:
...*
Finished to send 1 packets.
Received 5 packets, got 1 answers, remaining 0 packets 
>>> response.display() 
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 28
  id= 62578
  flags=
  frag= 0L
  ttl= 64
  proto= icmp
  chksum= 0xe512
  src= 172.16.36.135
  dst= 172.16.36.180
  \options\ 
###[ ICMP ]###
     type= echo-reply
     code= 0
     chksum= 0xffff
     id= 0x0
     seq= 0x0 
###[ Padding ]###
        load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x00' 

在這里提供的示例中,之前使用四個單獨(dú)的命令完成的所有工作戳粒,實(shí)際上可以通過直接調(diào)用函數(shù)的單個命令來完成颖侄。 請注意,如果在超時值指定的時間范圍內(nèi)享郊, ICMP 請求沒有收到 IP 地址的回復(fù)览祖,調(diào)用對象會產(chǎn)生異常。 由于未收到響應(yīng)炊琉,因此此示例中賦值為響應(yīng)的應(yīng)答變量不會初始化:

>>> answer = sr1(IP(dst="83.166.169.231")/ICMP(),timeout=1) 
Begin emission: 
..........................................
Finished to send 1 packets. 
......................................................................... ..........................
Received 1180 packets, got 0 answers, remaining 1 packets 
>>> answer.display() 
Traceback (most recent call last):  File "<console>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'display'

有關(guān)這些不同響應(yīng)的知識展蒂,可以用于生成在多個 IP 地址上按順序執(zhí)行 ICMP 請求的腳本。 腳本會循環(huán)遍歷目標(biāo) IP 地址中最后一個八位字節(jié)的所有可能值苔咪,并為每個值發(fā)送一個 ICMP 請求锰悼。 當(dāng)從每個sr1()函數(shù)返回時,將評估響應(yīng)來確定是否接收到應(yīng)答的響應(yīng):

#!/usr/bin/python

import logging 
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) 
from scapy.all import *

if len(sys.argv) != 2:   
    print "Usage - ./pinger.py [/24 network address]"   
    print "Example - ./pinger.py 172.16.36.0"   
    print "Example will perform an ICMP scan of the 172.16.36.0/24 range"   
    sys.exit()

address = str(sys.argv[1]) 
prefix = address.split('.')[0] + '.' + address.split('.')[1] + '.' + address.split('.')[2] + '.'

for addr in range(1,254):   
    answer=sr1(ARP(pdst=prefix+str(addr)),timeout=1,verbose=0)   
    if answer == None:      
        pass   
    else:      
        print prefix+str(addr)

腳本的第一行標(biāo)識了 Python 解釋器所在的位置团赏,以便腳本可以在不傳遞到解釋器的情況下執(zhí)行箕般。 然后腳本導(dǎo)入所有 Scapy 函數(shù),并定義 Scapy 日志記錄級別舔清,以消除腳本中不必要的輸出丝里。 還導(dǎo)入了子過程庫,以便于從系統(tǒng)調(diào)用中提取信息体谒。 第二個代碼塊是條件測試杯聚,用于評估是否向腳本提供了所需的參數(shù)。 如果在執(zhí)行時未提供所需的參數(shù)抒痒,則腳本將輸出使用情況的說明幌绍。 該說明包括工具的用法,示例和所執(zhí)行任務(wù)的解釋故响。

在這個代碼塊之后傀广,有一個單獨(dú)的代碼行將所提供的參數(shù)賦值給interface變量。下一個代碼塊使用check_output()子進(jìn)程函數(shù)執(zhí)行ifconfig系統(tǒng)調(diào)用彩届,該調(diào)用也使用grepcut從作為參數(shù)提供的本地接口提取 IP 地址伪冰。然后將此輸出賦給ip變量。然后使用split函數(shù)從 IP 地址字符串中提取/ 24網(wǎng)絡(luò)前綴惨缆。例如糜值,如果ip變量包含192.168.11.4字符串丰捷,則值為192.168.11。它將賦給prefix變量寂汇。

最后一個代碼塊是一個用于執(zhí)行實(shí)際掃描的for循環(huán)病往。 for循環(huán)遍歷介于 0 和 254 之間的所有值,并且對于每次迭代骄瓣,該值隨后附加到網(wǎng)絡(luò)前綴后面停巷。在早先提供的示例的中,將針對192.168.11.0192.168.11.254之間的每個 IP 地址發(fā)送 ICMP 回顯請求榕栏。然后對于每個回復(fù)的活動主機(jī)畔勤,將相應(yīng)的 IP 地址打印到屏幕上,以表明主機(jī)在 LAN 上活動扒磁。一旦腳本被寫入本地目錄庆揪,你可以在終端中使用句號和斜杠,然后是可執(zhí)行腳本的名稱來執(zhí)行它妨托「组唬看看以下用于執(zhí)行腳本的命令:

root@KaliLinux:~# ./pinger.py 
Usage - ./pinger.py [/24 network address] 
Example - ./pinger.py 172.16.36.0 
Example will perform an ICMP scan of the 172.16.36.0/24 range 
root@KaliLinux:~# ./pinger.py 
172.16.36.0 
172.16.36.2 
172.16.36.1 
172.16.36.132 
172.16.36.135 

如果在沒有提供任何參數(shù)的情況下執(zhí)行腳本,則會將使用方法輸出到屏幕兰伤。 使用方法輸出表明内颗,此腳本需要用于定義要掃描的/ 24網(wǎng)絡(luò)的單個參數(shù)。 提供的示例使用172.16.36.0網(wǎng)絡(luò)地址來執(zhí)行腳本敦腔。 該腳本然后輸出在/ 24網(wǎng)絡(luò)范圍上的活動 IP 地址的列表均澳。 此輸出也可以使用尖括號重定向到輸出文本文件,后跟輸出文件名符衔。 一個例子如下:

root@KaliLinux:~# ./pinger.py 172.16.36.0 > output.txt 
root@KaliLinux:~# ls output.txt 
output.txt 
root@KaliLinux:~# cat output.txt 
172.16.36.1 
172.16.36.2 
172.16.36.132 
172.16.36.135

然后可以使用ls命令來驗(yàn)證輸出文件是否已寫入文件系統(tǒng)找前,或者可以使用cat命令查看其內(nèi)容。 也可以修改此腳本柏腻,來接受 IP 地址列表作為輸入纸厉。 為此,必須更改for循環(huán)來循環(huán)遍歷從指定的文本文件讀取的行五嫂。 一個例子如下:

#!/usr/bin/python

import logging 
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) 
from scapy.all import *

if len(sys.argv) != 2:   
    print "Usage - ./pinger.py [filename]"   
    print "Example - ./pinger.py iplist.txt"   
    print "Example will perform an ICMP ping scan of the IP addresses listed in iplist.txt"   
    sys.exit()

filename = str(sys.argv[1]) 
file = open(filename,'r')

for addr in file:   
    ans=sr1(IP(dst=addr.strip())/ICMP(),timeout=1,verbose=0)   
    if ans == None:      
        pass   
    else:      
        print addr.strip()

與之前的腳本唯一的主要區(qū)別是,它接受一個輸入文件名作為參數(shù)肯尺,然后循環(huán)遍歷此文件中列出的每個 IP 地址進(jìn)行掃描沃缘。 與其他腳本類似,生成的輸出包括響應(yīng) ICMP 回顯請求的系統(tǒng)的相關(guān) IP 地址的簡單列表则吟,其中包含 ICMP 回顯響應(yīng):

root@KaliLinux:~# ./pinger.py 
Usage - ./pinger.py [filename] 
Example - ./pinger.py iplist.txt 
Example will perform an 
ICMP ping scan of the IP addresses listed in iplist.txt 
root@KaliLinux:~# ./pinger.py iplist.txt 
172.16.36.1 
172.16.36.2 
172.16.36.132 
172.16.36.135

此腳本的輸出可以以相同的方式重定向到輸出文件槐臀。 使用作為參數(shù)提供的輸入文件來執(zhí)行腳本,然后使用尖括號重定向輸出氓仲,后跟輸出文本文件的名稱水慨。 一個例子如下:

root@KaliLinux:~# ./pinger.py iplist.txt > output.txt 
root@KaliLinux:~# ls output.txt 
output.txt 
root@KaliLinux:~# cat output.txt 
172.16.36.1 
172.16.36.2 
172.16.36.132 
172.16.36.135

工作原理

此處使用 Scapy 通過構(gòu)造包括 IP 層和附加的 ICMP 請求的請求來執(zhí)行 ICMP 第三層發(fā)現(xiàn)得糜。 IP 層能夠?qū)⒎獍酚傻奖镜鼐W(wǎng)絡(luò)之外,并且 ICMP 請求用于從遠(yuǎn)程系統(tǒng)請求響應(yīng)晰洒。 在 Python 腳本中使用此技術(shù)朝抖,可以按順序執(zhí)行此任務(wù),來掃描多個系統(tǒng)或整個網(wǎng)絡(luò)范圍谍珊。

2.8 使用 Nmap 發(fā)現(xiàn)第三層

Nmap 是 Kali Linux 中最強(qiáng)大和最通用的掃描工具之一治宣。 因此,毫不奇怪砌滞,Nmap 也支持 ICMP 發(fā)現(xiàn)掃描侮邀。 該秘籍演示了如何使用 Nmap 在遠(yuǎn)程主機(jī)上執(zhí)行第三層發(fā)現(xiàn)。

準(zhǔn)備

使用 Nmap 執(zhí)行第三層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境贝润,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) ICMP 回顯請求绊茧。但是,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描打掘,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)华畏。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù),你需要至少有一個響應(yīng) ICMP 請求的系統(tǒng)胧卤。在提供的示例中唯绍,使用 Linux 和 Windows 系統(tǒng)的組合。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息枝誊,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍况芒。此外,本節(jié)還需要使用文本編輯器(如 VIM 或 Nano)將腳本寫入文件系統(tǒng)叶撒。有關(guān)編寫腳本的更多信息绝骚,請參閱第一章中的“使用文本編輯器(VIM 和 Nano)”秘籍。

操作步驟

Nmap是一種自適應(yīng)工具祠够,它可以按需自動調(diào)整压汪,并執(zhí)行第2層,第3層或第4層發(fā)現(xiàn)古瓤。 如果-sn選項(xiàng)在 Nmap 中用于掃描本地網(wǎng)段上不存在的 IP 地址止剖,則 ICMP 回顯請求將用于確定主機(jī)是否處于活動狀態(tài)和是否響應(yīng)。 為了對單個目標(biāo)執(zhí)行 ICMP 掃描落君,請使用帶有-sn選項(xiàng)的Nmap穿香,并傳遞要掃描的 IP 地址作為參數(shù):

root@KaliLinux:~# nmap -sn 74.125.228.1
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-16 23:05 EST 
Nmap scan report for iad23s05-in-f1.1e100.net (74.125.228.1) 
Host is up (0.00013s latency). 
Nmap done: 1 IP address (1 host up) scanned in 0.02 seconds 

此命令的輸出表明了設(shè)備是否已啟動,還會提供有關(guān)所執(zhí)行掃描的詳細(xì)信息绎速。 此外請注意皮获,系統(tǒng)名稱也已確定。 Nmap 還執(zhí)行 DNS 解析來在掃描輸出中提供此信息纹冤。 它還可以用于使用破折號符號掃描 IP 地址連續(xù)范圍洒宝。 Nmap 默認(rèn)情況下是多線程的购公,并且并行運(yùn)行多個進(jìn)程。 因此雁歌,Nmap 在返回掃描結(jié)果時非澈旰疲快。 看看下面的命令:

root@KaliLinux:~# nmap -sn 74.125.228.1-255
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-16 23:14 EST 
Nmap scan report for iad23s05-in-f1.1e100.net (74.125.228.1) 
Host is up (0.00012s latency). 
Nmap scan report for iad23s05-in-f2.1e100.net (74.125.228.2) 
Host is up (0.0064s latency). 
Nmap scan report for iad23s05-in-f3.1e100.net (74.125.228.3) 
Host is up (0.0070s latency). 
Nmap scan report for iad23s05-in-f4.1e100.net (74.125.228.4) 
Host is up (0.00015s latency). 
Nmap scan report for iad23s05-in-f5.1e100.net (74.125.228.5) 
Host is up (0.00013s latency). 
Nmap scan report for iad23s05-in-f6.1e100.net (74.125.228.6) 
Host is up (0.00012s latency). 
Nmap scan report for iad23s05-in-f7.1e100.net (74.125.228.7) 
Host is up (0.00012s latency). 
Nmap scan report for iad23s05-in-f8.1e100.net (74.125.228.8) 
Host is up (0.00012s latency). 
                    *** {TRUNCATED} ***

在提供的示例中将宪,Nmap 用于掃描整個/ 24網(wǎng)絡(luò)范圍绘闷。 為了方便查看,此命令的輸出被截?cái)唷?通過使用 Wireshark 分析通過接口的流量较坛,你可能會注意到這些地址沒有按順序掃描印蔗。 這可以在以下屏幕截圖中看到。 這是 Nmap 的多線程特性的進(jìn)一步證據(jù)丑勤,并展示了當(dāng)其他進(jìn)程完成時华嘹,如何從隊(duì)列中的地址啟動進(jìn)程:

或者,Nmap 也可用于掃描輸入文本文件中的 IP 地址法竞。 這可以使用-iL選項(xiàng)耙厚,后跟文件或文件路徑的名稱來完成:

root@KaliLinux:~# cat iplist.txt 
74.125.228.13 74.125.228.28 
74.125.228.47 74.125.228.144 
74.125.228.162 74.125.228.211 
root@KaliLinux:~# nmap -iL iplist.txt -sn
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-16 23:14 EST 
Nmap scan report for iad23s05-in-f13.1e100.net (74.125.228.13) 
Host is up (0.00010s latency). 
Nmap scan report for iad23s05-in-f28.1e100.net (74.125.228.28) 
Host is up (0.0069s latency). 
Nmap scan report for iad23s06-in-f15.1e100.net (74.125.228.47) 
Host is up (0.0068s latency). 
Nmap scan report for iad23s17-in-f16.1e100.net (74.125.228.144) 
Host is up (0.00010s latency). 
Nmap scan report for iad23s18-in-f2.1e100.net (74.125.228.162) 
Host is up (0.0077s latency). 
Nmap scan report for 74.125.228.211 
Host is up (0.00022s latency). 
Nmap done: 6 IP addresses (6 hosts up) scanned in 0.04 seconds

在提供的示例中,執(zhí)行目錄中存在六個 IP 地址的列表岔霸。 然后將此列表輸入到 Nmap 中薛躬,并掃描每個列出的地址來嘗試識別活動主機(jī)。

工作原理

Nmap 通過對提供的范圍或文本文件中的每個 IP 地址發(fā)出 ICMP 回顯請求呆细,來執(zhí)行第3層掃描型宝。 由于 Nmap 是一個多線程工具,所以它會并行發(fā)送多個請求絮爷,結(jié)果會很快返回給用戶趴酣。 由于 Nmap 的發(fā)現(xiàn)功能是自適應(yīng)的,它只會使用 ICMP 發(fā)現(xiàn)坑夯,如果 ARP 發(fā)現(xiàn)無法有效定位本地子網(wǎng)上的主機(jī)岖寞。 或者,如果 ARP 發(fā)現(xiàn)或 ICMP 發(fā)現(xiàn)都不能有效識別給定 IP 地址上的活動主機(jī)時柜蜈,那么將采第四層發(fā)現(xiàn)技術(shù)仗谆。

2.9 使用 fping 探索第三層

fping工具費(fèi)長類似于著名的ping工具。 但是淑履,它也內(nèi)建了在ping中不存在的許多附加功能胸私。 這些附加功能讓fping能夠用作功能掃描工具,無需額外修改鳖谈。 該秘籍演示了如何使用fping在遠(yuǎn)程主機(jī)上執(zhí)行第3層發(fā)現(xiàn)。

準(zhǔn)備

使用fping執(zhí)行第三層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境阔涉,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) ICMP 回顯請求缆娃。但是捷绒,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)贯要。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù)暖侨,你需要至少有一個響應(yīng) ICMP 請求的系統(tǒng)。在提供的示例中崇渗,使用 Linux 和 Windows 系統(tǒng)的組合字逗。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍宅广。

操作步驟

fping非常類似于添加了一些額外功能的ping工具葫掉。 它可以以ping的相同方式,向單個目標(biāo)發(fā)送 ICMP 回顯請求跟狱,以確定它是否活動俭厚。 這通過將 IP 地址作為參數(shù)傳遞給fping實(shí)用程序來完成:

root@KaliLinux:~# fping 172.16.36.135 
172.16.36.135 is alive

與標(biāo)準(zhǔn)ping工具不同,fping會在收到單個應(yīng)答后停止發(fā)送 ICMP 回顯請求驶臊。 在接收到回復(fù)時挪挤,它將顯示對應(yīng)該地址的主機(jī)是活動的。 或者关翎,如果未從地址接收到響應(yīng)扛门,則在確定主機(jī)不可達(dá)之前,fping通常嘗試聯(lián)系系統(tǒng)四次:

root@KaliLinux:~# fping 172.16.36.136 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.136 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.136 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.136 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 
172.16.36.136 172.16.36.136 is unreachable

可以使用-c count選項(xiàng)修改此默認(rèn)連接嘗試次數(shù)纵寝,并向其提供一個定義嘗試次數(shù)的整數(shù)值:

root@KaliLinux:~# fping 172.16.36.135 -c 1 
172.16.36.135 : [0], 84 bytes, 0.67 ms (0.67 avg, 0% loss)

172.16.36.135 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.67/0.67/0.67 
root@KaliLinux:~# fping 172.16.36.136 -c 1

172.16.36.136 : xmt/rcv/%loss = 1/0/100%

當(dāng)以這種方式執(zhí)行時论寨,輸出更加隱蔽一些,但可以通過仔細(xì)分析來理解店雅。 任何主機(jī)的輸出包括 IP 地址政基,嘗試次數(shù)(xmt),接收的回復(fù)數(shù)(rcv)和丟失百分比(%loss)闹啦。 在提供的示例中沮明,fping發(fā)現(xiàn)第一個地址處于聯(lián)機(jī)狀態(tài)。 這可以由接收的字節(jié)數(shù)和應(yīng)答的等待時間都被返回的事實(shí)來證明窍奋。 你還可以通過檢查百分比損失荐健,來輕松確定是否存在與提供的 IP 地址關(guān)聯(lián)的活動主機(jī)。 如果百分比損失為 100琳袄,則未收到回復(fù)江场。

ping(最常用作故障排除工具)不同,fping內(nèi)建了集成功能窖逗,可掃描多個主機(jī)址否。 可以使用fping掃描主機(jī)序列,使用-g選項(xiàng)動態(tài)生成 IP 地址列表碎紊。 要指定掃描范圍佑附,請使用該參數(shù)傳遞所需序列范圍中的第一個和最后一個 IP 地址:

root@KaliLinux:~# fping -g 172.16.36.1 172.16.36.4 
172.16.36.1 is alive 
172.16.36.2 is alive 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.3
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.3 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.3 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.3 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.4 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.4 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.4 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.4 172.16.36.3 is unreachable 
172.16.36.4 is unreachable

生成列表選項(xiàng)也可用于基于 CIDR 范圍符號生成列表樊诺。 以相同的方式,fping將循環(huán)遍歷這個動態(tài)生成的列表并掃描每個地址:

root@KaliLinux:~# fping -g 172.16.36.0/24 
172.16.36.1 is alive 
172.16.36.2 is alive 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.3 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.4 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.5 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.6 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.7 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.8 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.9 
                    *** {TRUNCATED} ***

最后音同,fping還可以用于掃描由輸入文本文件的內(nèi)容指定的一系列地址词爬。 要使用輸入文件,請使用-f文件選項(xiàng)权均,然后提供輸入文件的文件名或路徑:

root@KaliLinux:~# fping -f iplist.txt 172.16.36.2 is alive 172.16.36.1 is alive 172.16.36.132 is alive 172.16.36.135 is alive 172.16.36.180 is alive 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.203 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.203 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.203 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.203 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.205 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.205 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.205 
ICMP Host Unreachable from 172.16.36.180 for ICMP Echo sent to 172.16.36.205 
172.16.36.203 is unreachable 
172.16.36.205 is unreachable 
172.16.36.254 is unreachable

工作原理

fping工具執(zhí)行ICMP發(fā)現(xiàn)的方式與我們之前討論的其他工具相同顿膨。 對于每個 IP 地址,fping發(fā)送一個或多個 ICMP 回顯請求叽赊,然后評估所接收的響應(yīng)以識別活動主機(jī)恋沃。 fping還可以用于通過提供適當(dāng)?shù)膮?shù),來掃描一系列系統(tǒng)或 IP 地址的輸入列表蛇尚。 因此芽唇,我們不必使用bash腳本來操作工具,就像使用ping操作一樣取劫,使其成為有效的掃描工具匆笤。

2.10 使用 hping3 探索第三層

hping3可以用于以多種不同方式執(zhí)行主機(jī)發(fā)現(xiàn)的更多功能。 它比fping更強(qiáng)大谱邪,因?yàn)樗梢詧?zhí)行多種不同類型的發(fā)現(xiàn)技術(shù)炮捧,但作為掃描工具不太有用,因?yàn)樗荒苡糜诙ㄎ粏蝹€主機(jī)惦银。 然而咆课,這個缺點(diǎn)可以使用 bash 腳本克服。 該秘籍演示了如何使用hping3在遠(yuǎn)程主機(jī)上執(zhí)行第3層發(fā)現(xiàn)扯俱。

準(zhǔn)備

使用hping3執(zhí)行第三層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境书蚪,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) ICMP 回顯請求。但是迅栅,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描殊校,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù)读存,你需要至少有一個響應(yīng) ICMP 請求的系統(tǒng)为流。在提供的示例中,使用 Linux 和 Windows 系統(tǒng)的組合让簿。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息敬察,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍。

hping3是一個非常強(qiáng)大的發(fā)現(xiàn)工具尔当,具有大量可操作的選項(xiàng)和模式莲祸。它能夠在第3層和第4層上執(zhí)行發(fā)現(xiàn)。為了使用hping3對單個主機(jī)地址執(zhí)行基本的 ICMP 發(fā)現(xiàn), 只需要將要測試的 IP 地址和所需的 ICMP 掃描模式傳遞給它:

root@KaliLinux:~# hping3 172.16.36.1 --icmp 
HPING 172.16.36.1 (eth1 172.16.36.1): icmp mode set, 28 headers + 0 data bytes 
len=46 ip=172.16.36.1 ttl=64 id=41835 icmp_seq=0 rtt=0.3 ms 
len=46 ip=172.16.36.1 ttl=64 id=5039 icmp_seq=1 rtt=0.3 ms 
len=46 ip=172.16.36.1 ttl=64 id=54056 icmp_seq=2 rtt=0.6 ms 
len=46 ip=172.16.36.1 ttl=64 id=50519 icmp_seq=3 rtt=0.5 ms 
len=46 ip=172.16.36.1 ttl=64 id=47642 icmp_seq=4 rtt=0.4 ms 
^C 
--- 172.16.36.1 hping statistic --5 packets transmitted, 
5 packets received, 0% packet loss 
round-trip min/avg/max = 0.3/0.4/0.6 ms

提供的演示使用Ctrl + C停止進(jìn)程虫给。與標(biāo)準(zhǔn)ping工具類似藤抡,hping3 ICMP 模式將無限繼續(xù),除非在初始命令中指定了特定數(shù)量的數(shù)據(jù)包抹估。 為了定義要發(fā)送的嘗試次數(shù),應(yīng)包含-c選項(xiàng)和一個表示所需嘗試次數(shù)的整數(shù)值:

root@KaliLinux:~# hping3 172.16.36.1 --icmp -c 2 
HPING 172.16.36.1 (eth1 172.16.36.1): icmp mode set, 28 headers + 0 data bytes 
len=46 ip=172.16.36.1 ttl=64 id=40746 icmp_seq=0 rtt=0.3 ms 
len=46 ip=172.16.36.1 ttl=64 id=12231 icmp_seq=1 rtt=0.5 ms
--- 
172.16.36.1 hping statistic --
2 packets transmitted, 2 packets received, 0% packet loss 
round-trip min/avg/max = 0.3/0.4/0.5 ms

雖然hping3默認(rèn)情況下不支持掃描多個系統(tǒng)弄兜,但可以使用 bash 腳本輕易編寫腳本药蜻。 為了做到這一點(diǎn),我們必須首先確定與活動地址相關(guān)聯(lián)的輸出替饿,以及與非響應(yīng)地址相關(guān)聯(lián)的輸出之間的區(qū)別语泽。 為此,我們應(yīng)該在未分配主機(jī)的 IP 地址上使用相同的命令:

root@KaliLinux:~# hping3 172.16.36.4 --icmp -c 2 
HPING 172.16.36.4 (eth1 172.16.36.4): icmp mode set, 28 headers + 0 data bytes
--- 
172.16.36.4 hping statistic --
2 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms 
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 0.2/0.2/0.2 ms
--- 172.16.36.4 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms 

盡管產(chǎn)生了期望的結(jié)果视卢,在這種情況下踱卵,grep函數(shù)似乎不能有效用于輸出。 由于hping3中的輸出顯示處理据过,它難以通過管道傳遞到grep函數(shù)惋砂,并只提取所需的行,我們可以嘗試通過其他方式解決這個問題绳锅。 具體來說西饵,我們將嘗試確定輸出是否可以重定向到一個文件,然后我們可以直接從文件中grep鳞芙。 為此眷柔,我們嘗試將先前使用的兩個命令的輸出傳遞給handle.txt文件:

root@KaliLinux:~# hping3 172.16.36.1 --icmp -c 1 >> handle.txt

--- 172.16.36.1 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 0.4/0.4/0.4 ms 
root@KaliLinux:~# hping3 172.16.36.4 --icmp -c 1 >> handle.txt

--- 172.16.36.4 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms 
root@KaliLinux:~# cat handle.txt 
HPING 172.16.36.1 (eth1 172.16.36.1): icmp mode set, 28 headers + 0 data bytes 
len=46 ip=172.16.36.1 ttl=64 id=56022 icmp_seq=0 rtt=0.4 ms 
HPING 172.16.36.4 (eth1 172.16.36.4): icmp mode set, 28 headers + 0 data bytes 

雖然這種嘗試并不完全成功,因?yàn)檩敵鰶]有完全重定向到文件溉仑,我們可以看到通過讀取文件中的輸出弓叛,足以創(chuàng)建一個有效的腳本义郑。 具體來說,我們能夠重定向一個唯一的行鞠评,該行只與成功的ping嘗試相關(guān)聯(lián),并且包含該行中相應(yīng)的 IP 地址丙笋。 要驗(yàn)證此解決方法是否可行谢澈,我們需要嘗試循環(huán)訪問/ 24范圍中的每個地址,然后將結(jié)果傳遞到handle.txt文件:

root@KaliLinux:~# for addr in $(seq 1 254); do hping3 172.16.36.$addr --icmp -c 1 >> handle.txt & done

--- 172.16.36.2 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 6.6/6.6/6.6 ms

--- 172.16.36.1 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 55.2/55.2/55.2 ms

--- 172.16.36.8 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms 
                    *** {TRUNCATED} ***

通過這樣做御板,仍然有大量的輸出(提供的輸出為了方便而被截?cái)啵┌粗囟ㄏ虻轿募妮敵觥?但是锥忿,以下腳本的成功不取決于初始循環(huán)的過多輸出,而是取決于從輸出文件中提取必要信息的能力:

root@KaliLinux:~# ls 
Desktop  handle.txt  pinger.sh 
root@KaliLinux:~# grep len handle.txt 
len=46 ip=172.16.36.2 ttl=128 id=7537 icmp_seq=0 rtt=6.6 ms 
len=46 ip=172.16.36.1 ttl=64 id=56312 icmp_seq=0 rtt=55.2 ms 
len=46 ip=172.16.36.132 ttl=64 id=47801 icmp_seq=0 rtt=27.3 ms 
len=46 ip=172.16.36.135 ttl=64 id=62601 icmp_seq=0 rtt=77.9 ms
root@KaliLinux:~# grep len handle.txt | cut -d " " -f 2 
ip=172.16.36.2 
ip=172.16.36.1 
ip=172.16.36.132 
ip=172.16.36.135
root@KaliLinux:~# grep len handle.txt | cut -d " " -f 2 | cut -d "=" -f 2 
172.16.36.2 
172.16.36.1 
172.16.36.132
172.16.36.135 

通過將輸出使用管道連接到一系列cut函數(shù)怠肋,我們可以從輸出中提取 IP 地址敬鬓。 現(xiàn)在我們已經(jīng)成功地確定了一種方法,來掃描多個主機(jī)并輕易識別結(jié)果,我們應(yīng)該將其集成到一個腳本中钉答。 將所有這些操作組合在一起的功能腳本的示例如下:

#!/bin/bash

if [ "$#" -ne 1 ]; then
    echo "Usage - ./ping_sweep.sh [/24 network address]" 
    echo "Example - ./ping_sweep.sh 172.16.36.0" 
    echo "Example will perform an ICMP ping sweep of the 172.16.36.0/24 network and output to an output.txt file" 
    exit 
fi

prefix=$(echo $1 | cut -d '.' -f 1-3)

for addr in $(seq 1 254); do 
    hping3 $prefix.$addr --icmp -c 1 >> handle.txt; 
done

grep len handle.txt | cut -d " " -f 2 | cut -d "=" -f 2 >> output.txt 
rm handle.txt 

在提供的 bash 腳本中础芍,第一行定義了 bash 解釋器的位置。 接下來的代碼塊執(zhí)行測試來確定是否提供了預(yù)期的一個參數(shù)数尿。 這通過評估提供的參數(shù)的數(shù)量是否不等于 1 來確定仑性。如果未提供預(yù)期參數(shù),則輸出腳本的用法右蹦,并且退出腳本诊杆。 用法輸出表明,腳本需要接受/ 24網(wǎng)絡(luò)地址作為參數(shù)何陆。 下一行代碼從提供的網(wǎng)絡(luò)地址中提取網(wǎng)絡(luò)前綴晨汹。 例如,如果提供的網(wǎng)絡(luò)地址是192.168.11.0贷盲,則前綴變量將被賦值為192.168.11淘这。 然后對/ 24范圍內(nèi)的每個地址執(zhí)行hping3操作,并將每個任務(wù)的結(jié)果輸出放入handle.txt文件中巩剖。

一旦完成铝穷,grep用于從handle文件中提取與活動主機(jī)響應(yīng)相關(guān)聯(lián)的行,然后從這些行中提取 IP 地址球及。 然后將生成的 IP 地址傳遞到output.txt文件氧骤,并從目錄中刪除handle.txt臨時文件。 此腳本可以使用句號和斜杠吃引,后跟可執(zhí)行腳本的名稱執(zhí)行:

root@KaliLinux:~# ./ping_sweep.sh 
Usage - ./ping_sweep.sh [/24 network address] 
Example - ./ping_sweep.sh 172.16.36.0 
Example will perform an ICMP ping sweep of the 172.16.36.0/24 network and output to an output.txt file 
root@KaliLinux:~# ./ping_sweep.sh 172.16.36.0
--- 172.16.36.1 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 0.4/0.4/0.4 ms
--- 172.16.36.2 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 0.5/0.5/0.5 ms
--- 172.16.36.3 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms
                        *** {TRUNCATED} ***

一旦完成筹陵,腳本應(yīng)該返回一個output.txt文件到執(zhí)行目錄。 這可以使用ls驗(yàn)證镊尺,并且cat命令可以用于查看此文件的內(nèi)容:

root@KaliLinux:~# ls output.txt 
output.txt 
root@KaliLinux:~# cat output.txt 
172.16.36.1 
172.16.36.2 
172.16.36.132 
172.16.36.135 
172.16.36.253

當(dāng)腳本運(yùn)行時朦佩,你仍然會看到在初始循環(huán)任務(wù)時看到的大量輸出。 幸運(yùn)的是庐氮,你發(fā)現(xiàn)的主機(jī)列表不會在此輸出中消失语稠,因?yàn)樗看味紩懭肽愕妮敵鑫募?/p>

工作原理

我們需要進(jìn)行一些調(diào)整,才能使用hping3對多個主機(jī)或地址范圍執(zhí)行主機(jī)發(fā)現(xiàn)弄砍。 提供的秘籍使用 bash 腳本順序執(zhí)行 ICMP 回應(yīng)請求仙畦。 這是可性的,因?yàn)槌晒筒怀晒Φ恼埱竽軌蛏晌ㄒ豁憫?yīng)音婶。 通過將函數(shù)傳遞給一個循環(huán)慨畸,并將唯一響應(yīng)傳遞給grep,我們可以高效開發(fā)出一個腳本衣式,對多個系統(tǒng)依次執(zhí)行 ICMP 發(fā)現(xiàn)寸士,然后輸出活動主機(jī)列表檐什。

2.11 使用 Scapy 探索第四層

多種不同方式可以用于在第四層執(zhí)行目標(biāo)發(fā)現(xiàn)∪蹩ǎ可以使用用戶數(shù)據(jù)報(bào)協(xié)議(UDP)或傳輸控制協(xié)議(TCP)來執(zhí)行掃描乃正。 Scapy 可以用于使用這兩種傳輸協(xié)議來制作自定義請求,并且可以與 Python 腳本結(jié)合使用以開發(fā)實(shí)用的發(fā)現(xiàn)工具婶博。 此秘籍演示了如何使用 Scapy 執(zhí)行 TCP 和 UDP 的第四層發(fā)現(xiàn)瓮具。

準(zhǔn)備

使用 Scapy 執(zhí)行第四層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) TCP 和 UDP 請求凡蜻。但是搭综,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)划栓。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù),你需要至少有一個響應(yīng) TCP/UDP 請求的系統(tǒng)条获。在提供的示例中忠荞,使用 Linux 和 Windows 系統(tǒng)的組合。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息帅掘,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍委煤。此外,本節(jié)還需要使用文本編輯器(如 VIM 或 Nano)將腳本寫入文件系統(tǒng)修档。有關(guān)編寫腳本的更多信息碧绞,請參閱第一章中的“使用文本編輯器(VIM 和 Nano)”秘籍。

操作步驟

為了驗(yàn)證從活動主機(jī)接收到的 RST 響應(yīng)吱窝,我們可以使用 Scapy 向已知的活動主機(jī)發(fā)送 TCP ACK 數(shù)據(jù)包讥邻。 在提供的示例中,ACK 數(shù)據(jù)包將發(fā)送到 TCP 目標(biāo)端口 80院峡。此端口通常用于運(yùn)行 HTTP Web 服務(wù)兴使。 演示中使用的主機(jī)當(dāng)前擁有在此端口上運(yùn)行的 Apache 服務(wù)。 為此照激,我們需要構(gòu)建我們的請求的每個層級发魄。 要構(gòu)建的第一層是IP層。 看看下面的命令:

root@KaliLinux:~# scapy Welcome to Scapy (2.2.0) 
>>> i = IP() 
>>> i.display() 
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= ip
  chksum= None
  src= 127.0.0.1
  dst= 127.0.0.1
  \options\ 
>>> i.dst="172.16.36.135" 
>>> i.display() 
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= ip
  chksum= None
  src= 172.16.36.180
  dst= 172.16.36.135
  \options\ 

這里俩垃,我們將i變量初始化為IP對象励幼,然后重新配置標(biāo)準(zhǔn)配置,將目標(biāo)地址設(shè)置為目標(biāo)服務(wù)器的 IP 地址口柳。 請注意苹粟,當(dāng)為目標(biāo)地址提供除回送地址之外的任何 IP 地址時,源 IP 地址會自動更新啄清。 我們需要構(gòu)建的下一層是我們的 TCP 層六水。 這可以在以下命令中看到:

>>> t = TCP() 
>>> t.display()
###[ TCP ]###
  sport= ftp_data
  dport= http
  seq= 0
  ack= 0
  dataofs= None
  reserved= 0
  flags= S
  window= 8192
  chksum= None
  urgptr= 0
  options= {} 
>>> t.flags='A' 
>>> t.display() 
###[ TCP ]###
  sport= ftp_data
  dport= http
  seq= 0
  ack= 0
  dataofs= None
  reserved= 0
  flags= A
  window= 8192
  chksum= None
  urgptr= 0
  options= {}

這里俺孙,我們將t變量初始化為TCP對象。 注意掷贾,對象的默認(rèn)配置已經(jīng)將目標(biāo)端口設(shè)置為 HTTP 或端口 80睛榄。這里,我們只需要將 TCP 標(biāo)志從S(SYN)更改為A(ACK)想帅。 現(xiàn)在场靴,可以通過使用斜杠分隔每個層級來構(gòu)建棧,如以下命令中所示:

>>> request = (i/t) 
>>> request.display() 
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= tcp
  chksum= None
  src= 172.16.36.180
  dst= 172.16.36.135
  \options\ 
###[ TCP ]###
     sport= ftp_data
     dport= http
     seq= 0
     ack= 0
     dataofs= None
     reserved= 0
     flags= A
     window= 8192
     chksum= None
     urgptr= 0
     options= {}

這里港准,我們將整個請求棧賦給request變量旨剥。 現(xiàn)在,可以使用sendrecieve函數(shù)跨線路發(fā)送請求浅缸,然后可以評估響應(yīng)來確定目標(biāo)地址的狀態(tài):

>>> response = sr1(request) 
Begin emission: 
.......Finished to send 1 packets. 
....* 
Received 12 packets, got 1 answers, remaining 0 packets 
>>> response.display() 
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 40
  id= 0
  flags= DF
  frag= 0L
  ttl= 64
  proto= tcp
  chksum= 0x9974
  src= 172.16.36.135
  dst= 172.16.36.180
  \options\ 
###[ TCP ]###
     sport= http
     dport= ftp_data
     seq= 0
     ack= 0
     dataofs= 5L
     reserved= 0L
     flags= R
     window= 0
     chksum= 0xe21
     urgptr= 0
     options= {} 
###[ Padding ]###
        load= '\x00\x00\x00\x00\x00\x00'

請注意轨帜,遠(yuǎn)程系統(tǒng)使用設(shè)置了 RST 標(biāo)志的 TCP 數(shù)據(jù)包進(jìn)行響應(yīng)。 這由分配給flags屬性的R值表示衩椒。 通過直接調(diào)用函數(shù)蚌父,可以將堆疊請求和發(fā)送和接收響應(yīng)的整個過程壓縮為單個命令:

>>> response = sr1(IP(dst="172.16.36.135")/TCP(flags='A')) 
.Begin emission: 
................
Finished to send 1 packets. 
....* 
Received 22 packets, got 1 answers, remaining 0 packets 
>>> response.display() 
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 40
  id= 0
  flags= DF
  frag= 0L
  ttl= 64
  proto= tcp
  chksum= 0x9974
  src= 172.16.36.135
  dst= 172.16.36.180
  \options\ 
###[ TCP ]###
     sport= http
     dport= ftp_data
     seq= 0
     ack= 0
     dataofs= 5L
     reserved= 0L
     flags= R
     window= 0
     chksum= 0xe21
     urgptr= 0
     options= {} 
###[ Padding ]###
        load= '\x00\x00\x00\x00\x00\x00'

現(xiàn)在我們已經(jīng)確定了與發(fā)送到活動主機(jī)上的打開端口的 ACK 數(shù)據(jù)包相關(guān)聯(lián)的響應(yīng),讓我們嘗試向活動系統(tǒng)上的已關(guān)閉端口發(fā)送類似的請求毛萌,并確定響應(yīng)是否有任何變化:

>>> response = sr1(IP(dst="172.16.36.135")/TCP(dport=1111,flags='A')) 
.Begin emission: 
.........
Finished to send 1 packets. 
....* 
Received 15 packets, got 1 answers, remaining 0 packets 
>>> response.display() 
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0x0
  len= 40
  id= 0
  flags= DF
  frag= 0L
  ttl= 64
  proto= tcp
  chksum= 0x9974
  src= 172.16.36.135
  dst= 172.16.36.180
  \options\ 
###[ TCP ]###
     sport= 1111
     dport= ftp_data
     seq= 0
     ack= 0
     dataofs= 5L
     reserved= 0L
     flags= R
     window= 0
     chksum= 0xa1a
     urgptr= 0
     options= {} 
###[ Padding ]###
        load= '\x00\x00\x00\x00\x00\x00'

在此請求中苟弛,目標(biāo) TCP 端口已從默認(rèn)端口 80 更改為端口 1111(未在其上運(yùn)行服務(wù)的端口)。 請注意阁将,從活動系統(tǒng)上的打開端口和關(guān)閉端口返回的響應(yīng)是相同的膏秫。 無論這是否是在掃描端口上主動運(yùn)行的服務(wù),活動系統(tǒng)都會返回 RST 響應(yīng)做盅。 另外缤削,應(yīng)當(dāng)注意,如果將類似的掃描發(fā)送到與活動系統(tǒng)無關(guān)的 IP 地址言蛇,則不會返回響應(yīng)僻他。 這可以通過將請求中的目標(biāo) IP 地址修改為與實(shí)際系統(tǒng)無關(guān)的 IP 地址來驗(yàn)證:

>>> response = sr1(IP(dst="172.16.36.136")/TCP(dport=80,flags='A'),timeo ut=1) 
Begin emission:
......................................................................... ......................................................................... ......
Finished to send 1 packets. 
..................... 
Received 3559 packets, got 0 answers, remaining 1 packets

因此,通過查看腊尚,我們發(fā)現(xiàn)對于發(fā)送到活動主機(jī)任何端口的 ACK 數(shù)據(jù)包吨拗,無論端口狀態(tài)如何,都將返回 RST 數(shù)據(jù)包婿斥,但如果沒有活動主機(jī)與之相關(guān)劝篷,則不會從 IP 接收到響應(yīng)。 這是一個好消息民宿,因?yàn)樗馕吨考耍覀兛梢酝ㄟ^只與每個系統(tǒng)上的單個端口進(jìn)行交互,在大量系統(tǒng)上執(zhí)行發(fā)現(xiàn)掃描活鹰。 將 Scapy 與 Python 結(jié)合使用哈恰,我們可以快速循環(huán)訪問/ 24網(wǎng)絡(luò)范圍中的所有地址只估,并向每個系統(tǒng)上的僅一個 TCP 端口發(fā)送單個 ACK 數(shù)據(jù)包。 通過評估每個主機(jī)返回的響應(yīng)着绷,我們可以輕易輸出活動 IP 地址列表蛔钙。

#!/usr/bin/python

import logging 
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) 
from scapy.all import *

if len(sys.argv) != 2:   
    print "Usage - ./ACK_Ping.py [/24 network address]"   
    print "Example - ./ACK_Ping.py 172.16.36.0"   
    print "Example will perform a TCP ACK ping scan of the 172.16.36.0/24 range"  
    sys.exit()
 
address = str(sys.argv[1]) 
prefix = address.split('.')[0] + '.' + address.split('.')[1] + '.' + address.split('.')[2] + '.'

for addr in range(1,254):
    response = sr1(IP(dst=prefix+str(addr))/TCP(dport=80,flags='A'), timeout=1,verbose=0)  
    try:      
        if int(response[TCP].flags) == 4:         
            print "172.16.36."+str(addr)   
    except:      
        pass 

提供的示例腳本相當(dāng)簡單。 當(dāng)循環(huán)遍歷 IP 地址中的最后一個八位字節(jié)的每個可能值時荠医,ACK 封包被發(fā)送到 TCP 端口 80吁脱,并且評估響應(yīng)來確定響應(yīng)中的 TCP 標(biāo)志的整數(shù)轉(zhuǎn)換是否具有值4 (與單獨(dú) RST 標(biāo)志相關(guān)的值)。 如果數(shù)據(jù)包具有 RST 標(biāo)志彬向,則腳本將輸出返回響應(yīng)的系統(tǒng)的 IP 地址兼贡。 如果沒有收到響應(yīng),Python 無法測試響應(yīng)變量的值娃胆,因?yàn)闆]有為其賦任何值遍希。 因此,如果沒有返回響應(yīng)里烦,將發(fā)生異常孵班。 如果返回異常,腳本將會跳過招驴。 生成的輸出是活動目標(biāo) IP 地址的列表。 此腳本可以使用句號和斜杠枷畏,后跟可執(zhí)行腳本的名稱執(zhí)行:

root@KaliLinux:~# ./ACK_Ping.py 
Usage - ./ACK_Ping.py [/24 network address] 
Example - ./ACK_Ping.py 172.16.36.0 
Example will perform a TCP ACK ping scan of the 172.16.36.0/24 range 
root@KaliLinux:~# ./ACK_Ping.py 
172.16.36.1 
172.16.36.2 
172.16.36.132 
172.16.36.135 

類似的發(fā)現(xiàn)方法可以用于使用 UDP 協(xié)議來執(zhí)行第四層發(fā)現(xiàn)别厘。 為了確定我們是否可以使用 UDP 協(xié)議發(fā)現(xiàn)主機(jī),我們需要確定如何從任何運(yùn)行 UDP 的活動主機(jī)觸發(fā)響應(yīng)拥诡,而不管系統(tǒng)是否有在 UDP 端口上運(yùn)行服務(wù)触趴。 為了嘗試這個,我們將首先在 Scapy 中構(gòu)建我們的請求棧:

root@KaliLinux:~# scapy Welcome to Scapy (2.2.0) 
>>> i = IP() 
>>> i.dst = "172.16.36.135" 
>>> u = UDP() 
>>> request = (i/u) 
>>> request.display()
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= udp
  chksum= None
  src= 172.16.36.180
  dst= 172.16.36.135
  \options\ 
###[ UDP ]###
     sport= domain
     dport= domain
     len= None
     chksum= None

注意渴肉,UDP對象的默認(rèn)源和目標(biāo)端口是域名系統(tǒng)(DNS)冗懦。 這是一種常用的服務(wù),可用于將域名解析為 IP 地址仇祭。 發(fā)送請求是因?yàn)樗怯兄谂袛嗯叮琁P 地址是否與活動主機(jī)相關(guān)聯(lián)。 發(fā)送此請求的示例可以在以下命令中看到:

>>> reply = sr1(request,timeout=1,verbose=1) 
Begin emission: 
Finished to send 1 packets.
Received 7 packets, got 0 answers, remaining 1 packets

盡管與目標(biāo) IP 地址相關(guān)的主機(jī)是活動的乌奇,但我們沒有收到響應(yīng)没讲。 諷刺的是,缺乏響應(yīng)實(shí)際上是由于 DNS 服務(wù)正在目標(biāo)系統(tǒng)上使用礁苗。這是因?yàn)榛顒臃?wù)通常配置為僅響應(yīng)包含特定內(nèi)容的請求爬凑。 你可能會自然想到,有時可以嘗試通過探測未運(yùn)行服務(wù)的 UDP 端口來高效識別主機(jī)试伙,假設(shè) ICMP 流量未被防火墻阻止嘁信。 現(xiàn)在于样,我們嘗試將同一請求發(fā)送到不在使用的不同 UDP 端口:

>>> u.dport = 123 
>>> request = (i/u)
>>> reply = sr1(request,timeout=1,verbose=1) 
Begin emission: Finished to send 1 packets.
Received 5 packets, got 1 answers, remaining 0 packets 
>>> reply.display() 
###[ IP ]###
  version= 4L
  ihl= 5L
  tos= 0xc0
  len= 56
  id= 62614
  flags=
  frag= 0L
  ttl= 64
  proto= icmp
  chksum= 0xe412
  src= 172.16.36.135
  dst= 172.16.36.180
  \options\ 
###[ ICMP ]###
     type= dest-unreach
     code= port-unreachable
     chksum= 0x9e72
     unused= 0 
###[ IP in ICMP ]###
        version= 4L
        ihl= 5L
        tos= 0x0
        len= 28
        id= 1
        flags=
        frag= 0L
        ttl= 64
        proto= udp
        chksum= 0xd974
        src= 172.16.36.180
        dst= 172.16.36.135
        \options\
###[ UDP in ICMP ]###
           sport= domain       
           dport= ntp        
           len= 8          
           chksum= 0x5dd2 

通過將請求目標(biāo)更改為端口 123,然后重新發(fā)送它潘靖,我們現(xiàn)在會收到一個響應(yīng)穿剖,表明目標(biāo)端口不可達(dá)。如果檢查此響應(yīng)的源 IP 地址秘豹,你可以看到它是從發(fā)送原始請求的主機(jī)發(fā)送的携御。此響應(yīng)隨后表明原始目標(biāo) IP 地址處的主機(jī)處于活動狀態(tài)。不幸的是既绕,在這些情況下并不總是返回響應(yīng)啄刹。這種技術(shù)的效率在很大程度上取決于你正在探測的系統(tǒng)及其配置。正因?yàn)槿绱似喾罚琔DP 發(fā)現(xiàn)通常比 TCP 發(fā)現(xiàn)更難執(zhí)行誓军。它從來不會像發(fā)送帶有單個標(biāo)志的 TCP 數(shù)據(jù)包那么簡單。在服務(wù)確實(shí)存在的情況下疲扎,通常需要服務(wù)特定的探測昵时。幸運(yùn)的是,有各種相當(dāng)復(fù)雜的 UDP 掃描工具椒丧,可以使用各種 UDP 請求和服務(wù)特定的探針壹甥,來確定活動主機(jī)是否關(guān)聯(lián)了任何給定的IP地址。

工作原理

這里提供的示例使用 UDP 和 TCP 發(fā)現(xiàn)方式壶熏。 我們能夠使用 Scapy 來制作自定義請求句柠,來使用這些協(xié)議識別活動主機(jī)。 在 TCP 的情況下棒假,我們構(gòu)造了自定義的 ACK 封包并將其發(fā)送到每個目標(biāo)系統(tǒng)上的任意端口溯职。 在接收到 RST 應(yīng)答的情況下,系統(tǒng)被識別為活動的帽哑。 或者谜酒,空的 UDP 請求被發(fā)送到任意端口,來嘗試請求 ICMP 端口不可達(dá)響應(yīng)妻枕。 響應(yīng)可用作活動系統(tǒng)的標(biāo)識僻族。 然后這些技術(shù)中的每一個都可以在 Python 腳本中使用,來對多個主機(jī)或地址范圍執(zhí)行發(fā)現(xiàn)佳头。

2.12 使用 Nmap 探索第四層

除了集成到 Nmap 工具中的許多其他掃描功能鹰贵,還有一個選項(xiàng)用于執(zhí)行第四層發(fā)現(xiàn)。 這個具體的秘籍演示了如何使用 Nmap 執(zhí)行 TCP 和 UDP 協(xié)議的第4層發(fā)現(xiàn)康嘉。

準(zhǔn)備

使用 Nmap 執(zhí)行第四層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境碉输,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) TCP 和 UDP 請求。但是亭珍,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描敷钾,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)枝哄。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù),你需要至少有一個響應(yīng) TCP/UDP 請求的系統(tǒng)阻荒。在提供的示例中挠锥,使用 Linux 和 Windows 系統(tǒng)的組合。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息侨赡,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍蓖租。此外,本節(jié)還需要使用文本編輯器(如 VIM 或 Nano)將腳本寫入文件系統(tǒng)羊壹。有關(guān)編寫腳本的更多信息蓖宦,請參閱第一章中的“使用文本編輯器(VIM 和 Nano)”秘籍。

操作步驟

在 Nmap 中有一些選項(xiàng)用于發(fā)現(xiàn)運(yùn)行 TCP 和 UDP 的主機(jī)油猫。 Nmap 的 UDP 發(fā)現(xiàn)已配置為稠茂,使用必需的唯一載荷來觸發(fā)無響應(yīng)的服務(wù)。 為了使用 UDP 執(zhí)行發(fā)現(xiàn)掃描情妖,請使用-PU選項(xiàng)和端口來測試:

root@KaliLinux:~# nmap 172.16.36.135 -PU53 -sn

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-11 20:11 EST 
Nmap scan report for 172.16.36.135 Host is up (0.00042s latency). 
MAC Address: 00:0C:29:3D:84:32 (VMware) 
Nmap done: 1 IP address (1 host up) scanned in 0.13 seconds 
This UDP discovery scan can also be modified to perform a scan of a sequential range by using dash notation. In the example provided, we will scan the entire 172.16.36.0/24 address range: 
root@KaliLinux:~# nmap 172.16.36.0-255 -PU53 -sn

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 06:33 EST 
Nmap scan report for 172.16.36.1 
Host is up (0.00020s latency). 
MAC Address: 00:50:56:C0:00:08 (VMware) 
Nmap scan report for 172.16.36.2 
Host is up (0.00018s latency). 
MAC Address: 00:50:56:FF:2A:8E (VMware) 
Nmap scan report for 172.16.36.132 
Host is up (0.00037s latency). 
MAC Address: 00:0C:29:65:FC:D2 (VMware) 
Nmap scan report for 172.16.36.135 
Host is up (0.00041s latency).
MAC Address: 00:0C:29:3D:84:32 (VMware) 
Nmap scan report for 172.16.36.180 
Host is up. 
Nmap scan report for 172.16.36.254 
Host is up (0.00015s latency). 
MAC Address: 00:50:56:EB:E1:8A (VMware) 
Nmap done: 256 IP addresses (6 hosts up) scanned in 3.91 seconds

與之類似睬关,也可以對輸入列表所定義的一系列 IP 地址執(zhí)行 Nmap UDP ping 請求。 在提供的示例中毡证,我們使用同一目錄中的iplist.txt文件來掃描以下列出的每個主機(jī):

root@KaliLinux:~# nmap -iL iplist.txt -sn -PU53
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 06:36 EST 
Nmap scan report for 172.16.36.2 
Host is up (0.00015s latency). 
MAC Address: 00:50:56:FF:2A:8E (VMware) 
Nmap scan report for 172.16.36.1 
Host is up (0.00024s latency). 
MAC Address: 00:50:56:C0:00:08 (VMware) 
Nmap scan report for 172.16.36.135 
Host is up (0.00029s latency). 
MAC Address: 00:0C:29:3D:84:32 (VMware) 
Nmap scan report for 172.16.36.132 
Host is up (0.00030s latency). 
MAC Address: 00:0C:29:65:FC:D2 (VMware) 
Nmap scan report for 172.16.36.180 
Host is up. 
Nmap scan report for 172.16.36.254 
Host is up (0.00021s latency). 
MAC Address: 00:50:56:EB:E1:8A (VMware) 
Nmap done: 6 IP addresses (6 hosts up) scanned in 0.31 seconds

盡管來自這些示例中的每一個的輸出表明發(fā)現(xiàn)了六個主機(jī)电爹,但是這不一定標(biāo)識六個主機(jī)都通過 UDP 發(fā)現(xiàn)方法被發(fā)現(xiàn)。 除了在 UDP 端口 53 上執(zhí)行的探測之外料睛,Nmap 還將利用任何其它發(fā)現(xiàn)技術(shù)藐不,來發(fā)現(xiàn)在指定范圍內(nèi)或在輸入列表內(nèi)的主機(jī)。 雖然-sn選項(xiàng)有效防止了 Nmap 執(zhí)行 TCP 端口掃描秦效,但它不會完全隔離我們的 UDP ping 請求。 雖然沒有有效的方法來隔離這個任務(wù)涎嚼,你可以通過分析 Wireshark 或 TCPdump 中的流量阱州,來確定通過 UDP 請求發(fā)現(xiàn)的主機(jī)。 或者法梯,Nmap 也可以用于以 Scapy 的相同方式苔货,來執(zhí)行 TCP ACK ping。 為了使用 ACK 數(shù)據(jù)包識別活動主機(jī)立哑,請結(jié)合你要使用的端口使用-PA選項(xiàng):

root@KaliLinux:~# nmap 172.16.36.135 -PA80 -sn

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-11 20:09 EST 
Nmap scan report for 172.16.36.135 
Host is up (0.00057s latency). 
MAC Address: 00:0C:29:3D:84:32 (VMware) 
Nmap done: 1 IP address (1 host up) scanned in 0.21 seconds 

TCP ACK ping 發(fā)現(xiàn)方法還可以使用破折號符號在一定范圍的主機(jī)上執(zhí)行夜惭,或者可以基于輸入列表在指定的主機(jī)地址上執(zhí)行:

root@KaliLinux:~# nmap 172.16.36.0-255 -PA80 -sn

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 06:46 EST 
Nmap scan report for 172.16.36.132 
Host is up (0.00033s latency). 
MAC Address: 00:0C:29:65:FC:D2 (VMware) 
Nmap scan report for 172.16.36.135 
Host is up (0.00013s latency). 
MAC Address: 00:0C:29:3D:84:32 (VMware) 
Nmap scan report for 172.16.36.180 
Host is up. 
Nmap done: 256 IP addresses (3 hosts up) scanned in 3.43 seconds 

root@KaliLinux:~# nmap -iL iplist.txt -PA80 -sn

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 06:47 EST 
Nmap scan report for 172.16.36.135 
Host is up (0.00033s latency). 
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap scan report for 172.16.36.132 
Host is up (0.00029s latency). 
MAC Address: 00:0C:29:65:FC:D2 (VMware) 
Nmap scan report for 172.16.36.180 
Host is up. 
Nmap done: 3 IP addresses (3 hosts up) scanned in 0.31 seconds

工作原理

Nmap 用于執(zhí)行 TCP 發(fā)現(xiàn)的技術(shù)的基本原理,與 Scapy 用于執(zhí)行 TCP 發(fā)現(xiàn)的技術(shù)相同铛绰。 Nmap 向目標(biāo)系統(tǒng)上的任意端口發(fā)送一系列 TCP ACK 數(shù)據(jù)包诈茧,并嘗試請求 RST 響應(yīng)作為活動系統(tǒng)的標(biāo)識。 然而捂掰,Nmap 用于執(zhí)行 UDP 發(fā)現(xiàn)的技術(shù)有點(diǎn)不同于 Scapy 的技術(shù)敢会。 Nmap 不僅僅依賴于可能不一致或阻塞的 ICMP 主機(jī)不可達(dá)響應(yīng)曾沈,而且通過向目標(biāo)端口發(fā)送服務(wù)特定請求,嘗試請求響應(yīng)鸥昏,來執(zhí)行主機(jī)發(fā)現(xiàn)塞俱。

2.13 使用 hping3 來探索第四層

我們之前討論過,使用hping3來執(zhí)行第3層 ICMP 發(fā)現(xiàn)吏垮。 除了此功能障涯,hping3還可以用于執(zhí)行 UDP 和 TCP 主機(jī)發(fā)現(xiàn)。 然而膳汪,如前所述唯蝶,hping3被開發(fā)用于執(zhí)行定向請求,并且需要一些腳本來將其用作有效的掃描工具旅敷。 這個秘籍演示了如何使用hping3來執(zhí)行 TCP 和 UDP 協(xié)議的第4層發(fā)現(xiàn)生棍。

準(zhǔn)備

使用hping3執(zhí)行第四層發(fā)現(xiàn)不需要實(shí)驗(yàn)環(huán)境,因?yàn)?Internet 上的許多系統(tǒng)都將回復(fù) TCP 和 UDP 請求媳谁。但是涂滴,強(qiáng)烈建議你只在您自己的實(shí)驗(yàn)環(huán)境中執(zhí)行任何類型的網(wǎng)絡(luò)掃描,除非你完全熟悉您受到任何管理機(jī)構(gòu)施加的法律法規(guī)晴音。如果你希望在實(shí)驗(yàn)環(huán)境中執(zhí)行此技術(shù)柔纵,你需要至少有一個響應(yīng) TCP/UDP 請求的系統(tǒng)。在提供的示例中锤躁,使用 Linux 和 Windows 系統(tǒng)的組合搁料。有關(guān)在本地實(shí)驗(yàn)環(huán)境中設(shè)置系統(tǒng)的更多信息,請參閱第一章中的“安裝 Metasploitable2”和“安裝 Windows Server”秘籍系羞。此外郭计,本節(jié)還需要使用文本編輯器(如 VIM 或 Nano)將腳本寫入文件系統(tǒng)。有關(guān)編寫腳本的更多信息椒振,請參閱第一章中的“使用文本編輯器(VIM 和 Nano)”秘籍昭伸。

操作步驟

與 Nmap 不同,hping3通過隔離任務(wù)澎迎,能夠輕易識別能夠使用 UDP 探針發(fā)現(xiàn)的主機(jī)庐杨。 通過使用--udp選項(xiàng)指定 UDP 模式,可以傳輸 UDP 探針來嘗試觸發(fā)活動主機(jī)的回復(fù):

root@KaliLinux:~# hping3 --udp 172.16.36.132 
HPING 172.16.36.132 (eth1 172.16.36.132): udp mode set, 28 headers + 0 data bytes 
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN   status=0 port=2792 seq=0 
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN   status=0 port=2793 seq=1 
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN   status=0 port=2794 seq=2 ^F
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN   status=0 port=2795 seq=3 
^C 
--- 172.16.36.132 hping statistic --
4 packets transmitted, 4 packets received, 0% packet loss 
round-trip min/avg/max = 1.8/29.9/113.4 ms 

在提供的演示中夹供,Ctrl + C用于停止進(jìn)程灵份。在 UDP 模式下使用hping3時,除非在初始命令中定義了特定數(shù)量的數(shù)據(jù)包哮洽,否則將無限繼續(xù)發(fā)現(xiàn)填渠。 為了定義要發(fā)送的嘗試次數(shù),應(yīng)包含-c選項(xiàng)和一個表示所需嘗試次數(shù)的整數(shù)值:

root@KaliLinux:~# hping3 --udp 172.16.36.132 -c 1 
HPING 172.16.36.132 (eth1 172.16.36.132): udp mode set, 28 headers + 0 data bytes 
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN   status=0 port=2422 seq=0

--- 172.16.36.132 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 104.8/104.8/104.8 ms

雖然hping3默認(rèn)情況下不支持掃描多個系統(tǒng),但可以使用 bash 腳本輕易編寫腳本揭蜒。 為了做到這一點(diǎn)横浑,我們必須首先確定與活動地址相關(guān)的輸出,以及與非響應(yīng)地址相關(guān)的輸出之間的區(qū)別屉更。 為此徙融,我們應(yīng)該在未分配主機(jī)的 IP 地址上使用相同的命令:

root@KaliLinux:~# hping3 --udp 172.16.36.131 -c 1 
HPING 172.16.36.131 (eth1 172.16.36.131): udp mode set, 28 headers + 0 data bytes
--- 172.16.36.131 hping statistic 
--1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms 

通過識別這些請求中的每一個的相關(guān)響應(yīng),我們可以確定出我們可以grep的唯一字符串; 此字符串能夠隔離成功的發(fā)現(xiàn)嘗試與失敗的發(fā)現(xiàn)嘗試瑰谜。 在以前的請求中欺冀,你可能已經(jīng)注意到,“ICMP 端口不可達(dá)”的短語僅在返回響應(yīng)的情況下顯示萨脑。 基于此隐轩,我們可以通過對Unreachable進(jìn)行grep來提取成功的嘗試。 為了確定此方法在腳本中的有效性渤早,我們應(yīng)該嘗試連接兩個先前的命令职车,然后將輸出傳遞給我們的grep函數(shù)。 假設(shè)我們選擇的字符串對于成功的嘗試是唯一的鹊杖,我們應(yīng)該只看到與活動主機(jī)相關(guān)的輸出:

root@KaliLiniux:~# hping3 --udp 172.16.36.132 -c 1; hping3 --udp 172.16.36.131 -c 1 | grep "Unreachable"HPING 172.16.36.132 (eth1 172.16.36.132): udp mode set, 28 headers + 0 data bytes 
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN   status=0 port=2836 seq=0

--- 172.16.36.132 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 115.2/115.2/115.2 ms
--- 172.16.36.131 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms

盡管產(chǎn)生了期望的結(jié)果悴灵,在這種情況下,grep函數(shù)似乎不能有效用于輸出骂蓖。 由于hping3中的輸出顯示處理积瞒,它難以通過管道傳遞到grep函數(shù),并只提取所需的行登下,我們可以嘗試通過其他方式解決這個問題茫孔。 具體來說,我們將嘗試確定輸出是否可以重定向到一個文件被芳,然后我們可以直接從文件中grep缰贝。 為此,我們嘗試將先前使用的兩個命令的輸出傳遞給handle.txt文件:

root@KaliLinux:~# hping3 --udp 172.16.36.132 -c 1 >> handle.txt

--- 172.16.36.132 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 28.6/28.6/28.6 ms 
root@KaliLinux:~# hping3 --udp 172.16.36.131 -c 1 >> handle.txt

--- 172.16.36.131 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms 
root@KaliLinux:~# ls Desktop  handle.txt 
root@KaliLinux:~# cat handle.txt 
HPING 172.16.36.132 (eth1 172.16.36.132): udp mode set, 28 headers + 0 data bytes 
ICMP Port Unreachable from ip=172.16.36.132 name=UNKNOWN   status=0 port=2121 seq=0 
HPING 172.16.36.131 (eth1 172.16.36.131): udp mode set, 28 headers + 0 data bytes

雖然這種嘗試并不完全成功畔濒,因?yàn)檩敵鰶]有完全重定向到文件揩瞪,我們可以看到通過讀取文件中的輸出,足以創(chuàng)建一個有效的腳本篓冲。 具體來說,我們能夠重定向一個唯一的行宠哄,該行只與成功的ping嘗試相關(guān)聯(lián)壹将,并且包含該行中相應(yīng)的 IP 地址。 要驗(yàn)證此解決方法是否可行毛嫉,我們需要嘗試循環(huán)訪問/ 24范圍中的每個地址诽俯,然后將結(jié)果傳遞到handle.txt文件:

root@KaliLinux:~# for addr in $(seq 1 254); do hping3 --udp 172.16.36.$addr -c 1 >> handle.txt; done
--- 172.16.36.1 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms

--- 172.16.36.2 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms
--- 172.16.36.3 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms 

通過這樣做,仍然有大量的輸出(提供的輸出為了方便而被截?cái)啵┌粗囟ㄏ虻轿募妮敵觥?但是,以下腳本的成功不取決于初始循環(huán)的過多輸出暴区,而是取決于從輸出文件中提取必要信息的能力:

root@KaliLinux:~# ls 
Desktop  handle.txt 
root@KaliLinux:~# grep Unreachable handle.txt 
ICMP Port Unreachable from ip=172.16.36.132 HPING 172.16.36.133 (eth1 172.16.36.133): udp mode set, 28 headers + 0 data bytes 
ICMP Port Unreachable from ip=172.16.36.135 HPING 172.16.36.136 (eth1 172.16.36.136): udp mode set, 28 headers + 0 data bytes 

完成掃描循環(huán)后闯团,可以使用ls命令在當(dāng)前目錄中確定輸出文件,然后可以直接從此文件中對Unreachable的唯一字符串進(jìn)行grep仙粱,如下一個命令所示房交。 在輸出中,我們可以看到伐割,列出了通過 UDP 探測發(fā)現(xiàn)的每個活動主機(jī)候味。 此時,剩下的唯一任務(wù)是從此輸出中提取 IP 地址隔心,然后將此整個過程重新創(chuàng)建為單個功能腳本:

root@KaliLinux:~# grep Unreachable handle.txt 
ICMP Port Unreachable from ip=172.16.36.132 
HPING 172.16.36.133 (eth1 172.16.36.133): udp mode set, 28 headers + 0 data bytes 
ICMP Port Unreachable from ip=172.16.36.135 
HPING 172.16.36.136 (eth1 172.16.36.136): udp mode set, 28 headers + 0 data bytes 
root@KaliLinux:~# grep Unreachable handle.txt | cut -d " " -f 5 ip=172.16.36.132 ip=172.16.36.135 
root@KaliLinux:~# grep Unreachable handle.txt | cut -d " " -f 5 | cut -d "=" -f 2 172.16.36.132 172.16.36.135


通過將輸出使用管道連接到一系列cut函數(shù)白群,我們可以從輸出中提取 IP 地址。 現(xiàn)在我們已經(jīng)成功地確定了一種方法硬霍,來掃描多個主機(jī)并輕易識別結(jié)果帜慢,我們應(yīng)該將其集成到一個腳本中。 將所有這些操作組合在一起的功能腳本的示例如下:

#!/bin/bash
if [ "$#" -ne 1 ]; then 
    echo "Usage - ./udp_sweep.sh [/24 network address]" 
    echo "Example - ./udp_sweep.sh 172.16.36.0" 
    echo "Example will perform a UDP ping sweep of the 172.16.36.0/24 network and output to an output.txt file" 
    exit 
fi

prefix=$(echo $1 | cut -d '.' -f 1-3)

for addr in $(seq 1 254); do 
    hping3 $prefix.$addr --udp -c 1 >> handle.txt; 
done

grep Unreachable handle.txt | cut -d " " -f 5 | cut -d "=" -f 2 >> output.txt 
rm handle.txt 

在提供的 bash 腳本中唯卖,第一行定義了 bash 解釋器的位置粱玲。 接下來的代碼塊執(zhí)行測試來確定是否提供了預(yù)期的一個參數(shù)。 這通過評估提供的參數(shù)的數(shù)量是否不等于 1 來確定耐床。如果未提供預(yù)期參數(shù)密幔,則輸出腳本的用法,并且退出腳本撩轰。 用法輸出表明胯甩,腳本需要接受/ 24網(wǎng)絡(luò)地址作為參數(shù)。 下一行代碼從提供的網(wǎng)絡(luò)地址中提取網(wǎng)絡(luò)前綴堪嫂。 例如偎箫,如果提供的網(wǎng)絡(luò)地址是192.168.11.0,則前綴變量將被賦值為192.168.11皆串。 然后對/ 24范圍內(nèi)的每個地址執(zhí)行hping3操作淹办,并將每個任務(wù)的結(jié)果輸出放入handle.txt文件中。

root@KaliLinux:~# ./udp_sweep.sh 
Usage - ./udp_sweep.sh [/24 network address] 
Example - ./udp_sweep.sh 172.16.36.0 
Example will perform a UDP ping sweep of the 172.16.36.0/24 network and output to an output.txt file
root@KaliLinux:~# ./udp_sweep.sh 172.16.36.0
--- 172.16.36.1 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms
--- 172.16.36.2 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms
--- 172.16.36.3 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms
                *** {TRUNCATED} ***
root@KaliLinux:~# ls output.txt 
output.txt 
root@KaliLinux:~# cat output.txt 
172.16.36.132 
172.16.36.135 
172.16.36.253 

當(dāng)腳本運(yùn)行時恶复,你仍然會看到在初始循環(huán)任務(wù)時看到的大量輸出怜森。 幸運(yùn)的是,你發(fā)現(xiàn)的主機(jī)列表不會在此輸出中消失谤牡,因?yàn)樗看味紩懭肽愕妮敵鑫募?/p>

你還可以使用hping3執(zhí)行 TCP 發(fā)現(xiàn)副硅。 TCP 模式實(shí)際上是hping3使用的默認(rèn)發(fā)現(xiàn)模式,并且可以通過將要掃描的 IP 地址傳遞到hping3來使用此模式:

root@KaliLinux:~# hping3 172.16.36.132 
HPING 172.16.36.132 (eth1 172.16.36.132): NO FLAGS are set, 40 headers + 0 data bytes 
len=46 ip=172.16.36.132 ttl=64 DF id=0 sport=0 flags=RA seq=0 win=0 rtt=3.7 ms 
len=46 ip=172.16.36.132 ttl=64 DF id=0 sport=0 flags=RA seq=1 win=0 rtt=0.7 ms 
len=46 ip=172.16.36.132 ttl=64 DF id=0 sport=0 flags=RA seq=2 win=0 rtt=2.6 ms 
^C 
--- 172.16.36.132 hping statistic --
3 packets transmitted, 3 packets received, 0% packet loss 
round-trip min/avg/max = 0.7/2.3/3.7 ms

我們之前創(chuàng)建一個bash腳本循環(huán)訪問/ 24網(wǎng)絡(luò)并使用hping3執(zhí)行 UDP 發(fā)現(xiàn)翅萤,與之相似恐疲,我們可以為 TCP 發(fā)現(xiàn)創(chuàng)建一個類似的腳本。 首先,必須確定唯一短語培己,它存在于活動主機(jī)的相關(guān)輸出中碳蛋,但不在非響應(yīng)主機(jī)的相關(guān)輸出中。 為此省咨,我們必須評估每個響應(yīng):

root@KaliLinux:~# hping3 172.16.36.132 -c 1 
HPING 172.16.36.132 (eth1 172.16.36.132): NO FLAGS are set, 40 headers + 0 data bytes 
len=46 ip=172.16.36.132 ttl=64 DF id=0 sport=0 flags=RA seq=0 win=0 rtt=3.4 ms
--- 172.16.36.132 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 3.4/3.4/3.4 ms 
root@KaliLinux:~# hping3 172.16.36.131 -c 1 
HPING 172.16.36.131 (eth1 172.16.36.131): NO FLAGS are set, 40 headers + 0 data bytes
--- 172.16.36.131 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms 

在這種情況下肃弟,長度值僅存在于活動主機(jī)的相關(guān)輸出中。 再一次茸炒,我們可以開發(fā)一個腳本愕乎,將輸出重定向到臨時handle文件,然后grep此文件的輸出來確定活動主機(jī):

#!/bin/bash
if [ "$#" -ne 1 ]; then 
    echo "Usage - ./tcp_sweep.sh [/24 network address]" 
    echo "Example - ./tcp_sweep.sh 172.16.36.0" 
    echo "Example will perform a TCP ping sweep of the 172.16.36.0/24 network and output to an output.txt file" 
    exit 
fi

prefix=$(echo $1 | cut -d '.' -f 1-3)

for addr in $(seq 1 254); do 
    hping3 $prefix.$addr -c 1 >> handle.txt; 
done

grep len handle.txt | cut -d " " -f 2 | cut -d "=" -f 2 >> output.txt
 rm handle.txt

此腳本的執(zhí)行方式類似于 UDP 發(fā)現(xiàn)腳本壁公。 唯一的區(qū)別是在循環(huán)序列中執(zhí)行的命令感论,grep值和提取 IP 地址的過程。 執(zhí)行后紊册,此腳本將生成一個output.txt文件比肄,其中將包含使用 TCP 發(fā)現(xiàn)方式來發(fā)現(xiàn)的主機(jī)的相關(guān) IP 地址列表。

root@KaliLinux:~# ./tcp_sweep.sh 
Usage - ./tcp_sweep.sh [/24 network address] 
Example - ./tcp_sweep.sh 172.16.36.0 
Example will perform a TCP ping sweep of the 172.16.36.0/24 network and output to an output.txt file 
root@KaliLinux:~# ./tcp_sweep.sh 172.16.36.0
--- 172.16.36.1 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 0.4/0.4/0.4 ms
--- 172.16.36.2 hping statistic --
1 packets transmitted, 1 packets received, 0% packet loss 
round-trip min/avg/max = 0.6/0.6/0.6 ms
--- 172.16.36.3 hping statistic --
1 packets transmitted, 0 packets received, 100% packet loss 
round-trip min/avg/max = 0.0/0.0/0.0 ms
                    *** {TRUNCATED} *** 

你可以使用ls命令確認(rèn)輸出文件是否已寫入執(zhí)行目錄囊陡,并使用cat命令讀取其內(nèi)容芳绩。 這可以在以下示例中看到:

root@KaliLinux:~# ls output.txt 
output.txt 
root@KaliLinux:~# cat output.txt 
172.16.36.1 
172.16.36.2 
172.16.36.132 
172.16.36.135 
172.16.36.253

工作原理

在提供的示例中,hping3使用 ICMP 主機(jī)不可達(dá)響應(yīng)撞反,來標(biāo)識具有 UDP 請求的活動主機(jī)妥色,并使用空標(biāo)志掃描來標(biāo)識具有 TCP 請求的活動主機(jī)。 對于 UDP 發(fā)現(xiàn)遏片,一系列空 UDP 請求被發(fā)送到任意目標(biāo)端口嘹害,來試圖請求響應(yīng)。 對于 TCP 發(fā)現(xiàn)吮便,一系列 TCP 請求被發(fā)送到目的端口 0笔呀,并沒有激活標(biāo)志位。 所提供的示例請求激活了 ACK + RST 標(biāo)志的響應(yīng)髓需。 這些任務(wù)中的每一個都傳遞給了 bash 中的循環(huán)许师,來在多個主機(jī)或一系列地址上執(zhí)行掃描。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末僚匆,一起剝皮案震驚了整個濱河市微渠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咧擂,老刑警劉巖逞盆,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屋确,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門攻臀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焕数,“玉大人,你說我怎么就攤上這事刨啸”づ猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵碳锈,是天一觀的道長抖剿。 經(jīng)常有香客問我飒筑,道長,這世上最難降的妖魔是什么换团? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮宫蛆,結(jié)果婚禮上艘包,老公的妹妹穿的比我還像新娘。我一直安慰自己耀盗,他們只是感情好想虎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叛拷,像睡著了一般舌厨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忿薇,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天裙椭,我揣著相機(jī)與錄音,去河邊找鬼煌恢。 笑死骇陈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瑰抵。 我是一名探鬼主播你雌,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼二汛!你這毒婦竟也來了婿崭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤肴颊,失蹤者是張志新(化名)和其女友劉穎氓栈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婿着,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡授瘦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年醋界,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片提完。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡形纺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出徒欣,到底是詐尸還是另有隱情逐样,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布打肝,位于F島的核電站脂新,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粗梭。R本人自食惡果不足惜争便,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望楼吃。 院中可真熱鬧始花,春花似錦、人聲如沸孩锡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躬窜。三九已至浇垦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荣挨,已是汗流浹背男韧。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留默垄,地道東北人此虑。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像口锭,于是被迫代替她去往敵國和親朦前。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容