使用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/

相關文章
相關標籤/搜索