網絡安全里四層發現的工具介紹
前面介紹過了二層、三層發現,今天就來分享一些四層發現的工具。
二三四層網絡發現掃描目的是為了發現網絡中存活的IP地址,雖然第四層是基于TCP和UDP進行掃描,但不對目標端口的狀態進行識別。
四層網絡的掃描發現只是使用了四層的網絡通信來識別目標IP的存活狀態。
四層發現有這些優點:
可路由且結果可靠
不太可能被防火墻過濾掉
甚至可以發現所有端口都被過濾的主機
當然也有一些缺點:
基于狀態過濾的防火墻可能過濾掃描
全端口掃描速度較慢
前面說了四層發現使用了TCP和UDP,簡單來說,大概是下面這樣。
TCP:
未經請求的ACK-RST
SYN-SYN/ACK、RST
直接發送ACK數據包,一般來說狀態為up的目標主機會返回一個RST數據包以終止這個不正常的TCP鏈接;也可以發送正常的SYN數據包,如果目標主機返回SYN/ACK或者SRT數據包,都可以證明目標主機為up狀態。
UDP:
ICMP端口不可達、一去不復返
如果目標ip為up狀態且UDP目標端口為關閉狀態,目標主機就會返回一個目標端口不可達的數據包,這就可以證明目標端口是up狀態。
TCP和UDP的具體定義和交互邏輯就不在這里展開了,沒有概念的可以網上查一下,有比較詳細的講解帖子。
需要注意的是,隨著對于網絡安全意識的提升,有些服務器對于掃描其實做了一定的防護,比如收到直接收到一個ACK的包就不返回數據包,避免被掃描到。所以現在掃描到的結果,都只是作為參考,不要完全相信。
scapy-TCP
用scapy演示一下使用TCP做四層掃描:
scapy使用tcp做四層掃描
收到的響應包:
a.display()
可以看出來返回的數據包flags=R,表示是一個RST。
用一行代碼請求:
a = sr1(IP(dst='192.168.31.97')/TCP(dport=80,flags='A'), timeout=1)
根據上面的這些講解,就可以做一個使用tcp做四層發現的腳本了:
#!/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作為判斷:
收到的響應包里面flags
從圖片中可以看到RST轉換成十進制后就是4,所以腳本中用來這樣的判斷。
執行前還是要改權限,執行過程就是這樣:
python3 ack_ping_script.py 192.168.31.0
scapy-UDP
使用udp做四層掃描的時候,要設置那些幾乎不會被使用的端口,因為我們就是在通過目標端口不可達來探測ip是否有效。
具體使用:
scapy使用udp做四層掃描
如果遇到ip不存在或者端口正常開放就不會收到返回的數據包:
目標ip不存在
也寫一個使用udp做四層發現的腳本:
#!/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行的判定依據:
1代表了ICMP
執行結果:
python3 udp_pinger.py 192.168.31.0
我在scapy使用tcp和udp做四層發現的時候,獲取到的結果是有點差異的,所以再次提醒各位同學,對于掃描結果,只能作為參考。
nmap
nmap在三層、四層發現中的作用,應該算主流,當然也有可能是我接觸的工具還比較少,如果更好用的工具,也請推薦給我一下。接下來介紹一下nmap在四層發現中的使用。
nmap使用udp做四層發現:
nmap 192.168.31.1-254 -PU12345 -sn
nmap使用tcp做四層發現:
nmap 192.168.1.1-254 -PA12345 -sn
其實nmap還提供了一些其他參數用來做四層發現:
四層發現的參數
實際使用中如果時間充裕,最好多換幾種參數進行四層發現,也許會得到不一樣的結果,綜合比較后的結果會更有參考性。
前面的文章里也說過nmap也可以傳ip文檔作為入參,對文檔中指定的ip進行掃描:
nmap -iL ip.txt -PA123 -sn
hping3
hping3也可以用來做四層發現,使用udp的話,就是這樣:
hping3 --udp 192.168.31.97 -p 12345 -c 1
如果是用udp做四層發現,在傳參中的端口也要使用一個沒有被開啟的端口。
寫個用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 --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在使用的時候不加--udp,就是默認使用tcp方式進行掃描:
hping3 192.168.31.168 -c 1
也可以寫一個使用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
執行結果就是這樣:
./tcp_hping3.sh 36.152.44.0
這里提一下,如果你用hping3來掃描同網段的話,會自動降級使用arp協議,變成二層掃描,通過抓包可以看到,感興趣可以試試。