协助处理Python脚本
我写了一个Python代码,想对它进行一些修改。这个代码是在我进行渗透测试时用的,我想让我的脚本变得更好。这个脚本会获取我输入的用户名,然后通过25号端口连接到SMTP服务器,检查这个用户是否存在。
#!/usr/bin/python
import socket
import sys
if len(sys.argv) != 2:
print "Usage: vrfy.py <username>"
sys.exit(0)
# Create a Socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect to the Server
connect=s.connect(('192.168.0.10',25))
# Recieve the banner
banner=s.recv(1024)
print banner
# VRFY a user
s.send('VRFY ' + sys.argv[1] + '\r\n')
result=s.recv(1024)
print result
# Close the socket
s.close()
我想进行的修改有以下几点:我不想只输入一个用户名来检查,而是想指定一个文本文件的位置,这样脚本就可以读取文件里所有的用户名。
另外,我希望脚本中的IP地址不要写死,而是每次使用脚本时都能手动输入。非常感谢!
Bar Aviv
2 个回答
0
可以使用类似下面的代码:
with open(sys.argv[1]) as f:
for line in f:
username = line.replace('\n', '')
print 'Testing with user: %s' % user
对于IP地址,你可以把它作为第二个参数传入——verify.py 用户名列表文件 服务器IP地址
——然后在代码中用 sys.argv[2] 来引用它。
你也可以这样做:
try:
userlist = sys.argv[1]
server_address = sys.argv[2]
except IndexError:
print 'Usage: verify.py username-list-file server-ip-address'
sys.exit(-1)
2
其实你不应该直接使用低级的socket里的 send()
和 recv()
这两个函数。因为它们并不能保证每次都能发送或接收特定数量的数据。可能在和某个特定的邮件服务器沟通时,它刚好能按你想的那样工作,但一旦命令和响应不能一一对应地装入IP数据包,你就会遇到奇怪的结果。
如果你想要一个简单的阻塞式对话流,可以试试通过 socket.makefile
来实现。
你可能还需要实现SMTP协议的更多内容……至少要先打个招呼!
下面的代码是从标准输入读取用户名的,所以你可以通过以下方式将一个用户名文件传给它:
python vrfy.py 127.0.0.1 < usernames.txt
不过如果你想的话,也可以把它改成读取 sys.argv[2]
作为另一个文件名参数。
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() # ignore banner
fp.write('HELO test.example.com\r\n')
fp.flush()
fp.readline() # ignore response
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()