在前三篇中,我們介紹了使用python腳本發現二層、三層的主機設備,接下來我們介紹使用python發現第四層主機,
在TCP/IP協議中,第四層為傳輸層,主要使用的通信協議為TCP協議和UDP協議,我們就利用這兩個協議來進行目標主機的發現,
簡單說一下TCP協議,TCP協議是一種面向連接的、可靠的,基于位元組流的傳輸層通信協議,它要求通信雙方在通信之前必須建立連接,此外,TCP協議可以確保接收方一定會收到發送方所發出的資料,最著名的就是“三次握手"原理了,和“三次握手”分不開的,就是TCP的flag標識位,
flag標識位
FIN:斷開連接,對應值為1;
SYN:同步信號,用于發起一個連接,對應值為2;
RST:重置連接,對應值為4;
ACK:確認資訊,對應值為16;
三次握手的程序
1.發送方給接收方發送一個SYN
2.接收方回給發送方一個SYN和和ACK
3.發送發給接收方發送一個ACK
TCP探測原理
為了探測對方主機是否存活,我們可以直接給接收方發送一個ACK,接收方就會認為是無效確認,從而給我們回復一個RST,只要我們能收到這個RST,我們就可以判斷對方的主機是在線的,此外,我們向目標主機發送ACK包,只要目標主機在線,無論埠是否對外開放,都將回傳資料,
附上python腳本
def host_scan(ip):
try:
pkt=IP(dst=ip)/TCP(dport=55555,flags='A')
result=sr1(pkt,timeout=1,verbose=0)
if int (result[TCP].flags)==4:
time.sleep(0.1)
print ip,"在線"
return
except:
return
def main():
if len(sys.argv) != 2:
print "使用方法: ./hostscan.py 目標網路地址"
sys.exit()
address=str(sys.argv[1]).strip()
prefix=address.split(".")[0]+"."+address.split(".")[1]+"."+address.split(".")[2]+"."
for i in range(1,255):
ip=prefix+str(i)
t=Thread(target=host_scan,args=(ip,))
t.start()
if __name__=='__main__':
main()
上述代碼實作的方法,就是構造一個ACK包發給目標主機,只要我們接收到的數值為4(即為RST包),則可以判斷目標主機在線,
UDP探測原理
我們使用UDP探測的原理是:向目標主機的一個沒有開放的埠發送資料,目標主機會回傳一個埠不可達的ICMP訊息,只要我們接收到了這個ICMP訊息,我們就可以發現目標主機是否在線了,此外,如果目標主機不在線,或者目標主機在線但是埠是開放的狀態,那我們發送過去的UDP探測資料包就不會收到回應了,
附上UDP主要功能部分:
def host_scan(ip):
try:
pkt=IP(dst=ip)/UDP(dport=55555)
result=sr1(pkt,timeout=1,verbous=0)
if int(result[IP].proto)==1:
time.sleep(0,1)
print ip,"在線"
return
except:
return
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/17486.html
標籤:其他
上一篇:之前聽合天公開課做的一些筆記
