Kali Linux 網(wǎng)絡(luò)掃描秘籍 第三章 端口掃描(二)

第三章 端口掃描(二)

作者:Justin Hutchens

譯者:飛龍

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

3.6 Scapy 隱秘掃描

執(zhí)行 TCP 端口掃描的一種方式就是執(zhí)行一部分搬设。目標(biāo)端口上的 TCP 三次握手用于識(shí)別端口是否接受連接。這一類型的掃描指代隱秘掃描阵谚, SYN 掃描钞翔,或者半開(kāi)放掃描口叙。這個(gè)秘籍演示了如何使用 Scapy 執(zhí)行 TCP 隱秘掃描。

準(zhǔn)備

為了使用 Scapy 執(zhí)行 TCP 隱秘 掃描嗅战,你需要一個(gè)運(yùn)行 TCP 網(wǎng)絡(luò)服務(wù)的遠(yuǎn)程服務(wù)器妄田。這個(gè)例子中我們使用 Metasploitable2 實(shí)例來(lái)執(zhí)行任務(wù)俺亮。配置 Metasploitable2 的更多信息請(qǐng)參考第一章中的“安裝 Metasploitable2”秘籍。

此外疟呐,這一節(jié)也需要編寫腳本的更多信息脚曾,請(qǐng)參考第一章中的“使用文本編輯器*VIM 和 Nano)。

操作步驟

為了展示如何執(zhí)行 SYN 掃描启具,我們需要使用 Scapy 構(gòu)造 TCP SYN 請(qǐng)求本讥,并識(shí)別和開(kāi)放端口、關(guān)閉端口以及無(wú)響應(yīng)系統(tǒng)有關(guān)的響應(yīng)鲁冯。為了向給定端口發(fā)送 TCP SYN 請(qǐng)求拷沸,我們首先需要構(gòu)建請(qǐng)求的各個(gè)層面。我們需要構(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\

為了構(gòu)建請(qǐng)求的 IP 層薯演,我們需要將IP對(duì)象賦給變量i撞芍。通過(guò)調(diào)用display函數(shù),我們可以確定對(duì)象的屬性配置跨扮。通常序无,發(fā)送和接受地址都設(shè)為回送地址,127.0.0.1衡创。這些值可以通過(guò)修改目標(biāo)地址來(lái)修改帝嗡,也就是設(shè)置i.dst為想要掃描的地址的字符串值。通過(guò)再次調(diào)用dislay函數(shù)璃氢,我們看到不僅僅更新的目標(biāo)地址哟玷,也自動(dòng)更新了和默認(rèn)接口相關(guān)的源 IP 地址⊥姿冢現(xiàn)在我們構(gòu)建了請(qǐng)求的 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= {}

為了構(gòu)建請(qǐng)求的 TCP 層岳瞭,我們使用和 IP 層相同的技巧殿如。在這個(gè)立即中蟆豫,TCP對(duì)象賦給了t變量棍潘。像之前提到的那樣裕偿,默認(rèn)的配置可以通過(guò)調(diào)用display函數(shù)來(lái)確定尊剔。這里我們可以看到目標(biāo)端口的默認(rèn)值為 HTTP 端口 80爪幻。對(duì)于我們的首次掃描,我們將 TCP 設(shè)置保留默認(rèn)⌒胛螅現(xiàn)在我們創(chuàng)建了 TCP 和 IP 層挨稿,我們需要將它們疊放來(lái)構(gòu)造請(qǐng)求。

>>> 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= S     
    window= 8192     
    chksum= None     
    urgptr= 0     
    options= {}

我們可以通過(guò)以斜杠分離變量來(lái)疊放 IP 和 TCP 層京痢。這些層面之后賦給了新的變量奶甘,它代表整個(gè)請(qǐng)求。我們之后可以調(diào)用dispaly函數(shù)來(lái)查看請(qǐng)求的配置祭椰。一旦構(gòu)建了請(qǐng)求臭家,可以將其傳遞給sr1函數(shù)來(lái)分析響應(yīng):

>>> response = sr1(request) 
...Begin emission: 
........Finished to send 1 packets. 
....* 
Received 16 packets, got 1 answers, remaining 0 packets 
>>> response.display() 
###[ IP ]###  
    version= 4L  
    ihl= 5L  
    tos= 0x0  
    len= 44
    id= 0  
    flags= DF  
    frag= 0L  
    ttl= 64  
    proto= tcp  
    chksum= 0x9970  
    src= 172.16.36.135  
    dst= 172.16.36.180  
    \options\ 
###[ TCP ]###     
    sport= http     
    dport= ftp_data     
    seq= 2848210323L     
    ack= 1     
    dataofs= 6L     
    reserved= 0L     
    flags= SA     
    window= 5840     
    chksum= 0xf82d     
    urgptr= 0     
    options= [('MSS', 1460)] 
###[ Padding ]###        
    load= '\x00\x00'

相同的請(qǐng)求可以不通過(guò)構(gòu)建和堆疊每一層來(lái)執(zhí)行疲陕。反之,我們使用單獨(dú)的一條命令钉赁,通過(guò)直接調(diào)用函數(shù)并傳遞合適的參數(shù):

>>> sr1(IP(dst="172.16.36.135")/TCP(dport=80)) 
.Begin emission: .............Finished to send 1 packets. 
....* 
Received 19 packets, got 1 answers, remaining 0 packets 
<IP  version=4L ihl=5L tos=0x0 len=44 id=0 flags=DF frag=0L ttl=64 proto=tcp chksum=0x9970 src=172.16.36.135 dst=172.16.36.180 options=[] |<TCP  sport=http dport=ftp_data seq=542529227 ack=1 dataofs=6L reserved=0L flags=SA window=5840 chksum=0x6864 urgptr=0 options=[('MSS', 1460)] |<Padding  load='\x00\x00' |>>>

要注意當(dāng) SYN 封包發(fā)往目標(biāo) Web 服務(wù)器的 TCP 端口 80蹄殃,并且該端口上運(yùn)行了 HTTP 服務(wù)時(shí),響應(yīng)中會(huì)帶有 TCP 標(biāo)識(shí) SA 的值你踩,這表明 SYN 和 ACK 標(biāo)識(shí)都被激活诅岩。這個(gè)響應(yīng)表明特定的目標(biāo)端口是開(kāi)放的,并接受連接带膜。如果相同類型的封包發(fā)往不接受連接的端口吩谦,會(huì)收到不同的請(qǐng)求。

>>> response = sr1(IP(dst="172.16.36.135")/TCP(dport=4444)) 
..Begin emission: 
.Finished to send 1 packets. 
...* Received 7 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= 4444    
    dport= ftp_data 
    seq= 0   
    ack= 1   
    dataofs= 5L  
    reserved= 0L  
    flags= RA  
    window= 0    
    chksum= 0xfd03   
    urgptr= 0
    options= {} 
###[ Padding ]###   
    load= '\x00\x00\x00\x00\x00\x00'

當(dāng) SYN 請(qǐng)求發(fā)送給關(guān)閉的端口時(shí)膝藕,返回的響應(yīng)中帶有 TCP 標(biāo)識(shí) RA式廷,這表明 RST 和 ACK 標(biāo)識(shí)為都被激活。ACK 為僅僅用于承認(rèn)請(qǐng)求被接受束莫,RST 為用于斷開(kāi)連接懒棉,因?yàn)槎丝诓唤邮苓B接草描。作為替代览绿,如果 SYN 封包發(fā)往崩潰的系統(tǒng),或者防火墻過(guò)濾了這個(gè)請(qǐng)求穗慕,就可能接受不到任何信息饿敲。由于這個(gè)原因,在sr1函數(shù)在腳本中使用時(shí)逛绵,應(yīng)該始終使用timeout選項(xiàng)怀各,來(lái)確保腳本不會(huì)在無(wú)響應(yīng)的主機(jī)上掛起。

