黑客网站渗透入侵破解拿权限
10.4K subscribers
2.38K photos
108 links
Download Telegram
libmalloc初探——TinyHeap

环境与调试方式
在MacOS 11中引入了动态链接库保存系统,各个系统动态链接库不会以文件的形式保存在文件系统中,文件系统中也不存在各个系统动态链接库副本,不象我们去研究macos的堆以及相关使用。网上有对MacOS1111的动态链接库保存的过程,有兴趣的小伙伴可以尝试一下。本文主要分析在MacOS10.15.7下的libmalloc-283.100.6之后。

MacOS可以通过虚拟机进行安装,MacOS虚拟机安装的资料在网上很充分。

在MacOS上安装使用GDB还是比较麻烦的,推荐使用LLDB。LLDB是Xcode默认的调试器,命令与使用与GDB也比较相似。相比于GDB,LLDB可能插件可能还不够完善,这里推荐Voltron和lldbinit。

小堆
在Tiny和Small中分配申请的最小单位称为Quantum,Quantum在Tiny堆中的大小为0x10个字节,在Small堆中的大小为0x200字节。申请返回的堆块大小都为Quantum大小的整数倍。

微小区域
与Linux下的通过在申请的chunk前添加头部记录当前chunk的信息不同,在libmalloc中申请多大的空间就返回多大的空间,而相关信息的记录则通过region来完成。同时每个微小区域包含64504个块,每个块的大小为一个Quantum(0x10)。

Region具体是如何判断当前Region中哪些块可用哪些块不可用呢?主要是通过region结构中的位图(即结构体中对)来进行判断,位图实际上由header bitmap和inuse bitmap组成组成,其中每一个bit都分别用于记录所对应block的分配情况以及释放与否。大致的规则如下:
1.如果某个区域已经被使用,那么这块区域的第一个block在header bitmap和inuse bitmap中对应的值都是1。
2.如果一块区域是空闲的,那么这块区域的第一个块在 header 位图和 inuse 位图中对应的值分别是 1 和 0。
3. 其他情况下,表头位图均为0。
4. 其他情况下,使用位图的值无关要紧,任何值都需要。

块重叠攻击

首先申请四个chunk,然后依次释放p2以及p4,此时p2位于freelist[4]中,p4位于服务器中。

然后将p2的msize位由59,然后依次释放p1以及p3,此时p3于缓存中,p2会被置入freelist中之前,会与p2合并,但由于p2的msize被修改成9,合并后p1的msize等于0xc,实际上合并了p2以及p3,从而造成了堆块重叠。此时申请大小为0xc0和0x40的chunk,即可通过对大小为0xc0 chunk的修改实现对0x40 chunk的修改。

/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我
@MoA_Ke
13🔥12
SpringBoot Actuator之 logging.config grovvy rce分析及内存马注入

Spring boot最经典的漏洞莫过于由于配置不当导致Actuator的相关路由暴露从而导致信息泄露以及各种远程命令执行漏洞。根据spingboot官方文档,以spring-boot 2.1.10版本为例,对于web应用程序来说,以下端口默认是开启的。

具体开放端口可通过management.endpoints.web.exposure.include=进行配置。一些公开的常用利用链包括spring cloud SnakeYAML RCE,通过设置 spring.cloud.bootstrap.location属性加载外部恶意 yml 文件和jolokia logback进行jndi利用。在整理Springboot关于Actuator的利用时,注意到groovy脚本执行的利用方式,以下对该漏洞利用原理进行分析

设置logging.config属性执行groovy脚本
根据springboot相关文档说明:可通过Spring 环境属性“logging.config”进一步设置配置文件的位置。

同样首先通过/actuator/env接口修改logging.config的属性值

然后通过/actuator/restart接口重启应用程序,使之重新加载修改到环境属性中

关键代码在org.springframework.boot.context.logging.LoggingApplicationListener#initialize()方法中。

初始化Springboot应用程序的logging system。

/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我
@MoA_Ke
14🔥13
利用spring cloud SnakeYAML利用注入Springboot内存马
对于Springboot来说,不能通过上传文件getshell,因此注入内存马技术对springboot来说很重要。对于springboot来说,根据内存马类型可大致分为filer型,Interceptor型,controller型。由于springboot在处理过程中先后顺序的差别(先经filter处理,然后到controller处理,再到Interceptor拦截器处理)。由于对权限控制的考虑,优先注入Filter型内存马。
Springboot内存吗注入思路:首先获取应用上下文ApplicationContext,对于内置服务器是tomcat的springboot应用来说,应用上下文是org.apache.catalina.core.ApplicationContextFacade类。通过org.apache.catalina.core.ApplicationContextFacade的addFilter()方法注入自定义Filter。

因此重点是如何获取应用上下文呢?对于tomcat来说,可以通过request对象——org.apache.catalina.connector.Request类的getServletContext()方法获取。


因此现在又把目光放在如何获取request对象。一般从线程入手。通过调试,可通过Thread.currentThread().threadLocals.table获取线程中与request对象相关的对象,如下图所示,这里通过Thread.currentThread().threadLocals.table[12]的value可获取request对象。

因此,进一步可通过((ServletRequestAttributes) Thread.currentThread().threadLocals.table[12].value).request.getServletContext();获取上下文环境,进而利用该上下文对象org.apache.catalina.core.ApplicationContextFacade调用addFilter()完成内存马注入。

/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我
@MoA_Ke
🔥2913
在org.apache.catalina.core.ApplicationContext#addFilter(java.lang.String, java.lang.String, javax.servlet.Filter)中,需满足this.context.getState()值为LifecycleState.STARTING_PREP,否则不能继续向下注入Filter。此操作可通过反射进行设置。

完成addFilter()操作后,通过org.apache.catalina.core.ApplicationFilterRegistration的addMappingForServletNames()方法为该Filter设置路由。最后,别忘了再通过反射将该context的state属性恢复原值。由此完成Springboot之Filter型内存马的注入。
这里需要注意的是,在一些场景下,比如通过jndi利用时,有可能当前线程Thread.currentThread()并不是http类的线程,因此需要遍历所有线程,在里面找与http相关的符合需要的线程。

注入内存马的代码在mem.jar中。如何制作mem.jar包

关于Spring Boot Actuator相关利用方式有很多,但都跟配置相关,如大部分情况需要开启refresh接口,甚至在利用restart接口时更要慎重,否则利用不慎则会对目标应用异常退出。另外,根据目标应用实际暴露的endpoint以及mbeans,可能存在其他利用方式。

/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我
@MoA_Ke
16🔥13
EDR绕过

blockdlls
在cs3.14版本过后引入了blockdlls命令,用于保护beacon生成的任何子进程不加载非 Microsoft 签名的 dll

这里使用监听新增一个子会话

可以看到rundll32.exe进程有了Signatures restricted (Microsoft only)标志

UpdateProcThreadAttribute
cs的实现在UpdateProcThreadAttribute函数,UpdateProcThreadAttribute的Attribute参数0x20007实际上解析为PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY,而0x100000000000解析为PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON。因此,cs 在这里所做的是使用CreateProcessAPI 调用以及STARTUPINFOEX包含缓解策略的结构,在这种情况下,用于阻止非 Microsoft签名的 DLL

自己通过代码实现

SetProcessMitigationPolicy
这个api可以给当前线程添加 Signatures restricted (Microsoft only) 标识

代码如下

void blockdll_thread()
{
PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY sp = {};
sp.MicrosoftSignedOnly = 1;
SetProcessMitigationPolicy(ProcessSignaturePolicy, &sp, sizeof(sp));
}

生成一下可以看到,首先还是注入一下cs的dll失败,然后注入user32.dll成功
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我
@MoA_Ke
15🔥14
NtCreateUserProcess直接创建进程
也可疑直接调用NtCreateUserProcess创建进程,通过设置参数为PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON来达到添加流程缓解措施的效果

检测
使用powershell可以看到当前MicrosoftSignedOnly标志的进程

弊端
有一些EDR拥有微软签名,其dll就能够注入到开启了blockdlls保护的进程,如@SEKTOR7 Institute发现的Crowdstrike Falcon就可以不受影响,那么我们还可以通过ACG来进行保护

ACG
ACG即漏洞利用保护参考,其作为一个可选功能添加进了Windows操作系统中,它可以用来检测和防止下列情况的出现

现有代码被恶意修改

向一个数据段中写入并执行代码

为了实现这两个目标,ACG会强制执行这条规则:内存不能同时拥有写入权限和执行权限。更通俗点来说,开启了 ACG 保护的进程,就不能再用 VirtualProtect、VirtualAlloc等来获得 PAGE_EXECUTE_READWRITE的内存,这里不赘述ACG的原理了,这里我们探究其实现

要开启ACG,使用到的是SetProcessMitigationPolicy这个API,第一个参数指定要设定的缓解策略类型,第二个参数根据第一个参数指定不同的 Policy 数据,第三个参数指定第二个参数的长度

我们首先在不开启ACG之前用VirtualAlloc申请一块RWX内存,然后再开启ACG,再使用VitualAlloc申请一块内存能否申请成功,再使用VirtualProtect看能否更改内存属性

/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我
@MoA_Ke
17🔥17👍1