對登錄中賬號密碼進行加密之後再傳輸的爆破的思路和方式
*原創作者:yiran4827,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
一. 概述
滲透測試過程中遇到web登錄的時候,現在很多場景賬號密碼都是經過js加密之後再請求發送(通過抓包可以看到加密信息)如圖一burp抓到的包,request的post的登錄包,很明顯可以看到password參數的值是經過前端加密之後再進行傳輸的,遇到這種情況,普通發包的爆破腳本就很難爆破成功。
鑒於這種情況,這邊分析四種方式進行繞過加密爆破。
二. 方法和思路
1. 分析找出是哪個js文件進行了password參數值的加密,將該js導入本地動態執行,建一個小型的web伺服器,利用瀏覽器頁面將js運行起來,把賬號密碼發給本地這個伺服器。
然後本地js執行加密之後把加密的值再給登錄的請求,實現普通的發包爆破。(這個時候普通的發包方式password參數的值就是加密之後的值)(這裡渲染 js 可以用 webdrive 或者 phantomjs,或者 Node.js 都行)
2. 利用selenium webdriver,本地驅動一個瀏覽器,完全模擬瀏覽器的操作,實現瀏覽器自動登錄爆破.(類似的工具,或者 Node.js,按鍵精靈,QTP 工具等都可以)
3. 通過對js里的加密演算法進行破解,或者是理清加密流程,然後利用自己熟知的編程語言實現同樣的加密方式(再下使用的是python),寫一個效果一樣的加密方式,然後把代碼嵌入到發包爆破代碼里,這種方式字典里賬號密碼傳入的時候,先進行加密再傳給登錄請求。(也是實現普通的發包爆破)
4. 利用前面的方法,把密碼字典全部加密之後生成對應加密字典,然後普通發包爆破的時候傳入加密的字典。
三. 具體的分析
1. 第一種方式:本地動態執行js
1) 分析登錄界面,根據登錄按鈕之後進行burp抓包,發現每次登陸之前都會先請求一個頁面
而該頁面返回的是一個json格式的m開頭和e開頭的值
下圖是直接從瀏覽器訪問的截圖
根據元素定位,從登陸頁面的 login()函數設置執行斷點調試,理清密碼利用 js 加密的一個過程,最後找出加密過程為登陸頁面中的 rasEncode函數
contextPath:就是網站首頁
str :是輸入的密碼的明文
url :contextPath+」抹掉的路徑」,就是上面所說每次登陸之前去請求的頁面,請求得到的就是modulus和exponent值
RSAPUB_KEY就是利用RSAUtils.getKeyPair函數加密modulus和exponent得到的值
enpassword就是最後我們在 第一張圖裡burp 里抓到密碼經過 js加密之後的值。
enpassword過程是利用RSAUtils.encryptedString函數,使RSAPUB_KEY為加密秘鑰對原始密碼進行字元串編碼的值進行加密的結果(encodeURIComponent是 JavaScript 中對字元串編碼的函數)
document.getElementById(『password』).value=enpassword,HTML 中一個方法,最好將 enpassword 的值給需要post 的password 欄位。
該過程中使用到的最主要的就是RSAUtils.getKeyPair和RSAUtils.encryptedString這兩個方法。
通過最 Sources 的搜索,發現這兩個方法都是security.js 中定義的。
理清過程和找到對應的 js 之後,就可以將 security.js 文件保存到本地,利用 python(也可以用其他語言)編寫一個簡易的的伺服器接收原始密碼,計算輸出 js 加密之後的密文。
實現如下:
server.py是起 簡易server的腳本
security.js 就是上面找到的加密的 js
index.html獲取原始密碼的首頁,result.html是進行加密的頁面
server.py 的代碼:
# -*- coding:utf-8 -*-from flask import Flask
from flask import render_template
from flask import request
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def hello_world():
if request.method == "GET":
return render_template("index.html")
if request.method == "POST":
print request.form["modulus"]
print request.form["exponent"]
print request.form["password"]
return render_template("result.html", modulus=request.form["modulus"], exponent=request.form["exponent"],password=request.form["password"])
if __name__ == "__main__":
app.run(debug=True)
index.html 的代碼:
result.html 的代碼:
{{ modulus }}
{{ exponent }}
Hello World!
這個 js 腳本就是圖七中加密的過程的精簡
var RSAPUB_KEY = "";
var enpassword = "";
var modulus = document.getElementById("modulus").textContent;
var exponent = document.getElementById("exponent").textContent;
RSAPUB_KEY = RSAUtils.getKeyPair(exponent, "", modulus);
enpassword = RSAUtils.encryptedString(RSAPUB_KEY, encodeURIComponent("{{ password }}"));
document.getElementById("result").innerHTML = enpassword;
console.log(enpassword);
server 運行起來之後打開的效果:
下圖是最後的運行結果,這也是我們需要的加密之後的值
接著就是爆破的腳本brute.py通過python的request模塊實現【詳情點擊閱讀原文】
爆破過程:
1.現將 server.py 運行起來
python server.py
2.然後運行爆破腳本
python brute.py
2. 第二種方式
利用selenium webdriver,(或者其他類似的自動化工具)本地驅動一個瀏覽器,完全模擬瀏覽器的操作,實現瀏覽器自動登錄爆破。
webdriver的實現代碼點擊閱讀原文可見。
3. 第三種方式,通過對js里的加密演算法進行破解,或者是理清加密流程:
第一是完全讀懂他加密演算法的實現然後破解他的加密演算法然後用自己熟知的編程語言重寫實現對密碼加密,或者不用讀懂破解他的演算法,理清他的邏輯照著寫一個就行了。
例如他用定義變數,你也定義變數,他循環你也循環,完全照抄翻譯式的寫一個即可。寫一個效果一樣的加密方式,然後把代碼嵌入到發包爆破代碼里,這種方式字典里賬號密碼傳入的時候,先進行加密再傳給登錄請求。(也是實現普通的發包爆破)
我們可以簡單看看他這裡的實現邏輯,
從第一種方法分析中我們得知,這裡就是實現密碼加密的方法,簡單的看是一個 RSA 加密RSAUtils.getKeyPair函數利用exponent和modulus生成加密的公鑰,然後RSAUtils.encryptedString利用公鑰對密碼進行加密,從斷點調試中可以得知 RSAPUB_KEY類型是一個對象。
而調用RSAUtils.getKeyPair和RSAUtils.encryptedString這兩個函數是 security.js這個 js 文件里定義的加密方法。
下圖是RSAUtils.encryptedString
去看了下標準的 RSA 加密演算法,每次得到的 利用相同的公鑰enpassword 都會變,因為添加的因子,但是這個 security.js 里的 js 每次的 enpassword 都是固定,所以跟標準的還是有出入。
最後花了是哪個小時左右一直沒有進展,就沒有繼續分析下去了。不過這裡更多的是提供分析的思路。知道的大牛可以傳授我姿勢。(如果日後還有時間,會把具體的實現代碼補上)
4. 第四種方式,利用上述的方法,把原始密碼字典轉換成加密之後的字典,然後普通發包爆破的時候傳入加密的字典。
到時候字典做成對應的格式
例如
admin: admin的加密值
123456:123456的加密值
qwerty:qwerty 的加密值
做成上面這種字典,發包傳入的是是加密之後的值,終端打出來或者爆破成功之後保存的卻是原始的值,利用我上文用的這個 spilt 方式取值。
username = U.split(":")[0].strip()
password = U.split(":")[1].strip()
點擊閱讀原文,可以看見我利用 html 寫的一個簡單轉化的方法,寫的很簡單,沒有實現保存保存的格式大家可以自行修改豐富,或者利用我第一種方式里的那個代碼原理去實現。
聯繫方式:
郵箱:yiran_weisuo@163.com
*原創作者:yiran4827,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
※如何對iOS App進行打補丁和重新簽名
※手電筒驚現海量Root病毒:私自扣費、強裝病毒、惡意彈窗
※SHA-1碰撞攻擊將會對我們產生怎樣的現實影響?
TAG:FreeBuf |
※常見的用戶密碼加密方式以及破解方法
※c語言對文件進行加密與解密
※終極加密手段:用人體傳輸信號
※和過去的防盜版措施比起來,現在的加密方式都無聊爆了
※java加密與解密之——對稱加密
※如何對電腦和筆記本電腦上的數據進行加密?
※虛擬密碼機重現二戰加密通信
※藏著大秘密的移動硬碟怕被盜?指紋加密是一招
※加密套件:密碼,演算法以及安全設置
※通過流量識別加密視頻內容:以色列學者提出神經網路攻擊模型
※測試加密方案中的缺陷?試試谷歌的這款工具
※又是D加密!EA《戰地1》中文未加密版下載發布
※Java加密與解密——非對稱加密
※精準狙擊 《狙擊手:幽靈戰士3》未加密補丁下載
※D加密再次被破 《建造者》CPY鏡像版遊戲下載
※單機周報:《搶灘登陸》出續作 最新D加密遭破解
※少女卡牌遊戲《限界凸騎》未加密版下載正式發布
※睿語加密手咪解決方案 開啟模擬對講安全通話新時代
※D加密再被破!《全面戰爭:戰錘》3DM搬運版