0x00 前言Fortigate的識別需要區分管理頁面和VPN登陸頁面,版本探測需要根據頁面特徵提取特徵,根據特徵匹配出精確的版本,本文將要介紹通過Python實現Fortigate識別與版本探測的方法,開源代碼。
0x01 簡介本文將要介紹以下內容:
實現思路
實現細節
開源代碼
0x02 實現思路1.Fortigate的識別可通過跳轉的URL進行區分
管理頁面跳轉的url:/login?redir=%2F
vpn登陸頁面跳轉的url:/remote/login?lang=en
2.版本探測頁面源碼中存在32位的16進製字符串可以作為版本識別的特徵,每個版本對應不同的32位字符串
0x03 實現細節1.Fortigate的識別這裡的方法是直接訪問IP,根據頁面返回結果進行判斷
(1)管理頁面
在返回結果中就能獲得32位的16進製字符串
(2)vpn登陸頁面
返回的內容為跳轉地址,需要解析出跳轉地址重新構造URL並訪問,在返回結果中獲得32位的16進製字符串
返回跳轉地址的內容示例:
因為跳轉的url不固定,這裡可以通過正則匹配取出需要跳轉的url,示例代碼:
注:
在判斷版本時無法在requests模塊中使用allow_redirects=False參數來控制是否重定向,原因如下:
使用requests模塊時,如果使用allow_redirects=False參數,只有在返回狀態碼為301或302時,才會關閉重定向,這裡Fortigate返回的狀態碼為200,所以allow_redirects=False參數不起作用
2.版本探測在實際測試過程中,不同版本的Fortigate,雖然都會返回32位16進製字符,但是格式不同,為了提高匹配的效率,減少工作量,這裡在正則匹配時選擇直接匹配32位的16進製字符,示例代碼如下:
在實際測試過程中,存在response.text的輸出為亂碼的情況
研究解決方法的過程如下:
輸出response.headers,示例代碼:
返回結果:
發現編碼格式為x-gzip
所以這裡可以對response.text額外做一次gzip解碼,獲得原始數據,代碼如下:
完整的實現代碼如下:
注:
如果遇到通過瀏覽器訪問SSL Vpn Client頁面提示ERR_SSL_VERSION_OR_CIPHER_MISMATCH的錯誤時,程序將返回如下結果:
解決方法:
改用Python2即可
0x04 開源代碼完整的實現代碼已上傳至github,地址如下:
https://github.com/3gstudent/Homework-of-Python/blob/master/Fortigate_GetVersion.py
代碼支持區分管理頁面和VPN登陸頁面,提供了VM版本的指紋庫作為示例,代碼能夠從頁面自動提取出指紋特徵,同指紋庫進行比對,識別出精確的版本。
0x05 小結本文介紹了通過Python實現Fortigate識別與版本探測的方法,介紹實現細節,開源代碼,作為一個很好的學習示例。
Recommended Comments