Good in study, attitude and health

  • Windows XML Event Log (EVTX)单条日志清除(四)——通过注入获取日志文件句柄删除当前系统单条日志记录

    0x00 前言 Windows XML Event Log (EVTX)单条日志清除系列文章的第四篇,介绍第二种删除当前系统单条日志记录的方法:获得日志服务Eventlog对应进程中指定日志文件的句柄,通过Dll注入获得该句柄的操作权限,利用该句柄实现日志文件的修改 0x01 简介 本文将要介绍以下内容: 利用思路 程序实现 枚举日志服务Eventlog对应进程的所有句柄,获得指定日志文件的句柄 通过Dll注入获得该句柄的操作权限 进程间消息传递的方法 0x02 利用思路 系统启动日志服务Eventlog后,会以独占模式打开日志文件,导致其他进程无法打开该日志文件,也就无法进行修改操作 那么,如果我们通过Dll注入进入进程的内存,接着获得指定日志文件的句柄,能否获得该日志文件的操作权限呢? 0x03 枚举日志服务Eventlog对应进程的所有句柄,获得指定日志文件的句柄 1、利用工具processhacker获得指定日志文件的句柄 下载地址: https://processhacker.sourceforge.io/ (1)获得日志服务Eventlog对应进程的pid 执行如下powershell代码: Get-WmiObject -Class win32_service -Filter "name = 'eventlog'" | select -exp ProcessId (2)运行processhacker 根据pid找到进程,查看Properties->Handles 能够获得当前进程的所有句柄信息 如下图 可以看到C:\Windows\System32\winevt\Logs\Security.evtx对应的Handle值为0x1c8 2、通过c++程序实现获得指定日志文件的句柄 查看processhacker的源码,寻找实现方法 代码位置: https://github.com/processhacker/processhacker/blob/e2d793289dede80f6e3bda26d6478dc58b20b7f8/ProcessHacker/hndlprv.c#L307 获得参考资料: On Windows 8...

  • Windows XML Event Log (EVTX)单条日志清除(三)——通过解除文件占用删除当前系统单条日志记录

    0x00 前言 Windows XML Event Log (EVTX)单条日志清除系列文章的第三篇,介绍第一种删除当前系统evtx日志文件单条日志记录的方法:关闭服务对应的进程,释放文件句柄,解除文件占用,删除日志,重启服务 0x01 简介 本文将要介绍以下内容: 通过c程序枚举服务信息,提取Eventlog服务对应进程svchost.exe的pid 通过c程序提权关闭Eventlog进程 通过c程序释放文件句柄 通过c程序删除单条日志文件 0x02 删除思路 在上篇文章《Windows XML Event Log (EVTX)单条日志清除(二)——程序实现删除evtx文件的单条日志记录》介绍了删除单条日志记录的方法,但如果直接用来删除当前系统的日志,在打开文件时会报错,提示文件被占用 这是因为当前系统启动日志服务Eventlog后,会以独占模式打开日志文件,导致其他进程无法打开该日志文件,也就无法进行修改操作 有以下两种解决方法: 结束日志服务Eventlog对应的进程,释放文件句柄,获得修改日志文件的权限 获得日志服务Eventlog对应进程中指定日志文件的句柄,利用该句柄实现日志文件的修改 本文将要介绍第一种解决方法,分享在程序实现上的细节,最后开源实现代码 第二种解决方法会在之后的文章进行详细介绍 0x03 获得Eventlog服务对应进程svchost.exe的pid 由于Windows系统有多个svchost.exe进程,无法直接搜索进程名”svchost.exe”获得Eventlog服务对应的进程pid 查询思路: 枚举当前系统服务,根据服务名称筛选出对应的进程pid 1、通过powershell实现 代码如下: Get-WmiObject -Class win32_service -Filter "name = 'eventlog'" | select -exp ProcessId 2、通过c++实现 #include <windows.h> #pragma comment(lib,"Advapi32.lib")...

  • Windows XML Event Log (EVTX)单条日志清除(二)——程序实现删除evtx文件的单条日志记录

    0x00 前言 Windows XML Event Log (EVTX)单条日志清除系列文章的第二篇,介绍对指定evtx文件的单条日志删除方法,解决在程序设计上需要考虑的多个问题,开源实现代码。 0x01 简介 本文将要介绍以下内容: 对指定evtx文件单条日志的删除思路 程序实现细节 开源代码 0x02 对指定evtx文件单条日志的删除思路 在上篇文章《Windows XML Event Log (EVTX)单条日志清除(一)——删除思路与实例》介绍了evtx日志文件中删除单条日志的原理和一个实例,采用修改日志长度的方法实现日志删除 实现思路如图 注: 图片来自https://blog.fox-it.com/2017/12/08/detection-and-recovery-of-nsas-covered-up-tracks/ 这种方法在实现上相对简单,但是需要考虑多种不同的情况: 删除中间日志 删除最后一条日志 删除第一条日志 0x03 删除中间日志 方法如下: File header中的Next record identifier值减1 重新计算File header中的Checksum 重新计算前一日志长度,共2个位置(偏移4和当前日志的最后4字节) 后续日志的Event record identifier依次减1 ElfChuk中的Last event record number减1 ElfChuk中的Last event record identifier减1 重新计算ElfChuk中Event records...

  • Windows XML Event Log (EVTX)单条日志清除(一)——删除思路与实例

    0x00 前言 Windows XML Event Log (EVTX)单条日志清除系列文章的第一篇,侧重于介绍evtx日志文件的基础知识和删除单条日志的实现思路与实例 0x01 简介 本文将要介绍以下内容: evtx文件格式 删除单条日志的思路 删除单条日志的实例 0x02 基础知识:evtx文件格式 可参考的资料: https://github.com/williballenthin/python-evtx evtx文件是指Windows Vista之后用于保存系统日志信息的文件 evtx文件结构包含三部分: file header chunks trailing empty values 注: file header保存evtx文件基本信息,值得注意的是Next record identifier、Number of chunks、File flags和Checksum chunks保存日志内容,包括具体每条日志的内容和校验和,值得注意的是Last event record number、Last event record identifier、Last event record data offset和两个Checksum trailing empty values为尾随空值,用于填充文件长度,内容任意,不会影响evtx文件的有效性 (1) file...

  • 渗透基础——Windows下计划任务的使用

    0x00 前言 在渗透测试中,尤其是域渗透,常常会用到Windows系统的计划任务,一是用于远程启动程序,二是用于程序的自启动 那么,计划任务具体有哪些使用技巧呢?是否对权限有要求?一定需要管理员权限才能运行吗? 0x01 简介 本文将要介绍以下内容: 命令行实现 c++实现 不同权限下创建计划任务的区别 COM组件ITaskService能否提权运行 命令行开启和关闭计划任务 日志位置 0x02 简介 官方说明文档: https://msdn.microsoft.com/en-us/library/windows/desktop/aa446802(v=vs.85).aspx 需要开启服务Task Scheduler 可在以下情况触发: When a specific system event occurs. At a specific time. At a specific time on a daily schedule. At a specific time on a weekly schedule. At a specific time...

  • 通过COM组件IARPUninstallStringLauncher绕过UAC

    0x00 前言 在上篇文章《通过COM组件NetFwPolicy2越权关闭防火墙》验证结论:对于explorer.exe(或是模拟成explorer.exe),加载高权限的COM组件不会弹出UAC的对话框。同时介绍了如何在注册表中寻找可以高权限运行的COM组件。 本次将要继续,介绍另一个可供使用的COM组件。 在我搜索到HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{FCC74B77-EC3E-4dd8-A80B-008A702075A9}时,获得名称ARP UninstallString Launcher 经过进一步搜索,发现ExpLife已经公开了这个COM组件的利用方法,地址如下: http://www.freebuf.com/articles/system/116611.html 感谢ExpLife的分享,缩短了我研究的时间,所以本文将要在此基础上,侧重于分析原理和介绍更多利用方式 0x01 简介 本文将要介绍以下内容: 复现通过COM组件IARPUninstallStringLauncher绕过UAC的方法 利用分析 更多利用方式 0x02 复现通过COM组件IARPUninstallStringLauncher绕过UAC的方法 ExpLife是从寻找不会弹出UAC对话框的功能入手,通过逆向找到可供利用的COM组件 而我的思路是先找到支持提升权限的COM组件,然后查找这个COM组件对应的功能 两种方法各有利弊: ExpLife的方法需要对系统有足够了解,得找到不会弹出UAC对话框的功能 我采用的方法能够找到一些不常见的COM组件,其中的功能在平时也许很难接触 但使用Explife的方法,如果找到了一个功能,使用动态下断点和静态分析的方法对COM组件的逆向会很高效 而我采用的方法只能通过注册表键值内容做一个大概的判断,需要进一步搜索才能定位具体的COM组件,效率不高 可以将两种方法相结合,但最重要的一点,找到的COM组件不仅要能够提升权限,还要能够执行程序(或是其他有用的功能)才可以 下面开始介绍利用原理: 1、“偷偷”绕过UAC 在之前的文章《渗透基础——获得当前系统已安装的程序列表》曾提到过控制面板 -> 程序 -> 程序和功能中的程序列表对应以下注册表键值: 高权限程序对应注册表键值HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ 低权限程序对应注册表键值HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\(实际上为HKEY_USERS\[sid]\Software\Microsoft\Windows\CurrentVersion\Uninstall\) 在卸载程序时,同时会删除程序对应的注册表键值 而我们在删除高权限的程序时,会删除HKEY_LOCAL_MACHINE\下的键值,正常情况下该操作会弹出UAC对话框,但实际上并没有,这里就可以判断系统“偷偷”绕过了UAC 如果我们能够模拟这个功能,那么也能“偷偷”绕过UAC 2、执行程序 注册表项Uninstall下有一个键为”UninstallString”,内容为要执行的命令 如果我们替换成payload,就能实现高权限执行,即UAC绕过并执行任意程序 以上两点相结合,满足了通过COM组件绕过UAC的必要条件 所以,接下来只要能够模拟卸载程序的功能即可 逆向分析过程和模拟卸载的功能ExpLife在他的文章中已经写得很详细,不再赘述 引用文中的分析: 通过调用位于CARPUninstallStringLauncherCOM组件中IARPUninstallStringLauncher接口的LaunchUninstallStringAndWait方法来实现卸载程序 关键代码如下: CLSID clsid; IID...

  • 通过COM组件NetFwPolicy2越权关闭防火墙

    0x00 前言 在上篇文章《通过COM组件IFileOperation越权复制文件》介绍了通过COM组件IFileOperation越权复制文件的三种方法,我们得出一个推论:对于explorer.exe(或是模拟成explorer.exe),加载高权限的COM组件不会弹出UAC的对话框 那么,这个推论是否适用于其他COM组件呢?又有哪些COM组件可以利用呢? 本文将要通过COM组件越权关闭防火墙的方法,详细记录研究过程 0x01 简介 寻找可以高权限运行的COM组件 编写c++程序实现关闭防火墙 添加代码以高权限运行COM组件 添加代码模拟进程explorer.exe 开源完整实现代码 0x02 寻找可以高权限运行的COM组件 通过COM组件IFileOperation实现越权复制文件有一个前提: COM组件能够以高权限运行 对于IFileOperation,它提供了一个参数(SetOperationFlags)可以指定启动的权限 官方文档: https://msdn.microsoft.com/en-us/library/bb775799.aspx 为了找到其他可以高权限运行的COM组件,我们首要的是寻找能够以高权限运行COM组件的方法 经过查找,我找到了一个资料,利用COM Elevation Moniker能够以高权限运行COM组件 官方文档: https://msdn.microsoft.com/en-us/library/windows/desktop/ms679687(v=vs.85).aspx 通过学习官方文档,发现COM Elevation Moniker的使用对COM组件有如下要求: 该COM组件被注册 注册位置在HKEY_LOCAL_MACHINE下,也就是说,需要以管理员权限注册这个COM组件才可以 注册表HKEY_LOCAL_MACHINE\Software\Classes\CLSID下需要指定三项键值 {CLSID}, LocalizedString(REG_EXPAND_SZ):displayName {CLSID}/Elevation,IconReference(REG_EXPAND_SZ):applicationIcon {CLSID}/Elevation,Enabled(REG_DWORD):1 注: 经过实际测试,以上三项缺一不可 接下来,按照这个要求搜索注册表寻找可用的COM组件 搜索位置:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID 搜索关键词:Elevation 经过一段时间的搜索,我找到了一个可用的COM组件,位置:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{E2B3C97F-6AE1-41AC-817A-F6F92166D7DD} 信息如下图 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{E2B3C97F-6AE1-41AC-817A-F6F92166D7DD}\Elevation的信息如下图 满足COM Elevation Moniker的要求 通过搜索名称“HNetCfg.FwPolicy2”发现这个COM组件同防火墙的操作有关 0x03 编写c++程序实现关闭防火墙 对应COM接口INetFwProfile,于是查找资料尝试编写c程序实现...

  • 通过COM组件IFileOperation越权复制文件

    0x00 前言 在之前的文章《Empire中的Invoke-WScriptBypassUAC利用分析》曾介绍过一个越权复制文件的方法,在普通用户的权限下,利用wusa能够将cab文件释放至管理员权限的文件夹,进一步可以实现文件名劫持和UAC绕过。 但该功能在Win10下被取消,那么有没有更为通用的方法呢? 本文将要介绍一个适用于Win7-Win10的方法——利用COM组件IFileOperation 0x01 简介 利用原理 三种实现思路 实例代码 实际测试 利用分析 0x02 利用原理 注: 该方法学习自Defcon 25中的workshop,Ruben Boonen 《UAC 0day, all day!》 ppt下载地址: https://github.com/FuzzySecurity/DefCon25/blob/master/DefCon25_UAC-0day-All-Day_v1.2.pdf 利用COM组件IFileOperation越权复制文件的前提: Win7以后的系统 可信路径下的可信文件(例如explorer.exe,powershell.exe) 所以有以下三种实现思路: 1、dll劫持或是dll注入 由于可信路径下的可信文件一般都是在需要管理员权限的路径下,所以普通用户权限下基本无法实现dll劫持 可行的方法是dll注入 例如explorer.exe,在普通用户权限就可以对其进行dll注入 2、修改PEB结构,欺骗PSAPI,调用COM组件IFileOperation COM组件通过Process Status API (PSAPI)读取进程PEB结构中的Commandline来识别它们正在运行的进程 如果将进程的Path改成可信文件(如explorer.exe),就能够欺骗PSAPI,调用COM组件IFileOperation实现越权复制 3、通过可信文件直接调用COM组件IFileOperation 例如powershell.exe为可信文件,并且能够直接调用COM组件IFileOperation 0x03 实现方法1:dll注入explorer.exe 具体实现分为如下两段: 将dll注入到进程explorer.exe dll实现调用COM组件IFileOperation复制文件 github已经有一个完整的实现代码,因此可以参考该工程对其分析,工程地址: https://github.com/hjc4869/UacBypass (1)工程UacBypassTest实现了dll注入到进程explorer.exe 去掉不必要的功能,只保留将UacBypass.dll注入到进程explorer.exe的功能: 删除Line...

  • 渗透技巧——利用PHP脚本从浏览器中获得Net-NTLM hash

    0x00 前言 在上篇文章《渗透技巧——通过HTTP协议获得Net-NTLM hash》介绍了通过HTTP协议获得客户端当前登录用户Net-NTLM hash的方法,侧重于介绍原理和思路,本文将要给出一个具体的实现方法,利用PHP脚本模拟Net-NTLM认证过程,提取出客户端的Net-NTLM hash 0x01 简介 本文将要介绍以下内容: Net-NTLM认证过程 利用PHP脚本模拟认证过程 脚本编写细节 实际测试 0x02 Net-NTLM认证过程 参考资料: https://www.innovation.ch/personal/ronald/ntlm.html 依然使用这幅图,如下图 注: 图片截取自https://www.innovation.ch/personal/ronald/ntlm.html 0x03 利用PHP脚本模拟认证过程 想要通过PHP脚本模拟Net-NTLM认证过程,主要考虑的是Server端的实现 1、发送WWW-Authenticate: NTLM 接收Client的GET请求,回复401 Unauthorized WWW-Authenticate: NTLM,提示Client需要NTLM认证 2、发送WWW-Authenticate: NTLM <base64-encoded type-2-message> 接收Client的Type-1-Message,回复Type-2-message The Type 2 Message的结构如下: Offset Description Content 0 NTLMSSP Signature Null-terminated ASCII “NTLMSSP” (0x4e544c4d53535000) 8 NTLM...

  • 渗透技巧——通过HTTP协议获得Net-NTLM hash

    0x00 前言 在之前的文章《Windows下的密码hash——NTLM hash和Net-NTLM hash介绍》、《渗透技巧——利用netsh抓取连接文件服务器的NTLMv2 Hash》和《渗透技巧——利用图标文件获取连接文件服务器的NTLMv2 Hash》曾介绍了通过SMB协议获得登录用户Net-NTLM hash的方法,利用的前提是客户端通过界面使用SMB协议连接服务器时,默认先使用本机的用户名和密码hash尝试登录。 对于HTTP协议,也同样支持NTLM认证。那么,通过HTTP协议能否同样获得当前登录用户的Net-NTLM hash呢?限制条件有哪些?如何防御?本文将要逐一介绍。 0x01 简介 本文将要介绍以下内容: NTLM Over HTTP Protocol简介 找出利用前提 如何具体利用 防御思路 0x02 NTLM Over HTTP Protocol简介 官方文档: https://msdn.microsoft.com/en-us/library/cc237488.aspx 参考资料: https://www.innovation.ch/personal/ronald/ntlm.html 使用HTTP协议的NTLM认证流程: 客户端向服务器发送一个GET请求,请求获得网页内容 服务器由于开启了NTLM认证,所以返回401,提示需要NTLM认证 客户端发起NTLM认证,向服务器发送协商消息 服务器收到消息后,生成一个16位的随机数(这个随机数被称为Challenge),明文发送回客户端 客户端接收到Challenge后,使用输入的密码hash对Challenge加密,生成response,将response发送给服务器 服务器接收客户端加密后的response,经过同样的运算,比较结果,若匹配,提供后续服务,否则,认证失败 直观的流程图,如下图 注: 图片截取自https://www.innovation.ch/personal/ronald/ntlm.html,具体的消息格式可查看链接中的介绍 实际测试 服务器: OS: Server2012 R2 IP: 192.168.62.136 安装IIS服务 客户端: OS: Win7...