使用Python编写一个渗透测试探测工具

本篇将会涉及:php

  • 资源探测
  • 一个有用的字典资源
  • 第一个暴力探测器

文章首发:zmister.com/archives/18…

资源探测

资源探测在渗透测试中仍是属于资源的映射和信息的收集阶段。
主要有如下三个类型:html

  • 字典攻击
  • 暴力破解
  • 模糊测试

字典攻击,在破解密码或密钥的时候,经过自定义的字典文件,有针对性地尝试字典文件内全部的字典组合。python

暴力破解,也叫作穷举法,按照特定的组合,进行枚举全部的组合。简单来讲就是将密码进行逐个推算直到找出真正的密码为止。mysql

模糊测试,指经过向目标系统提供非预期性的输入并监视其发生的异常结果来发现目标系统的漏洞。git

资源探测的做用

经过资源探测,咱们能够在目标系统中发现文件、目录、活动、服务还有相关的参数,为下一步的行动提供信息参考。github

一个开源的模糊测试数据库

github.com/fuzzdb-proj… 是一个开源的漏洞注入和资源发现的原语字典。其提供了攻击、资源发现和响应分析的资源。web

第一个暴力探测器

在以前的章节,咱们了解了使用Python进行HTTP请求的方法,在本章,咱们了解的资源探测的做用的用途。接下面咱们就利用Python编写一个资源探测器,用来对Web网站进行资源探测。sql

咱们将上面介绍的开源模糊测试数据库FUZZDB从github上克隆或下载下来:数据库

这个数据库会做为咱们的资源探测器的字典,来对web站点进行针对性的探测。安全

新建一个Python文件,开始咱们的暴力探测器的编写。

首先,引入相关的模块:

# coding:utf-8

import requests
from threading import Thread
import sys
import getopt复制代码
  • requests用于请求目标站点;
  • threading用于启用多线程;
  • sys用于解析命令行参数;
  • getopt用于处理命令行参数;

而后,定义一个程序的横幅:

# 程序标识
def banner():
    print("\n********************")
    name = ''' ______ _ _ |___ / (_) | | / / _ __ ___ _ ___| |_ ___ _ __ / / | '_ ` _ \| / __| __/ _ \ '__| / /__| | | | | | \__ \ || __/ | /_____|_| |_| |_|_|___/\__\___|_| '''
    print(name)
    print("州的先生-暴力发掘器 v0.1")
    print("***********************")复制代码

这个横幅用于在程序启动的时候显示出来,除了让程序个性一点以外,也没啥用。

再定义一个函数,用来显示程序的用法:

# 程序用法
def usage():
    print("用法:")
    print(" -w:网址 (http://wensite.com/FUZZ)")
    print(" -t:线程数")
    print(" -f:字典文件")
    print("例子:bruteforcer.py -w http://zmister.com/FUZZ -t 5 -f commom.txt")复制代码

咱们的程序由于是在命令行下运行的,因此须要设置一些参数,在这里,咱们用:

  • -w来指定网址
  • -t 来指定线程数
  • -f来指定字典文件

这三个参数缺一不可。

这两个函数建立好后,运行程序便会出现以下界面:

看上去是否是有那么点意思。

接着,咱们建立一个继承于Thread的类request_performer(),用于建立线程并向目标站点发起请求以及获取响应:

class request_performer(Thread):
    def __init__(self,word,url):
        Thread.__init__(self)
        try:
            self.word = word.split("\n")[0]
            self.urly = url.replace('FUZZ',self.word)
            self.url = self.urly
        except Exception as e:
            print(e)

    def run(self):
        try:
            r = requests.get(self.url)
            print(self.url,"-",str(r.status_code))
            i[0] = i[0] -1
        except Exception as e:
            print(e)复制代码

在request_performer()类的run()方法里面,咱们利用requests对URL进行请求并将响应的状态码打印出来。而这,就是咱们这个探测器的最主要功能了。

再建立一个启动request_performer()类的函数launcher_thread(),用于遍历字典文件中的关键字组合成URL并生成新的线程。

def launcher_thread(names,th,url):
    global i
    i = []
    resultlist = []
    i.append(0)
    while len(names):
        try:
            if i[0] < th:
                n = names.pop(0)
                i[0] = i[0]+1
                thread = request_performer(n,url)
                thread.start()
        except KeyboardInterrupt:
            print("用户中止了程序运行。完成探测")
            sys.exit()
    return True复制代码

继续建立一个函数start(),用于接收命令行中的参数将其传递给launcher_thread()函数:

def start(argv):
    banner()
    if len(sys.argv) < 5:
        usage()
        sys.exit()
    try:
        opts,args = getopt.getopt(sys.argv[1:],"w:t:f:")
    except getopt.GetoptError:
        print("错误的参数")
        sys.exit()

    for opt,arg in opts:
        if opt == '-w':
            url = arg
        elif opt == '-f':
            dicts = arg
        elif opt == '-t':
            threads = int(arg)

    try:
        f = open(dicts,'r')
        words = f.readlines()
    except Exception as e:
        print("打开文件错误:",dicts,"\n")
        print(e)
        sys.exit()

    launcher_thread(words,threads,url)复制代码

最后,固然是在主程序中运行了:

if __name__ == '__main__':
    try:
        start(sys.argv[1:])
    except KeyboardInterrupt:
        print("用户中止了程序运行。完成探测")复制代码

我们这个程序到底有什么用呢?
在这里,咱们不得再也不提一下上面说起过的FUZZDB数据库。fuzzdb是一个用于模糊测试的数据库,相似于一个庞大的字典。而这些字典的内容呢,都是安全大神们维护的、在实践中发现颇有可能会是攻击点的目录或路径。

咱们能够打开数据库中的一个txt文件看看:

这是一个针对wordpress博客系统插件的一个字典,这里面都是插件的路径和目录。

测试暴力探测器

还记得在渗透测试环境搭建那篇文章介绍的虚拟机环境吗?
里面有一个充满漏洞的Web应用www.scruffybank.com/,咱们可使用咱们刚刚…
字典文件咱们先采用一个简单的字典:

咱们在命令行运行命令:

python3 brutediscovery.py -w http://www.scruffybank.com/FUZZ -t 5 -f common.txt复制代码

获得结果:

common.txt字典中有三个是成功的响应,咱们打开其中一个www.scruffybank.com/robots.txt看…

包含了三个禁止搜索引擎爬取的连接,看字面意思,其中一个仍是后台地址admin,可是在结果页咱们知道/admin是404错误,可是有一个/Admin,咱们打开看看:

弹出了认证登陆框,可是咱们没有用户名和密码,目前来讲只能做罢。

咱们再使用FUZZDB数据库里的字典测试一下。选择fuzzdb-master/discovery/predictable-filepaths/php目录下的PHP.fuzz.txt:

一样在终端命令行运行命令:

python3 brutediscovery.py -w http://www.scruffybank.com/FUZZ -t 5 -f PHP.fuzz.txt复制代码

获得结果:

虽然有不少404,可是咱们仍是发现了一些成功的响应:
好比info.php,打开原来是PHP的info界面:

login.php为登陆页面:

phpmyadmin是mysql数据库的web管理入口:

在数据探测收集阶段,咱们经过咱们本身编写的暴力探测器,得到了这些页面的信息,对分析服务器和web应用的漏洞并进行针对性的渗透有很大的帮助。

在接下来的文章里,咱们将丰富和完善咱们编写的渗透测试工具的功能。
敬请期待!

微信公众号:州的先生 同步更新
Pytho爬虫、数据分析、机器学习、渗透测试、Web开发:zmister.com/

相关文章
相关标签/搜索