Hydra源碼學習
由於工作需要,閱讀了hydra的源碼,現整理一下,方便後期翻閱學習
Hydra的簡介及用法
關於hydra的簡介及用法,網上有很多的資料,本次便不在贅述Hydra中需要知道的幾個點
1、 密碼、用戶名存儲格式
Hydra的使用可以直接讀取用戶名錶和密碼錶,讀出數據後,每個地段中間使用’\0’進行切割,故使用printf和string.h的函數在此地不可用。
例如:
User表是
root
asdf
123asd
則在內存中的存儲字段爲
Root\0asdf\0123asd
密碼錶同理。因爲鍵盤上凡是能出現的字母和符號均有可能是密碼的一部分。故使用\0進行切割,是種聰明的做法。
*2、 服務之間的通信機制
對某個服務進行密碼破解時,是使用fork進程,並且創建了兩個互相通信的套接字,
Socketpair函數是創建一對相互連接的套接字,用於本機內的進程通信。
在子進行中開啓密碼破解服務,父進程中進行數據的接收處理。3、 用戶名、密碼的傳遞
上面說了父子進程的作用,在子進程中獲取用戶名和密碼也是通過套接字進行數據的獲取。
由於不只是一個進程,會存在最多32個父子程同時處理,父子進程在用戶名密碼這塊的處理使用的是一個數組
即從套接字中獲取一對用戶名和密碼存儲在pair數組中。
格式爲\0隔開。即root\0123456.
在截取時,使用while循環,遇到\0結束4、 父進程的數據接收處理
父進程使用select進行數據的接收處理,雖然select效率不如epoll高,但是考慮到最多也就32個進程。使用select萬全能夠勝任
從子進程收到的數據,之後再分別進行處理- 5、 服務的密碼破解
這部分在子進程中進行,邏輯很簡單。首先對服務的ip和port進行tcp連接,有-s參數的,會使用ssl進行連接,該處有兩個作用。1、是爲了檢測該服務是否存在或者是否正在運行中,2、針對於部分服務需要使用該套接字進行數據會話。
對於postgres和mysql這類有現成api的服務。直接使用api進行連接。成功時代表用戶名密碼正確,失敗代表不正確。
對於telnet、ftp這類的服務。使用的是數據交換的方式,將用戶名密碼封裝爲特定格式數據通過之前的套接字進行發送,然後接收返回信息。根據返回信息進行結果的判斷。