您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關python怎樣調用jsDES加密,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
0x00 burpsuite的局限性
今天的滲透工作中黑盒測試遇到一個DES加密的登陸方式,遇到了很多坑,最終是通過python調用js進行des加密入手了這個站。
這次的情況是這樣的,當我測試登陸的時候,發現發送登錄請求時,驗證碼時可以復用的,原因是登陸失敗時沒有刷新session的值,導致圖形驗證碼可以復用。測試驗證碼可復用的方法就是burpsuite抓取登陸請求包發送到repeater里面不斷gogogogo,如果提示錯誤是驗證碼錯誤就說明漏洞不存在,但提示賬號或密碼錯誤就說明驗證碼可以復用。
美滋滋可以暴力破解,但是看到post的數據是加密的,為什么我知道是DES加密。原因是仔細觀察他的html頁面源代碼。發現這樣一段javascript代碼。
functionencryptByDES(message, key) {
var keyHex = CryptoJS.enc.Utf8.parse(key);
var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
并且發現開發這把加密密鑰也寫進了html里面,看到發送登陸請求時調用這個des加密函數encryptByDES,
頁面的js總是處處有驚喜。下面就進入正題說說我的pythondes加密爬坑記。
首先第一反應我是想到使用burpsuite進行paylaod處理暴力破解。
以前遇到的一些md5加密,sha1都可以在這里處理payload,然后簡單的就可以進行加密暴力破解了。
但是在這里找不到DES、RSA、AES等加密方式,這就是burpsuite的局限性。我們再來看看有什么方法可以進行此加密密碼。
0x02 理解js中的“DES加密”
我們理解了他原本登陸的函數,我們可以在瀏覽器F12里的控制臺,就直接可以調用他的加密函數。登陸加密的內容就是這個{"username":"admin","password":"12345678"}
encryptByDES('{"username":"admin","password":"12345678"}','232cb85*************cd354');
發現跟登陸請求包的post參數是一樣的。但暴力破解總不可能這樣一次次輸入的。
0x03 pythonDES加密模塊——pydes
然后再想想了,看python有沒有DES的加密模塊的,有的。Pydes模塊,這里有兩個坑點。
這是pydes模塊官方的使用模板
importbase64
frompyDes import *
Des_Key= "12345678" #Key
Des_IV= "" #自定IV向量
defDesEncrypt(str):
k= des(Des_Key, CBC, Des_IV, pad=None, padmode=PAD_PKCS5)
EncryptStr= k.encrypt(str)
returnbase64.b64encode(EncryptStr) #轉base64編碼返回
第一個坑點,我發現這個模塊只有des的ECB和CBC模式加密,并且填充方式只有pkcs5padding,和nomalpadding兩種。我需要的是pkcs7padding!!!!
第二個坑點,正常des加密key固定是8位的,3des加密是16或者24位的。但是,頁面源代碼里給我的是64位!!!什么肥事!!!!無奈之下另外一個想法,去在線加密看看。
0x04 設計DES加密api
到了在線加密,找了三個網站,其他兩個網站都報的是key位數錯誤,真的是要8位才行,但是唯獨這個網站可以。之前再頁面源代碼中可以看到js代碼DES加密方式是ECB模式的,并且是以pkcs7_padding的填充方式,加密過后是跟原來登陸請求包的加密數據是一樣的。
并且看到他的查詢數據包,是post需要加密的內容并返回加密過后的密碼的,所以打算使用python寫個加密的api的http請求?然后提取密碼再進行登陸的暴力破解。
的確是可以這樣加密暴力破解的。但是當我使用burpsuite快速的重放了這個數據包,就發現這方法不可行。
除非5秒請求一次。我在不知道賬號不知道密碼的情況下,還猜測不了用戶存不存在的情況下,這種情況是不可取的。(如果存在的用戶返回密碼錯誤。用戶不存在的時候返回賬號不存在,可以根據登陸的返回結果來猜測用戶存不存在)。
Api思路2
我們退一步回到該登陸頁面再看看,當我們訪問登陸頁面的時候,一共額外加載了這幾個js文件。
進去看了下真正用于des加密的三個js是如下圖
我們可以點擊它然后查看響應可以看到js的代碼,都然后保存到本地,然后可以把他們寫成自己的api。
這是把他們加密的js保存下來再自己寫的html頁面(js順序要正確)
<script src="core.js"></script>
<script src="tripledes"></script>
<script src="md5.js"></script>
<script src="mode-ecb.js"></script>
<script type="text/javascript">
function encryptByDES(message, key) {
var keyHex = CryptoJS.enc.Utf8.parse(key);
var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
</script>
于是可以寫到自己網站的一個頁面添加輸入和輸出的標簽,我們直接可以輸入輸出加密結果了,但這還不是最優的解法,這樣的話,還是要請求一次自己的網站再發一次登陸的請求。效率比直接再python加密再暴力破解低了一半!
0x05 python調用js——execjs
最后,我使用了一個python直接可以執行js代碼的模塊,相信除了登陸加密的用途外,其他地方都非常有用。
這個模塊叫execjs,然后把三個加密的js按順序疊加寫到一個文件里就可以了。
首先加密的函數時這樣的,首先讀取加密的js。
defget_js():#這個是獲取js的函數
f= open('C:\Users\\3s_NwGeek\Desktop\\des.js','r')
line = f.readline()
htmlstr = ''
whileline:
htmlstr = htmlstr+line
line = f.readline()
returnhtmlstr
這個是加密的函數。先獲取js然后解析js代碼再調用js的函數并傳參就可以返回加密的密碼了。
defDesEncrypt(str,key):#這個是des加密的函數
jsstr= get_js()#獲取js
ctx= execjs.compile(jsstr)#解析js代碼
password=ctx.call('encryptByDES',str,key)#調用encryptByDES函數,并傳參原文str和加密key
password=(password.encode("unicode_escape").decode("string_escape")).decode('unicode-escape').encode('utf-8')#解碼,解出來是unicode的
returnpassword
使用原來的原文進行加密,返回的結果是跟原來的請求包一樣的
{"username":"admin","password":"12345678"}
iKUJ1KTtfI4NqIHAf7QQha71W4vil4uLWR1YQREFkJLsx1W/aKLcnt9Ni7PalkpP
0x06 后話
tips:最后直接使用協程進行暴力破解,其實事先,我把滲透調研表的聯系人和負責人,還有整個部門的姓名信息,加了進去制作成一個用戶字典。比如說,姓名叫張三豐,那么就會有,zhangsanfeng,zhang_sanfeng,zhang_sf,zsf。然后制作了16個用戶再加常用的admin和root進行大字典的暴力破解。
排坑5小時,暴破5分鐘。
最終激動的顫抖叫出來“yes!!!!!”了
其實這個站每個月都會多家廠家做滲透,但也許看到密碼加密了就pass這個方式了,但是當你肯比別人付出更多的耐心,就能比別人看到更多的風景,挖到更多的漏洞。
看完上述內容,你們對python怎樣調用jsDES加密有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。