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

06-01 1803阅读

前言

本文将展示,如何在前端数据包加密的情况下,手动劫持的明文数据,并在修改后,自动转化为密文发送。

以及如何在 history 中保存明文报文,而不是加密后的报文。

场景

依旧是 encrypt-labs,其中的AES+RSA加密

项目地址:https://github.com/SwagXz/encrypt-labs

tes.png

固定key和iv

按照之前文章的办法,固定key和iv

前文地址:yakit 替换本地JS 解决AES+Rsa加密

codec保存加解密模块

因为是通用的加密方式,并未魔改,所以我们采用codec模块,寻找正确的加解密方式

解密

base64——》AES

tes.png

保存模块 decode_base64_AES

tes.png

加密

tes.png

注意,AES的输出格式是raw,而不是hex

保存模块 encode_AES_base64

在 mitm 热加载中写

为修改前,history中报文如下

tes.png

我们想在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中,成功显示明文包,而并不影响正常的登录功能。

tes.png

如果需要修改响应包,将其变为明文,可以参考

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中能看到已经变成明文了

    tes.png

    但是发送到后端的,我们想要的是加密后的,后端可以读取的,所以需要在 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
    }
    

    演示如下:

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

    点击AES + RSA

    tes.png

    此时,手动劫持中显示明文

    tes.png

    将password,从admin修改为123456,提交数据

    tes.png

    前端显示登录成功,说明手动劫持修改成功

    tes.png

    在history中查看原始请求,可以看到,发送到后端的是加密后的

    tes.png

    这样就实现了手动劫持,明文修改,密文发出。

    在yak runner修改脚本

    热加载模块中,我们很难排查是哪里出现问题。我们可以在yak runner中修改参数。

    tes.png

    对req进行处理,给req参数赋值。出错有显示,可以及时调整。

    欢迎关注微信公众号:进击的HACK

    公众号会第一时间更新文章。

    参考资料

    • https://yaklang.com/articles/vulnerability_testing_after_being_encrypted_by_the_front-end
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码