Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863108528

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

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進製字符串

返回跳轉地址的內容示例:

1.png因為跳轉的url不固定,這裡可以通過正則匹配取出需要跳轉的url,示例代碼:

2.png

注:

在判斷版本時無法在requests模塊中使用allow_redirects=False參數來控制是否重定向,原因如下:

使用requests模塊時,如果使用allow_redirects=False參數,只有在返回狀態碼為301或302時,才會關閉重定向,這裡Fortigate返回的狀態碼為200,所以allow_redirects=False參數不起作用

2.版本探測在實際測試過程中,不同版本的Fortigate,雖然都會返回32位16進製字符,但是格式不同,為了提高匹配的效率,減少工作量,這裡在正則匹配時選擇直接匹配32位的16進製字符,示例代碼如下:

3.png

在實際測試過程中,存在response.text的輸出為亂碼的情況

研究解決方法的過程如下:

輸出response.headers,示例代碼:

4.png

返回結果:

5.png

發現編碼格式為x-gzip

所以這裡可以對response.text額外做一次gzip解碼,獲得原始數據,代碼如下:

6.png完整的實現代碼如下:

7.png 8.png

注:

如果遇到通過瀏覽器訪問SSL Vpn Client頁面提示ERR_SSL_VERSION_OR_CIPHER_MISMATCH的錯誤時,程序將返回如下結果:

9.png

解決方法:

改用Python2即可

0x04 開源代碼完整的實現代碼已上傳至github,地址如下:

https://github.com/3gstudent/Homework-of-Python/blob/master/Fortigate_GetVersion.py

代碼支持區分管理頁面和VPN登陸頁面,提供了VM版本的指紋庫作為示例,代碼能夠從頁面自動提取出指紋特徵,同指紋庫進行比對,識別出精確的版本。

0x05 小結本文介紹了通過Python實現Fortigate識別與版本探測的方法,介紹實現細節,開源代碼,作為一個很好的學習示例。