使用Scapy编写的Python TCP端口扫描器无响应

2 投票
1 回答
5174 浏览
提问于 2025-04-18 11:27

我正在尝试制作一个TCP端口扫描器,但我只是在做一个非常简单的例子,这个例子是我从网上找到的一个更复杂的例子中拼凑出来的。

我没有遇到任何错误。

我期待代码能告诉我端口80是开放的,因为我在我的Linux机器上启动了Apache服务器。

以下是代码:

#!/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

输出是…… 完全没有任何东西。

我尝试了几种方法,比如把端口换成其他不同的端口,有些是我已经打开的,有些则没有。

你觉得我哪里做错了?

1 个回答

3

scapy的文档提到,回环地址是一个特殊的情况。

回环接口是一个非常特殊的接口。通过这个接口发送的数据包并不是像正常那样被组装和拆解。内核在数据包仍然存储在内部结构中的时候,就已经将其路由到目的地。你在使用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'

所以你的情况可能会有所不同。

编辑

显然,这是在BSD类系统(包括OS-X)上Scapy的一个已知bug:http://bb.secdev.org/scapy/issue/174/sniffing-loopback-in-mac-os-x-darwin

撰写回答