暴力破解測試工具 Patator 原始碼分析

2021-06-17 14:48:20 字數 4071 閱讀 5926

說到暴力破解大家首先想到的肯定是hydra,的確hydra的確非常強大,支援幾乎所有的弱密碼破解。hydra本身使用c語言開發,效能很高,很適合學習。

但今天我們使用的是patator,patator本身使用python開發,最新版本也就4000行左右,可以說小到極致,這主要多虧了python庫的豐富和強大。

比較遺憾的是需要自己提供密碼字典,下面我們就揭開patator的真面目。

先來掃個telnet弱密碼,看下效果:

其中telnet_login,意思是掃telnet,其中user.txt是使用者名稱字典,passwd.txt是密碼字典

patator和hydra都會交叉使用者名稱和密碼檔案,通過上訴比較我們可以看出,兩者最大不同點在於,hydra直接可以輸出成功的使用者名稱和密碼,但patator只輸出認證後資訊。

這也導致了hydra比patator更好用,但難免會有誤報。

其中telnet模組原始碼如下:

# telnet }}
把核心部分抽出來,流程是這樣的。

建立乙個連線到telnetlib.telnet物件fp  -->> 等待出現匹配正則(\w+:)字元出現(如 login:,username等)

-->> 傳送使用者名稱 -->>繼續等待(\w+:)出現(如passwd:,password:) -->> 傳送密碼  ->> 等待(\w+:)出現,輸出返回字串

過程就是這麼簡單,其中expect函式接受二個引數,第乙個是正規表示式的列表,可以是編譯好的,也可以是字串,第二個是超時時間。

返回乙個三項的tuple,第乙個是匹配到的正則序號(從0開始),第二個是匹配match的物件,第三個是直到正則的返回資料(包括匹配內容)

這說的有點抽象。

請看下面:

從上面我們可以很明顯看出,匹配的正則是按順序的,雖然返回資料中,『bo'在』lo'之前,但由於在正則列表中『lo'在前,所以資料一致讀到』lo'。

到這裡為止,大家應該對patator如何去爆telnet弱密碼基本了解了。

但如果我們想直接得出破解的使用者名稱和密碼,這該怎麼辦呢?

有一種思路就是提供乙個錯誤的使用者名稱和密碼,儲存返回的內容,然後每次獲取要測試的使用者名稱和密碼的回內容,通過比較兩次的結果就可以結果了。但由於返回內容會千奇百怪,所以要做較多的特殊處理。

如以下**:

import telnetlib

class telnet_check:

def __init__(self,host,port=23,timeout=10):

self.host=host

self.port=port

self.timeout=timeout

self.promote='\w+:'

self.errmsg=''

self.geterrmsg()

def connect(self):

return telnetlib.telnet(self.host,self.port,self.timeout)

def geterrmsg(self):

f=self.connect()

f.expect([self.promote],self.timeout)

f.write('nullnull\r')

f.expect([self.promote],self.timeout)

f.write('nullnull\r')

_,_,self.errmsg=f.expect([self.promote],self.timeout)

self.errmsg=self.errmsg.strip()

def check(self,user,passwd):

t=self.connect()

t.expect([self.promote],self.timeout)

t.write(user+'\r')

_,_,p=t.expect([self.promote],self.timeout)

if p.strip() == self.errmsg:

return false

t.write(passwd+'\r')

_,_,loginmsg=t.expect([self.promote],self.timeout)

loginmsg=loginmsg.strip()

if self.errmsg != '' and self.errmsg != loginmsg:

return true

else:

return false

if __name__=='__main__':

tn=telnet_check('127.0.0.1')

print tn.check('yihaibo','1')

print tn.check('root','root')

print tn.check('admin','admin')

執行結果如下:

我們發現這的確是一種可行的辦法。這也給hydra誤報帶來了解決辦法。

由於每次都建立telnetlib.telnet物件比較浪費資源,patator使用了快取來解決這個問題,但這裡我一直有乙個疑問,為啥telnet物件可以快取,如果親明白,教教我吧!

telnet_login的父類tcp_cache簡化**如下:

class tcp_cache:

def __init__(self):

self.cache = {} #

for w in set(warnings):

mods, url, ver = dependencies[w]

if name in mods:

print('error: %s %s (%s) is required to run %s.' % (w, ver, url, name))

abort = true

上面這是我簡化後的**,從中可以看出,有乙個全域性變數列表warning,每次匯入需要的庫時,如果匯入失敗,則將庫名加入warning,當我們通過命令列傳遞使用哪個模組時,如我們使用pycurl,這時我們發現在warnings中含有「pycurl",所以就提示我們需要安裝庫,而且很智慧型的將庫的位址也給我們了。

由於是弱密碼掃瞄,字典肯定不小,那麼為了追求速度,肯定要使用執行緒,patator預設使用10個執行緒去跑,這部分**主要在控制部分中(class controller),**還是有點小複雜的。

gqueues = [queue(maxsize=10000) for _ in range(self.num_threads)]

# consumers

for num in range(self.num_threads):

pqueue = queue(maxsize=1000)

t = thread(target=self.consume, args=(gqueues[num], pqueue))

t.daemon = true

t.start()

# producer

t = thread(target=self.produce, args=(gqueues,))

t.daemon = true

t.start()

正如你所看到的,啟用了兩個最經典的執行緒,乙個produce,乙個consume,兩者通訊使用的是queue。self.num_threads是可配的,通過命名行中指定 -t,否則將是預設的10個執行緒。

到這裡就要和大家說再見了,patator原始碼還是值得一讀的,剩下的就交給你們自己行動了。

HASH暴力破解工具 Hashcat

烏雲網看到一篇文章講述hashcat的使用簡介 戳這裡 對使用字典破解md5內容 簡單在kali上嘗試了一下。1 首先檢視了下hashcat的幫助文件,簡單擷取了其中的部分常用說明。hashcat,advanced password recovery usage hashcat options ha...

暴力破解 字典工具

kali自帶了以下幾個好用的外部字典。cewl工具可以自動爬取 關鍵字後生成字典檔案。cewl www.example.com m 6 w example cewl.txt m引數,生成的密碼最小位數為6 w引數,指定字典生成的位置和名稱 etc john john.conf檔案儲存著john工具的...

Hydra(暴力破解工具)引數

r 根據上一次進度繼續破解 s 使用ssl協議連線 s 指定埠 l 指定使用者名稱 l 指定使用者名稱字典 檔案 p 指定密碼破解 p 指定密碼字典 檔案 e 空密碼探測和指定使用者密碼探測 ns c 使用者名稱可以用 分割 username password 可以代替 l username p p...