Good in study, attitude and health

  • 通过APC实现Dll注入——绕过Sysmon监控

    0x00 前言 要对指定进程进行远程注入,通常使用Windows提供的API CreateRemoteThread创建一个远程线程,进而注入dll或是执行shellcode Sysmon可用来监控和记录系统活动,可记录CreateRemoteThread操作 注入的方法不只有CreateRemoteThread,能否通过其他注入方式绕过Sysmon的监控呢? Casey Smith@subTee在他的文章中给出了答案: Shellcode Injection via QueueUserAPC - Hiding From Sysmon 地址如下: http://subt0x10.blogspot.com/2017/01/shellcode-injection-via-queueuserapc.html 0x01 简介 本文将要介绍如下内容: Sysmon配置测试,监控CreateRemoteThread操作 c++实现通过APC对Dll注入 绕过Sysmon测试 Casey Smith@subTee分享的C#实现代码和用途 Sysmon: 可用来监控和记录系统活动,并记录到windows事件日志,包含如下事件: Event ID 1: Process creation Event ID 2: A process changed a file creation time Event ID 3: Network connection Event ID...

  • 渗透测试中的Application Verifier(DoubleAgent利用介绍)

    0x00 前言 近日,Cybellum Technologies LTD公开了一个0-day漏洞的POC,对其命名为“DoubleAgent”,可用于控制主流的杀毒软件 不同于以往的绕过思路,这次使用的是一种直接攻击并劫持的方式 本文将要介绍该方式的原理,分享利用思路、攻击条件和防御方法 Cybellum的博客链接如下: https://cybellum.com/doubleagent-taking-full-control-antivirus/ https://cybellum.com/doubleagentzero-day-code-injection-and-persistence-technique/ POC: https://github.com/Cybellum/DoubleAgent 0x01 简介 该方式主要是对微软系统自带的Application Verifier(应用程序检验器)进行利用 利用过程如下: 编写自定义Verifier provider DLL 通过Application Verifier进行安装 注入到目标进程执行payload 每当目标进程启动,均会执行payload,相当于一个自启动的方式 Application Verifier支持系统: WinXP-Win10 理论上,该利用方式支持WinXP-Win10,但是POC提供的dll在部分操作系统下会报错,修复方法暂略,本文仅挑选一个默认成功的系统进行测试——Win8.1 x86 0x02 application verifier 是针对非托管代码的运行时验证工具,它有助于找到细小的编程错误、安全问题和受限的用户帐户特权问题,使用常规的应用程序测试技术很难识别出这些错误和问题 注: 类似于Application Compatibility Shims,可以理解为一种补丁机制 关于Application Compatibility Shims在渗透测试中的利用技巧可参照: https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84Application-Compatibility-Shims/ 更多基础概念可参考微软官方文档,地址如下: https://msdn.microsoft.com/zh-cn/library/aa480483.aspx 测试系统: Win8.1 x86(默认支持application verifier) cmd输入(管理员权限): appverif 进入控制界面,通过面板查看配置验证器...

  • Study Notes of using sdclt.exe to bypass UAC

    0x00 前言 Matt Nelson‏ @enigma0x3在最近的文章中公开了一个绕过Win10 UAC的技巧,通过修改HKCU下的注册表键值实现对UAC的绕过,文章地址如下: https://enigma0x3.net/2017/03/14/bypassing-uac-using-app-paths/ https://enigma0x3.net/2017/03/17/fileless-uac-bypass-using-sdclt-exe/ 0x01 简介 本文将对其进行测试,分享测试心得,整理该方法的攻防技巧 0x02 原理 Sigcheck 可用来查看exe文件的清单(manifest) 下载地址: https://technet.microsoft.com/en-us/sysinternals/bb897441.aspx 在Win10环境下,cmd下运行: sigcheck.exe -m c:\windows\system32\sdclt.exe 如图 level=”requireAdministrator” true代表可自动提升权限 在Win7环境下,同样使用Sigcheck查看sdclt.exe 如图 level=”asInvoker”表示不会提升权限,这也就是不支持Win7的原因 接下来,使用ProcessMonitor监控sdclt.exe的启动过程,查找是否会调用其他程序 0x03 实际测试 测试环境: Win 10 x64 注: 该方法只在Win10下测试成功 cmd下输入: sdclt.exe 正常启动,如图 使用ProcessMonitor查看启动过程 如图 启动sdclt.exe的过程中会以High权限查找注册表键值HKCU:\Software\Microsoft\Windows\CurrentVersion\App Paths\control.exe 如果手动修改该注册表键值,填入参数,那么就能够实现UAC的绕过 绕过方法如下: 新建注册表键值: HKCU:\Software\Microsoft\Windows\CurrentVersion\App Paths\control.exe 并将默认值设置为cmd.exe 如图...

  • Windows Shellcode学习笔记——利用VirtualAlloc绕过DEP

    0x00 前言 接着介绍DEP绕过的另一种方法——利用VirtualAlloc绕过DEP。通过VirtualAlloc函数可以申请一段具有可执行属性的内存,相比于VirtualProtect,传入VirtualAlloc的四个参数不需要先读取再赋值,可在shellcode中直接指定,结构更简单。当然,利用Immunity Debugger的mona插件可自动构造利用VirtualAlloc绕过DEP的ROP链。 0x01 简介 本文将要介绍以下内容: 调用VirtualAlloc函数时的Bug及修复 选择合适的替代指令,修改mona自动生成的rop链,实现利用 利用VirtualAlloc绕过DEP时需要考虑的细节,如对shellcode的长度要求 0x02 相关概念 VirtualAlloc: LPVOID WINAPI VirtualAlloc( LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect ) lpAddress:申请内存区域的地址 dwSize:申请内存区域的大小 flAllocationType:申请内存的类型 flProtect:申请内存的访问控制类型 申请成功时函数返回申请内存的起始地址,申请失败时返回NULL 0x03 实际测试 测试环境: 测试系统: Win 7 编译器: VS2012 build版本: Release 项目属性: 关闭GS 关闭优化 关闭SEH 打开DEP 关闭ASLR 禁用c++异常 禁用内部函数 注: 详细配置方法在上篇文章有说明...

  • Windows Shellcode学习笔记——通过VirtualProtect绕过DEP

    0x00 前言 在掌握了栈溢出的基本原理和利用方法后,接下来就要研究如何绕过Windows系统对栈溢出利用的重重防护,所以测试环境也从xp转到了Win7(相比xp,Win7的防护更全面)。本文将要介绍经典的DEP绕过方法——通过VirtualProtect绕过DEP 0x01 简介 本文将要介绍以下内容: VS2012的编译配置 利用Immunity Debugger的mona插件自动获取ROP链 对ROP链的分析调试 调用VirtualProtect函数时的Bug及修复 0x02 相关概念 DEP: 溢出攻击的根源在于计算机对数据和代码没有明确区分,如果将代码放置于数据段,那么系统就会去执行 为了弥补这一缺陷,微软从XP SP2开始支持数据执行保护(Data Exection Prevention) DEP保护原理: 数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,而有了DEP,此时CPU会抛出异常,而不是去执行指令 DEP四种工作状态: Optin Optout AlwaysOn AlwaysOff DEP绕过原理: 如果函数返回地址并不直接指向数据段,而是指向一个已存在的系统函数的入口地址,由于系统函数所在的页面权限是可执行的,这样就不会触发DEP 也就是说,可以在代码区找到替代指令实现shellcode的功能 但是可供利用的替代指令往往有限,无法完整的实现shellcode的功能 于是产生了一个折中方法:通过替代指令关闭DEP,再转入执行shellcode 内存页: x86系统一个内存页的大小为4kb,即0x00001000,4096 ROP: 面向返回的编程(Return-oriented Programming) VirtualProtect: BOOL VirtualProtect{ LPVOID lpAddress, DWORD dwsize, DWORD flNewProtect, PDWORD lpflOldProtect } lpAddress:内存起始地址 dwsize:内存区域大小...

  • Windows Shellcode学习笔记——栈溢出中对jmp esp的利用与优化

    0x00 前言 在《Windows Shellcode学习笔记——shellcode在栈溢出中的利用与优化》中对栈溢出的利用做了介绍。通过将返回地址覆盖为shellcode在内存中的起始地址,实现对栈溢出的利用 但是shellcode在内存中的起始地址往往不固定,导致漏洞利用不一定成功,本文将通过jmp esp的方式来解决这个问题 0x01 简介 函数代码在栈中保存顺序(直观理解,已省略其他细节): buffer 前栈帧EBP 返回地址 ESP ESP寄存器总是指向返回地址的下一地址 如果用jmp esp覆盖返回地址,那么在函数返回后会执行jmp esp,跳到esp,也就是返回地址的下一地址开始执行 因此,将shellcode放于返回地址之后,并将返回地址覆盖为jmp esp,就可以避免shellcode在内存中产生的移位问题 本文将要介绍使用jmp esp的具体细节,并分享如何优化我们自己生成的弹框实例shellcode,实现jmp esp利用,编写程序自动实现,解决shellcode在内存中的起始地址不固定的问题。 弹框实例shellcode下载地址: https://github.com/3gstudent/Shellcode-Generater/blob/master/shellcode.bin 0x01 jmp esp 获得jmp esp的机器码: 可通过搜索各个进程空间来获取,具体原理可参考《0day安全:软件漏洞分析技术》3.2.2节 为便于理解和测试,直接引用《0day安全:软件漏洞分析技术》3.2.2节中的代码,代码如下: #include <stdio.h> #include <windows.h> #define DLL_NAME "user32.dll" int main() { BYTE *ptr; int position,address; HINSTANCE handle; BOOL done_flag=FALSE; handle=LoadLibrary(DLL_NAME);...

  • Windows Shellcode学习笔记——shellcode在栈溢出中的利用与优化

    0x00 前言 在《Windows Shellcode学习笔记——shellcode的提取与测试》中介绍了如何对shellcode作初步优化,动态获取Windows API地址并调用,并通过程序实现自动提取机器码作为shellcode并保存到文件中。 弹框实例shellcode的bin文件已上传至github,地址如下: https://github.com/3gstudent/Shellcode-Generater/blob/master/shellcode.bin 注: shellcode.bin由getshellcode.cpp生成 getshellcode.cpp地址如下: https://github.com/3gstudent/Shellcode-Generater/blob/master/getshellcode.cpp 接下来,要研究shellcode在具体环境中的使用和优化技巧 0x01 简介 先从最入门的缓冲区溢出开始 本文将要结合《0day安全:软件漏洞分析技术》中的“栈溢出原理与实践”章节,以其中的栈溢出代码作样本,优化我们自己生成的弹框实例shellcode,实现在栈溢出中的初步利用。 0x02 相关概念 栈区: 用于动态地存储函数之间的调用关系,以保证被调用函数在返回时恢复到母函数中继续执行 特殊寄存器: ESP:栈指针寄存器(extended stack pointer),指向栈顶 EBP:基址指针寄存器(extended base pointer),指向栈底 EIP:指令寄存器(extended instruction pointer),指向下一条等待执行的指令地址 函数代码在栈中保存顺序(直观理解,已省略其他细节): buffer 前栈帧EBP 返回地址 ESP 函数栈溢出原理(直观理解,已省略其他细节): 正常情况下函数在返回过程中,最后会执行返回地址中保存的内容,通常是跳到下一条指令的地址 如果buffer长度过长,长到覆盖了返回地址的值,那么函数在返回时,就会执行被覆盖的内容 如果将shellcode保存到buffer中,覆盖的返回地址为shellcode的起始地址,那么,shellcode将得到执行,完成栈溢出的利用 0x03 栈溢出实例测试 样本代码如下: #include <stdio.h> #include <windows.h> #define PASSWORD "1234567" int...

  • Windows Shellcode学习笔记——shellcode的提取与测试

    0x00 前言 之前在《Windows Shellcode学习笔记——通过VisualStudio生成shellcode》介绍了使用C++编写(不使用内联汇编),实现动态获取API地址并调用,对其反汇编提取shellcode的方法,并开源了测试代码。 接下来在对shellcode进行提取的过程中,发现了当时开源代码的一些bug,所以本文着重解决测试代码的bug,并介绍使用C++开发shellcode需要考虑的一些问题。 存在bug的测试代码下载地址: https://github.com/3gstudent/Shellcode-Generater/blob/master/shellcode.cpp 0x01 简介 简单的shellcode提取流程: 使用c++开发代码 更改VisualStudio编译配置 生成exe 在IDA下打开生成的exe,获得机器码 由于是动态获取API地址并调用,所以为了保证shellcode的兼容性,代码中不能出现固定地址,并且要尽量避免使用全局变量,如果代码中包含子函数,根据调用方式,还有注意各个函数之间的排列顺序(起始函数放于最前) 0x02 Bug修复 配置三个编译选项:release、禁用优化、禁用/GS 将代码编译,然后使用IDA提取机器码作为shellcode 在实际调试过程中,发现代码存在bug: 1、代码中应合理处理全局变量 在代码中使用全局变量 FARPROC(WINAPI* GetProcAddressAPI)(HMODULE, LPCSTR); HMODULE(WINAPI* LoadLibraryWAPI)(LPCWSTR); 在编译后会成为一个固定地址,导致shellcode无法兼容不同环境 最简单直接的方式是在shellcode中尽量避免全局变量 2、函数声明方式需要修改 修改全局变量后,以下代码需要修改: MESSAGEBOXA_INITIALIZE MeassageboxA_MyOwn = reinterpret_cast<MESSAGEBOXA_INITIALIZE>(GetProcAddressAPI(LoadLibraryWAPI(struser32), MeassageboxA_api)); MeassageboxA_MyOwn(NULL, NULL, NULL, 0); 需要全部换成typedef的函数声明方式 3、函数调用顺序 如果使用以下方式加载shellcode: (*(int(*)()) sc)(); 起始函数的定义应该位于这段shellcode的最前面(和函数声明的顺序无关) 注: shellcode如果包含子函数,应该保证各个函数放在一段连续的地址中,并且起始函数置于最前面,这样在提取机器码后,可以直接加载起始函数执行shellcode 综上,给出新的完整代码: #include...

  • 32位程序对64位进程的远程注入实现

    0x00 前言 要对指定进程进行远程注入,通常使用Windows提供的API CreateRemoteThread创建一个远程线程,进而注入dll或是执行shellcode。 在64位系统下,该方法需要特别注意,注入的目标进程要同程序的结构保持一致,即32位程序只能对32进程作注入,64位程序只能对64位进程作注入 32位程序对64位程序进行注入时会失败(32位和64位的结构不同) 然而,在某些特殊的环境下,无法提前预知目标进程的结构,准备两个不同版本的程序又不现实 所以只能重新思考这个问题: 32位程序真的无法对64位程序进行远程注入吗? 0x01 简介 我在odzhan的博客里找到了解决思路,文章地址如下: https://modexp.wordpress.com/2015/11/19/dllpic-injection-on-windows-from-wow64-process/ 本文将会介绍实现思路,参考odzhan的开源工程”pi”,编写测试代码,生成32位程序,实现对64位进程calc.exe的进程注入,验证32位程序能够对64进程作注入的结论 0x02 实现思路 1、32位程序支持对64位程序的读写 参考资料: rgb/29a: http://www.vxheaven.org/lib/vrg02.html ReWolf: http://blog.rewolf.pl/blog/ https://github.com/rwfpl/rewolf-wow64ext 2、 利用CreateRemoteThread作进程注入的通用方法 进程注入流程: OpenProcess VirtualAllocEx WriteProcessMemory VirtualProtectEx CreateRemoteThread WaitForSingleObject 在具体的实现过程中,如果指定了进程名称,需要先将进程名称转换为进程ID,参考代码如下: DWORD processNameToId(LPCTSTR lpszProcessName) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe; pe.dwSize = sizeof(PROCESSENTRY32); if (!Process32First(hSnapshot, &pe))...

  • Windows Shellcode学习笔记——通过VisualStudio生成shellcode

    0x00 前言 shellcode是一段机器码,常用作漏洞利用中的载荷(也就是payload) 在渗透测试中,最简单高效的方式是通过metasploit生成shellcode,然而在某些环境下,需要定制开发自己的shellcode,所以需要对shellcode的开发作进一步研究 0x01 简介 编写Shellcode的基本方式有3种: 直接编写十六进制操作码 采用C或者Delphi这种高级语言编写程序,编译后,对其反汇编进而获得十六进制操作码 编写汇编程序,将该程序汇编,然后从二进制中提取十六进制操作码 本文将介绍如何通过Visual Studio编写c代码来生成shellcode,具体包含以下三部分内容: 利用vc6.0的DEBUG模式获取shellcode 测试Shellcode自动生成工具——ShellcodeCompiler 使用C++编写(不使用内联汇编),实现动态获取API地址并调用,对其反汇编可提取出shellcode 0x02 利用vc6.0的DEBUG模式获取shellcode 注: 本节参考爱无言的《挖0day》附录部分 测试系统: Windows XP 1、编写弹框测试程序并提取汇编代码 代码如下: #include "stdafx.h" #include <windows.h> int main(int argc, char* argv[]) { MessageBoxA(NULL,NULL,NULL,0); return 0; } 在MessageBoxA(NULL,NULL,NULL,0);处,按F9下断点 debug模式按F5开始调试,跳到断点 按Alt+8将当前C代码转为汇编代码,如图 00401028 mov esi,esp 0040102A push 0 0040102C push 0...