>>> response = sr1(IP(dst="172.16.36.136")/TCP(dport=4444),timeout=1,verb ose=1) 
Begin emission: 
Finished to send 1 packets

Received 15 packets, got 0 answers, remaining 1 packets 

如果函數(shù)對(duì)無(wú)響應(yīng)的主機(jī)使用時(shí)术浪,timeout值沒(méi)有指定瓢对,函數(shù)會(huì)無(wú)限繼續(xù)下去。這個(gè)演示中胰苏,timout值為 1秒硕蛹,用于使這個(gè)函數(shù)更加完備,響應(yīng)的值可以用于判斷是否收到了響應(yīng):

root@KaliLinux:~# 
python Python 2.7.3 (default, Jan  2 2013, 16:53:07) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from scapy.all import * 
>>> response = sr1(IP(dst="172.16.36.136")/TCP(dport=4444),timeout=1,verb ose=1) 
Begin emission: 
WARNING: Mac address to reach destination not found. Using broadcast. Finished to send 1 packets.

Received 15 packets, got 0 answers, remaining 1 packets 
>>> if response == None: 
...     print "No Response!!!" 
... 
No Response!!!

Python 的使用使其更易于測(cè)試變量來(lái)識(shí)別sr1函數(shù)是否對(duì)其復(fù)制硕并。這可以用作初步檢驗(yàn)法焰,來(lái)判斷是否接收到了任何響應(yīng)。對(duì)于接收到的響應(yīng)倔毙,可以執(zhí)行一系列后續(xù)檢查來(lái)判斷響應(yīng)表明端口開(kāi)放還是關(guān)閉埃仪。這些東西可以輕易使用 Python 腳本來(lái)完成,像這樣:

#!/usr/bin/python

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

if len(sys.argv) != 4:   
    print "Usage - ./syn_scan.py [Target-IP] [First Port] [Last Port]"   
    print "Example - ./syn_scan.py 10.0.0.5 1 100"   
    print "Example will TCP SYN scan ports 1 through 100 on 10.0.0.5"   
    sys.exit()

ip = sys.argv[1] 
start = int(sys.argv[2]) 
end = int(sys.argv[3])

for port in range(start,end):   
    ans = sr1(IP(dst=ip)/TCP(dport=port),timeout=1,verbose=0)   
    if ans == None:      
        pass   
    else:      
        if int(ans[TCP].flags) == 18:    
            print port  
        else:       
            pass 

在這個(gè) Python 腳本中陕赃,用于被提示來(lái)輸入 IP 地址卵蛉,腳本之后會(huì)對(duì)定義好的端口序列執(zhí)行 SYN 掃描颁股。腳本之后會(huì)得到每個(gè)連接的響應(yīng),并嘗試判斷響應(yīng)的 SYN 和 ACK 標(biāo)識(shí)是否激活毙玻。如果響應(yīng)中出現(xiàn)并僅僅出現(xiàn)了這些標(biāo)識(shí)豌蟋,那么會(huì)輸出相應(yīng)的端口號(hào)碼。

root@KaliLinux:~# chmod 777 syn_scan.py 
root@KaliLinux:~# ./syn_scan.py 
Usage - ./syn_scan.py [Target-IP] [First Port] [Last Port] 
Example - ./syn_scan.py 10.0.0.5 1 100 
Example will TCP SYN scan ports 1 through 100 on 10.0.0.5 
root@KaliLinux:~# ./syn_scan.py 172.16.36.135 1 100

21 
22 
23 
25 
53 
80 

運(yùn)行這個(gè)腳本之后桑滩,輸出會(huì)顯示所提供的 IP 地址的系統(tǒng)上梧疲,前 100 個(gè)端口中的開(kāi)放端口。

工作原理

這一類型的掃描由發(fā)送初始 SYN 封包給遠(yuǎn)程系統(tǒng)的目標(biāo) TCP 端口运准,并且通過(guò)返回的響應(yīng)類型來(lái)判斷端口狀態(tài)來(lái)完成幌氮。如果遠(yuǎn)程系統(tǒng)返回了 SYN+ACK 響應(yīng),那么它正在準(zhǔn)備建立連接胁澳,我們可以假設(shè)這個(gè)端口開(kāi)放该互。如果服務(wù)返回了 RST 封包,這就表明端口關(guān)閉并且不接收連接韭畸。此外宇智,如果沒(méi)有返回響應(yīng),掃描系統(tǒng)和遠(yuǎn)程系統(tǒng)之間可能存在防火墻胰丁,它丟棄了請(qǐng)求随橘。這也可能表明主機(jī)崩潰或者目標(biāo) IP 上沒(méi)有關(guān)聯(lián)任何系統(tǒng)。

3.7 Nmap 隱秘掃描

Nmap 擁有可以執(zhí)行遠(yuǎn)程系統(tǒng) SYN 掃描的掃描模式锦庸。這個(gè)秘籍展示了如何使用 Namp 執(zhí)行 TCP 隱秘掃描机蔗。

準(zhǔn)備

為了使用 Nmap 執(zhí)行 TCP 隱秘掃描,你需要一個(gè)運(yùn)行 TCP 網(wǎng)絡(luò)服務(wù)的遠(yuǎn)程服務(wù)器甘萧。這個(gè)例子中我們使用 Metasploitable2 實(shí)例來(lái)執(zhí)行任務(wù)萝嘁。配置 Metasploitable2 的更多信息請(qǐng)參考第一章中的“安裝 Metasploitable2”秘籍。

操作步驟

就像多數(shù)掃描需求那樣扬卷,Nmap 擁有簡(jiǎn)化 TCP 隱秘掃描執(zhí)行過(guò)程的選項(xiàng)牙言。為了使用 Nmap 執(zhí)行 TCP 隱秘掃描,應(yīng)使用-sS選項(xiàng)怪得,并附帶被掃描主機(jī)的 IP 地址咱枉。

root@KaliLinux:~# nmap -sS 172.16.36.135 -p 80

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:47 EST
Nmap scan report for 172.16.36.135 
Host is up (0.00043s latency). 
PORT   STATE SERVICE 
80/tcp open  http 
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 13.05 seconds 

在提供的例子中,特定的 IP 地址的 TCP 80 端口上執(zhí)行了 TCP 隱秘掃描汇恤。和 Scapy 中的技巧相似庞钢,Nmap 監(jiān)聽(tīng)響應(yīng)并通過(guò)分析響應(yīng)中所激活的 TCP 標(biāo)識(shí)來(lái)識(shí)別開(kāi)放端口。我們也可以使用 Namp 執(zhí)行多個(gè)特定端口的掃描因谎,通過(guò)傳遞逗號(hào)分隔的端口號(hào)列表基括。

