协助处理Python脚本

0 投票
2 回答
888 浏览
提问于 2025-04-16 01:11

我写了一个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()

撰写回答