1.CTFer成长日记16:用动态生成的源码代码绕过程序的静态安全检查——shellcode敏感字节检测绕过
2.一文看懂内存马
3.delphiççä¸å¯ä»¥åshellcodeä¹
4.pwn基础— Got表劫持
5.EMET下EAF机制分析以及模拟实现
CTFer成长日记16:用动态生成的代码绕过程序的静态安全检查——shellcode敏感字节检测绕过
敏感字节检查绕过的基本原理,关键在于利用程序执行的变成动态特性。在执行时,源码若目标程序能允许某段内存被读写执行,变成我们就能尝试将shellcode注入,源码借此劫持程序执行流至shellcode首地址,变成电力管理系统源码实现ret2shellcode攻击。源码
然而,变成目标程序往往会对输入进行检查,源码发现敏感字节序列,变成如syscall、源码int等指令对应的变成机器码时,会拒绝输入,源码导致攻击失败。变成解决之道在于,源码编写一段可动态生成shellcode的代码。此代码本身不是shellcode,但能在执行中自动生成shellcode并执行,以此绕过敏感字节检查。
理解ret2shellcode攻击过程后,我们能设想编写代码动态生成shellcode。具体方法是删除或替换敏感字节,并在执行时恢复。通过对比原始与修改后的shellcode,我们发现,关键在于修改自身shellcode的代码。
为了生成直接可用的shellcode,需修改原始shellcode,确保满足特定条件,net考试源码即敏感字节序列指令在执行前恢复。将用于修改自身的shellcode片段置于shellcode头部,确保敏感字节指令被执行前恢复,实现绕过。
接下来,通过实例题验证上述方法的有效性。自定义源代码,使用特定命令编译,关闭程序的防御机制。通过内存布局,利用shellcode长度与main函数返回地址之间的偏移,实现攻击。
针对原始shellcode中的敏感字节,利用pwntools提供的shellcraft.sh()函数修改,首先删去syscall指令,接着在汇编代码头部添加修改自身shellcode的代码,尾部补全syscall指令对应的机器码。通过异或操作,将敏感字节序列转换为可接受的序列。
最后,解决的问题是获取shellcode尾部地址。通过输出shellcode首地址的程序,结合生成等效shellcode,利用脚本获取机器码长度,最终编写攻击脚本完成整个过程。
一文看懂内存马
webshell的变迁过程大致如下:
web服务器管理页面——> 大马——>小马拉大马——>一句话木马——>加密一句话木马——>加密内存马
内存马是无文件攻击的一种常用手段,随着攻防演练热度越来越高:攻防双方的博弈,流量分析、蜂窝帮源码EDR等专业安全设备被蓝方广泛使用,传统的文件上传的webshll或以文件形式驻留的后门越来越容易被检测到,内存马使用越来越多。
Webshell内存马,是在内存中写入恶意后门和木马并执行,达到远程控制Web服务器的一类内存马,其瞄准了企业的对外窗口:网站、应用。但传统的Webshell都是基于文件类型的,黑客可以利用上传工具或网站漏洞植入木马,区别在于Webshell内存马是无文件马,利用中间件的进程执行某些恶意代码,不会有文件落地,给检测带来巨大难度。
目标:访问任意url或者指定url,带上命令执行参数,即可让服务器返回命令执行结果
实现:以java为例,客户端发起的web请求会依次经过Listener、Filter、Servlet三个组件,我们只要在这个请求的过程中做手脚,在内存中修改已有的组件或者动态注册一个新的组件,插入恶意的shellcode,就可以达到我们的目的。
根据内存马注入的方式,大致可以将内存马划分为如下两类
1.servlet-api型 通过命令执行等方式动态注册一个新的listener、filter或者servlet,从而实现命令执行等功能。优秀jdk源码特定框架、容器的内存马原理与此类似,如spring的controller内存马,tomcat的valve内存马 2.字节码增强型 通过java的instrumentation动态修改已有代码,进而实现命令执行等功能。
2.1 Servlet
Servlet 是运行在 Web 服务器或应用服务器上的程序,是作为来自 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。它负责处理用户的请求,并根据请求生成相应的返回信息提供给用户。
2.1.1 Filter
简介
filter也称之为过滤器,是对Servlet技术的一个强补充,其主要功能是在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest ,根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据;在HttpServletResponse到达客户端之前,拦截HttpServletResponse ,根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
基本工作原理
实现
filter的生命周期
filter链 当多个filter同时存在的时候,组成了filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter。当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法,通过判断FilterChain中是否还有filter决定后面是否还调用filter。
2.1.3 Listener
简介
JavaWeb开发中的监听器(Listener)就是Application、Session和Request三大对象创建、销毁或者往其中添加、qtqml框架源码修改、删除属性时自动执行代码的功能组件。
用途
可以使用监听器监听客户端的请求、服务端的操作等。通过监听器,可以自动出发一些动作,比如监听在线的用户数量,统计网站访问量、网站访问监控等。
2.2 Tomcat
Tomcat 作为Servlet容器,将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,传递给servlet;同时会将响应的信息封装为HttpServletResponse类型的response对象,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器。
2.3 其他java背景知识
2.3.1 java反射
2.3.2 java instrumentation
3 内存马实现
使用新增servlet的方式就需要绑定指定的URL。如果我们想要更加隐蔽,做到内存马与URL无关,无论这个url是原生servlet还是某个struts action,甚至无论这个url是否真的存在,只要我们的请求传递给tomcat,tomcat就能相应我们的指令,那就得通过注入新的或修改已有的filter或者listener的方式来实现了。比如早期rebeyond师傅开发的memshell,就是通过修改org.apache.catalina.core.ApplicationFilterChain类的internalDoFilter方法来实现的,后期冰蝎最新版本的内存马为了实现更好的兼容性,选择hook javax.servlet.http.HttpServlet#service 函数,在weblogic选择hook weblogic.servlet.internal.ServletStubImpl#execute 函数。
4 内存马检测与排查
在java中,只有被JVM加载后的类才能被调用,或者在需要时通过反射通知JVM加载。所以特征都在内存中,表现形式为被加载的class。需要通过某种方法获取到JVM的运行时内存中已加载的类, Java本身提供了Instrumentation类来实现运行时注入代码并执行,因此产生一个检测思路:注入jar包-> dump已加载class字节码->反编译成java代码-> 源码webshell检测。
delphiççä¸å¯ä»¥åshellcodeä¹
ä¸è¬çShellCodeé½æ¯ï½ASMåCåçï½Delphiä½çå°æ¯å¾å°æå ·ä½ä¾å å ¶å®ä½¿ç¨Delphiåä¸æ¯ä¸å¯è½ï½å°±æ¯éº»ç¦ï½(Delphiçï½BASMä¹ä¸å¤ªçµæ´»ï½è³å°ææè§æ²¡æç´æ¥ä½¿ç¨TASMç½) ä¸è¿è¿æ¯åä¸ä¸ªç©ç©å§ï½è¿éä» ä» ä½ä¸ªæ¼ç¤ºä»£ç ï½ ä»¥ä¸ShellCodeæºä»£ç :
pwn基础— Got表劫持
随着技术的发展,攻击者越来越重视对软件的深入理解,其中对GOT(全局偏移表)的劫持技术成为了渗透测试中的一种重要手段。本文将对GOT表劫持的基础知识进行深入讲解,包括其原理、流程、检测方法、保护机制、源码分析以及利用脚本的编写和动态调试分析。
程序信息方面,我们以ELF程序为例。由于延迟绑定机制的存在,GOT是可以被修改的,这为攻击者提供了任意控制程序流程的可能性。劫持原理主要分为两步:首先,在未执行漏洞函数前,GOT中的特定地址存储着真实的函数地址;然后,通过执行漏洞函数,将该地址修改为攻击者想要的函数地址,如system函数,从而在再次调用原函数时,其行为被改变了。
检测保护机制时,通常使用检查安全工具来分析程序的安全性。在本例中,程序仅开启了Canary保护和部分RELRO保护,这意味着堆、栈、BSS段代码可执行,但GOT仍然可写。这为GOT劫持提供了条件。保护机制的全称为RELRO(Relocation Read-Only),通过设置全RELRO,可以防止GOT劫持,因为在加载时将所有函数绑定完成,GOT被设置为不可写。
分析源码是理解攻击流程的关键步骤。题目直接提供了源码,通过仔细阅读,我们可以发现puts@plt地址和全局变量name的地址,这是进行GOT劫持和shellcode注入的基础。
编写利用脚本是将理论知识转化为实践的环节。通过编写并执行exp脚本,成功实现了getshell,验证了攻击流程的有效性。动态调试分析提供了更直观的视角,通过在关键位置设置断点,观察内存内容的变化,确认shellcode的注入和目标地址的修改,最终实现目标函数的劫持。
综上所述,GOT表劫持技术是渗透测试领域中一种复杂且强大的攻击手段。通过深入了解其原理、流程、保护机制和利用方法,可以有效提升安全意识和防御能力。对于开发者而言,及时更新安全保护机制,如全RELRO保护,可以有效防止GOT劫持,保障软件的安全性。
EMET下EAF机制分析以及模拟实现
在信息安全领域,EAF(Export Address Table Access Filtering)机制引起了广泛的关注,它是Enhanced Mitigation Experience Toolkit(EMET)中的关键组件,旨在提升系统安全。本文将深入探讨EAF的实现原理、模拟过程以及在实际应用中的操作策略,以帮助安全专业人士更好地理解和利用这一技术。
首先,让我们回顾一下EAF的核心概念。EAF是导出地址表(Export Address Table,EAT)访问过滤器,它能够在shellcode试图访问EAT时进行拦截和控制,从而限制恶意代码的执行权限。在代码层面,关键步骤包括注册异常处理函数(EAFVectoredHandler)和获取kernel.dll、ntdll.dll和kernelbase.dll等核心模块的EAT地址并设置断点。
在具体的实现流程中,首先,我们需要在系统中注册一个异常处理函数,如AddVectoredExceptionHandler(0, EAFVectoredHandler),这样当遇到STATUS_GUARD_PAGE_VIOLATION异常时,程序将进入我们的自定义处理逻辑。接着,通过定位kernel.dll等模块的EAT地址,并设置内存断点,确保在shellcode尝试访问这些敏感区域时能被捕捉到。一旦异常触发,程序会根据白名单策略决定是终止违规进程还是进行单步调试。
对于EAF的详细分析,重点在于理解异常处理函数的注册以及如何获取模块的EAT地址。通过添加内存断点并监控堆栈指针,我们能够有效地识别出企图访问EAT的shellcode。在白名单系统中,针对特定模块的内存保护尤为重要,例如ntdll.dll,通过设置PAGE_GUARD属性,我们可以在shellcode试图访问时立即触发异常。
为了模拟EAF,GitHub上有多个项目可供参考,如sheri/EMET_Simulator、codingtest/EMET,以及Maxwell/MemGuard.cpp。这些项目提供了实战代码示例,帮助我们更好地理解和应用EAF。在这些代码中,我们能看到如何在运行时检查堆栈指针的一致性,以及如何根据白名单策略处理shellcode异常。
在实际场景中,EAF的使用涉及对模块加载监控、堆栈寄存器检查和特定内存访问的拦截。通过在模块加载时设置内存断点,我们可以对shellcode的行为进行更精细化的控制。而在遇到shellcode访问受保护页面时,程序会根据白名单策略执行相应的处理,如终止进程或允许单步调试。
综上所述,EAF机制在EMET框架中扮演着至关重要的角色,通过模拟和理解其原理,安全专业人员可以更有效地保护系统免受恶意shellcode的攻击。GitHub上的项目和源代码提供了深入学习和实践的宝贵资源,帮助我们提升系统的安全防护能力。