使用C#winform編寫滲透測試工具--web指紋識別
本篇文章主要介紹使用C#winform編寫滲透測試工具--Web指紋識別。在滲透測試中,web指紋識別是資訊收集關鍵的一步,通常是使用各種工具如WhatWeb、Wapplyzer、Whatruns等進行網站的指紋識別,以獲取CMS型別、Web服務元件型別及版本資訊,根據識別的資訊在網站查詢相應元件的漏洞,進行滲透測試。
- 下面是使用C#winform編寫的滲透測試工具,前面我們已經完成了埠掃描、敏感目錄掃描和暴力破解等工作,這一部分將介紹如何實現web指紋識別。
目錄
- 常見指紋檢測物件
- 指紋識別方法
- 程式碼實現
- 軟體使用步驟
一、常見指紋檢測物件
-
CMS資訊:比如大漢CMS、織夢、帝國CMS、phpcms、ecshop等;
-
前端技術:比如HTML5、jquery、bootstrap、pure、ace等;
-
Web伺服器:比如Apache、lighttpd, Nginx, IIS等;
-
應用伺服器:比如Tomcat、Jboss、weblogic、websphere等;
-
開發語言:比如PHP、Java、Ruby、Python、C#等;
-
作業系統資訊:比如linux、win2k8、win7、kali、centos等;
-
CDN資訊:是否使用CDN,如cloudflare、360cdn、365cyd、yunjiasu等;
-
WAF資訊:是否使用waf,如Topsec、Jiasule、Yundun等;
-
IP及域名資訊:IP和域名註冊資訊、服務商資訊等;
-
埠資訊:有些軟體或平臺還會探測伺服器開放的常見埠。
二、指紋識別方法
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等。
三、程式碼實現
- 以呼叫字典的形式對網站特定檔案和特定檔案的MD5值進行檢測,判斷網站的CMS,如python安全程式設計之指紋識別和b站視訊Python安全程式設計,但該方法比較依賴字典的準確性。
- 使用線上測試網站如Wappalyzer提供的Api介面,該軟體就是基於該方法進行開發。
使用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欄中輸入地址,點選開始查詢,最後得到網站指紋資訊。