使用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欄中輸入地址,點擊開始查詢,最后得到網站指紋信息。