Является ли scapy
функция traceroute действительно TCP traceroute?
Да, это делает TCP
traceroute (среди прочего). Взгляните на Scapy
исходный код :
@conf.commands.register
def traceroute(target, dport=80, minttl=1, maxttl=30, sport=RandShort(), l4 = None, filter=None, timeout=2, verbose=None, **kargs):
"""Instant TCP traceroute traceroute(target, [maxttl=30,] [dport=80,] [sport=80,] [verbose=conf.verb]) -> None"""
if verbose is None:
verbose = conf.verb
if filter is None:
# we only consider ICMP error packets and TCP packets with at
# least the ACK flag set *and* either the SYN or the RST flag
# set
filter="(icmp and (icmp[0]=3 or icmp[0]=4 or icmp[0]=5 or icmp[0]=11 or icmp[0]=12)) or (tcp and (tcp[13] & 0x16 > 0x10))"
if l4 is None:
a,b = sr(IP(dst=target, id=RandShort(), ttl=(minttl,maxttl))/TCP(seq=RandInt(),sport=sport, dport=dport),
timeout=timeout, filter=filter, verbose=verbose, **kargs)
else:
# this should always work
filter="ip"
a,b = sr(IP(dst=target, id=RandShort(), ttl=(minttl,maxttl))/l4,
timeout=timeout, filter=filter, verbose=verbose, **kargs)
a = TracerouteResult(a.res)
if verbose:
a.show()
return a,b
Я хочу выполнить tcp
traceroute для ipv6
и ipv4
Снова глядя на
Scapy
исходный код,
traceroot6
может выполнить работу:
def traceroute6(target, dport=80, minttl=1, maxttl=30, sport=RandShort(),
l4 = None, timeout=2, verbose=None, **kargs):
"""
Instant TCP traceroute using IPv6 :
traceroute6(target, [maxttl=30], [dport=80], [sport=80]) -> None
"""
if verbose is None:
verbose = conf.verb
if l4 is None:
a,b = sr(IPv6(dst=target, hlim=(minttl,maxttl))/TCP(seq=RandInt(),sport=sport, dport=dport),
timeout=timeout, filter="icmp6 or tcp", verbose=verbose, **kargs)
else:
a,b = sr(IPv6(dst=target, hlim=(minttl,maxttl))/l4,
timeout=timeout, verbose=verbose, **kargs)
a = TracerouteResult6(a.res)
if verbose:
a.display()
return a,b
Пример кода для traceroute ipv6:
from scapy.all import *
waypoint = "2001:301:0:8002:203:47ff:fea5:3085"
target = "2001:5f9:4:7:2e0:81ff:fe52:9a6b"
traceroute6(waypoint, minttl=10, maxttl=40, l4=IPv6ExtHdrRouting(addresses=[target])/ICMPv6EchoRequest(data=RandString(7)))
Я не уверен, почему одни и те же IP-адреса отображаются для всех переходов.
Используя DNS traceroute
, указав полный пакет в параметре l4 функции traceroute (), вы не получите одинаковые IP-адреса для всех прыжков.
from scapy.all import *
target = ["172.217.17.46"]
result, unans = traceroute(target, l4=UDP(sport=RandShort())/DNS(qd=DNSQR(qname="www.google.com")))
Или вы можете использовать TCP SYN traceroute
для получения похожих результатов:
from scapy.all import *
target = ["172.217.17.46"]
result, unans = sr(IP(dst=target, ttl=(1, 10)) / TCP(dport=53, flags="S"))
for snd, rcv in result:
print(snd.ttl, rcv.src, snd.sent_time, rcv.time)
Или вы можете создать IP and UDP packets
для реализации traceroute
, используя Scapy
следующим образом:
from scapy.all import *
hostname = "172.217.17.46"
for i in range(1, 28):
pkt = IP(dst=hostname, ttl=i) / UDP(dport=33434)
reply = sr1(pkt, verbose=0)
if reply is None:
break
elif reply.type == 3:
print("Done!", reply.src)
break
else:
print("%d hops away: " % i, reply.src, reply.time)
Есть ли еще какая-нибудь библиотека, которую я могу использовать, если Scapy
не подходит?
- Выезд webb . Я не использовал его, но вы можете использовать его так:
import webb
webb.traceroute("www.google.com")
webb.traceroute("www.google.com",'file-name.txt')
Также, проверьте это tcptraceroute
Томаса Геттлера.
Или это трассировка с несколькими источниками с геолокацией реализация от Addy Yeow (Ayeowch).
Помимо прочего, используя параметр -j
(JSON_FILE), он будет перечислять источники в формате файла JSON.
Или это реализация Кристиана Крейбича. Он может анализировать информацию трассировки в серию объектов прыжка, каждый из которых состоит из одного или нескольких результатов проверки, а также экземпляров объекта. Кроме того, форматирование строки производит знакомый вывод traceroute.
(Для работы с Python 3
необходимо изменить cStringIO
на from io import StringIO
Без scapy
(с помощью консоли Windows):
Создайте скрипт с именем output.py
, содержащий следующее:
import sys
from subprocess import Popen
if len(sys.argv) < 2:
print('Usage: output.py "command to watch"')
sys.exit(1)
cmd_line = sys.argv[1:]
p = Popen(cmd_line)
p.communicate()[0]
Пример использования: python output.py ping google.com
Пример вывода для ping
:
Pinging google.com [216.58.209.14] with 32 bytes of data:
Reply from 216.58.209.14: bytes=32 time=50ms TTL=56
Reply from 216.58.209.14: bytes=32 time=45ms TTL=56
Reply from 216.58.209.14: bytes=32 time=45ms TTL=56
Reply from 216.58.209.14: bytes=32 time=45ms TTL=56
Ping statistics for 216.58.209.14:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 45ms, Maximum = 50ms, Average = 46ms
Пример использования: python output.py tracert google.com
Пример вывода для tracert
:
Tracing route to google.com [172.217.18.174]
over a maximum of 30 hops:
1 <1 ms 1 ms 1 ms 192.168.0.1
2 6 ms 8 ms 8 ms xx.xx.xx.xx
3 8 ms 8 ms 8 ms [xx.xx.xxx.xxx]
4 17 ms 16 ms 16 ms be3549.ccr31.sof02.atlas.cogentco.com [154.54.59.138]
5 18 ms 17 ms 20 ms be3421.ccr51.beg03.atlas.cogentco.com [130.117.0.94]
6 32 ms 31 ms 30 ms be3464.ccr52.vie01.atlas.cogentco.com [154.54.59.189]
7 39 ms 37 ms 44 ms be3462.ccr22.muc03.atlas.cogentco.com [154.54.59.182]
8 42 ms 48 ms 44 ms be2960.ccr42.fra03.atlas.cogentco.com [154.54.36.253]
9 44 ms 50 ms 50 ms be3187.agr41.fra03.atlas.cogentco.com [130.117.1.117]
10 43 ms 45 ms 46 ms tata.fra03.atlas.cogentco.com [130.117.15.86]
11 45 ms 45 ms 44 ms 72.14.196.162
12 43 ms 41 ms 46 ms 108.170.251.129
13 46 ms 46 ms 45 ms 74.125.37.167
14 45 ms 52 ms 48 ms fra15s29-in-f14.1e100.net [172.217.18.174]
Вы можете использовать tracert -d
, если не хотите, чтобы имена разрешались.
Для
OSX
и
Linux
и
Python 2.7
вы можете использовать этот
парсер .