Python 端口扫描器
我刚开始学Python,现在遇到了一些问题。我想用Python 3自带的库来创建一个端口扫描器(也就是说不使用像scapy这样的库)。我现在有以下代码:
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()
现在我想给这个程序添加两个功能:
- 区分关闭的端口和被过滤的端口。在这两种情况下,我收到的错误代码是一样的,那我怎么才能判断我收到的是一个重置包(rst包)还是没有收到任何东西呢?我尝试过使用s.recv(),但好像不太管用。
- 我想控制尝试的次数,也就是说我只想发送一到两个同步包(syn包)。我不想让这个程序发送超过两个syn包来探测端口。这个功能怎么实现呢?
2 个回答
0
#!/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')
当然可以!不过你没有提供具体的内容,我无法进行翻译。如果你能把需要翻译的内容发给我,我会很乐意帮你把它变得更简单易懂。
1
区分关闭的端口和被过滤的端口。在这两种情况下,我收到的错误码是一样的,那我怎么能检查我收到的是一个重置包(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'
我想控制尝试的次数,也就是说,我只想发送一到两个同步包(SYN)。
我觉得没有一个叫做 setsockopt
的TCP选项可以用,但在Linux上有:
net.ipv4.tcp_syn_retries
不过,由于你限制了套接字的超时时间,所有在0.5秒内没有完成的操作都会超时。所以很可能只会发送1到2个SYN包。