Fork me on GitHub

使用C#winform编写渗透测试工具--Web指纹识别

使用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等。

三、代码实现

  • 以调用字典的形式对网站特定文件和特定文件的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

posted @ 2021-08-04 17:09  吟风芥尘  阅读(1229)  评论(0编辑  收藏  举报