我目前正在学习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
答案 0 :(得分:2)
将该功能移至脚本的顶层。不要将它嵌套在循环内的if语句中。
没有必要在循环中重新定义函数(并且在条件中定义它似乎也不好)
必须在函数上面写一个函数
不完全。函数只需要在运行它们的代码之前定义。这些函数不需要明确地在它们被调用的“代码之上”。相同的逻辑适用于变量。
如果需要为函数引用某些变量,请使用参数。
答案 1 :(得分:0)
Python是一种动态语言,但要求顶级函数通过解释时间来解析。
只需将功能移至顶部并稍后调用,或将其嵌套在函数中。
例如,不会工作:
x()
def x():
pass
然而,这将起作用:
def x():
pass
x()
这样:
def y():
x()
def x():
pass
y()
Python为您提供了所有工具,可以轻松避免前向声明和循环依赖。