Tracert 命令跟踪路由原理是IP路由每经过一个路由节点TTL值会减一,假设TTL值=0时数据包还没有到达目标主机,那么该路由则会回复给目标主机一个数据包不可达,由此我们就可以获取到目标主机的IP地址,如下我们通过scapy构造一个路由追踪工具并实现一次追踪 。
首先Scapy是如何发包与收包的,看以下案例的演示 。
>>> from random import randint>>>>>> RandomID=randint(1,65534)>>> packet = IP(dst="61.135.169.125", ttl=1, id=RandomID) / ICMP(id=RandomID, seq=RandomID) / "hello lyshark">>> respon = sr1(packet,timeout=3,verbose=0)>>>>>> respon<IPversion=4 ihl=5 tos=0xc0 len=61 id=14866 flags= frag=0 ttl=64 proto=icmp chksum=0xbc9a src=https://www.huyubaike.com/biancheng/192.168.1.1 dst=192.168.1.2 |
文章插图
将这个过程自动化 , 就可以完成数据包的跟踪,Python 代码如下所示
from scapy.all import *from random import randintimport time,ipaddress,threadingfrom optparse import OptionParserdef 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.comdef 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 = https://www.huyubaike.com/biancheng/str(respon[IP].src)if ip_src != addr:print("[+] --> {}".format(str(respon[IP].src)))else:print("[+] --> {}".format(str(respon[IP].src)))return 1else:print("[-] --> TimeOut")time.sleep(1)if __name__== "__main__":parser = OptionParser()parser.add_option("--mode",dest="mode",help="选择使用的工具模式<ping/trace>")parser.add_option("-a","--addr",dest="addr",help="指定一个IP地址或范围")(options,args) = parser.parse_args()print("By: LyShark.com")# 使用方式: lyshark.py --mode=ping -a 192.168.1.0/24if 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.64elif options.mode == "trace":TraceRouteTTL(str(options.addr))else:parser.print_help()
追踪探测效果如下:
【Python 实现Tracert追踪TTL值】
文章插图
推荐阅读
- python合并多个excel
- 独辟蹊径:逆推Krpano切图算法,实现在浏览器切多层级瓦片图
- Python实现改进后的Bi-RRT算法实例
- Java实现6种常见排序
- C++实现双向RRT算法
- frp服务利用云主机实现Windows远程连接
- WPF开发经验-实现自带触控键盘的TextBox
- frp服务利用云主机docker服务实现Windows远程连接
- 1 python-数据描述与分析
- 51单片机下实现软件模拟IIC通信