渗透测试中的加解密技巧
这是同事
在接到公司测试的站点,看到加密帮忙处理所记录下的内容
一、加密定位
抓包截图,可以看出来站点对请求包
和响应包
都做了加密处理
我们可以分析本地的Javascript
文件,查看是否能得到密钥或者一些加密方式等其他信息
我们可以使用关键字搜索如(Aes,des,decrypt,encrypt,sm4...等)
和请求包xhr
的调试跟踪,如下,我让浏览器使用的是请求包的登录Api
地址作为调试的第一个点 (这里注意添加后需要刷新下页面)
点击对应的功能点后,点击美化输出
就可以看到发送请求的地方
接下来我们可以使用堆栈慢慢的向上找,我这里找到o就发现了data : e
,得知了数据的值大概率为data
然后使用关键字搜索encrypt
找到了加密的地方,使用sm4加解密
并且找到了密钥
使用Yakit
工具查看一下
二、脚本编写
1.这里我推荐使用Python
的mitmproxy
编写脚本,并且设置他为BurpSuite
上游代理
2.此文章选择BurpSuite
插件autoDecoder
,其实如果知道加密算法不建议用这种方式,上面的方法是群上的表格提醒我才了解到的
这里贴上项目地址autoDecoder有需要点击下载和了解,这个插件对支持node
和python
的编写方式,最好不要学我使用node
编写。
贴上代码,适合sm4
,32位Key的hex
var http = require('http');
const url = require('url');
const querystring = require('querystring');
// const base64 = require('base64-js');
//SM4加密转换函数
const stringToByte = function (str) {
var len, c;
len = str.length;
var bytes = [];
for (var i = 0; i < len; i++) {
c = str.charCodeAt(i);
if (c >= 0x010000 && c <= 0x10FFFF) {
bytes.push(((c >> 18) & 0x07) | 0xF0);
bytes.push(((c >> 12) & 0x3F) | 0x80);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else if (c >= 0x000800 && c <= 0x00FFFF) {
bytes.push(((c >> 12) & 0x0F) | 0xE0);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else if (c >= 0x000080 && c <= 0x0007FF) {
bytes.push(((c >> 6) & 0x1F) | 0xC0);
bytes.push((c & 0x3F) | 0x80);
} else {
bytes.push(c & 0xFF);
}
}
return new Int8Array(bytes);
};
//16进制转换函数
function hexToByte(hex) {
let result = [];
while (hex.length >= 2) {
result.push(parseInt(hex.substring(0, 2), 16));
hex = hex.substring(2, hex.length);
}
return result;
}
const sm4 = require('sm-crypto').sm4;
const key = hexToByte("键入key值");
http.createServer(function (req, res) {
let path = url.parse(req.url);
let postparms = '';
if (path.pathname === '/encode') {
console.log("encode路由");
req.on('data', (parms) => {
postparms += parms;
});
req.on('end', () => {
postparms = querystring.parse(postparms);
console.log(postparms)
let dataBody = postparms.dataBody;
let Data = sm4.encrypt(dataBody,key)
console.log(Data)
res.end(Data);
});
} else if (path.pathname === '/decode') {
console.log("decode路由")
req.on('data', (parms) => {
postparms += parms;
}
)
req.on('end', () => {
postparms = querystring.parse(postparms);
console.log(postparms)
let dataBody = postparms.dataBody;
const encryptData = dataBody
let decryptData = sm4.decrypt(encryptData, key, {
output: 'array'
}) // 解密,默认输出 utf8 字符串,默认使用 pkcs#7 填充(传 pkcs#5 也会走 pkcs#7 填充)
decryptData = Buffer.from(decryptData);
decryptData = decryptData.toString('utf-8')
console.log(decryptData);
res.end(decryptData);
})
} else{
res.write("end");
res.end()
}
}).listen(8888);
愉快日站