使用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栏中输入地址,点击开始查询,最后得到网站指纹信息。

github地址:https://github.com/Chenmengx/Penetration-testing-tool
使用C#winform编写渗透测试工具--Web指纹识别的更多相关文章
- 使用C#winform编写渗透测试工具--敏感目录扫描
使用C#winform编写渗透测试工具--敏感目录扫描 由于之前在做渗透测试的时候,发现使用的工具较多,切换起来较麻烦,便萌生了开发一个包含各种渗透测试工具的小程序,包括敏感目录扫描.端口查询.子域名 ...
- 使用C#winform编写渗透测试工具--SQL注入
使用C#winform编写渗透测试工具--SQL注入 本篇文章主要介绍使用C#winform编写渗透测试工具,实现SQL注入的功能.使用python编写SQL注入脚本,基于get显错注入的方式进行数据 ...
- #使用C#winform编写渗透测试工具--子域名挖掘
使用C#winform编写渗透测试工具--子域名挖掘 这篇文章主要介绍使用C#winform编写渗透测试工具--子域名挖掘.在渗透测试中,子域名的收集十分重要,通常一个网站的主站的防御能力特别强,而他 ...
- 使用C#winform编写渗透测试工具--暴力破解
使用C#winform编写渗透测试工具--暴力破解 这篇文章主要介绍使用C#winform编写渗透测试工具--暴力破解.暴力破解是指通过利用大量猜测和穷举的方式来尝试获取用户口令的攻击方式.简单来说就 ...
- 使用C#winform编写渗透测试工具--端口扫描
使用C#winform编写渗透测试工具--端口扫描器 主要介绍使用C#winform编写渗透测试工具--端口扫描器,端口扫描器则是一种检测服务器或者主机虚拟端口是开启或关闭的工具.由于连接到局域网或互 ...
- 轻量级Web渗透测试工具jSQL
轻量级Web渗透测试工具jSQL jSQL是Kali集成的一款轻量级的Web渗透测试工具.最初该工具主要实施SQL注入,后来增加更多的功能,扩展形成一个综合性的Web渗透测试工具.Kali提供的版本较 ...
- github渗透测试工具库
本文作者:Yunying 原文链接:https://www.cnblogs.com/BOHB-yunying/p/11856178.html 导航: 2.漏洞练习平台 WebGoat漏洞练习平台: h ...
- github渗透测试工具库[转载]
前言 今天看到一个博客里有这个置顶的工具清单,但是发现这些都是很早以前就有文章发出来的,我爬下来后一直放在txt里吃土.这里一起放出来. 漏洞练习平台 WebGoat漏洞练习平台:https://gi ...
- 渗透测试工具BurpSuite做网站的安全测试(基础版)
渗透测试工具BurpSuite做网站的安全测试(基础版) 版权声明:本文为博主原创文章,未经博主允许不得转载. 学习网址: https://t0data.gitbooks.io/burpsuite/c ...
随机推荐
- PRVF-0002: could not retrieve local nodename报错解决
- MEMORY_TARGET不够时解决办法
一.报错原因:设置的memory_max_target超过了系统中设置的share memory(/dev/shm)而已. 二.解决办法:增加tmpfs的大小 三.调整tmpfs的大小(两种方法) 1 ...
- Winform中用户自定义控件中外部设置子控件属性的方法
假设我们新建立一个用户自定义控件,由一个lable1和pictureBox1组成 此时我们在外部调用该控件,然后想动态改变lable1的值,我们该怎么办? 假设实例化的用户控件名为UserContro ...
- 向虚拟机注册钩子,实现Bean对象的初始化和销毁方法
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 有什么方式,能给代码留条活路? 有人说:人人都是产品经理,那你知道吗,人人也都可以是 ...
- Java实现单例模式的几种方式
单例模式(Singleton),保证在程序运行期间,内存中只有一个实例对象. 饿汉式,最常用的方式.JVM加载类到内存中时,创建实例,线程安全. public class Boss { private ...
- Excel的布尔值运算
TRUE被当做1进行加减乘除,例:1-TRUE=0. FALSE被当做0进行加减乘除,例:1-FALSE=1.(当做除数时,会因为分母为0返回错误值)
- elf文件结构解读以及plt节got节的理解
前言: 熟悉elf文件结构是一件很不错的事,因为安卓中的so加固以及修复都是需要这些知识的,包括pwn里面的rop之类的,也都是 和got节,plt节息息相关的,个人建议是在搞懂elf文件结构后,自己 ...
- Leetcode No.167 Two Sum II - Input array is sorted(c++实现)
1. 题目 1.1 英文题目 Given an array of integers numbers that is already sorted in non-decreasing order, fi ...
- Docker基础:VMware虚拟机Centos7环境下docker安装及使用
1.docker简介 2.docker安装 3.卸载docker 4.阿里云镜像加速 5.docker的常用命令 5.1 帮助命令 5.2 镜像命令 5.3 容器命令 5.4 后台启动命令 5.5 查 ...
- oracle 大表在线删除列操作(alter table table_name set unused )
在某些情况下业务建的表某些列没有用到,需要进行删除,但是如果是数据量很大的大表,直接 alter table table_name drop column column_name;这种方法删除,那么将 ...