【问题标题】:Simple Python SMTP Enumeration script简单的 Python SMTP 枚举脚本
【发布时间】:2016-04-10 00:54:24
【问题描述】:

我正在尝试编写一个简单的 Python SMTP 枚举脚本,它从文本文件(作为第二个参数提供的文件名 - sys.argv[2])读取用户名,并根据 SMTP 服务器(作为第一个提供的主机名或 ip论点 - sys.argv[1]。我发现了一些很接近的东西,并对其进行了一些调整,如下所示:

#!/usr/bin/python

import socket
import sys

users = sys.argv[2]
for line in users:
    line = line.strip()
    if line!='':
        users.append(line)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((sys.argv[1], 25))
fn = s.makefile('rwb')

fn.readline()                
fn.write('HELO testing.com \r\n')
fn.flush()
fn.readline()

for user in users:
    fn.write('VRFY %s\r\n' % user)
    fn.flush()
    print '%s: %s' % (user, fn.readline().strip())

fn.write('QUIT\r\n')
fn.flush()
s.close()

但是,当我运行脚本时(例如):

./smtp-vrfy.py 192.168.1.9 users.txt 

导致错误:

文件“./smtp-vrfy.py”,第 10 行,在 users.append(行) AttributeError: 'str' 对象没有属性 'append'

我做错了什么?我该如何解决?也许有更简单的方法来完成我想做的事情?

【问题讨论】:

    标签: python smtp-auth


    【解决方案1】:

    users 是一个文件名,但您没有在阅读它。相反,看看会发生什么:

    >>> users = "users.txt"
    >>> for line in users:
    ...     print(line)
    ...
    u
    s
    e
    r
    s
    .
    t
    x
    t
    

    你可能想要:

    with open(users) as f:
        for line in f:
            # ...
    

    更好:

    filename = sys.argv[2]
    with open(filename) as f:
        users = [line.strip() for line in f.readlines() if line]
    

    【讨论】:

    • 感谢您的帮助,但我有点困惑 - 您的意思是用以下代码替换我的第一行代码:with open(users) as f: for line in f: username = line.replace('\n', '') s.send('VRFY ' + 'username' + '\r\n') print 'Testing with user: %s' % username
    • @Cain 那也可以:)
    • 我觉得我快到了,但并不完全。我在上面使用了您的建议(您的最后一段代码),但它在 user = [line.strip() for line 中生成错误 File "./smtp-vrfy.py",第 21 行在 f.readlines if line] TypeError: 'builtin_function_or_method' object is not iterable
    • 你是对的,我添加了括号,现在脚本不再吐出任何回溯,但看起来它试图在 pythonic 中一次检查整个列表 格式,因为这是我得到的输出 -->> Testing with user: ['root', 'backup', 'bob', 'rick', 'david', 'harry', ' apache', 'igor', 'ron', 'mike', 'larry', 'joseph'] 550 5.1.1 user... User unknown....是不是因为文本文件有用户名在列中,而不是逗号分隔的列表?我整天都在做这件事,但似乎无法做到这一点。
    • @Cain 否。实际上,应该是 users(注意最后一个 s)。像这样:users = [line.strip() for line... 等等。然后您将检查循环中的每个元素for user in users...
    猜你喜欢
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2011-07-22
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多