2010-07-12 2 views
0

Я написал код в Python, и я хочу его изменить. Я использую его, когда выполняю тесты на проникновение в свою организацию, и я хочу улучшить свой сценарий. Сценарий получает имя пользователя, которое я вхожу, и оно подключается к SMTP-серверу через порт 25 и проверяет, существует ли пользователь. Вот сценарий:Помогите с скриптом Python

#!/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-адрес в скрипте не будет жестко закодирован, и мне нужно будет вставлять его каждый раз, когда я использую скрипт. Большое спасибо заранее,

Бар Aviv

+0

Его вещи, подобные этому (имя пользователя), поэтому я отключил VRFY в своей почтовой программе. –

ответ

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 username-list-file server-ip-address - и ссылки как 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) 
+0

Я постараюсь, спасибо! –

2

Вы действительно не должны использовать низкоуровневый разъем send() и recv() непосредственно, как это. Им не гарантируется отправка/получение какого-либо определенного объема данных. Возможно, вам просто нужно работать так, как вы хотите разговаривать с одним конкретным почтовым сервером, но как только команды/ответы не подходят друг к другу в IP-пакеты, вы получите странные результаты.

Если вы хотите простой блокирующий поток, попробуйте интерфейс файла, который вы получаете от socket.makefile.

Возможно, вы должны реализовать немного больше SMTP ... хотя бы сказать helo!

Ниже читает имена пользователей из стандартного ввода, так что вы можете направить файл имен пользователей к нему, говоря:

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() 
Смежные вопросы