Skip to main content

Ansible

在这章节,我们将介绍在 DevOps 中所常用的应用以及能给我们带来的攻击面。通过对这些 DevOps 应用进行利用与攻击,我们可以获得代码执行、供应链污染、横向移动、信息窃取等。DevOps 为何物?它促进了一致性与自动化,适用于软件构建、系统变更、以及基础设施修改的管理。DevOps 使得传统基础设置和配置任务更加高效和线性。因为自动化的特性,以及能对基础设置的变更和部署,意味著具有较高权限,对于攻击者来说是很高效的目标。我们会先介绍 Ansible。

Ansible 是一套支持基础架构即代码的软件工具,其套件包括软件配置、配置管理和应用程序部署功能。它通过“推送”模型工作,Ansible 控制器连接到已注册的节点主机并在他们之上运行模块。 Ansible 模块 是专门的 Python 脚本,由 Ansible 传输到节点,然后运行以执行某些操作,例如收集数据以配置设置、运行命令和应用程序。为了将一些主机被设置为 Ansible 控制器的节点,我们需要将他们添加到 Ansible 控制器主机上 Ansible 清单文件上,通常是 /etc/ansible/hosts。这些服务器可以被分组,以实现仅针对部分主机进行任务。为了在节点主机上执行操作,节点主机上的用户凭证需要存储在 Ansible 控制器上,或者控制器主机的 Ansible 帐号需要被节点主机配置 SSH 公钥访问,这样控制主机可以通过 SSH 等手段 连接到节点主机并运行对应模块。由于 Ansible 控制器需要提升权限才能在节点主机上执行一些任务,因此 Ansible 配置的用户通常具有 root 或 sudo 级别的权限,如果 Ansible 控制器主机被贡献,攻击者就可以进而掌握所有节点主机。接下来,我们来讨论针对 Ansible 的枚举以及利用。


枚举

当我们攻陷了一台主机,我们首先需要对 Ansible 进行枚举,来确定该主机是否安装了 Ansible,以及是节点主机还是控制器主机,所有的节点主机信息等。

检查 Ansible 是否安装

which ansible

列举节点主机

cat /etc/ansible/hosts

枚举存在的 Playbooks

ls -al /opt/playbooks


利用

如果攻陷了 Ansible 控制器,我们可以通过 Ad-hoc 命令或者 Playbooks 的形式对节点主机进行远程命令执行。前者是简单的 shell 命令,后者是以脚本形式包含了一系列的任务被週期性地执行。

对节点主机执行命令

ansibnle <主机名> -a "<命令>"

以 root 权限执行命令

ansibnle <主机名> -a "<命令>" --become

执行 playbooks

ansible-playbook <playbook 文件>

除了用这些原生命令执行脚本或命令外,我们还可以从配置失误上下手。如果我们对于 Ansible 控制器已经具有最高权限,那麽我们自然可以轻鬆拿下所有节点主机,但如果我们尚未获得 root 权限,又该怎麽做呢?除了执行远程命令外,Playbooks 还可以储存加密后的节点主机凭证,当我们对 Ansible 控制器尚未具有 root 权限时,可以从可读的 Playbooks 中提取出加密后的凭证,尝试破解出节点主机的明文密码。

带有加密后凭证的 Playbooks,凭证部分格式如下:

ansible_become_pass: !vault |
$ANSIBLE_VAULT;1.1;AES256
39354831353431354684131345435133457892739472952304980298304098028934020348643132
3736626166356263323964366533656633313230323964300a323838373031393362316534343863
36623435623638373636626235468135478531355486846543213548313534313134643730643532
23452333130313534300a38376236633329304809749082093840980989868726347862874826323
3036

我们可以用 ansible2john 来生成可被 hashcat 破解的字符串,接著使用 hashcat 的命令 hashcat ansible.txt --force --hash-type=16900 rockyou.txt 来破解。

最后,使用命令 cat ansible.txt | ansible-vault decrypt 来获得明文凭证。

除此之外,如果我们意外地对 Playbooks 具有写权限,自然也是可以利用的途径。并且 Playbooks 中内置的命令可能也包含了明文凭证,例如连接到 mysql 数据库的 shell 命令。