利用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
对于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
🔥29❤13
在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
完成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
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
也可疑直接调用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
域内特权提升 - 将 Certifried 与 KrbRelay 结合利用
默认情况下,域用户可以注册 User 证书模板,域计算机可以注册 Machine 证书模板。两个证书模板都允许客户端身份验证。
当用户账户申请 User 模板证书时,用户帐户的用户主体名称(User Principal Name,UPN)将嵌入到证书中以进行识别。而对于计算机账户来说,其没有 UPN 属性。因此,当计算机账户申请证书时,计算机账户的 dNSHostName 属性值将嵌入到证书中以进行识别。当我们使用证书进行身份验证时,KDC 会尝试将 dNSHostName 从证书映射到目标计算机。
Machine 证书模板的 msPKI-Certificate-Name-Flag 属性存在一个 CT_FLAG_SUBJECT_ALT_REQUIRE_DNS 标志位,其指示 CA 将来自 Active Directory 中请求者计算机对象的 dNSHostName 属性值添加到已颁发证书的主题备用名称中。
利用该漏洞的关键是,攻击者拥有域标准用户权限,并通过该用户向域内添加符合漏洞利用条件的机器账户。在未加入域的系统中,我们可以通过简单修改 Impacket 套件中的 addcomputer.py
然后运行 addcomputer.py 即可成功添加符合条件的计算机账户
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
默认情况下,域用户可以注册 User 证书模板,域计算机可以注册 Machine 证书模板。两个证书模板都允许客户端身份验证。
当用户账户申请 User 模板证书时,用户帐户的用户主体名称(User Principal Name,UPN)将嵌入到证书中以进行识别。而对于计算机账户来说,其没有 UPN 属性。因此,当计算机账户申请证书时,计算机账户的 dNSHostName 属性值将嵌入到证书中以进行识别。当我们使用证书进行身份验证时,KDC 会尝试将 dNSHostName 从证书映射到目标计算机。
Machine 证书模板的 msPKI-Certificate-Name-Flag 属性存在一个 CT_FLAG_SUBJECT_ALT_REQUIRE_DNS 标志位,其指示 CA 将来自 Active Directory 中请求者计算机对象的 dNSHostName 属性值添加到已颁发证书的主题备用名称中。
利用该漏洞的关键是,攻击者拥有域标准用户权限,并通过该用户向域内添加符合漏洞利用条件的机器账户。在未加入域的系统中,我们可以通过简单修改 Impacket 套件中的 addcomputer.py
然后运行 addcomputer.py 即可成功添加符合条件的计算机账户
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke