使用C#winform编写渗透测试工具--Web指纹识别
使用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栏中输入地址,点击开始查询,最后得到网站指纹信息。