Python實(shí)現(xiàn)Tracert追蹤TTL值的方法詳解
Tracert 命令跟蹤路由原理是IP路由每經(jīng)過(guò)一個(gè)路由節(jié)點(diǎn)TTL值會(huì)減一,假設(shè)TTL值=0時(shí)數(shù)據(jù)包還沒(méi)有到達(dá)目標(biāo)主機(jī),那么該路由則會(huì)回復(fù)給目標(biāo)主機(jī)一個(gè)數(shù)據(jù)包不可達(dá),由此我們就可以獲取到目標(biāo)主機(jī)的IP地址,如下我們通過(guò)scapy構(gòu)造一個(gè)路由追蹤工具并實(shí)現(xiàn)一次追蹤。
- 需要安裝擴(kuò)展包:
- pip install scapy
首先Scapy是如何發(fā)包與收包的,看以下案例的演示。
>>> from random import randint >>> >>> RandomID=randint(1,65534) >>> packet = IP(dst="8.141.58.64", ttl=1, id=RandomID) / ICMP(id=RandomID, seq=RandomID) / "hello lyshark" >>> respon = sr1(packet,timeout=3,verbose=0) >>> >>> respon <IP version=4 ihl=5 tos=0xc0 len=61 id=14866 flags= frag=0 ttl=64 proto=icmp chksum=0xbc9a src=192.168.1.1 dst=192.168.1.2 |<ICMP type=time-exceeded code=ttl-zero-during-transit chksum=0xf4ff reserved=0 length=0 unused=None |<IPerror version=4 ihl=5 tos=0x0 len=33 id=49588 flags= frag=0 ttl=1 proto=icmp chksum=0x4f79 src=192.168.1.2 dst=61.135.169.125 |<ICMPerror type=echo-request code=0 chksum=0x30c4 id=0xc1b4 seq=0xc1b4 |<Raw load='hello lyshark' |>>>>>
路由追蹤原理(參考于互聯(lián)網(wǎng)):一開(kāi)始發(fā)送一個(gè)TTL為1的包,這樣到達(dá)第一個(gè)路由器的時(shí)候就已經(jīng)超時(shí)了,第一個(gè)路由器就發(fā)ICMP通知說(shuō)包超時(shí),這樣就能夠記錄下所經(jīng)過(guò)的第一個(gè)路由器的IP。然后將TTL加1,安全通過(guò)第一個(gè)路由器,而第二個(gè)路由器的的處理與第一個(gè)同樣,丟包,發(fā)通知說(shuō)包超時(shí)了,這樣記錄下第二個(gè)路 由器IP,由此能夠一直進(jìn)行下去,直到這個(gè)數(shù)據(jù)包到達(dá)目標(biāo)主機(jī),由此打印出全部經(jīng)過(guò)的路由器。
將這個(gè)過(guò)程自動(dòng)化,就可以完成數(shù)據(jù)包的跟蹤,Python 代碼如下所示
from scapy.all import * from random import randint import time,ipaddress,threading from optparse import OptionParser def ICMP_Ping(addr): RandomID=randint(1,65534) packet = IP(dst=addr, ttl=64, id=RandomID) / ICMP(id=RandomID, seq=RandomID) / "lyshark" respon = sr1(packet,timeout=3,verbose=0) if respon: print("[+] --> {}".format(str(respon[IP].src))) # By: LyShark.com def TraceRouteTTL(addr): for item in range(1,128): RandomID=randint(1,65534) packet = IP(dst=addr, ttl=item, id=RandomID) / ICMP(id=RandomID, seq=RandomID) respon = sr1(packet,timeout=3,verbose=0) if respon != None: ip_src = str(respon[IP].src) if ip_src != addr: print("[+] --> {}".format(str(respon[IP].src))) else: print("[+] --> {}".format(str(respon[IP].src))) return 1 else: print("[-] --> TimeOut") time.sleep(1) def Banner(): print(" _ ____ _ _ ") print(" | | _ _/ ___|| |__ __ _ _ __| | __") print(" | | | | | \___ \| '_ \ / _` | '__| |/ /") print(" | |__| |_| |___) | | | | (_| | | | < ") print(" |_____\__, |____/|_| |_|\__,_|_| |_|\_\\") print(" |___/ \n") print("E-Mail: me@lyshark.com") if __name__== "__main__": Banner() parser = OptionParser() parser.add_option("--mode",dest="mode",help="選擇使用的工具模式<ping/trace>") parser.add_option("-a","--addr",dest="addr",help="指定一個(gè)IP地址或范圍") (options,args) = parser.parse_args() print("By: LyShark.com") # 使用方式: lyshark.py --mode=ping -a 192.168.1.0/24 if options.mode == "ping": net = ipaddress.ip_network(str(options.addr)) for item in net: t = threading.Thread(target=ICMP_Ping,args=(str(item),)) t.start() # 使用方式: lyshark.py --mode=trace -a 8.141.58.64 elif options.mode == "trace": TraceRouteTTL(str(options.addr)) else: parser.print_help()
追蹤探測(cè)效果如下:
到此這篇關(guān)于Python實(shí)現(xiàn)Tracert追蹤TTL值的方法詳解的文章就介紹到這了,更多相關(guān)Python Tracert追蹤TTL值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python&Matlab實(shí)現(xiàn)螞蟻群算法求解最短路徑問(wèn)題的示例
本文主要介紹了Python&Matlab實(shí)現(xiàn)螞蟻群算法求解最短路徑問(wèn)題的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Python實(shí)現(xiàn)將sqlite數(shù)據(jù)庫(kù)導(dǎo)出轉(zhuǎn)成Excel(xls)表的方法
這篇文章主要介紹了Python實(shí)現(xiàn)將sqlite數(shù)據(jù)庫(kù)導(dǎo)出轉(zhuǎn)成Excel(xls)表的方法,結(jié)合實(shí)例形式分析了Python針對(duì)sqlite數(shù)據(jù)庫(kù)的連接、讀取及使用寫(xiě)操作包(xlwt)生成Excel表的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07天翼開(kāi)放平臺(tái)免費(fèi)短信驗(yàn)證碼接口使用實(shí)例
天翼開(kāi)放平臺(tái)提供了一個(gè)免費(fèi)的短信驗(yàn)證碼API,下面看看使用方法吧,我們用python開(kāi)發(fā)接口2013-12-12Python查找算法之折半查找算法的實(shí)現(xiàn)
這篇文章主要介紹了Python查找算法之折半查找算法的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04tkinter如何實(shí)現(xiàn)label超鏈接調(diào)用瀏覽器打開(kāi)網(wǎng)址
這篇文章主要介紹了tkinter如何實(shí)現(xiàn)label超鏈接調(diào)用瀏覽器打開(kāi)網(wǎng)址問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01python編程PyAutoGUI庫(kù)使用與安裝簡(jiǎn)介
這篇文章主要為大家介紹了python編程中PyAutoGUI庫(kù)的使用與安裝簡(jiǎn)單介紹,文中含有視頻詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10