阅读须知
文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!
背景
在一片由数据和代码构成的海洋中,红蓝对抗的战火悄然点燃。这次,战场是内网服务器的深处,它们对外的沟通仅通过DNS协议的桥梁。这是一个关于隐蔽和智慧的较量,一场在网络的阴影中进行的博弈。
想象一下,你是一名红队成员,你的目标是渗透进内网,而你的对手,蓝队,正严阵以待。他们知道,你的攻击必须经过DNS协议,这是你唯一的通道,也是他们的防线。
你坐在电脑前,周围是一片寂静,只有你的心跳和键盘敲击的声音。你开始构建你的攻击计划,每一个步骤都必须精心策划,因为任何一个小小的失误都可能导致整个行动的失败。
你开始尝试各种DNS隧道技术,利用DNS协议的隐蔽性来传输数据。你的目标是绕过蓝队的监控,潜入内网,找到那些珍贵的信息。
蓝队也不是省油的灯,他们对DNS流量进行了严密的监控和分析。他们知道,任何异常的DNS请求都可能是红队的攻击。他们必须保持警惕,分析每一个请求,确保内网的安全。
这场对抗,就像是一场精心编排的舞蹈,红队和蓝队在网络的舞台上跳跃,旋转,每一个动作都充满了策略和智慧。他们的目标只有一个:胜利。
随着时间的推移,战斗进入了白热化阶段。红队不断尝试新的策略,蓝队则不断加强防御。这是一场智力的较量,一场技术的比拼,一场耐心和决心的考验。
最终,无论结果如何,这场红蓝对抗都将成为网络安全史上的一个经典案例。它展示了网络攻防的复杂性,也展示了网络安全专家的智慧和勇气。
站库分离分析
这个站点采用的是相当独特的架构,使用了PHP和SQL Server的组合。这种搭配并不常见,但也正因如此,它可能会带来一些独特的挑战和优势.在系统中发现了SQL注入漏洞,数据库为SQL Server,当前用户是sa。
通过sqlmap的 --os-shell 选项调用 xp_cmdshell 执行系统命令,以获取权限。然而,执行完命令后发现当前仅是普通的 service 用户权限,而非管理员权限。
试图通过执行 PowerShell 命令弹回 CobaltStrike 的 shell,但是遇到了错误,提示无法连接到远程服务器。
怀疑目标机器可能无法直接连接到外部网络,因此尝试通过ping百度进行确认。结果显示只有DNS协议能够成功连接到外部网络。
我们的下一步思路是通过定位目标网站路径,然后注入 WebShell 以获取权限。为了找到网站路径,我们可以利用 Windows 下的文件搜索语法(如 dir /s /b c:test.txt)来查找特定文件。首先,我们需要找到网站上一个相对独特的文件名。
执行命令查找:dir /s /b c:checkform.js,但未找到该文件,因此怀疑网站可能采用了库分离的方式。
通过执行sqlmap的 --sql-shell 参数,并运行以下 SQL 语句验证是否站库分离。果然,发现该站点采用了站库分离。
select host_name()select @@servername
在内网数据库服务器上获得了权限,但由于只允许 DNS 协议通信,无法返回 shell。唯一的希望就在于利用 SQL 注入来窃取网站的账号密码,然后登录后台,找到获取 shell 的机会。最终,在数据库中找到了网站后台的账号密码。
最终,在后台找到一个上传点,但受到后缀白名单和文件内容检测的限制,只允许上传图片格式的文件。通过上传图片木马并结合解析漏洞,成功获取了服务器权限。
利用DNS隧道
为了实现内网渗透目标,你计划通过制作一个 DNS Beacon 类型的木马来弹回一个 CobaltStrike 类型的 shell。以下是制作 DNS Beacon 的步骤:
-
准备一台 VPS 服务器,并确保该服务器的 53 端口对外开放。准备好一个域名。
-
配置域名的解析记录,在 DNS 服务商处创建 A 记录和 NS 记录。A 记录解析到 VPS 服务器的 IP 地址上,NS 记录解析到 A 记录上。
-
在 CobaltStrike 中开启 DNS Beacon 监听器。填写 DNS Hosts 为我们的 NS 记录,填写 DNS Host(Stager)为我们的 A 记录。
-
生成 DNS 木马,选择 Windows Executable(S) 作为生成类型。如果目标机器有杀软,可以先生成 shellcode,然后进行免杀编译。
-
执行生成的木马,让其上线到 CobaltStrike 服务器。
通过上传免杀的 DNS 木马,成功实现了上线。默认上线后可能只有一个黑框框,无法执行命令。
执行以下两条命令,即可正常显示并执行命令:
checkinmode dns-txt
要在 WinServer2012 上开启 3389 端口,可以执行以下命令:
wmic /namespace:\rootcimv2terminalservices path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1
这条命令将允许远程桌面连接,使得 3389 端口可以被访问。
绕过杀软
为了绕过目标机器上的杀软,我们可以使用 argue 参数来执行创建用户的命令。以下是使用 argue 参数绕过杀软执行创建用户命令的示例:
argue net1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxargueexecute net1 user hack Root111! /addexecute net1 localgroup administrators hack /add
这条命令将创建一个名为 "hack" 的用户,并将其添加到管理员组中。
挂代理
考虑到目标机器只允许 DNS 协议通信,最好的选择是搭建一个 HTTP 协议的代理。
成功使用 RDP 远程连接到目标主机的内网 IP 的 3389 端口,实现了远程桌面连接。
在翻阅目标机器的目录时,找到了之前注入到 SQL Server 数据库中的账号密码。
通过 Navicat 远程连接,查阅数据库,发现其中存有一些用户名和经过 MD5 加密的密码。我们可以先收集这些用户名。
执行xp_cmdshell提权,是在翻阅数据库之后的下一步行动。
通过在拿到的 Web 服务器上放置我们的 DNS 木马,然后执行 xp_cmdshell 远程下载并执行,成功地弹回数据库服务器的 CobaltStrike shell。
横向渗透
内网的所有机器对外仅通过 DNS 协议通信,因此我们需要利用获取到的 Web 服务器作为中继监听来进行内网横向渗透。让我们在获取到的 Web 服务器上执行中继监听,以便在内网中进行渗透。
目前我们只有数据库服务器上的普通 network service 权限,需要提升为管理员权限。我们可以使用 CobaltStrike 的插件来进行提权,然后选择刚刚创建的中继监听器。执行后,成功获得了管理员权限。由于目标机器是 WinServer2008,我们可以运行 mimikatz 来获取明文账号密码。
我们已经成功获取了两台服务器的管理员权限,其中一台服务器是明文账号密码,另一台服务器是密码哈希。现在我们需要对内网进行更广泛的横向渗透。虽然我们获取的两台机器都在 192.168 网段,但我们需要扫描 10.0 和 172.16 网段。
我们可以先进行 MS17-010 探测攻击,在内网中成功攻下了另外三台服务器,这三台服务器都在 192.168 网段。
我们进行了对内网的端口扫描,包括 445、1433、3306 和 6379 等端口。
针对开放了 445 端口的主机,我们进行了 SMB 爆破攻击,利用之前读取到的明文账号密码。如果爆破成功,我们直接使用 psexec 远程执行命令,成功获取了三台服务器的权限,这三台服务器均位于 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 通域控后,我们在该机器上挂代理,准备对域内的用户进行枚举。我们将使用之前在数据库中收集到的用户名,结合我的超强用户名字典(这是针对国内用户进行收集的,总共有两万多条用户名)。
通过域内用户名枚举,一共枚举出了一百多个域内用户名。
接下来,我们可以使用 Nmap 工具进行 Kerberos 用户名枚举。以下是命令示例:
nmap -sT -Pn -p 88 --script krb5-enum-users --script-args krb5-enum-users.realm="域名",userdb="users.txt" 域控IP
在这个命令中,我们指定了域控的 IP 地址,并指定了域名以及用户名字典文件。这样就可以使用 Kerberos 协议进行用户枚举。
域内用户密码碰撞
获取到了域内的用户名之后,我们可以查看哪些用户名在之前拿到的数据库中,并找到其对应的 MD5 密码。然后,我们可以尝试在在线网站上解密这些 MD5 密码,进行碰撞攻击。
最后,我们终于成功碰撞出一个属于信息管理部人员的域账号。
然后,我们使用了这个域用户远程连接到了开放了 3389 端口的域内主机,并立即弹回了一个 DNS Beacon 的 shell。接着,我们对域内信息进行了查询,发现这个域账号只是一个普通的域用户。
执行了 net group "domain computers" /domain
命令后,发现了与刚刚破解的用户名相同的主机名。由此可猜测,这台机器应该是这个用户的个人办公机。进一步扫描了一下端口,发现该机器开放了 3389 端口。
于是在中午十二点,也就是饭点的时候,我们远程 RDP 登录了该主机,并迅速进行了信息查找。
RDP凭据账号密码提取
执行以上命令后,我们发现该机器上存有登录到域内其他机器的 RDP Session 纪录。
具体命令如下:
cmdkey /list # 查看 mstsc 的连接记录dir /a %userprofile%AppDataLocalMicrosoftCredentials* # 查找本地的 Credentials
通过这些命令,我们能够了解到在该机器上存储了哪些 RDP 连接的凭据,从而进一步获取信息。
通过上传 Mimikatz,并利用本地提权漏洞将权限提升至 System 级别,我们成功执行了以下命令,从中获取了保存在 RDP 凭据中的用户名和密码:
exp.exe mimikatz.exeprivilege::debug
dpapi::cred /in:C:UsersxxAppDataLocalMicrosoftCredentialsRDP Sessions
sekurlsa::dpapi
dpapi::cred /in:C:UsersxxxAppDataLocalMicrosoftCredentialsRDP Sessions
/masterkey:上一步获取的 masterkey
通过这些步骤,我们成功地获取了 RDP 凭据中保存的用户名和密码。
拿下域控
查询该用户名所属组后发现属于管理员组。
发现域控的 3389 端口开启着,我们直接使用 RDP 登录到了域控服务器。
查看域内主机个数,共有 3807 台主机。至此,项目结束。游戏结束!
总结
本次HW项目最主要的特点是内网的主机对外都只能通过 DNS 协议通信,因此我们需要利用 DNS Beacon 弹回 shell。在进行内网横向渗透时,需要以已获取权限的主机作为中继监听,进行内网横向渗透。
推荐数据
以往精彩文章
追击诈骗者网站需要有一些技术基础 剩下的就是耐心、细心和知识面
不要随便社交场所发你照片,否则你的一张自拍照完全会泄露你的公司或个人位置
突破与揭秘:用Frida解锁移动应用的秘密、破译数据与揭示隐藏层技巧
商场、饭店、地铁、路边 不要随便扫描二维码 可能那就是诈骗码
精彩短视频
原文始发于微信公众号(网安守护):毫无意义 极奇邋遢的一次网络红蓝对抗小插曲
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论