Python实现Tracert追踪TTL值的方法详解

 更新时间:2022年10月08日 09:00:01   作者:lyshark  
Tracert命令跟踪路由原理是IP路由每经过一个路由节点TTL值会减一。本文我们将通过scapy构造一个路由追踪工具并实现一次追踪,感兴趣的小伙伴可以了解一下

Tracert 命令跟踪路由原理是IP路由每经过一个路由节点TTL值会减一,假设TTL值=0时数据包还没有到达目标主机,那么该路由则会回复给目标主机一个数据包不可达,由此我们就可以获取到目标主机的IP地址,如下我们通过scapy构造一个路由追踪工具并实现一次追踪。

  • 需要安装扩展包:
  • pip install scapy

首先Scapy是如何发包与收包的,看以下案例的演示。

>>> 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' |>>>>>

路由追踪原理(参考于互联网):一开始发送一个TTL为1的包,这样到达第一个路由器的时候就已经超时了,第一个路由器就发ICMP通知说包超时,这样就能够记录下所经过的第一个路由器的IP。然后将TTL加1,安全通过第一个路由器,而第二个路由器的的处理与第一个同样,丢包,发通知说包超时了,这样记录下第二个路 由器IP,由此能够一直进行下去,直到这个数据包到达目标主机,由此打印出全部经过的路由器。

将这个过程自动化,就可以完成数据包的跟踪,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="指定一个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()

追踪探测效果如下:

到此这篇关于Python实现Tracert追踪TTL值的方法详解的文章就介绍到这了,更多相关Python Tracert追踪TTL值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • matplotlib实战之饼图绘制详解

    matplotlib实战之饼图绘制详解

    饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表,这篇文章主要为大家详细介绍了如何使用Matplotlib绘制饼图,需要的小伙伴可以参考下
    2023-08-08
  • 使用Python快速进行Excel合并的几种场景

    使用Python快速进行Excel合并的几种场景

    由于工作需要,客户需要将多个excel文件合并成一个excel中,下面这篇文章主要给大家介绍了关于使用Python快速进行Excel合并的几种场景,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • python中内置库os与sys模块的详细介绍

    python中内置库os与sys模块的详细介绍

    这篇文章主要介绍了python中内置库os与sys模块的详细介绍,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • windows安装TensorFlow和Keras遇到的问题及其解决方法

    windows安装TensorFlow和Keras遇到的问题及其解决方法

    这篇文章主要介绍了windows安装TensorFlow和Keras遇到的问题及其解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-07-07
  • python常规方法实现数组的全排列

    python常规方法实现数组的全排列

    这篇文章主要介绍了python常规方法实现数组的全排列,实例分析了全排列的概念及Python常规实现技巧,需要的朋友可以参考下
    2015-03-03
  • python套接字socket通信

    python套接字socket通信

    这篇文章主要介绍了python套接字socket通信,python标准库中内置了底层网络接口socket,以下代码均默认from socket import *,下文很多详细内容需要的小伙伴可以参考一下
    2022-04-04
  • Python和Sublime整合过程图示

    Python和Sublime整合过程图示

    这篇文章主要介绍了Python和Sublime整合过程图示,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • python如何在文件中部插入信息

    python如何在文件中部插入信息

    这篇文章主要介绍了python如何在文件中部插入信息问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • pyqt5 实现在别的窗口弹出进度条

    pyqt5 实现在别的窗口弹出进度条

    今天小编就为大家分享一篇pyqt5 实现在别的窗口弹出进度条,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Django 再谈一谈json序列化

    Django 再谈一谈json序列化

    这篇文章主要介绍了Django json序列化,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03

最新评论