溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python怎樣調(diào)用jsDES加密

發(fā)布時間:2021-12-04 10:42:48 來源:億速云 閱讀:333 作者:柒染 欄目:網(wǎng)絡(luò)安全

今天就跟大家聊聊有關(guān)python怎樣調(diào)用jsDES加密,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

0x00  burpsuite的局限性

今天的滲透工作中黑盒測試遇到一個DES加密的登陸方式,遇到了很多坑,最終是通過python調(diào)用js進(jìn)行des加密入手了這個站。


python怎樣調(diào)用jsDES加密

這次的情況是這樣的,當(dāng)我測試登陸的時候,發(fā)現(xiàn)發(fā)送登錄請求時,驗證碼時可以復(fù)用的,原因是登陸失敗時沒有刷新session的值,導(dǎo)致圖形驗證碼可以復(fù)用。測試驗證碼可復(fù)用的方法就是burpsuite抓取登陸請求包發(fā)送到repeater里面不斷gogogogo,如果提示錯誤是驗證碼錯誤就說明漏洞不存在,但提示賬號或密碼錯誤就說明驗證碼可以復(fù)用。


python怎樣調(diào)用jsDES加密

美滋滋可以暴力破解,但是看到post的數(shù)據(jù)是加密的,為什么我知道是DES加密。原因是仔細(xì)觀察他的html頁面源代碼。發(fā)現(xiàn)這樣一段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();

}

并且發(fā)現(xiàn)開發(fā)這把加密密鑰也寫進(jìn)了html里面,看到發(fā)送登陸請求時調(diào)用這個des加密函數(shù)encryptByDES

python怎樣調(diào)用jsDES加密

頁面的js總是處處有驚喜。下面就進(jìn)入正題說說我的pythondes加密爬坑記。

首先第一反應(yīng)我是想到使用burpsuite進(jìn)行paylaod處理暴力破解。

以前遇到的一些md5加密,sha1都可以在這里處理payload,然后簡單的就可以進(jìn)行加密暴力破解了。

python怎樣調(diào)用jsDES加密

但是在這里找不到DES、RSA、AES等加密方式,這就是burpsuite的局限性。我們再來看看有什么方法可以進(jìn)行此加密密碼。

0x02   理解js中的“DES加密”


python怎樣調(diào)用jsDES加密

我們理解了他原本登陸的函數(shù),我們可以在瀏覽器F12里的控制臺,就直接可以調(diào)用他的加密函數(shù)。登陸加密的內(nèi)容就是這個{"username":"admin","password":"12345678"}

encryptByDES('{"username":"admin","password":"12345678"}','232cb85*************cd354');


python怎樣調(diào)用jsDES加密

發(fā)現(xiàn)跟登陸請求包的post參數(shù)是一樣的。但暴力破解總不可能這樣一次次輸入的。

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) #轉(zhuǎn)base64編碼返回

第一個坑點,我發(fā)現(xiàn)這個模塊只有des的ECB和CBC模式加密,并且填充方式只有pkcs5padding,和nomalpadding兩種。我需要的是pkcs7padding!?。。?/p>

第二個坑點,正常des加密key固定是8位的,3des加密是16或者24位的。但是,頁面源代碼里給我的是64位?。?!什么肥事?。。?!無奈之下另外一個想法,去在線加密看看。

0x04  設(shè)計DES加密api

到了在線加密,找了三個網(wǎng)站,其他兩個網(wǎng)站都報的是key位數(shù)錯誤,真的是要8位才行,但是唯獨(dú)這個網(wǎng)站可以。之前再頁面源代碼中可以看到j(luò)s代碼DES加密方式是ECB模式的,并且是以pkcs7_padding的填充方式,加密過后是跟原來登陸請求包的加密數(shù)據(jù)是一樣的。


python怎樣調(diào)用jsDES加密

并且看到他的查詢數(shù)據(jù)包,是post需要加密的內(nèi)容并返回加密過后的密碼的,所以打算使用python寫個加密的api的http請求?然后提取密碼再進(jìn)行登陸的暴力破解。


