Сканер TCP-порта, написанный на Python с использованием Scapy, не дает ответа
Я пытаюсь сделать сканер портов TCP, но я придерживаюсь очень простого примера, который я собрал на основе более сложного примера, который я нашел в Интернете.
Я не получаю никаких ошибок.
Я ожидаю, что код покажет мне, что порт 80 открыт, так как я запустил свой сервер Apache на моем компьютере с Linux.
Вот код:
#!/usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
ip = "127.0.0.1"
port = 80
response = sr1(IP(dst=ip)/TCP(dport=port, flags="S"),verbose=False, timeout=0.2)
if response :
if response[TCP].flags == 18 :
print "Port open"
Предупреждение, которое я имел (но это больше не появляется):
ВНИМАНИЕ: Не найден маршрут для пункта назначения IPv6:: (нет маршрута по умолчанию?)
Я прочитал, что включение этих двух строк ниже поможет в ошибке:
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
Nmap Scan:
STATE SERVICE
80/tcp open http
Выход... ничего вообще.
Я попробовал несколько вещей, таких как изменение порта на другие порты, некоторые из которых у меня были открыты, а некоторые - нет.
Есть идеи, что я сделал не так?
1 ответ
В Scapy Docs упоминается, что адрес обратной связи - это особый случай
Петлевой интерфейс - это очень особенный интерфейс. Проходящие через него пакеты на самом деле не собираются и не разбираются. Ядро направляет пакет к месту назначения, пока оно все еще хранится во внутренней структуре. То, что вы видите с помощью tcpdump -i lo, является лишь подделкой, чтобы заставить вас думать, что все нормально. Ядро не знает, что делает Scapy за его спиной, поэтому то, что вы видите на интерфейсе обратной связи, также является подделкой. Кроме этого не из местной структуры. Таким образом, ядро никогда не получит его.
Чтобы общаться с локальными приложениями, вам нужно собрать пакеты на один уровень выше, используя сокет PF_INET/SOCK_RAW вместо PF_PACKET/SOCK_RAW (или его эквивалент в других системах, которые Linux):
>>> conf.L3socket <class __main__.L3PacketSocket at 0xb7bdf5fc> >>> conf.L3socket=L3RawSocket >>> sr1(IP(dst="127.0.0.1")/ICMP()) <IP version=4L ihl=5L tos=0x0 len=28 id=40953 flags= frag=0L ttl=64 proto=ICMP chksum=0xdce5 src=127.0.0.1 dst=127.0.0.1 options=''
| \>
Однако проверка этого на моем компьютере с OS-X приводит к следующей ошибке:
>>> conf.L3socket=L3RawSocket
>>> sr1(IP(dst="127.0.0.1")/ICMP())
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scapy/sendrecv.py", line 334, in sr1
s=conf.L3socket(filter=filter, nofilter=nofilter, iface=iface)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scapy/supersocket.py", line 64, in __init__
self.ins = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(type))
AttributeError: 'module' object has no attribute 'AF_PACKET'
Так что ваш пробег может отличаться
РЕДАКТИРОВАТЬ
По-видимому, это известная ошибка в scapy в системах, подобных BSD (включая OS-X): http://bb.secdev.org/scapy/issue/174/sniffing-loopback-in-mac-os-x-darwin