網(wǎng)絡(luò)安全里四層發(fā)現(xiàn)的工具介紹
前面介紹過了二層、三層發(fā)現(xiàn),今天就來分享一些四層發(fā)現(xiàn)的工具。
二三四層網(wǎng)絡(luò)發(fā)現(xiàn)掃描目的是為了發(fā)現(xiàn)網(wǎng)絡(luò)中存活的IP地址,雖然第四層是基于TCP和UDP進(jìn)行掃描,但不對(duì)目標(biāo)端口的狀態(tài)進(jìn)行識(shí)別。
四層網(wǎng)絡(luò)的掃描發(fā)現(xiàn)只是使用了四層的網(wǎng)絡(luò)通信來識(shí)別目標(biāo)IP的存活狀態(tài)。
四層發(fā)現(xiàn)有這些優(yōu)點(diǎn):
可路由且結(jié)果可靠
不太可能被防火墻過濾掉
甚至可以發(fā)現(xiàn)所有端口都被過濾的主機(jī)
當(dāng)然也有一些缺點(diǎn):
基于狀態(tài)過濾的防火墻可能過濾掃描
全端口掃描速度較慢
前面說了四層發(fā)現(xiàn)使用了TCP和UDP,簡(jiǎn)單來說,大概是下面這樣。
TCP:
未經(jīng)請(qǐng)求的ACK-RST
SYN-SYN/ACK、RST
直接發(fā)送ACK數(shù)據(jù)包,一般來說狀態(tài)為up的目標(biāo)主機(jī)會(huì)返回一個(gè)RST數(shù)據(jù)包以終止這個(gè)不正常的TCP鏈接;也可以發(fā)送正常的SYN數(shù)據(jù)包,如果目標(biāo)主機(jī)返回SYN/ACK或者SRT數(shù)據(jù)包,都可以證明目標(biāo)主機(jī)為up狀態(tài)。
UDP:
ICMP端口不可達(dá)、一去不復(fù)返
如果目標(biāo)ip為up狀態(tài)且UDP目標(biāo)端口為關(guān)閉狀態(tài),目標(biāo)主機(jī)就會(huì)返回一個(gè)目標(biāo)端口不可達(dá)的數(shù)據(jù)包,這就可以證明目標(biāo)端口是up狀態(tài)。
TCP和UDP的具體定義和交互邏輯就不在這里展開了,沒有概念的可以網(wǎng)上查一下,有比較詳細(xì)的講解帖子。
需要注意的是,隨著對(duì)于網(wǎng)絡(luò)安全意識(shí)的提升,有些服務(wù)器對(duì)于掃描其實(shí)做了一定的防護(hù),比如收到直接收到一個(gè)ACK的包就不返回?cái)?shù)據(jù)包,避免被掃描到。所以現(xiàn)在掃描到的結(jié)果,都只是作為參考,不要完全相信。
scapy-TCP
用scapy演示一下使用TCP做四層掃描:
scapy使用tcp做四層掃描
收到的響應(yīng)包:
a.display()
可以看出來返回的數(shù)據(jù)包flags=R,表示是一個(gè)RST。
用一行代碼請(qǐng)求:
a = sr1(IP(dst='192.168.31.97')/TCP(dport=80,flags='A'), timeout=1)
根據(jù)上面的這些講解,就可以做一個(gè)使用tcp做四層發(fā)現(xiàn)的腳本了:
#!/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_script.py [/24 network address]')
print('Example ./ack_ping_script.py 172.18.14.0')
print('Example will perform an TCP ACK ping scan of the 172.18.14.0/24 range')
sys.exit()
address = str(sys.argv[1])
ip_num_list = address.split('.')
prefix = ip_num_list[0] + '.' + ip_num_list[1] + '.' + ip_num_list[2] + '.'
for addr in range(1, 254):
a = sr1(IP(dst=prefix+str(addr))/TCP(dport=333,flags='A'), timeout=0.1, verbose=0)
try:
if int(a[TCP].flags) == 4:
print(prefix+str(addr))
except:
pass
解釋一下腳本中20行為什么用4作為判斷:
收到的響應(yīng)包里面flags
從圖片中可以看到RST轉(zhuǎn)換成十進(jìn)制后就是4,所以腳本中用來這樣的判斷。
執(zhí)行前還是要改權(quán)限,執(zhí)行過程就是這樣:
python3 ack_ping_script.py 192.168.31.0
scapy-UDP
使用udp做四層掃描的時(shí)候,要設(shè)置那些幾乎不會(huì)被使用的端口,因?yàn)槲覀兙褪窃谕ㄟ^目標(biāo)端口不可達(dá)來探測(cè)ip是否有效。
具體使用:
scapy使用udp做四層掃描
如果遇到ip不存在或者端口正常開放就不會(huì)收到返回的數(shù)據(jù)包:
目標(biāo)ip不存在
也寫一個(gè)使用udp做四層發(fā)現(xiàn)的腳本:
#!/usr/bin/python
import logging
logging.getLogger('scapy.runtime').setLevel(logging.ERROR)
from scapy.all import *
if len(sys.argv) != 2:
print('Usage ./udp_ping_script.py [/24 network address]')
print('Example ./udp_ping_script.py 172.18.14.0')
print('Example will perform an UDP ping scan of the 172.18.14.0/24 range')
sys.exit()
address = str(sys.argv[1])
ip_num_list = address.split('.')
prefix = ip_num_list[0] + '.' + ip_num_list[1] + '.' + ip_num_list[2] + '.'
for addr in range(1, 254):
a = sr1(IP(dst=prefix+str(addr))/UDP(dport=23687), timeout=0.1, verbose=0)
try:
if int(a[IP].proto) == 1:
print(prefix+str(addr))
except:
pass
解釋一下第20行的判定依據(jù):
1代表了ICMP
執(zhí)行結(jié)果:
python3 udp_pinger.py 192.168.31.0
我在scapy使用tcp和udp做四層發(fā)現(xiàn)的時(shí)候,獲取到的結(jié)果是有點(diǎn)差異的,所以再次提醒各位同學(xué),對(duì)于掃描結(jié)果,只能作為參考。
nmap
nmap在三層、四層發(fā)現(xiàn)中的作用,應(yīng)該算主流,當(dāng)然也有可能是我接觸的工具還比較少,如果更好用的工具,也請(qǐng)推薦給我一下。接下來介紹一下nmap在四層發(fā)現(xiàn)中的使用。
nmap使用udp做四層發(fā)現(xiàn):
nmap 192.168.31.1-254 -PU12345 -sn
nmap使用tcp做四層發(fā)現(xiàn):
nmap 192.168.1.1-254 -PA12345 -sn
其實(shí)nmap還提供了一些其他參數(shù)用來做四層發(fā)現(xiàn):
四層發(fā)現(xiàn)的參數(shù)
實(shí)際使用中如果時(shí)間充裕,最好多換幾種參數(shù)進(jìn)行四層發(fā)現(xiàn),也許會(huì)得到不一樣的結(jié)果,綜合比較后的結(jié)果會(huì)更有參考性。
前面的文章里也說過nmap也可以傳ip文檔作為入?yún)ⅲ瑢?duì)文檔中指定的ip進(jìn)行掃描:
nmap -iL ip.txt -PA123 -sn
hping3
hping3也可以用來做四層發(fā)現(xiàn),使用udp的話,就是這樣:
hping3 --udp 192.168.31.97 -p 12345 -c 1
如果是用udp做四層發(fā)現(xiàn),在傳參中的端口也要使用一個(gè)沒有被開啟的端口。
寫個(gè)用hping3做四層發(fā)現(xiàn)的腳本:
#!/bin/bash
if ["$#" -ne 1];then
echo 'Usage ./udp_hping3.sh [/24 network address]'
echo 'Example ./udp_hping3.sh 192.168.31.0'
echo 'Example will perform a UDP ping sweep of the 192.168.31.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 -p 13215 -c 1 >> r.txt
done
grep Unreachable r.txt | cut -d ' ' -f 5 | cut -d '=' -f 2 >> output.txt
rm r.txt
hping3在使用的時(shí)候不加--udp,就是默認(rèn)使用tcp方式進(jìn)行掃描:
hping3 192.168.31.168 -c 1
也可以寫一個(gè)使用tcp的hping3腳本:
#!/bin/bash
if ["$#" -ne 1];then
echo 'Usage ./udp_hping3.sh [/24 network address]'
echo 'Example ./udp_hping3.sh 192.168.31.0'
echo 'Example will perform a UDP ping sweep of the 192.168.31.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 >> r.txt
done
grep Unreachable r.txt | cut -d ' ' -f 5 | cut -d '=' -f 2 >> output.txt
rm r.txt
執(zhí)行結(jié)果就是這樣:
./tcp_hping3.sh 36.152.44.0
這里提一下,如果你用hping3來掃描同網(wǎng)段的話,會(huì)自動(dòng)降級(jí)使用arp協(xié)議,變成二層掃描,通過抓包可以看到,感興趣可以試試。