Python端口扫描器
问题描述:
新手到python并卡住了一个点。我想创建一个端口扫描器只使用Python 3个的内置库(意味着避免Scapy的等),我有以下代码:Python端口扫描器
import socket
for i in range(1,26):
s = socket.socket()
s.settimeout(0.5)
ip = "74.207.244.221" #scanme.nmap.org
response = s.connect_ex((ip, i))
if response:
print ("%d\tclose" %i)
else:
print ("%d\topen" %i)
s.close()
现在我想2层的功能添加到这一点:那就是
- 区分关闭和过滤端口之间。在这两种情况下,我都会收到相同的errno,因此如何检查我是否收到了第一个数据包?据我所知s.recv()不适用于此。
- 我想控制尝试次数(尝试),即我只想发送一个或两个syn数据包。我不希望这个程序发送超过2个syn数据包用于探测。这件事如何实现?
答
区分关闭和过滤的端口。在这两种情况下是 接收返回同一错误号我怎么能检查,如果我收到 回RST包或没有
你可能只与发送RST服务器进行检查。下面是我的尝试:
-
第一种情况,正常的配置:
>>> os.strerror(s.connect_ex((ip, 81))) 'Connection refused'
-
其次,具有手动iptables的:
iptables -A OUTPUT -p tcp --dport 81 -j DROP >>> os.strerror(s.connect_ex((ip, 81))) 'Resource temporarily unavailable'
我要控制数量尝试(尝试),即我想发送 只有一个或两个同步数据包。
我不认为有暴露setsockopt
TCP选项,但在Linux上有:
net.ipv4.tcp_syn_retries
不过,既然你限制了超时套接字,所有操作不中0.5完成秒会超时。所以很可能只有1或2个SYN会离开电台。
答
#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INET, socekt.SOCK_STREAM)
host = 74.207.244.221
def portscan(port):
try:
s.connect((host,port))
return True
else:
return False
for x in range(1,255):
if portscan(x):
print('Port',x,'Is Open')
+0
的声誉写一个新手尽管此代码可以回答这个问题的代码要好得多,提供关于为什么和/或如何代码的其他方面回答这个问题提高了它的长期价值。 – 2017-10-27 19:20:54
我希望每一个现有的端口扫描器会比与1 – 2013-02-20 05:24:58