前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从DNSBeacon到域控

从DNSBeacon到域控

作者头像
谢公子
发布2022-01-20 15:16:16
1.7K0
发布2022-01-20 15:16:16
举报
文章被收录于专栏:谢公子学安全谢公子学安全

以下文章来源于酒仙桥六号部队 ,作者队员编号051

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

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

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

站库分离Getshell

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

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

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

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

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

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

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

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

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

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

代码语言:javascript
复制
select host_name()
select @@servername

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

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

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

利用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木马,执行上线成功。默认上线是黑框框,也执行不了命令。

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

代码语言:javascript
复制
checkin
mode dns-txt

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

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

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

开启3389端口

WinServer2012开启3389端口命令如下:

代码语言:javascript
复制
wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1

argue参数绕过杀软

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

代码语言:javascript
复制
argue net1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
argue
execute net1 user hack Root111! /add
execute net1 localgroup administrators hack /add

挂代理

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

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

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

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

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

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

内网中继横向渗透

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

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

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

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

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

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

  • 对开放了445端口的主机进行SMB爆破,利用刚刚读取到的明文账号密码。如果爆破成功,直接psexec远程弹一个CobaltStrike shell回来。这里获取到3台服务器权限,均在192.168网段。
  • 对于没爆破成功的主机,利用读取到的哈希进行哈希传递攻击。
  • 对开放了1433、3306端口的主机,利用内网中获取到的账号密码进行数据库爆破。如果爆破成功,再执行UDF/XP_cmdshell 提权等操作。这里MySQL的UDF提权未执行成功,但是xp_cmdshell提权执行成功,获取了权限,在10.0网段。
  • 对6379端口进行爆破,如果有未授权访问或弱口令并且是Linux主机的话,则直接尝试利用写入公钥提权。但是这里好多机器无写入权限,只获取到一台Linux主机权限,在10.0网段。

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

域内用户枚举

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

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

代码语言:javascript
复制
nmap -sT -Pn -p 88 --script krb5-enum-users --script-args krb5-enum-users.realm="域名",userdb="users.txt" 域控IP

域内用户密码碰撞

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

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

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

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

RDP凭据账号密码提取

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

代码语言:javascript
复制
#查看mstsc的连接纪录
cmdkey /list
 
#查找本地的Credentials:
dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*

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

代码语言:javascript
复制
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

拿下域控

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

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

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

总结

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

  1. 站库分离获取web服务器权限,然后通过DNS Beacon弹回shell。
  2. 内网连接数据库,翻阅数据库记录用户名和密码,xp_cmdshell提权获取权限。
  3. 内网中继横向渗透获取到9台服务器权限。
  4. 域内用户名枚举,枚举出一百多个用户名,并且通过密码碰撞得到信息管理员人员域内用户名密码。
  5. 登录域内任意主机,查询发现该人员的个人办公机器。
  6. 趁着饭点连接该人员主机,从RDP凭据中获取到域管理员账号密码。
  7. 直接使用该域管理员账号登录域控,GameOver。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 谢公子学安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档