使用C#winform編寫滲透測試工具--Web指紋識別

吟風芥塵發表於2021-08-04

使用C#winform編寫滲透測試工具--web指紋識別

本篇文章主要介紹使用C#winform編寫滲透測試工具--Web指紋識別。在滲透測試中,web指紋識別是資訊收集關鍵的一步,通常是使用各種工具如WhatWebWapplyzer、Whatruns等進行網站的指紋識別,以獲取CMS型別、Web服務元件型別及版本資訊,根據識別的資訊在網站查詢相應元件的漏洞,進行滲透測試。

  • 下面是使用C#winform編寫的滲透測試工具,前面我們已經完成了埠掃描、敏感目錄掃描和暴力破解等工作,這一部分將介紹如何實現web指紋識別。

目錄

  1. 常見指紋檢測物件
  2. 指紋識別方法
  3. 程式碼實現
  4. 軟體使用步驟

一、常見指紋檢測物件

  1. CMS資訊:比如大漢CMS、織夢、帝國CMS、phpcms、ecshop等;

  2. 前端技術:比如HTML5、jquery、bootstrap、pure、ace等;

  3. Web伺服器:比如Apache、lighttpd, Nginx, IIS等;

  4. 應用伺服器:比如Tomcat、Jboss、weblogic、websphere等;

  5. 開發語言:比如PHP、Java、Ruby、Python、C#等;

  6. 作業系統資訊:比如linux、win2k8、win7、kali、centos等;

  7. CDN資訊:是否使用CDN,如cloudflare、360cdn、365cyd、yunjiasu等;

  8. WAF資訊:是否使用waf,如Topsec、Jiasule、Yundun等;

  9. IP及域名資訊:IP和域名註冊資訊、服務商資訊等;

  10. 埠資訊:有些軟體或平臺還會探測伺服器開放的常見埠。

二、指紋識別方法

引用自Web指紋識別技術研究與優化實現

1. 特定特定檔案的MD5

CMS是Content Management System的縮寫,意為"內容管理系統",這是百度百科的解釋,意思是相當於網站的建站模板,整個網站架構已經整合好了,只需要你部署和安裝,便可以搭起一個網站,這樣雖然方便了開發人員建設網站,但也帶來新的安全問題,如果cms本身有安全問題如一些高危漏洞,那麼使用這個cms的所有網站都會存在這種安全漏洞,所以我們在進行滲透測試的時候,如果可以探測出網站使用的框架,那麼我們便可以尋找這個框架的漏洞,從而成功拿下這個網站,所以在滲透過程中,探測網站的cms是一件很重要的事,網上有開源的常見的cms的字典庫,我們可以手寫一個cms識別程式來對cms進行識別,方便我們進行滲透。

2. 正常頁面或錯誤網頁中包含的關鍵字

先訪問首頁或特定頁面如robots.txt等,通過正則的方式去匹配某些關鍵字,如Powered by Discuz、dedecms等。或者可以構造錯誤頁面,根據報錯資訊來判斷使用的CMS或者中介軟體資訊,比較常見的如tomcat的報錯頁面。

3. 請求頭資訊的關鍵字匹配

根據網站response返回頭資訊進行關鍵字匹配,whatweb和Wappalyzer就是通過banner資訊來快速識別指紋,之前fofa的web指紋庫很多都是使用的這種方法,效率非常高,基本請求一次就可以,但蒐集這些規則可能會耗時很長。而且這些banner資訊有些很容易被改掉。
根據response header一般有以下幾種識別方式:

  • 檢視http響應報頭的X-Powered-By欄位來識別;
  • 根據Cookies來進行判斷,比如一些waf會在返回頭中包含一些資訊,如360wzws、Safedog、yunsuo等;
  • 根據header中的Server資訊來判斷,如DVRDVS-Webs、yunjiasu-nginx、Mod_Security、nginx-wallarm等;
  • 根據WWW-Authenticate進行判斷,一些路由交換裝置可能存在這個欄位,如NETCORE、huawei、h3c等裝置。

4. 部分URL中包含的關鍵字,比如wp-includes、dede等URL關鍵特徵

通過規則庫去探測是否有相應目錄,或者根據爬蟲結果對連結url進行分析,或者對robots.txt檔案中目錄進行檢測等等方式,通過url地址來判別是否使用了某CMS,比如wordpress預設存在wp-includes和wp-admin目錄,織夢預設管理後臺為dede目錄,solr平臺可能使用/solr目錄,weblogic可能使用wls-wsat目錄等。