python怎樣調(diào)用jsDES加密

的確是可以這樣加密暴力破解的。但是當(dāng)我使用burpsuite快速的重放了這個數(shù)據(jù)包,就發(fā)現(xiàn)這方法不可行。


python怎樣調(diào)用jsDES加密


python怎樣調(diào)用jsDES加密

除非5秒請求一次。我在不知道賬號不知道密碼的情況下,還猜測不了用戶存不存在的情況下,這種情況是不可取的。(如果存在的用戶返回密碼錯誤。用戶不存在的時候返回賬號不存在,可以根據(jù)登陸的返回結(jié)果來猜測用戶存不存在)。

Api思路2

我們退一步回到該登陸頁面再看看,當(dāng)我們訪問登陸頁面的時候,一共額外加載了這幾個js文件。

python怎樣調(diào)用jsDES加密

進(jìn)去看了下真正用于des加密的三個js是如下圖

python怎樣調(diào)用jsDES加密

我們可以點擊它然后查看響應(yīng)可以看到j(luò)s的代碼,都然后保存到本地,然后可以把他們寫成自己的api。


python怎樣調(diào)用jsDES加密

這是把他們加密的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怎樣調(diào)用jsDES加密

于是可以寫到自己網(wǎng)站的一個頁面添加輸入和輸出的標(biāo)簽,我們直接可以輸入輸出加密結(jié)果了,但這還不是最優(yōu)的解法,這樣的話,還是要請求一次自己的網(wǎng)站再發(fā)一次登陸的請求。效率比直接再python加密再暴力破解低了一半!

0x05   python調(diào)用js——execjs

最后,我使用了一個python直接可以執(zhí)行js代碼的模塊,相信除了登陸加密的用途外,其他地方都非常有用。

這個模塊叫execjs,然后把三個加密的js按順序疊加寫到一個文件里就可以了。

首先加密的函數(shù)時這樣的,首先讀取加密的js。

defget_js():#這個是獲取js的函數(shù)
  f= open('C:\Users\\3s_NwGeek\Desktop\\des.js','r')
  line = f.readline()
   htmlstr = ''
 
whileline:
      htmlstr = htmlstr+line
       line = f.readline()
  returnhtmlstr

這個是加密的函數(shù)。先獲取js然后解析js代碼再調(diào)用js的函數(shù)并傳參就可以返回加密的密碼了。
defDesEncrypt(str,key):#這個是des加密的函數(shù)

  jsstr= get_js()#獲取js
  ctx= execjs.compile(jsstr)#解析js代碼
 password=ctx.call('encryptByDES',str,key)#調(diào)用encryptByDES函數(shù),并傳參原文str和加密key
 password=(password.encode("unicode_escape").decode("string_escape")).decode('unicode-escape').encode('utf-8')#解碼,解出來是unicode的
  returnpassword

使用原來的原文進(jìn)行加密,返回的結(jié)果是跟原來的請求包一樣的

{"username":"admin","password":"12345678"}

iKUJ1KTtfI4NqIHAf7QQha71W4vil4uLWR1YQREFkJLsx1W/aKLcnt9Ni7PalkpP

0x06 后話

tips最后直接使用協(xié)程進(jìn)行暴力破解,其實事先,我把滲透調(diào)研表的聯(lián)系人和負(fù)責(zé)人,還有整個部門的姓名信息,加了進(jìn)去制作成一個用戶字典。比如說,姓名叫張三豐,那么就會有,zhangsanfeng,zhang_sanfeng,zhang_sf,zsf。然后制作了16個用戶再加常用的admin和root進(jìn)行大字典的暴力破解。

排坑5小時,暴破5分鐘。

最終激動的顫抖叫出來“yes?。。。?!”了

python怎樣調(diào)用jsDES加密

其實這個站每個月都會多家廠家做滲透,但也許看到密碼加密了就pass這個方式了,但是當(dāng)你肯比別人付出更多的耐心,就能比別人看到更多的風(fēng)景,挖到更多的漏洞。

看完上述內(nèi)容,你們對python怎樣調(diào)用jsDES加密有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI