Webpack js算法逆向實戰學習
推文開頭,先學習一下中華人民共和國網絡安全法,大家要做一名合法的白帽子,不要搞事情。
https://www.cto.ac.cn/thread-106.htm



本推文僅用于信息防御技術教學,切勿用于其他用途,有侵權或者存在危害性,請聯系我進行刪除。
如若文章中有地方描述錯誤,還請見諒。
作者本人技術和知識都不扎實,仍在學習中。
遇到一個網站,使用了webpack

輸入賬號密碼后,發現密碼被加密了。

此時嘗試定位該加密算法,并正向爆破。
當前登錄的請求接口是/prod-api/auth/login

此時全局搜索該接口
成功找到該接口文件

打開該js文件,通過分析js函數,可知2727行的r函數作用是登錄請求,2719行的o函數作用是加密。

此時設置斷點,觀察數值變化 
r函數中的t是用戶名admin,e是明文密碼123456。
此時下一步

密碼e通過2728行的函數調用,傳遞到了加密函數o。
加密函數o中,t是明文密碼,e是密鑰,密鑰是2021123456789012
加密后123456的密文是wzGWkli7/KSZszgljZhEng==

通過分析發現,此處的加解密算法的對象名是a,通過調用對象a下的屬性,實現的加密。

將這段加密的函數,復制到我們的js文件中

此時嘗試去找到a在哪聲明的。
通過分析,發現a在2717行被聲明

并且對象a的值,是由s調用了n中的3452模塊。
此時我們要找到n,看n是在哪出現的,我們并把它給拿出來。

因此設置斷點直接跟過去。
此時找到了n的聲明。

我們將這段聲明n函數的代碼復制到js文件中,即把分發器復制到js代碼中。
并在外部聲明一個用于接收分發器值的變量
通過定位追蹤 

我們將o值,賦值給用戶接收分發器函數返回值的變量。

即在分發器代碼的末尾處進行賦值。

此時分發器確定了,這個時候要找分發器調用了哪些webpack的模塊。
通過前面的分析可知,分發器調用的第一個webpack的模塊是3452。

此時全局搜索3452是在哪個js文件下。

此時找到了3452模塊,而3452模塊又調用了大量的其他模塊,因此我們要一一定位。

通過分析后發現,所有的模塊和3452模塊都是處于同一個js文件中的。

此時創建一個modules.js文件,用于管理這些模塊。 將該存放模塊的js代碼,全部復制粘貼到本地的modules.js文件中。
并設置全局變量進行調用 即var window = global;

并在encrypt.js文件中導入該模塊js文件。
并調用加密函數,查看加密結果。

執行代碼后,報錯,提示n未被定義。

報錯的原因是因為,此時分發器的模塊調用的結果,并未賦值給n,而是我最開始設置的變量flag,此flag接收了分發器的返回結果。因此我們要把n改成flag。
修改后,再次運行

123456在本地加密的結果和在前端加密的結果值是一樣的。

此時嘗試重復并多次加密明文。
使用nodejs,按行讀寫passwords.txt
并將密碼的密文并輸出到encrypt_passwors.txt中。
const readline = require('readline');
const fs = require('fs');
( () => {
let fRead = fs.createReadStream("passwords.txt");
let objReadLine = readline.createInterface({
input: fRead
});
objReadLine.on('line', function (line) {
console.log(encrypt(line));
fs.writeFile('./encrypt_passwors.txt', encrypt(line)+'', { 'flag': 'a' }, function(err) {
if (err) {
throw err;
}
});
});
})();

嘗試去解密aes的加密密文,找了半天也沒找到調用了哪些webpack的模塊,因此解密失敗了,太fw了。