乍闻“提权”二字或许会令人生畏,但是当你了解了应该需要哪些内容、忽视哪些内容之后,就会变得容易些。提权通常归结为适当的信息收集。本教程主要关注常见的提权技巧及其利用方式。
本教程一开始是一个没有提权的shell终端。为方便演示,我已使用netcat从Windows 7 x86 虚拟机中反弹了shell 。
漏洞枚举有多重要,不言而喻。网上有很多教我们从系统中提取有用信息的方法。在本教程中,我主要关注那些方便获取并使用的脚本。以下是一些较为常见的脚本:
根据我的经验,winPEAS和PowerUp是最有用的工具。PowerUp是用PowerShell写的,winPEAS是用C#写的。要运行winPEAS你需要安装.NET Framework 4.0。winPEAS还有.bat版本,可以在没有.NET Framework 4.0的环境中使用。就我个人而言,因为Windows 7 没有默认安装.NET 4.0,我需要先安装.NET 4.0才能使用winPEAS。保险起见,请使用多个脚本进行枚举。举个例子,winPEAS能检测Weak Registry漏洞,而PowerUp则不行。
在注册表中查找用户名和密码
假设现在你发现了一个密码,你会怎么做?如果RDP(Remote Desktop Protocol远程桌面协议)可用,且用户又在远程桌面用户组里面,那就太棒了。接下来你可以使用下面PowerShell脚本来以该用户的身份运行命令。
如果cmdkey/list有返回值,那就意味着,你可以 runas 特定用户,因为它把它的凭证存储在windows上。
如果该系统经常升级,那么这些利用方式可能不会那么有效。你可以使用Watson检查看看有没有因为没有打补丁而产生的漏洞。现在Watson已经整合进winPEAS了。一旦你发现任何漏洞,你都可以在下面的仓库中下载到相同的漏洞。这里你要确保下载的架构和你目标架构一致 。如果你需要编译二进制文件,你可以使用kali进行交叉编译。
https://github.com/SecWiki/windows-kernel-exploits
Windows程序启动的时候需要DLL。如果这些DLL 不存在,则可以通过在应用程序要查找的位置放置恶意DLL来提权。
通常,Windows应用程序有其预定义好的搜索DLL的路径,它会根据下面的顺序进行搜索:
1、应用程序加载的目录
2、32位系统目录(C:\Windows\System32)
3、16位系统目录(C:\Windows\System)
4、Windows目录 (C:\Windows)
5、当前工作目录(Current Working Directory,CWD)
6、在PATH环境变量的目录(先系统后用户)
如你所见,PowerUp检测到了一个潜在的DLL挟持漏洞。通常,我们用PowerUp的Write-HijackDll函数写恶意DLL,并重启该应用程序。当启动该应用程序时,它会加载该恶意DLL并以更高的权限运行我们的代码。
在这个例子中,使用谷歌快速搜索一下,就能找到 https://github.com/itm4n/Ikeext-Privesc 可用于利用此漏洞。
但是你也可以手动实现整个利用过程,以便更好的理解。你可以参考我这篇文章。
如果启动了某一服务,Windows就会搜索它的二进制文件来运行。要运行的二进制文件的位置在binPath属性中声明。如果该二进制文件没有被引用,Windows就不知道该二进制文件存放在哪里,然后就会在所有文件夹中进行查找。
所以,如果我们想利用这一点,我们需满足三个条件:
如果binPath是这样设置的:
Windows会根据以下顺序进行查找:
PowerUp检测到的未使用双引号的服务路径
winPEAS检测到的可写路径
用msfvenom创建一个payload,命名为control.exe,并将它放到C:\Program Files\Unquoted Path Service\common.exe目录下。
用sc start unquotedsvc启动该服务并运行该paylod
如果用户有某一服务所使用的文件夹的写权限,他就可以将二进制文件替换为恶意的二进制文件。那么重启服务后,该恶意二进制文件就会以更高的权限被执行。
有弱权限的二进制服务文件
通过复制payload到该二进制服务文件所在的位置,就可以替换该文件。重启该服务后,payload就会以更高权限被执行。
由SYSTEM创建的服务存在弱权限,会导致提权。如果低权限用户可以修改服务配置,也就是,修改binPath为一个恶意二进制文件并重启该服务,那么,恶意二进制文件就将以SYSTEM权限被执行。
如果Authenticated Users组在服务中具有SERVICE_ALL_ACCESS,则它可以修改该服务正在执行的二进制文件。
当Windows调用启动一个服务时,它调用的是ServiceMain函数,并期望有一个返回值。如果你不指定exe-service,那么上面生成的payload就无法给你返回shell。
要运行该payload,需要修改配置并启动该服务。
在Windows中,每一个服务都有一个注册键,而且这些注册键位于:
如果Authenticated Users或NT AUTHORITY\INTERACTIVE有任一服务的完全控制权,那么你就可以换掉要该service要运行的二进制文件。
修改注册表ImagePath的值为你的payload所在的位置,并启动该服务。
根据AlwaysInstallElevated组策略,Windows允许低权限用户使用system权限安装微软Windows安装包(Microsoft Windows Installer,MSI)。
用msfvenom创建一个msi格式的payload。
msfvenom -p windows/adduser USER=backdoor PASS=Pass@1234 -f msi -o setup.msi
使用如下命令安装payload。
MSI安装后用户添加的后门。
因为autorun的路径是可以修改的,我们可以用payload替换该文件。要以高权限运行该程序,我们需要等某个在admin组的用户登录。
admin登录
payload在admin登录的那一刻执行。
“Hot Potato(又名:Potato)利用windows中已存在的问题,在windows默认配置下进行本地权限提升。实际是利用了NTLM重放(更确切的说是HTPP->SMB重放),和NBNS欺骗。”
更多关于此exploit的信息请看这里。
我们添加了很多用户,现在让我们尝试以admin权限删除其中一个。
藏在admin组的后门用户
exploit完成后,后门用户被删除了。
在渗透测试项目中,渗透测试人员会设法攻破诸如Apache, IIS, SQL, MySQL等服务。但是,这些服务并不是以本地system或更高权限运行,而是网络服务。你可以使用下列的exploit进行提权。
原文地址:https://medium.com/bugbountywriteup/privilege-escalation-in-windows-380bee3a2842
翻译:看雪翻译小组 lumou
校对:看雪翻译小组 梦野间
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!
最后于 2020-5-20 15:28
被lumou编辑
,原因: