如何在Android Nougat中正确配置Burp Suite?
此前我已经在Genymotion VM或我的旧版Nexus Tablet,做过不少Android相关的测试。一直以来我都遵循Portswigger的说明文档,本地运行Burp Suite,并安装User Cert,配置一个WiFi代理。
然而,当我对这个特定app(需要API level 24 (Android 7.0 - "Nougat"))测试时,突然发现Burp无法正常工作。我回顾了我的配置步骤,并没有发现遗漏的地方,但在Burp中只看到“connection reset(连接重置)”错误:从Nougat开始,Android更改了对用户安装证书的默认信任行为。这意味着,从sdcard安装Burp CA将无法拦截应用流量。除非另有说明,否则应用程序将只会信任系统级别的CA。
这里有两种方法可以帮我们绕过它:
将Burp CA作为系统级CA安装在设备上。这是我认为最简单的解决方法,但需要一个已经root的设备。还免去了设置锁屏PIN码的的麻烦:)
修改manifest清单文件并重新打包应用程序。 操作步骤相对繁琐,但不需要root权限。
注意:我在Windows 10上使用Burp Suite Pro完成了这些操作,使用的是Android 7.1(API25)Genymotion VM,但这些步骤应适用于任何设置。
此前我已经在Genymotion VM或我的旧版Nexus Tablet,做过不少Android相关的测试。一直以来我都遵循Portswigger的说明文档,本地运行Burp Suite,并安装User Cert,配置一个WiFi代理。
然而,当我对这个特定app(需要API level 24 (Android 7.0 - "Nougat"))测试时,突然发现Burp无法正常工作。我回顾了我的配置步骤,并没有发现遗漏的地方,但在Burp中只看到“connection reset(连接重置)”错误:从Nougat开始,Android更改了对用户安装证书的默认信任行为。这意味着,从sdcard安装Burp CA将无法拦截应用流量。除非另有说明,否则应用程序将只会信任系统级别的CA。
这里有两种方法可以帮我们绕过它:
将Burp CA作为系统级CA安装在设备上。这是我认为最简单的解决方法,但需要一个已经root的设备。还免去了设置锁屏PIN码的的麻烦:)
修改manifest清单文件并重新打包应用程序。 操作步骤相对繁琐,但不需要root权限。
注意:我在Windows 10上使用Burp Suite Pro完成了这些操作,使用的是Android 7.1(API25)Genymotion VM,但这些步骤应适用于任何设置。
dubbo协议。其实这里打的就是hessian反序列化这个已经比较熟悉了。 看一下这个数据包。
典型的三次握手和四次挥手。dabb是dubbo的协议头。里面有hessian序列化的数据,然后 c 发送。s 确认收到。然后s再发。
这个漏洞主要是因为hessian引起的。
com.alibaba.com.caucho.hessian.io.Hessian2Output#writeString(java.lang.String)
就是在provider解析数据的时候,本应该是in.readUTF()。
但是我们构造数据包的时候用的是 out.writeObject(payload());
结果provider解析异常,然后会触发 payload() 的toString 方法。
如果此时如果有toString2rce的gadget。就会有被攻击的风险。
典型的三次握手和四次挥手。dabb是dubbo的协议头。里面有hessian序列化的数据,然后 c 发送。s 确认收到。然后s再发。
这个漏洞主要是因为hessian引起的。
com.alibaba.com.caucho.hessian.io.Hessian2Output#writeString(java.lang.String)
就是在provider解析数据的时候,本应该是in.readUTF()。
但是我们构造数据包的时候用的是 out.writeObject(payload());
结果provider解析异常,然后会触发 payload() 的toString 方法。
如果此时如果有toString2rce的gadget。就会有被攻击的风险。
freemarker.template.utility.ObjectConstruct 是 FreeMarker 模板引擎中的一个辅助类,主要用于创建 Java 对象,并将其转换为 FreeMarker 可以识别和处理的模板数据模型。这使得模板可以动态地实例化对象,并将它们传递给模板进行渲染。
freemarker.template.utility.JythonRuntime 是 FreeMarker 模板引擎中的一个辅助类,它用于与 Jython(一个基于 Java 的 Python 解释器)进行交互。通过这个类,FreeMarker 模板可以执行 Python 脚本,从而在模板中动态执行 Python 代码,并将结果用于模板渲染。
freemarker.template.utility.JythonRuntime 是 FreeMarker 模板引擎中的一个辅助类,它用于与 Jython(一个基于 Java 的 Python 解释器)进行交互。通过这个类,FreeMarker 模板可以执行 Python 脚本,从而在模板中动态执行 Python 代码,并将结果用于模板渲染。
导入表(Import Directory)存储了有关PE文件在运行的生命周期中所需要的API以及相关的dll模块。
有些AV/EDR会根据
导入表中记录的API来判定一个程序是否为高危文件,比如说一个文件在1MB以内,出现了 VirtualAlloc、VirtualProtect、CreateThread 等敏感API时,很大概率会判定为高危文件。
很多工具可以查看文件的导入表,常见的有studyPE+、IDA。
在本节中,我将详细介绍动态获取API函数的三种方式,它们分别是
1. GetModuleHandle+GetProcAddress 的组合获取所需的API函数指针
2. 使用 PEB 获取 GetModuleHandle 和 GetProcAddress 的函数指针,再利用 GetModuleHandle+GetProcAddress 获取所需要的API函数指针
3. 使用 PEB 获取所需要的API函数指针
网上也有人用 LoadLibrary 作为 GetModuleHandle 的平替,其效果相差无几,只是它们的机制有些区别,比如说在 自举的代码幽灵——反射DLL注入(Reflective DLL Injection) 中我们就是利用 LoadLibrary+GetProcAddress 给我的恶意DLL加载相应的DLL获取需要的API函数指针,值得关注的一点是恶意DLL是由其自身的导出函数 ReflectiveLoader 完成自身的加载,这意味着相应的DLL并没有加载到自身的地址空间中,所以需要利用 LoadLibrary 而不应该使用 GetModuleHandle。
有些AV/EDR会根据
导入表中记录的API来判定一个程序是否为高危文件,比如说一个文件在1MB以内,出现了 VirtualAlloc、VirtualProtect、CreateThread 等敏感API时,很大概率会判定为高危文件。
很多工具可以查看文件的导入表,常见的有studyPE+、IDA。
在本节中,我将详细介绍动态获取API函数的三种方式,它们分别是
1. GetModuleHandle+GetProcAddress 的组合获取所需的API函数指针
2. 使用 PEB 获取 GetModuleHandle 和 GetProcAddress 的函数指针,再利用 GetModuleHandle+GetProcAddress 获取所需要的API函数指针
3. 使用 PEB 获取所需要的API函数指针
网上也有人用 LoadLibrary 作为 GetModuleHandle 的平替,其效果相差无几,只是它们的机制有些区别,比如说在 自举的代码幽灵——反射DLL注入(Reflective DLL Injection) 中我们就是利用 LoadLibrary+GetProcAddress 给我的恶意DLL加载相应的DLL获取需要的API函数指针,值得关注的一点是恶意DLL是由其自身的导出函数 ReflectiveLoader 完成自身的加载,这意味着相应的DLL并没有加载到自身的地址空间中,所以需要利用 LoadLibrary 而不应该使用 GetModuleHandle。
网页被嵌入第一段JS代码
为了搞清楚其劫持原理,笔者尝试从代码层面对其整个劫持原理进行了研究剖析。
通过查看其网页源代码,我们发现在源代码中确实存在嵌入第三方js资源代码的情况。
被嵌入的JavaScript代码如下:
1
2
<script language="javascript" src="https://www.zuizhongjs.com/js/24/12/7/ky1.js" type="text/javascript"></script>
为了搞清楚其劫持原理,笔者尝试从代码层面对其整个劫持原理进行了研究剖析。
通过查看其网页源代码,我们发现在源代码中确实存在嵌入第三方js资源代码的情况。
被嵌入的JavaScript代码如下:
1
2
<script language="javascript" src="https://www.zuizhongjs.com/js/24/12/7/ky1.js" type="text/javascript"></script>
了解Qemu模拟运行Linux内核的基本执行流程
QEMU 是一个开源模拟器,广泛用于虚拟化不同架构的操作系统。在启动 Linux 内核时,QEMU 通过 qemu-system-x86 命令初始化虚拟机环境。这一过程包括设置 CPU、内存和设备模拟,确保虚拟机能够运行目标操作系统。
通过QEMU启动内核以及加载文件系统:
内核加载与执行: QEMU 加载内核映像文件,通常为 bzImage(压缩的内核)或 vmlinux(未压缩的内核)。根据 QEMU 文档,用户可以通过 -kernel 选项指定内核文件路径。内核加载后,会自动解压(如果为 bzImage),然后开始执行,完成硬件初始化(如设置内存结构、加载驱动)。
QEMU 是一个开源模拟器,广泛用于虚拟化不同架构的操作系统。在启动 Linux 内核时,QEMU 通过 qemu-system-x86 命令初始化虚拟机环境。这一过程包括设置 CPU、内存和设备模拟,确保虚拟机能够运行目标操作系统。
通过QEMU启动内核以及加载文件系统:
内核加载与执行: QEMU 加载内核映像文件,通常为 bzImage(压缩的内核)或 vmlinux(未压缩的内核)。根据 QEMU 文档,用户可以通过 -kernel 选项指定内核文件路径。内核加载后,会自动解压(如果为 bzImage),然后开始执行,完成硬件初始化(如设置内存结构、加载驱动)。
Initramfs(Initial RAM Filesystem)是 Linux 启动过程中的临时根文件系统,通常以 initramfs.cpio 格式存在。根据 Gentoo Wiki,其主要目的是为内核提供一个最小化的用户空间环境,以加载必要的驱动和挂载真实根文件系统。
● 加载与挂载: 内核检测到 Initramfs 文件后,将其解压并挂载为内存中的临时根文件系统(/)。这一过程通过 cpio 归档格式实现,内容包括基本的 shell、工具(如 busybox)和配置文件。
● 作用: Initramfs 特别适用于需要特殊驱动(如 RAID、LVM 或加密文件系统)的系统。例如,Debian Wiki 指出,Initramfs 允许在挂载真实根文件系统之前加载内核模块,增强了启动的灵活性。
● 解释补充: 用户提供的图表正确描述了这一阶段,但需要强调 Initramfs 是启动过程中的关键步骤,尤其在复杂存储配置下(如 USB 启动或加密分区)。
● 加载与挂载: 内核检测到 Initramfs 文件后,将其解压并挂载为内存中的临时根文件系统(/)。这一过程通过 cpio 归档格式实现,内容包括基本的 shell、工具(如 busybox)和配置文件。
● 作用: Initramfs 特别适用于需要特殊驱动(如 RAID、LVM 或加密文件系统)的系统。例如,Debian Wiki 指出,Initramfs 允许在挂载真实根文件系统之前加载内核模块,增强了启动的灵活性。
● 解释补充: 用户提供的图表正确描述了这一阶段,但需要强调 Initramfs 是启动过程中的关键步骤,尤其在复杂存储配置下(如 USB 启动或加密分区)。