我正在尝试制作一个TCP端口扫描程序,但我坚持一个非常简单的例子,我在网上找到了一个更高级的例子。
我没有收到任何错误。
我期待代码向我展示自我在Linux机器上启动Apache服务器以来端口80已打开。
以下是代码:
#!/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
输出是...... 什么都没有。
我尝试了几个方法,例如将端口更改为不同的其他端口,有些是我打开的,有些是我没有打开的。
关于我做错了什么的想法?
答案 0 :(得分:3)
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=''
| \&GT;
但是,在我的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的一个已知错误:http://bb.secdev.org/scapy/issue/174/sniffing-loopback-in-mac-os-x-darwin