干货|yakit实现在前端加密下抓取明文数据包并密文发出

admin 2025-12-29 00:58:30 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍利用Yakit工具实现前端AES+RSA加密流量的明文劫持与密文发送。通过codec模块配置加解密逻辑,并在MITM热加载中编写脚本:利用hijackSaveHTTPFlow将历史记录转为明文方便查看,通过hijackHTTPRequest解密请求以手动拦截修改,最后在beforeRequest阶段重新加密数据发送至服务端。该方案有效解决了前端加密场景下的渗透测试难题,允许在保持通信正常的情况下对数据包进行篡改与分析。 综合评分: 88 文章分类: 渗透测试,WEB安全,安全工具


cover_image

干货 | yakit 实现在前端加密下抓取明文数据包并密文发出

原创

进击的hack

进击的HACK

2025年4月12日 07:51 江苏

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!

文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。


前言

本文将展示,如何在前端数据包加密的情况下,手动劫持的明文数据,并在修改后,自动转化为密文发送。 以及如何在 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参数赋值。出错有显示,可以及时调整。

参考资料

  • • https://yaklang.com/articles/vulnerability_testing_after_being_encrypted_by_the_front-end

往期推荐

优化!多重加解密的解决方案codecflow!

yakit shiro-550 反连shell命令执行

Yakit小巧思之录屏功能

yakit 替换本地JS 解决AES+Rsa加密

攻防演练中 elasticsearch 如何利用

通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包

yakit 调用jsRpc加解密,免去抠代码补环境

Yakit JWT Token 弱口令枚举

yakit 弱口令爆破与未授权检测

yakit 验证码识别 进行webfuzzer


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:进击的HACK 进击的hack《干货 | yakit 实现在前端加密下抓取明文数据包并密文发出》

评论:0   参与:  0