root@KaliLinux:~# nmap -sS 172.16.36.135 -p 21,80,443

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:48 EST 
Nmap scan report for 172.16.36.135 
Host is up (0.00035s latency). 
PORT    STATE  SERVICE 
21/tcp  open   ftp 
80/tcp  open   http 
443/tcp closed https 
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 13.05 seconds 

在這個(gè)例子中,目標(biāo) IP 地址的端口 21财岔、80 和 443 上執(zhí)行了 SYN 掃描风皿。我們也可以使用 Namp 來(lái)掃描主機(jī)序列河爹,通過(guò)標(biāo)明要掃描的第一個(gè)和最后一個(gè)端口號(hào),以破折號(hào)分隔:

root@KaliLinux:~# nmap -sS 172.16.36.135 -p 20-25

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:48 EST 
Nmap scan report for 172.16.36.135 
Host is up (0.00035s latency). 
PORT   STATE  SERVICE 
20/tcp closed ftp-data 
21/tcp open   ftp
22/tcp open   ssh 
23/tcp open   telnet 
24/tcp closed priv-mail 
25/tcp open   smtp 
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 13.05 seconds 

在所提供的例子中桐款,SYN 掃描在 TCP 20 到 25 端口上執(zhí)行咸这。除了擁有指定被掃描端口的能力之外。Nmap 同時(shí)擁有配置好的 1000 和常用端口的列表魔眨。我們可以執(zhí)行這些端口上的掃描媳维,通過(guò)不帶任何端口指定信息來(lái)運(yùn)行 Nmap:

root@KaliLinux:~# nmap -sS 172.16.36.135

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:46 EST 
Nmap scan report for 172.16.36.135 
Host is up (0.00038s latency). N
ot shown: 977 closed ports 
PORT     STATE SERVICE 
21/tcp   open  ftp 
22/tcp   open  ssh 
23/tcp   open  telnet 
25/tcp   open  smtp 
53/tcp   open  domain 
80/tcp   open  http 
111/tcp  open  rpcbind 
139/tcp  open  netbios-ssn 
445/tcp  open  microsoft-ds 
512/tcp  open  exec 
513/tcp  open  login 
514/tcp  open  shell 
1099/tcp open  rmiregistry 
1524/tcp open  ingreslock 
2049/tcp open  nfs 
2121/tcp open  ccproxy-ftp 
3306/tcp open  mysql
5432/tcp open  postgresql 
5900/tcp open  vnc 
6000/tcp open  X11 
6667/tcp open  irc 
8009/tcp open  ajp13 
8180/tcp open  unknown 
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 13.17 seconds 

在上面的例子中,掃描了 Nmap 定義的 1000 個(gè)常用端口遏暴,用于識(shí)別 Metasploitable2 系統(tǒng)上的大量開(kāi)放端口侄刽。雖然這個(gè)技巧在是被多數(shù)設(shè)備上很高效,但是也可能無(wú)法識(shí)別模糊的服務(wù)或者不常見(jiàn)的端口組合朋凉。如果掃描在所有可能的 TCP 端口上執(zhí)行州丹,所有可能的端口地址值都需要被掃描。定義了源端口和目標(biāo)端口地址的 TCP 頭部部分是 16 位長(zhǎng)杂彭。并且墓毒,每一位可以為 1 或者 0。因此亲怠,共有2 ** 16或者 65536 個(gè)可能的 TCP 端口地址所计。對(duì)于要掃描的全部可能的地址空間,需要提供 0 到 65535 的端口范圍赁炎,像這樣:

root@KaliLinux:~# nmap -sS 172.16.36.135 -p 0-65535

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:51 EST 
Nmap scan report for 172.16.36.135 
Host is up (0.00033s latency). 
Not shown: 65506 closed ports 
PORT      STATE SERVICE 
21/tcp    open  ftp 
22/tcp    open  ssh 
23/tcp    open  telnet 
25/tcp    open  smtp 
53/tcp    open  domain 
80/tcp    open  http 
111/tcp   open  rpcbind 
139/tcp   open  netbios-ssn 
445/tcp   open  microsoft-ds 
512/tcp   open  exec 
513/tcp   open  login 
514/tcp   open  shell
1099/tcp  open  rmiregistry 
1524/tcp  open  ingreslock 
2049/tcp  open  nfs 
2121/tcp  open  ccproxy-ftp 
3306/tcp  open  mysql 
3632/tcp  open  distccd 
5432/tcp  open  postgresql 
5900/tcp  open  vnc 
6000/tcp  open  X11 
6667/tcp  open  irc 
6697/tcp  open  unknown 
8009/tcp  open  ajp13 
8180/tcp  open  unknown 
8787/tcp  open  unknown 
34789/tcp open  unknown 
50333/tcp open  unknown 
56375/tcp open  unknown 
57385/tcp open  unknown 
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 16.78 seconds 

這個(gè)例子中醉箕,Metasploitable2 系統(tǒng)上所有可能的 65536 和 TCP 地址都掃描了一遍钾腺。要注意該掃描中識(shí)別的多數(shù)服務(wù)都在標(biāo)準(zhǔn)的 Nmap 1000 掃描中識(shí)別過(guò)了徙垫。這就表明在嘗試識(shí)別目標(biāo)的所有可能的攻擊面的時(shí)候,完整掃描是個(gè)最佳實(shí)踐放棒。Nmap 可以使用破折號(hào)記法姻报,掃描主機(jī)列表上的 TCP 端口:

root@KaliLinux:~# nmap 172.16.36.0-255 -sS -p 80

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:56 EST 
Nmap scan report for 172.16.36.1 Host is up (0.00023s latency). 
PORT   STATE  SERVICE 
80/tcp closed http 
MAC Address: 00:50:56:C0:00:08 (VMware)

Nmap scan report for 172.16.36.2 Host is up (0.00018s latency). 
PORT   STATE  SERVICE 
80/tcp closed http 
MAC Address: 00:50:56:FF:2A:8E (VMware)

Nmap scan report for 172.16.36.132 Host is up (0.00047s latency). 
PORT   STATE  SERVICE 
80/tcp closed http 
MAC Address: 00:0C:29:65:FC:D2 (VMware)

Nmap scan report for 172.16.36.135 
Host is up (0.00016s latency). 
PORT   STATE SERVICE 
80/tcp open  http 
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap scan report for 172.16.36.180 
Host is up (0.0029s latency). 
PORT   STATE SERVICE 
80/tcp open  http

Nmap done: 256 IP addresses (5 hosts up) scanned in 42.85 seconds 

這個(gè)例子中,TCP 80 端口的 SYN 掃描在指定地址范圍內(nèi)的所有主機(jī)上執(zhí)行间螟。雖然這個(gè)特定的掃描僅僅執(zhí)行在單個(gè)端口上吴旋,Nmap 也能夠同時(shí)掃描多個(gè)系統(tǒng)上的多個(gè)端口和端口范圍。此外厢破,Nmap 也能夠進(jìn)行配置荣瑟,基于 IP 地址的輸入列表來(lái)掃描主機(jī)。這可以通過(guò)-iL選項(xiàng)并指定文件名摩泪,如果文件存放于執(zhí)行目錄中笆焰,或者文件路徑來(lái)完成。Nmap 之后會(huì)遍歷輸入列表中的每個(gè)地址见坑,并對(duì)地址執(zhí)行特定的掃描嚷掠。

root@KaliLinux:~# cat iplist.txt 
172.16.36.1 
172.16.36.2 
172.16.36.132 
172.16.36.135

