Сканер портов 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:

STATE SERVICE
80/tcp   open  http

Вывод… Ничего.

Я попробовал несколько вещей, таких как изменение порта на другие порты, некоторые из которых были открыты, а некоторые нет.

Любые идеи относительно того, что я сделал неправильно?


person Daniel    schedule 28.06.2014    source источник
comment
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) не предотвращает проблему; он просто говорит «не говорите мне, что есть проблема (даже если она есть)».   -  person icktoofay    schedule 29.06.2014


Ответы (1)


scapy docs упоминают, что петлевой адрес является особым случаем

Интерфейс loopback — это очень специальный интерфейс. Проходящие через него пакеты на самом деле не собираются и не разбираются. Ядро направляет пакет к месту назначения, пока он еще сохраняет внутреннюю структуру. То, что вы видите с помощью 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

person Peter Gibson    schedule 29.06.2014