探测smtp服务器的Python脚本
我编写此脚本是为了测试单个ip地址,以便探测smtp服务器上的特定用户名,以进行pentest测试。我现在尝试移植这个脚本来运行相同的测试,但是要移植到一个ip地址范围,而不是单个ip地址。有人能解释一下如何实现这一目标吗探测smtp服务器的Python脚本,python,sockets,Python,Sockets,我编写此脚本是为了测试单个ip地址,以便探测smtp服务器上的特定用户名,以进行pentest测试。我现在尝试移植这个脚本来运行相同的测试,但是要移植到一个ip地址范围,而不是单个ip地址。有人能解释一下如何实现这一目标吗 #!/usr/bin/python import socket import sys users= [] for line in sys.stdin: line = line.strip() if line != '':
#!/usr/bin/python
import socket
import sys
users= []
for line in sys.stdin:
line = line.strip()
if line != '':
users.append(line)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((sys.argv[1], 25))
fp = s.makefile('rwb')
fp.readline()
fp.write('HELO test.example.com\r\n')
fp.flush()
fp.readline
for user in users:
fp.write('VRFY %s\r\n\ ' % user)
fp.flush()
print '%s: %s' % (user, fp.readline().strip())
fp.write('QUIT\r\n')
fp.flush()
s.close()
我将通过将代码转换为探测单个主机的函数来实现这一点,并将主机名/ip作为参数。然后,在主机列表上循环(从命令行、文件、用户交互查询或任何地方),并为循环中的每个主机调用单个主机探测器。如果您使用的是Python3.3+,这基本上很简单
import ipaddress # new in Python3.3
start_ip, end_ip = however_you_get_these_as_strings()
ip_networks = ipaddress.summarize_address_range(
ipaddress.IPv4Address(start_ip),
ipaddress.IPv4Address(end_ip))
# list of networks between those two IPs
for network in ip_networks:
for ip in network:
# ip is an ipaddress.IPv4Address object
probe(str(ip))
# which converts nicely to str
好的,下面是我为这项工作所做的。 这个解决方案一点也不优雅,但它确实起到了作用,而且,我无法花更多的时间纯粹用Python来寻找解决方案,所以在阅读了上面bmhkim的答案后,我决定(谢谢提示)编写一个bash脚本,让它在一系列ip地址上迭代,并为每个ip地址调用我的python脚本来实现它的魔力
#!/bin/bash
for ip in $(seq 1 254); do
python smtp-probe.py 192.168.1.$ip <users.txt
done
正如我上面所说,这是一个棘手的解决办法——我知道,但我不是程序员,所以这就是我能够找到的解决办法(如果你有一种纯Python的方法,我非常希望看到它)。一旦我有更多的时间,我肯定会再次访问这个问题,我会继续学习Python,直到我把它做好
谢谢大家对我问题的支持 你的范围将如何写?我假设
sys.argv[1]
是单个IP——您是如何通过该范围的filename.py 192.168.1.1 192.168.1.255
?我想采用的方法是将ip范围定义为脚本的参数。比如:filename.py 192.168.1.1-254192.168.1-2.1-254
?讨厌!事实上,你的结构更好,更具可读性。但是我需要查看并尝试如何将范围传递到脚本中。谢谢。哇,这是一种有趣的方法,我会在某个时候进行探索,但我现在不能这样做,因为我刚刚掌握了如何在Python2.7中执行手头的任务,所以我不知道如何修改脚本的其余部分以与版本3.3兼容。无论如何谢谢你!!
#!/usr/bin/python
import socket
import sys
users= []
for line in sys.stdin:
line = line.strip()
if line != '':
users.append(line)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((sys.argv[1], 25))
print sys.argv[1] #Notice the printing of the script arguments/ip addresses for my output
fp = s.makefile('rwb')
fp.readline()
fp.write('HELO test.example.com\r\n')
fp.flush()
fp.readline
for user in users:
fp.write('VRFY %s\r\n\ ' % user)
fp.flush()
print '%s: %s' % (user, fp.readline().strip())
fp.write('QUIT\r\n')
fp.flush()
s.close()