root@KaliLinux:~# nmap -sS -iL iplist.txt -p 80

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:59 EST 
Nmap scan report for 172.16.36.1 
Host is up (0.00016s latency). 
PORT   STATE  SERVICE 
80/tcp closed http 
MAC Address: 00:50:56:C0:00:08 (VMware)

Nmap scan report for 172.16.36.2 
Host is up (0.00047s latency). 
PORT   STATE  SERVICE 
80/tcp closed http 
MAC Address: 00:50:56:FF:2A:8E (VMware)

Nmap scan report for 172.16.36.132 
Host is up (0.00034s latency). 
PORT   STATE  SERVICE 
80/tcp closed http 
MAC Address: 00:0C:29:65:FC:D2 (VMware)

Nmap scan report for 172.16.36.135 
Host is up (0.00016s latency). 
PORT   STATE SERVICE 
80/tcp open  http 
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 4 IP addresses (4 hosts up) scanned in 13.05 seconds

工作原理

Nmap SYN 掃描背后的底層機(jī)制已經(jīng)討論過(guò)了捏检。但是,Nmap 擁有多線程功能不皆,是用于執(zhí)行這類掃描的快速高效的方式贯城。

3.8 Metasploit 隱秘掃描

除了其它已經(jīng)討論過(guò)的工具之外,Metasploit 擁有用于 SYN 掃描的輔助模塊霹娄。這個(gè)秘籍展示了如何使用 Metasploit 來(lái)執(zhí)行 TCP 隱秘掃描能犯。

準(zhǔn)備

為了使用 Metasploit 執(zhí)行 TCP 隱秘掃描,你需要一個(gè)運(yùn)行 TCP 網(wǎng)絡(luò)服務(wù)的遠(yuǎn)程服務(wù)器犬耻。這個(gè)例子中我們使用 Metasploitable2 實(shí)例來(lái)執(zhí)行任務(wù)悲雳。配置 Metasploitable2 的更多信息請(qǐng)參考第一章中的“安裝 Metasploitable2”秘籍。

操作步驟

Metasploit 擁有可以對(duì)特定 TCP 端口執(zhí)行 SYN 掃描的輔助模塊香追。為了在 Kali 中啟動(dòng) Metasploit合瓢,我們?cè)诮K端中執(zhí)行msfconsole命令。

root@KaliLinux:~# msfconsole 
IIIIII    dTb.dTb        _.---._
  II     4'  v  'B   .'"".'/|\`.""'.  
  II     6.     .P  :  .' / | \ `.  :  
  II     'T;. .;P'  '.'  /  |  \  `.'  
  II      'T; ;P'    `. /   |   \ .' 
