从DNSBeacon到域控

  • A+
所属分类:安全新闻

这是 酒仙桥六号部队 的第 52 篇文章。

全文共计3141个字,预计阅读时长10分钟


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

从DNSBeacon到域控


站库分离Getshell

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

从DNSBeacon到域控

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

从DNSBeacon到域控

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

从DNSBeacon到域控

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

从DNSBeacon到域控

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

从DNSBeacon到域控

从DNSBeacon到域控

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

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

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

从DNSBeacon到域控

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

从DNSBeacon到域控

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

select host_name()select @@servername

从DNSBeacon到域控

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

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

从DNSBeacon到域控

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

从DNSBeacon到域控

从DNSBeacon到域控


利用DNS Beacon弹shell

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

制作DNS Beacon步骤如下:

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

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

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

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

  5. 执行木马上线。

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

从DNSBeacon到域控

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

checkinmode dns-txt

从DNSBeacon到域控

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

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

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

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

开启3389端口

WinServer2012开启3389端口命令如下:

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

从DNSBeacon到域控


argue参数绕过杀软

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

argue net1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxargueexecute net1 user hack Root111! /addexecute net1 localgroup administrators hack /add

从DNSBeacon到域控

挂代理

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

从DNSBeacon到域控

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

从DNSBeacon到域控

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

从DNSBeacon到域控

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

从DNSBeacon到域控

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

从DNSBeacon到域控

从DNSBeacon到域控

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


内网中继横向渗透

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

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

从DNSBeacon到域控

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

从DNSBeacon到域控

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

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

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

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

从DNSBeacon到域控

从DNSBeacon到域控

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

从DNSBeacon到域控

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

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

从DNSBeacon到域控

从DNSBeacon到域控

从DNSBeacon到域控

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


域内用户枚举

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

从DNSBeacon到域控

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

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

从DNSBeacon到域控


域内用户密码碰撞

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

从DNSBeacon到域控

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

从DNSBeacon到域控

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

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


RDP凭据账号密码提取

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

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

从DNSBeacon到域控

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

exp.exe mimikatz.exeprivilege::debugdpapi::cred /in:C:UsersxxAppDataLocalMicrosoftCredentialsRDP Sessionsekurlsa::dpapidpapi::cred /in:C:UsersxxxAppDataLocalMicrosoftCredentialsRDP Session /masterkey:上一步获取的mastkey

从DNSBeacon到域控

从DNSBeacon到域控


拿下域控

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

从DNSBeacon到域控

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

从DNSBeacon到域控

从DNSBeacon到域控

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

从DNSBeacon到域控


总结

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

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

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

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

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

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

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

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


从DNSBeacon到域控

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: