yakit 实现在前端加密下抓取明文数据包并密文发出
前言
本文将展示,如何在前端数据包加密的情况下,手动劫持的明文数据,并在修改后,自动转化为密文发送。
以及如何在 history 中保存明文报文,而不是加密后的报文。
场景
依旧是 encrypt-labs,其中的AES+RSA加密
项目地址:https://github.com/SwagXz/encrypt-labs
固定key和iv
按照之前文章的办法,固定key和iv
前文地址:yakit 替换本地JS 解决AES+Rsa加密
codec保存加解密模块
因为是通用的加密方式,并未魔改,所以我们采用codec模块,寻找正确的加解密方式
解密
base64——》AES
保存模块 decode_base64_AES
加密
注意,AES的输出格式是raw,而不是hex
保存模块 encode_AES_base64
在 mitm 热加载中写
为修改前,history中报文如下
我们想在history中显示明文的数据包,方便我们查看请求和响应,方便我们进行渗透。
此时,只需要修改MITM热加载模块的 hijackSaveHTTPFlow
dec_base64_aes = func(data){ aa = "{{codecflow(decode_base64_AES|" + data + ")}}" return fuzz.Strings(aa)[0] } decrypt = func(req){ req_method = poc.GetHTTPRequestMethod(req /*type: []byte*/) if req_method == "POST" && str.Contains(string(req), "encryptedData" /*type: string*/){ postParams = poc.ExtractPostParams(req /*type: []byte*/)~ enc_data = postParams["encryptedData"] dec_data = dec_base64_aes(enc_data) postParams["encryptedData"] = dec_data req = poc.ReplaceHTTPPacketJsonBody(req /*type: []byte*/, postParams /*type: map[string]any*/) } return req } hijackSaveHTTPFlow = func(flow /* *yakit.HTTPFlow */, modify /* func(modified *yakit.HTTPFlow) */, drop/* func() */) { req = codec.StrconvUnquote(flow.Request)~ flow.Request = codec.StrconvQuote(decrypt(req)) modify(flow) }
重启热加载,结果如下图,在history中,成功显示明文包,而并不影响正常的登录功能。
如果需要修改响应包,将其变为明文,可以参考
hijackSaveHTTPFlow = func(flow /* *yakit.HTTPFlow */, modify /* func(modified *yakit.HTTPFlow) */, drop/* func() */) { req = codec.StrconvUnquote(flow.Request)~ flow.Request = codec.StrconvQuote(decrypt(req)) rsp = codec.StrconvUnquote(flow.Response)~ flow.Response = codec.StrconvQuote(decrypt(rsp)) modify(flow) }
手动劫持 明文修改+密文发出
MITM热加载流程:
请求 -> hijackHTTPRequest -> 前端劫持 -> beforeRequest -> 服务器响应 -> hijackResponse -> 后端劫持 -> afterRequest -> 客户端看到的响应 -> hijackSaveHTTPFlow
- hijackHTTPRequest 浏览器抵达mitm模块前
- beforeRequest 从mitm模块发出后
- hijackResponse 后端抵达mitm模块前
- afterRequest 前端看到响应前
我们要实现在mitm中无感劫持修改,需要修改的是 hijackHTTPRequest
dec_base64_aes = func(data){ aa = "{{codecflow(decode_base64_AES|" + data + ")}}" return fuzz.Strings(aa)[0] } // hijackHTTPRequest 会在过滤后的请求到达Yakit MITM前被调用,可以通过该函数提前将请求修改或丢弃 // isHttps 请求是否为https请求 // url 网站URL // req 请求 // forward(req) 提交修改后的请求,如果未被调用,则使用原始的请求 // drop() 丢弃请求 hijackHTTPRequest = func(isHttps, url, req, forward /*func(modifiedRequest []byte)*/, drop /*func()*/) { req_method = poc.GetHTTPRequestMethod(req /*type: []byte*/) if req_method == "POST" && str.Contains(string(req), "encryptedData" /*type: string*/){ postParams = poc.ExtractPostParams(req /*type: []byte*/)~ enc_data = postParams["encryptedData"] dec_data = dec_base64_aes(enc_data) postParams["encryptedData"] = dec_data req = poc.ReplaceHTTPPacketJsonBody(req /*type: []byte*/, postParams /*type: map[string]any*/) } forward(req) }
在前端点击,发送,如下图,可以看到在mitm中能看到已经变成明文了
但是发送到后端的,我们想要的是加密后的,后端可以读取的,所以需要在 beforeRequest 函数中添加加密
enc_base64_aes = func(data){ aa = "{{codecflow(encode_AES_base64|" + data + ")}}" return fuzz.Strings(aa)[0] } // beforeRequest 会在请求到达服务器之前被调用,可以通过该函数对请求做最后一次修改 // isHttps 请求是否为https请求 // oreq 原始请求 // req hijackRequest修改后的请求 // 返回值: 修改后的请求,如果没有返回值则使用hijackRequest修改后的请求 beforeRequest = func(ishttps /*bool*/, oreq /*[]byte*/, req/*[]byte*/){ // Example: // if str.Contains(string(req), "凝聚磅礴的中国文学力量") { // modified = poc.FixHTTPRequest(str.ReplaceAll(req, "凝聚磅礴的中国文学力量", "AAAAAAAAAAAAAAAA")) // return []byte(modified) // } req_method = poc.GetHTTPRequestMethod(req /*type: []byte*/) if req_method == "POST" && str.Contains(string(req), "encryptedData" /*type: string*/){ postParams = poc.ExtractPostParams(req /*type: []byte*/)~ dec_data = postParams["encryptedData"] enc_data = enc_base64_aes(dec_data) postParams["encryptedData"] = enc_data req = poc.ReplaceHTTPPacketJsonBody(req /*type: []byte*/, postParams /*type: map[string]any*/) } return req }
演示如下:
点击AES + RSA
此时,手动劫持中显示明文
将password,从admin修改为123456,提交数据
前端显示登录成功,说明手动劫持修改成功
在history中查看原始请求,可以看到,发送到后端的是加密后的
这样就实现了手动劫持,明文修改,密文发出。
在yak runner修改脚本
热加载模块中,我们很难排查是哪里出现问题。我们可以在yak runner中修改参数。
对req进行处理,给req参数赋值。出错有显示,可以及时调整。
欢迎关注微信公众号:进击的HACK
公众号会第一时间更新文章。
参考资料
- https://yaklang.com/articles/vulnerability_testing_after_being_encrypted_by_the_front-end