IIIIII     'YvP'       `-.__|__.-'

I love shells --egypt

Using notepad to track pentests? Have Metasploit Pro report on hosts, services, sessions and evidence -- type 'go_pro' to launch it now.

       =[ metasploit v4.6.0-dev [core:4.6 api:1.0] 
+ -- --=[ 1053 exploits - 590 auxiliary - 174 post 
+ -- --=[ 275 payloads - 28 encoders - 8 nops

msf > use auxiliary/scanner/portscan/syn 
msf  auxiliary(syn) > show options

Module options (auxiliary/scanner/portscan/syn):
   
    Name       Current Setting  Required  Description   
    ----       ---------------  --------  ----------   
    BATCHSIZE  256              yes       The number of hosts to scan per set   
    INTERFACE                   no        The name of the interface   
    PORTS      1-10000          yes       Ports to scan (e.g. 2225,80,110-900)   
    RHOSTS                      yes       The target address range or CIDR identifier   
    SNAPLEN    65535            yes       The number of bytes to capture   
    THREADS    1                yes       The number of concurrent threads   
    TIMEOUT    500              yes       The reply read timeout in milliseconds 

為了在 Metasploit 中執(zhí)行 SYN 掃描透典,以輔助模塊的相對(duì)路徑調(diào)用use命令晴楔。一旦模塊被選中,可以執(zhí)行show options命令來(lái)確認(rèn)或修改掃描配置峭咒。這個(gè)命令會(huì)展示四列的表格税弃,包括namecurrent settings凑队、requireddescription则果。name列標(biāo)出了每個(gè)可配置變量的名稱。current settings列列出了任何給定變量的現(xiàn)有配置漩氨。required列標(biāo)出對(duì)于任何給定變量西壮,值是否是必須的。description列描述了每個(gè)變量的功能叫惊。任何給定變量的值可以使用set命令款青,并且將新的值作為參數(shù)來(lái)修改。

msf  auxiliary(syn) > set RHOSTS 172.16.36.135 
RHOSTS => 172.16.36.135 
msf  auxiliary(syn) > set THREADS 20 
THREADS => 20 
msf  auxiliary(syn) > set PORTS 80 
PORTS => 80 
msf  auxiliary(syn) > show options

Module options (auxiliary/scanner/portscan/syn):

   Name       Current Setting  Required  Description   
   ----       ---------------  --------  ----------   
   BATCHSIZE  256              yes       The number of hosts to scan per set
   INTERFACE                   no        The name of the interface   
   PORTS      80               yes       Ports to scan (e.g. 2225,80,110-900)   
   RHOSTS     172.16.36.135    yes       The target address range or CIDR identifier   
   SNAPLEN    65535            yes       The number of bytes to capture   
   THREADS    20               yes       The number of concurrent threads   
   TIMEOUT    500              yes       The reply read timeout in milliseconds

在上面的例子中霍狰,RHOSTS值修改為我們打算掃描的遠(yuǎn)程系統(tǒng)的 IP 地址抡草。地外,線程數(shù)量修改為 20蔗坯。THREADS的值定義了在后臺(tái)執(zhí)行的當(dāng)前任務(wù)數(shù)量康震。確定線程數(shù)量涉及到尋找一個(gè)平衡,既能提升任務(wù)速度宾濒,又不會(huì)過(guò)度消耗系統(tǒng)資源腿短。對(duì)于多數(shù)系統(tǒng),20 個(gè)線程可以足夠快答姥,并且相當(dāng)合理铣除。PORTS值設(shè)為 TCP 端口 80(HTTP)。修改了必要的變量之后鹦付,可以再次使用show options命令來(lái)驗(yàn)證尚粘。一旦所需配置驗(yàn)證完畢,就可以執(zhí)行掃描了敲长。

msf  auxiliary(syn) > run

[*] TCP OPEN 172.16.36.135:80 [*] Scanned 1 of 1 hosts (100% complete) 
[*] Auxiliary module execution completed The run command is used in Metasploit to execute the selected auxiliary module. In the example provided, the run command executed a TCP SYN scan against port 80 of the specified IP address. We can also run this TCP SYN scan module against a sequential series  of TCP ports by supplying the first and last values, separated by a dash notation:

msf  auxiliary(syn) > set PORTS 0-100 
PORTS => 0-100 
msf  auxiliary(syn) > show options

Module options (auxiliary/scanner/portscan/syn):

   Name       Current Setting  Required  Description   
   ----       ---------------  --------  ----------   
   BATCHSIZE  256              yes       The number of hosts to scan per set   
   INTERFACE                   no        The name of the interface
   PORTS      0-100            yes       Ports to scan (e.g. 2225,80,110-900)   
   RHOSTS     172.16.36.135    yes       The target address range or CIDR identifier   
   SNAPLEN    65535            yes       The number of bytes to capture   
   THREADS    20               yes       The number of concurrent threads   
   TIMEOUT    500              yes       The reply read timeout in milliseconds
   
msf  auxiliary(syn) > run

[*]  TCP OPEN 172.16.36.135:21 
[*]  TCP OPEN 172.16.36.135:22 
[*]  TCP OPEN 172.16.36.135:23 
[*]  TCP OPEN 172.16.36.135:25 
[*]  TCP OPEN 172.16.36.135:53 
[*]  TCP OPEN 172.16.36.135:80 
[*] Scanned 1 of 1 hosts (100% complete) 
[*] Auxiliary module execution completed 

上面的例子中郎嫁,所指定的遠(yuǎn)程主機(jī)的錢 100 個(gè) TCP 端口上執(zhí)行了 TCP SYN 掃描。雖然這個(gè)掃描識(shí)別了目標(biāo)系統(tǒng)的多個(gè)設(shè)備祈噪,我們不能確認(rèn)所有設(shè)備都識(shí)別出來(lái)泽铛,除非所有可能的端口地址都掃描到。定義來(lái)源和目標(biāo)端口地址的TCP 頭部部分是 16 位長(zhǎng)辑鲤。并且盔腔,每一位可以為 1 或者 0。因此月褥,共有2 ** 16或 65536 個(gè)可能的 TCP 端口地址弛随。對(duì)于要掃描的整個(gè)地址空間,需要提供 0 到 65535 的 端口范圍宁赤,像這樣:

msf  auxiliary(syn) > set PORTS 0-65535 
PORTS => 0-65535 
msf  auxiliary(syn) > show options

Module options (auxiliary/scanner/portscan/syn):

   Name       Current Setting  Required  Description   
   ----       ---------------  --------  ----------   
   BATCHSIZE  256              yes       The number of hosts to scan per set   
   INTERFACE                   no        The name of the interface
   PORTS      0-65535          yes       Ports to scan (e.g. 2225,80,110-900)   
   RHOSTS     172.16.36.135    yes       The target address range or CIDR identifier   
   SNAPLEN    65535            yes       The number of bytes to capture   
   THREADS    20               yes       The number of concurrent threads   
   TIMEOUT    500              yes       The reply read timeout in milliseconds 
   
msf  auxiliary(syn) > run

[*]  TCP OPEN 172.16.36.135:21 
[*]  TCP OPEN 172.16.36.135:22 
[*]  TCP OPEN 172.16.36.135:23 
[*]  TCP OPEN 172.16.36.135:25 
[*]  TCP OPEN 172.16.36.135:53 
[*]  TCP OPEN 172.16.36.135:80 
[*]  TCP OPEN 172.16.36.135:111 
[*]  TCP OPEN 172.16.36.135:139 
[*]  TCP OPEN 172.16.36.135:445 
[*]  TCP OPEN 172.16.36.135:512 
[*]  TCP OPEN 172.16.36.135:513 
[*]  TCP OPEN 172.16.36.135:514 
[*]  TCP OPEN 172.16.36.135:1099 
[*]  TCP OPEN 172.16.36.135:1524 
[*]  TCP OPEN 172.16.36.135:2049 
[*]  TCP OPEN 172.16.36.135:2121 
[*]  TCP OPEN 172.16.36.135:3306 
[*]  TCP OPEN 172.16.36.135:3632 
[*]  TCP OPEN 172.16.36.135:5432 
[*]  TCP OPEN 172.16.36.135:5900 
[*]  TCP OPEN 172.16.36.135:6000 
[*]  TCP OPEN 172.16.36.135:6667 
[*]  TCP OPEN 172.16.36.135:6697 
[*]  TCP OPEN 172.16.36.135:8009 
[*]  TCP OPEN 172.16.36.135:8180 
[*]  TCP OPEN 172.16.36.135:8787 
[*]  TCP OPEN 172.16.36.135:34789
[*]  TCP OPEN 172.16.36.135:50333 
[*]  TCP OPEN 172.16.36.135:56375 
[*]  TCP OPEN 172.16.36.135:57385 
[*] Scanned 1 of 1 hosts (100% complete) 
[*] Auxiliary module execution completed

在這個(gè)李忠舀透,遠(yuǎn)程系統(tǒng)的所有開(kāi)放端口都由掃描所有可能的 TCP 端口地址來(lái)識(shí)別。我們也可以修改掃描配置使用破折號(hào)記法來(lái)掃描地址序列决左。

msf  auxiliary(syn) > set RHOSTS 172.16.36.0-255 
RHOSTS => 172.16.36.0-255 
msf  auxiliary(syn) > show options

Module options (auxiliary/scanner/portscan/syn):

   Name       Current Setting  Required  Description   
   ----       ---------------  --------  ----------   
   BATCHSIZE  256              yes       The number of hosts to scan per set   
   INTERFACE                   no        The name of the interface   
   PORTS      80               yes       Ports to scan (e.g. 2225,80,110-900)   
   RHOSTS     172.16.36.0-255  yes       The target address range or CIDR identifier   
   SNAPLEN    65535            yes       The number of bytes to capture   
   THREADS    20               yes       The number of concurrent threads   
   TIMEOUT    500              yes       The reply read timeout in milliseconds
   
msf  auxiliary(syn) > run

[*] TCP OPEN 172.16.36.135:80 
[*] Scanned 256 of 256 hosts (100% complete) 
[*] Auxiliary module execution completed

這個(gè)例子中愕够,TCP SYN 掃描執(zhí)行在由RHOST變量指定的所有主機(jī)地址的 80 端口上。與之相似佛猛,RHOSTS可以使用 CIDR 記法定義網(wǎng)絡(luò)范圍惑芭。

msf  auxiliary(syn) > set RHOSTS 172.16.36.0/24 
RHOSTS => 172.16.36.0/24 
msf  auxiliary(syn) > show options

Module options (auxiliary/scanner/portscan/syn):

   Name       Current Setting  Required  Description   
   ----       ---------------  --------  ----------   
   BATCHSIZE  256              yes       The number of hosts to scan per set   
   INTERFACE                   no        The name of the interface   
   PORTS      80               yes       Ports to scan (e.g. 2225,80,110-900)   
   RHOSTS     172.16.36.0/24   yes       The target address range or CIDR identifier   
   SNAPLEN    65535            yes       The number of bytes to capture   
   THREADS    20               yes       The number of concurrent threads   
   TIMEOUT    500              yes       The reply read timeout in milliseconds
   
msf  auxiliary(syn) > run

[*] TCP OPEN 172.16.36.135:80 
[*] Scanned 256 of 256 hosts (100% complete) 
[*] Auxiliary module execution completed

工作原理

Metasploit SYN 掃描輔助模塊背后的底層原理和任何其它 SYN 掃描工具一樣。對(duì)于每個(gè)被掃描的端口挚躯,會(huì)發(fā)送 SYN 封包强衡。SYN+ACK 封包會(huì)用于識(shí)別活動(dòng)服務(wù)擦秽。使用 MEtasploit 可能更加有吸引力码荔,因?yàn)樗鼡碛薪换タ刂婆_(tái),也因?yàn)樗莻€(gè)已經(jīng)被多數(shù)滲透測(cè)試者熟知的工具感挥。

7.9 hping3 隱秘掃描

除了我們之前學(xué)到了探索技巧缩搅,hping3 也可以用于執(zhí)行端口掃描。這個(gè)秘籍展示了如何使用 hping3 來(lái)執(zhí)行 TCP 隱秘掃描触幼。

準(zhǔn)備

為了使用 hping3 執(zhí)行 TCP 隱秘掃描硼瓣,你需要一個(gè)運(yùn)行 TCP 網(wǎng)絡(luò)服務(wù)的遠(yuǎn)程服務(wù)器。這個(gè)例子中我們使用 Metasploitable2 實(shí)例來(lái)執(zhí)行任務(wù)。配置 Metasploitable2 的更多信息請(qǐng)參考第一章中的“安裝 Metasploitable2”秘籍堂鲤。

操作步驟

除了我們之前學(xué)到了探索技巧亿傅,hping3 也可以用于執(zhí)行端口掃描。為了使用 hping3 執(zhí)行端口掃描瘟栖,我們需要以一個(gè)整數(shù)值使用--scan模式來(lái)指定要掃描的端口號(hào)葵擎。

root@KaliLinux:~# hping3 172.16.36.135 --scan 80 -S 
Scanning 172.16.36.135 (172.16.36.135), port 80 
1 ports to scan, use -V to see all the replies 
+----+-----------+---------+---+-----+-----+-----+ 
|port| serv name |  flags  |ttl| id  | win | len | 
+----+-----------+---------+---+-----+-----+-----+   
   80 http       : .S..A...  64     0  5840    46 
All replies received. Done. 
Not responding ports: 

上面的例子中,SYN 掃描執(zhí)行在指定 IP 地址的 TCP 端口 80 上半哟。-S選項(xiàng)指明了發(fā)給遠(yuǎn)程系統(tǒng)的封包中激活的 TCP 標(biāo)識(shí)酬滤。表格展示了接收到的響應(yīng)封包中的屬性。我們可以從輸出中看到寓涨,接收到了SYN+ACK 響應(yīng)盯串,所以這表示目標(biāo)主機(jī)端口 80 是開(kāi)放的。此外戒良,我們可以通過(guò)輸入夠好分隔的端口號(hào)列表來(lái)掃描多個(gè)端口体捏,像這樣:

root@KaliLinux:~# hping3 172.16.36.135 --scan 22,80,443 -S 
Scanning 172.16.36.135 (172.16.36.135), port 22,80,443 
3 ports to scan, use -V to see all the replies
+----+-----------+---------+---+-----+-----+-----+ 
|port| serv name |  flags  |ttl| id  | win | len | 
+----+-----------+---------+---+-----+-----+-----+   
   22 ssh        : .S..A...  64     0  5840    46   
   80 http       : .S..A...  64     0  5840    46 
All replies received. Done. 
Not responding ports: 

在上面的掃描輸出中,你可以看到糯崎,僅僅展示了接受到 SYN+ACK 標(biāo)識(shí)的結(jié)果译打。要注意和發(fā)送到 443 端口的 SYN 請(qǐng)求相關(guān)的響應(yīng)并沒(méi)有展示。從輸出中可以看出拇颅,我們可以通過(guò)使用-v選項(xiàng)增加詳細(xì)讀來(lái)查看所有響應(yīng)胡陪。此外,可以通過(guò)傳遞第一個(gè)和最后一個(gè)端口地址值楞陷,來(lái)掃描端口范圍捧颅,像這樣:

root@KaliLinux:~# hping3 172.16.36.135 --scan 0-100 -S 
Scanning 172.16.36.135 (172.16.36.135), port 0-100 
101 ports to scan, use -V to see all the replies 
+----+-----------+---------+---+-----+-----+-----+ 
|port| serv name |  flags  |ttl| id  | win | len | 
+----+-----------+---------+---+-----+-----+-----+   
   21 ftp        : .S..A...  64     0  5840    46   
   22 ssh        : .S..A...  64     0  5840    46   
   23 telnet     : .S..A...  64     0  5840    46   
   25 smtp       : .S..A...  64     0  5840    46   
   53 domain     : .S..A...  64     0  5840    46   
   80 http       : .S..A...  64     0  5840    46 
All replies received. Done. 
Not responding ports: 

這個(gè)例子中,100 個(gè)端口的掃描足以識(shí)別 Metasploitable2 系統(tǒng)上的服務(wù)黄锤。但是搪缨,為了執(zhí)行 所有 TCP 端口的掃描,需要掃描所有可能的端口地址值鸵熟。定義了源端口和目標(biāo)端口地址的 TCP 頭部部分是 16 位長(zhǎng)副编。并且,每一位可以為 1 或者 0流强。因此痹届,共有2 ** 16或者 65536 個(gè)可能的 TCP 端口地址。對(duì)于要掃描的全部可能的地址空間打月,需要提供 0 到 65535 的端口范圍队腐,像這樣:

root@KaliLinux:~# hping3 172.16.36.135 --scan 0-65535 -S 
Scanning 172.16.36.135 (172.16.36.135), port 0-65535 
65536 ports to scan, use -V to see all the replies
+----+-----------+---------+---+-----+-----+-----+ 
|port| serv name |  flags  |ttl| id  | win | len | 
+----+-----------+---------+---+-----+-----+-----+   
   21 ftp        : .S..A...  64     0  5840    46   
   22 ssh        : .S..A...  64     0  5840    46   
   23 telnet     : .S..A...  64     0  5840    46   
   25 smtp       : .S..A...  64     0  5840    46   
   53 domain     : .S..A...  64     0  5840    46  
  111 sunrpc     : .S..A...  64     0  5840    46 
 1099 rmiregistry: .S..A...  64     0  5840    46 
 1524 ingreslock : .S..A...  64     0  5840    46 
 2121 iprop      : .S..A...  64     0  5840    46 
 8180            : .S..A...  64     0  5840    46 
34789            : .S..A...  64     0  5840    46  
  512 exec       : .S..A...  64     0  5840    46  
  513 login      : .S..A...  64     0  5840    46  
  514 shell      : .S..A...  64     0  5840    46 
 3632 distcc     : .S..A...  64     0  5840    46 
 5432 postgresql : .S..A...  64     0  5840    46 
56375            : .S..A...  64     0  5840    46   
   80 http       : .S..A...  64     0  5840    46  
  445 microsoft-d: .S..A...  64     0  5840    46 
 2049 nfs        : .S..A...  64     0  5840    46 
 6667 ircd       : .S..A...  64     0  5840    46
 6697            : .S..A...  64     0  5840    46 
57385            : .S..A...  64     0  5840    46  
  139 netbios-ssn: .S..A...  64     0  5840    46 
 6000 x11        : .S..A...  64     0  5840    46 
 3306 mysql      : .S..A...  64     0  5840    46 
 5900            : .S..A...  64     0  5840    46 
 8787            : .S..A...  64     0  5840    46 
50333            : .S..A...  64     0  5840    46 
 8009            : .S..A...  64     0  5840    46 
All replies received. Done. 
Not responding ports:

工作原理

hping3 不用于一些已經(jīng)提到的其它工具,因?yàn)樗](méi)有 SYN 掃描模式奏篙。但是反之柴淘,它允許你指定 TCP 封包發(fā)送時(shí)的激活的 TCP 標(biāo)識(shí)。在秘籍中的例子中,-S選項(xiàng)讓 hping3 使用 TCP 封包的 SYN 標(biāo)識(shí)为严。

3.10 Scapy 連接掃描

在多數(shù)掃描工具當(dāng)中敛熬,TCP 連接掃描比 SYN 掃描更加容易。這是因?yàn)?TCP 連接掃描并不需要為了生成和注入 SYN 掃描中使用的原始封包而提升權(quán)限第股。Scapy 是它的一大例外荸型。Scapy 實(shí)際上非常難以執(zhí)行完全的 TCP 三次握手,也不實(shí)用炸茧。但是瑞妇,出于更好理解這個(gè)過(guò)程的目的,我們來(lái)看看如何使用 Scapy 執(zhí)行連接掃描梭冠。

準(zhǔn)備

為了使用 Scapy 執(zhí)行全連接掃描辕狰,你需要一個(gè)運(yùn)行 UDP 網(wǎng)絡(luò)服務(wù)的遠(yuǎn)程服務(wù)器。這個(gè)例子中我們使用 Metasploitable2 實(shí)例來(lái)執(zhí)行任務(wù)控漠。配置 Metasploitable2 的更多信息請(qǐng)參考第一章中的“安裝 Metasploitable2”秘籍蔓倍。

此外,這一節(jié)也需要編寫腳本的更多信息盐捷,請(qǐng)參考第一章中的“使用文本編輯器*VIM 和 Nano)偶翅。

操作步驟

Scapy 中很難執(zhí)行全連接掃描,因?yàn)橄到y(tǒng)內(nèi)核不知道你在 Scapy 中發(fā)送的請(qǐng)求碉渡,并且嘗試阻止你和遠(yuǎn)程系統(tǒng)建立完整的三次握手聚谁。你可以在 Wireshark 或 tcpdump 中,通過(guò)發(fā)送 SYN 請(qǐng)求并嗅探相關(guān)流量來(lái)看到這個(gè)過(guò)程滞诺。當(dāng)你接收到來(lái)自遠(yuǎn)程系統(tǒng)的 SYN+ACK 響應(yīng)時(shí)形导,Linux 內(nèi)核會(huì)攔截它,并將其看做來(lái)源不明的響應(yīng)习霹,因?yàn)樗恢滥阍?Scapy 中 發(fā)送的請(qǐng)求朵耕。并且系統(tǒng)會(huì)自動(dòng)使用 TCP RST 封包來(lái)回復(fù),因此會(huì)斷開(kāi)握手過(guò)程淋叶⊙植埽考慮下面的例子:

#!/usr/bin/python

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

response = sr1(IP(dst="172.16.36.135")/TCP(dport=80,flags='S')) 
reply = sr1(IP(dst="172.16.36.135")/TCP(dport=80,flags='A',ack=(respon se[TCP].seq + 1)))

這個(gè) Python 腳本的例子可以用做 POC 來(lái)演系統(tǒng)破壞三次握手的問(wèn)題。這個(gè)腳本假設(shè)你將帶有開(kāi)放端口活動(dòng)系統(tǒng)作為目標(biāo)煞檩。因此处嫌,假設(shè) SYN+ACK 回復(fù)會(huì)作為初始 SYN 請(qǐng)求的響應(yīng)而返回。即使發(fā)送了最后的 ACK 回復(fù)形娇,完成了握手锰霜,RST 封包也會(huì)阻止連接建立。我們可以通過(guò)觀察封包發(fā)送和接受來(lái)進(jìn)一步演示桐早。

#!/usr/bin/python

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

SYN = IP(dst="172.16.36.135")/TCP(dport=80,flags='S')

print "-- SENT --" 
SYN.display()

print "\n\n-- RECEIVED --" 
response = sr1(SYN,timeout=1,verbose=0) 
response.display()

if int(response[TCP].flags) == 18:   
    print "\n\n-- SENT --"   
    ACK = IP(dst="172.16.36.135")/TCP(dport=80,flags='A',ack=(response[    TCP].seq + 1))   
    response2 = sr1(ACK,timeout=1,verbose=0)   
    ACK.display()   
    print "\n\n-- RECEIVED --"   
    response2.display() 
else:   
    print "SYN-ACK not returned"

在這個(gè) Python 腳本中,每個(gè)發(fā)送的封包都在傳輸之前展示,并且每個(gè)收到的封包都在到達(dá)之后展示哄酝。在檢驗(yàn)每個(gè)封包所激活的 TCP 標(biāo)識(shí)的過(guò)程中友存,我們可以看到,三次握手失敗了陶衅÷帕ⅲ考慮由腳本生成的下列輸出:

root@KaliLinux:~# ./tcp_connect.py 
-- SENT -
###[ 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     = S     
    window    = 8192     
    chksum    = None     
    urgptr    = 0     
    options   = {}
-- RECEIVED -
###[ IP ]###  
    version   = 4L  
    ihl       = 5L  
    tos       = 0x0  
    len       = 44  
    id        = 0  
    flags     = DF
    frag      = 0L  
    ttl       = 64  
    proto     = tcp  
    chksum    = 0x9970  
    src       = 172.16.36.135  
    dst       = 172.16.36.180  
    \options   \ 
###[ TCP ]###     
    sport     = http     
    dport     = ftp_data     
    seq       = 3013979073L     
    ack       = 1     
    dataofs   = 6L     
    reserved  = 0L     
    flags     = SA     
    window    = 5840     
    chksum    = 0x801e     
    urgptr    = 0     
    options   = [('MSS', 1460)] 
###[ Padding ]###        
    load      = '\x00\x00'
-- SENT -
###[ 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       = 3013979074L     
    dataofs   = None     
    reserved  = 0     
    flags     = A     
    window    = 8192     
    chksum    = None     
    urgptr    = 0     
    options   = {}
-- RECEIVED -
###[ 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       = 3013979074L     
    ack       = 0     
    dataofs   = 5L     
    reserved  = 0L     
    flags     = R     
    window    = 0     
    chksum    = 0xaeb8     
    urgptr    = 0     
    options   = {} 
###[ Padding ]###        
    load      = '\x00\x00\x00\x00\x00\x00'

在腳本的輸出中,我們看到了四個(gè)封包搀军。第一個(gè)封包是發(fā)送的 SYN 請(qǐng)求膨俐,第二個(gè)封包時(shí)接收到的 SYN+ACK 回復(fù),第三個(gè)封包時(shí)發(fā)送的 ACK 回復(fù)罩句,之后接收到了 RST 封包焚刺,它是最后的 ACK 回復(fù)的響應(yīng)。最后一個(gè)封包表明门烂,在建立連接時(shí)出現(xiàn)了問(wèn)題乳愉。Scapy 中可能能夠建立完成的三次握手,但是它需要對(duì)本地 IP 表做一些調(diào)整屯远。尤其是蔓姚,如果你去掉發(fā)往遠(yuǎn)程系統(tǒng)的 TSR 封包,你就可以完成握手慨丐。通過(guò)使用 IP 表建立過(guò)濾機(jī)制坡脐,我們可以去掉 RST 封包來(lái)完成三次握手,而不會(huì)干擾到整個(gè)系統(tǒng)(這個(gè)配置出于功能上的原理并不推薦)房揭。為了展示完整三次握手的成功建立挨措,我們使用 Netcat 建立 TCP 監(jiān)聽(tīng)服務(wù)。之后嘗試使用 Scapy 連接開(kāi)放的端口崩溪。

admin@ubuntu:~$ nc -lvp 4444 
listening on [any] 4444 ... 

這個(gè)例子中浅役,我們?cè)?TCP 端口 4444 開(kāi)啟了監(jiān)聽(tīng)服務(wù)。我們之后可以修改之前的腳本來(lái)嘗試連接 端口 4444 上的 Netcat 監(jiān)聽(tīng)服務(wù)伶唯。

#!/usr/bin/python

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

response = sr1(IP(dst="172.16.36.135")/TCP(dport=4444,flags='S')) 
reply = sr1(IP(dst="172.16.36.135")/TCP(dport=4444,flags='A',ack=(resp onse[TCP].seq + 1)))

這個(gè)腳本中觉既,SYN 請(qǐng)求發(fā)送給了監(jiān)聽(tīng)端口。收到 SYN+ACK 回復(fù)之后乳幸,會(huì)發(fā)送 ACK回復(fù)瞪讼。為了驗(yàn)證連接嘗試被系統(tǒng)生成的 RST 封包打斷,這個(gè)腳本應(yīng)該在 Wireshark 啟動(dòng)之后執(zhí)行粹断,來(lái)捕獲請(qǐng)求蓄力符欠。我們使用 Wireshark 的過(guò)濾器來(lái)隔離連接嘗試序列。所使用的過(guò)濾器是tcp && (ip.src == 172.16.36.135 || ip.dst == 172.16.36.135)瓶埋。過(guò)濾器僅僅用于展示來(lái)自或發(fā)往被掃描系統(tǒng)的 TCP 流量希柿。像這樣:

既然我們已經(jīng)精確定位了問(wèn)題诊沪。我們可以建立過(guò)濾器,讓我們能夠去除系統(tǒng)生成的 RST 封包曾撤。這個(gè)過(guò)濾器可以通過(guò)修改本地 IP 表來(lái)建立:

以如下方式修改本地 IP 表會(huì)通過(guò)阻塞所有發(fā)出的 RST 響應(yīng)端姚,改變和目標(biāo)系統(tǒng)之間的 TCP/IP 事務(wù)的處理方式。確保常見(jiàn)的 iptable 規(guī)則在這個(gè)秘籍完成之后移除挤悉,或者之后使用下列命令刷新 iptable渐裸。

iptables --flush
root@KaliLinux:~# iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 172.16.36.135 -j DROP 
root@KaliLinux:~# iptables --list 
Chain INPUT (policy ACCEPT) 
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT) 
target     prot opt source               destination      
   
Chain OUTPUT (policy ACCEPT) 
target     prot opt source               destination         
DROP       tcp  --  anywhere             172.16.36.135       tcp flags:RST/RST

在這個(gè)例子中,本地 IP 表的修改去除了所有發(fā)往被掃描主機(jī)的目標(biāo)地址的 TCP RST 封包装悲。list選項(xiàng)隨后可以用于查看 IP 表的條目昏鹃,以及驗(yàn)證配置已經(jīng)做了修改。為了執(zhí)行另一次連接嘗試诀诊,我們需要確保 Natcat 仍舊監(jiān)聽(tīng)目標(biāo)的 4444 端口洞渤,像這樣:

admin@ubuntu:~$ nc -lvp 4444 
listening on [any] 4444 ...

和之前相同的 Python 腳本可以再次使用,同時(shí) WIreshark 會(huì)捕獲后臺(tái)的流量畏梆。使用之前討論的顯示過(guò)濾器您宪,我們可以輕易專注于所需的流量。要注意三次握手的所有步驟現(xiàn)在都可以完成奠涌,而不會(huì)收到系統(tǒng)生成的 RST 封包的打斷宪巨,像這樣:

此外,如果我們看一看運(yùn)行在目標(biāo)系統(tǒng)的 Netcat 服務(wù)溜畅,我們可以注意到捏卓,已經(jīng)建立了連接。這是用于確認(rèn)成功建立連接的進(jìn)一步的證據(jù)慈格。這可以在下面的輸出中看到:

admin@ubuntu:~$ nc -lvp 4444 
listening on [any] 4444 ... 172.16.36.132: inverse host lookup failed: No address associated with name 
connect to [172.16.36.135] from (UNKNOWN) [172.16.36.132] 42409

雖然這個(gè)練習(xí)對(duì)理解和解決 TCP 連接的問(wèn)題十分有幫助怠晴,恢復(fù) IP 表的條目也十分重要。RST 封包 是 TCP 通信的重要組成部分浴捆,去除這些響應(yīng)會(huì)影響正常的通信功能蒜田。洗嘜按的命令可以用于刷新我們的 iptable 規(guī)則,并驗(yàn)證刷新成功:

root@KaliLinux:~# iptables --flush 
root@KaliLinux:~# iptables --list 
Chain INPUT (policy ACCEPT) 
target     prot opt source               destination   

Chain FORWARD (policy ACCEPT) 
target     prot opt source               destination    
     
Chain OUTPUT (policy ACCEPT) 
target     prot opt source               destination 

就像例子中展示的那樣选泻,flush選項(xiàng)應(yīng)該用于清楚 IP 表的條目冲粤。我們可以多次使用list選項(xiàng)來(lái)驗(yàn)證 IP 表的條目已經(jīng)移除了。

工作原理

執(zhí)行 TCP 連接掃描的同居通過(guò)執(zhí)行完整的三次握手页眯,和遠(yuǎn)程系統(tǒng)的所有被掃描端口建立連接梯捕。端口的狀態(tài)取決于連接是否成功建立。如果連接建立窝撵,端口被認(rèn)為是開(kāi)放的傀顾,如果連接不能成功建立,端口被認(rèn)為是關(guān)閉的碌奉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末短曾,一起剝皮案震驚了整個(gè)濱河市寒砖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌错英,老刑警劉巖入撒,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隆豹,死亡現(xiàn)場(chǎng)離奇詭異椭岩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)璃赡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門判哥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碉考,你說(shuō)我怎么就攤上這事塌计。” “怎么了侯谁?”我有些...
    開(kāi)封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵锌仅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我墙贱,道長(zhǎng)热芹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任惨撇,我火速辦了婚禮伊脓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魁衙。我一直安慰自己报腔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布剖淀。 她就那樣靜靜地躺著纯蛾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纵隔。 梳的紋絲不亂的頭發(fā)上翻诉,一...
    開(kāi)封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音巨朦,去河邊找鬼米丘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛糊啡,可吹牛的內(nèi)容都是我干的拄查。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼棚蓄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼堕扶!你這毒婦竟也來(lái)了碍脏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤稍算,失蹤者是張志新(化名)和其女友劉穎典尾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體糊探,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钾埂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了科平。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褥紫。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瞪慧,靈堂內(nèi)的尸體忽然破棺而出髓考,到底是詐尸還是另有隱情,我是刑警寧澤弃酌,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布氨菇,位于F島的核電站,受9級(jí)特大地震影響妓湘,放射性物質(zhì)發(fā)生泄漏查蓉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一多柑、第九天 我趴在偏房一處隱蔽的房頂上張望奶是。 院中可真熱鬧,春花似錦竣灌、人聲如沸聂沙。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)及汉。三九已至,卻和暖如春屯烦,著一層夾襖步出監(jiān)牢的瞬間坷随,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工驻龟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留温眉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓翁狐,卻偏偏與公主長(zhǎng)得像类溢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子露懒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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