Ansible
在这章节,我们将简要介绍在 DevOps 中所常用涉及的应用以及这些应用可能给我们带来的攻击面。通过对这些 DevOps 中涉及的应用进行利用与攻击,我们可以获得实现代码执行、横向移动、供应链污染、横向移动、信息窃取等。DevOps 为何物?它是一组结合了软件开发和 IT 运营的实践,,促进了一致性与自动化,适用于软件构建、系统变更、以及基础设施修改的管理。DevOps 使得传统基础设置和配置任务更加高效和线性。因为自动化的特性,以及能对基础设置的变更和部署,意味著 DevOps 中涉及的应用具有较高权限,对于攻击者来说是很高效的目标。我们会先介绍 Ansible。
在 DevOps 环境中可以使用各种工具,这些工具有助于自动化部署、编排、版本控制、配置管理、测试和监控。以下为分门别类的一些例子:
版本控制系统
Git:一种分布式版本控制系统,用于在软件开发过程中跟踪源代码的更改。GitHub、GitLab 和 Bitbucket 是流行的 Git 存储库托管平台。
SVN:一个集中式版本控制系统,允许开发人员跟踪和管理项目中文件和目录的更改。它支持原子提交并使用“复制-修改-合并”模型,促进在单个代码库上的协作工作。
持续集成/持续部署 (CI/CD) 工具
Jenkins:一种开源自动化服务器,可让开发人员可靠地构建、测试和部署他们的软件。
GitLab CI/CD:GitLab 平台的一部分,它提供了一个复杂的持续集成和部署系统。
配置管理工具
Ansible:一种开源软件置备、配置管理和应用程序部署工具。
Puppet:它提供了一种交付和操作软件的标准方式,无论它在何处运行。
Chef:一个强大的自动化平台,可将基础架构转换为代码。
容器化和编排工具
Docker:一个开源平台,用于在容器内自动部署、扩展和管理应用程序。
Kubernetes:一个开源平台,旨在自动部署、扩展和操作应用程序容器。
基础架构即代码 (IaC) 工具
Terraform:由 HashiCorp 创建的开源 IaC 软件工具。 它使用户能够使用声明性配置语言来定义和提供数据中心基础设施。
AWS CloudFormation:为用户提供一种通用语言来描述和配置云环境中的所有基础设施资源。
监控和记录工具
Grafana:一个多平台开源分析和交互式可视化 Web 应用程序。
ELK Stack:用于搜索的 Elasticsearch,用于集中日志记录的 Logstash 和用于可视化的 Kibana。
Splunk:一种搜索、监控和分析机器生成的大数据的工具。
测试和质量控制工具
Selenium:一套用于浏览器自动化的工具。 它用于测试 Web 应用程序。
SonarQube:SonarSource 开发的开源平台,用于持续检查代码质量。
在这一小节,我们讨论 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 命令。