5. 開發語言的識別

web開發語言一般常見的有PHP、jsp、aspx、asp等,常見的識別方式有:

  • 通過爬蟲獲取動態連結進行直接判斷是比較簡便的方法。
    asp判別規則如下<a[^>]*?href=(‘|”)[^http][^>]*?\.asp(\?|\#|\1),其他語言可替換相應asp即可。
  • 通過X-Powered-By進行識別
    比較常見的有X-Powered-By: ASP.NET或者X-Powered-By: PHP/7.1.8
  • 通過Set-Cookie進行識別
    這種方法比較常見也很快捷,比如Set-Cookie中包含PHPSSIONID說明是php、包含JSESSIONID說明是java、包含ASP.NET_SessionId說明是aspx等。

三、程式碼實現

使用python編寫指令碼呼叫Api介面

import requests
import zlib
import json
import sys

def whatweb(url):
    response = requests.get(url, verify=False)
    whatweb_dict = {"url":response.url,"text":response.text,"headers":dict(response.headers)}
    whatweb_dict = json.dumps(whatweb_dict)
    whatweb_dict = whatweb_dict.encode()
    whatweb_dict = zlib.compress(whatweb_dict)
    data = {"info":whatweb_dict}
    return requests.post("http://whatweb.bugscaner.com/api.go", files=data)

if __name__ == '__main__':
    # request = whatweb("http://whatweb.bugscaner.com/apidoc.html")
    request = whatweb(sys.argv[1])
    # print(u"今日識別剩餘次數")
    # print(request.headers["X-RateLimit-Remaining"])
    y = request.json()
    print(u"識別結果:")
    try:
        print("CMS:", y['CMS'] )
    except:
        print("CMS:未識別")
    try:
        print("Programming Languages:", y['Programming Languages'])
    except:
        print("Programming Languages:未識別")
    try:
        print("JavaScript Frameworks:", y['JavaScript Frameworks'])
    except:
        print("JavaScript Frameworks:未識別")
    try:
        print("CDN:", y['CDN'])
    except:
        print("CDN:未識別")
    try:
        print("Advertising Networks", y['Advertising Networks'])
    except:
        print("Advertising Networks:未識別")
    try:
        print("Web Servers", y['Web Servers'])
    except:
        print("Web Servers:未識別")

C#呼叫指令碼

對於python指令碼中包含第三方模組的情況,同樣,通過直接建立Process程式,呼叫python指令碼,返回掃描結果。

  • 建立按鈕按下事件button1_Click,執行“呼叫python指令碼”函式runPythonwebfinger()
private void button12_Click(object sender, EventArgs e)
        {
            richTextBox7.Clear();
            runPythonwebfinger();//執行python函式
            label35.Text = "開始掃描...";
        }
  • 例項化一個python程式 呼叫.py 指令碼
void runPythonwebfinger()
        {
            string url = textBox5.Text;
            p = new Process();
            string path = "web_fingerprint_v2.py";//待處理python檔案的路徑,本例中放在debug資料夾下
            string sArguments = path;
            ArrayList arrayList = new ArrayList();
            arrayList.Add(url);//需要挖掘的域名
            foreach (var param in arrayList)//拼接引數
            {
                sArguments += " " + param;
            }
            p.StartInfo.FileName = @"D:\Anaconda\python.exe"; //沒有配環境變數的話,可以寫"xx\xx\python.exe"的絕對路徑。如果配了,直接寫"python"即可
            p.StartInfo.Arguments = sArguments;//python命令的引數
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            p.Start();//啟動程式
            //MessageBox.Show("啟動成功");
            p.BeginOutputReadLine();
            p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived_webfinger);
            Console.ReadLine();
            //p.WaitForExit();
        }
  • 輸出接收事件函式
void p_OutputDataReceived_webfinger(object sender, DataReceivedEventArgs e)
        {
            var printedStr = e.Data;
            Action at = new Action(delegate ()
            {
                //接受.py程式列印的字元資訊到文字顯示框
                richTextBox7.AppendText(printedStr + "\n");
                label35.Text = "掃描結束";
            });
            Invoke(at);
        }

軟體使用步驟

*首先在url欄中輸入地址,點選開始查詢,最後得到網站指紋資訊。

github地址:https://github.com/Chenmengx/Penetration-testing-tool

相關文章