A-A+
远程调用JS函数对数据包密文加解密和签名
在渗透测试中,有时会遇到Web前端对数据进行加密或完整性校验的情况。这样的话,即使我们能够抓取到数据包,也无法修改数据包内容进行测试。为了解决这个问题,今天我要给大家介绍我自己琢磨到的一个超方便的方法。
0x01 难点
1.在js混淆或者js加密过程过于复杂的情况下无法使用其他脚本语言进行加解密算法还原。
2.即使将整个js加解密过程涉及的代码保存下来也难以模拟出加解密时的上下文。
0x02 解决方案
总结出两个重要问题后,我们可以通过以下方式解决该问题。
使用web的断点调试功能,将js的运行状态保存到正在进行函数加解密时,之后通过web的控制台开启websocket客户端连接上我们写的websocket服务端这样我们就可以在websocket服务端的代码里调用web中的加解密函数。完美解决无法还原js加解密过程和无法保持函数调用上下文的问题。下图为加密流程,解密流程也是如此。
0x03实践
1.在web浏览器中在加解密函数处下断点,并且让浏览器运行到断点处。以火狐浏览器为例,按下F12之后在控制台点击调试器。
2.这里我通过在网络中找到登录数据包的调用堆栈找到了加解密的位置。
4.再次登录,让程序运行到这里,不要在动了,要维持加解密函数的上下文状态。
5.创建并运行websocket服务端,这我使用python。代码很简单如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import asyncio import websockets async def check_permit(websocket): send_text = 'admin' await websocket.send(send_text)#连接上时向客户端发送admin。 return True #接受到消息时的处理函数。 async def recv_msg(websocket): while 1: recv_text = await websocket.recv() try: print(recv_text) except Exception as e: print(e) async def main_logic(websocket, path): await check_permit(websocket) await recv_msg(websocket) start_server = websockets.serve(main_logic, '127.0.0.1', 8888)#监听本地8888端口 asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever() |
6.在web浏览器控制台创建并允许websocket客户端。代码也很简单如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var ws = new WebSocket("ws://127.0.0.1:8888"); ws.onopen = function(){ console.log("websocket连接成功"); } ws.onmessage = function(e){ console.log("收到数据"); console.log(e.data); ws.send(rsa_encrypt(e.data));//使用加密函数对传输过来的数据进行加密 } ws.onclose = function(e){ console.log("websocket已断开"); } ws.onerror = function(e){ console.log("websocket发生错误"+error); } |
0x04结语
可以看到已经十分完美的解决了之前提出的两个问题,让我们在做渗透测试的时候可以花最少的精力简单无脑的处理前端加解密的数据包。
文字来源:https://mp.weixin.qq.com/s/uohxrPoT3WFv5YUCLUk0qw
作者:地表最强伍迪哥
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