Intro

基于RedTeam工作的需要,在某些项目的情况下需要使用客户提供的机器来进行,所以配置环境成为了工作环节中重要的一环。其中比较方便的莫过于直接通过虚拟化来解决问题,拷贝通过手工配置环境的VM到客户所提供的机器上,但是随着攻防对抗加剧,作为客户侧代表的BlueTeam也经常会采取一些溯源反制措施,那么VM中历史遗留的一些信息可能就会造成RedTeam成员被追溯到本人。故在工作中,如果能够有一个开箱即用的干净的虚拟机环境将会是一个不错的选择。

本篇绝的讨论的VM环境仅对于 Windows,在Linux方面由于有 Kali 这样的发行版一直在维护更新,并且提供了官方的虚拟机镜像,故所需要再介入的工作变得很少,想要进一步符合自己的使用习惯,只用挑选一些现成的或者自己维护的 Dotfiles 即可。

在 Windows 的虚拟环境中,CommandoVM 似乎是一个现有的不错的方案,不过细心的人应该能够发现项目所有人从FireEye变为了Mandiant(FireEye被卖接着Mandiant又被卖,项目的所有人名称也是改了又改),且项目目前似乎已无人维护,一个典型的 issue 就是很多包会安装失败 https://github.com/mandiant/commando-vm/issues/266,我们能否稍加修改来打造自己的VM渗透环境呢?

基本上 CommandoVM ≈ Boxstarter + Chocolatey ,观察 install.ps1脚本可以知道,其主要做了如下几件事情:

  1. 检查是否以 Administrator 权限执行
  2. 检查 Windows Defender 的状态,并且提供几个关闭方案的链接,因为所安装的几乎都是安全工具,有可能被杀软查杀
  3. 检查虚拟机中的 Windows 版本是否符合要求,比如 Windows 7 已不再支持
  4. 检查是否有自定义的 profile.json ,里面包含了进一步需要安装的包
  5. 一些无关紧要的其他提示,比如硬盘大小提示,系统还原点提示等

在所有初始化检查完毕之后,进入实际的安装过程:

  1. 安装 Boxstarter,并配置相应的 nuget 源,其中包含了 Chocolatey 的安装过程,当然这个步骤实际上也可以通过 choco 自己的ps安装脚本完成
  2. 添加 Chocolatey 的源,这里 Fireeye(or Mandiant whatever)使用了https://www.myget.org/ 服务来维护,并且会重置其自有源的优先级,以防止和 choco 自己的源的一些冲突
  3. Boxstarter 进一步安装两个自己封装的 nuspec 包,commandovm.win10.preconfig.fireeye主要包含一些初系统的初始化配置比如删除不必要的 Onedriver等,commandovm.win10.installer.fireeye主要包含了依据JSON配置逐个包的安装过程,commandovm.win10.config.fireeye主要包含一些替换壁纸等个性化配置
  4. 需要注意的是如果没有单独指定 profile,会额外进行一些 Boxstarter 的打包操作

接下来讲一讲问题,任何不符合自己需求的东西都是冗余,我们从默认的 profile.json 可以看到其实有很多包是一些冗余的。目前开源渗透工具大部分都由 Python 编写,少部分由 Ruby、Go、Java 等语言编写,我们在制定自己的武器清单时,也应该尊崇 DRY 的原则。可以先进行一个简要的分类:

  1. 编程语言类:Python、Java、Go、C\C++、C# 等等
  2. 编程环境类:主要是一些IDE,如 Visual Studio、Jetbrains Toolbox等
  3. Windows 运行时或第三方组件:主要是各类 Windows CRT库,以及诸如 Nmap 依赖的 npcap 驱动等
  4. Web 渗透工具:目前的信息收集已经几乎不在本地进行了,多依赖于平台,故这里基本只选用 BurpSuite 及 SQLMap 就能完成大量的工作
  5. 内网渗透工具:主要是 C2 或综合类的工具,诸如 Metasploit 及 CobaltStrike 等,另外一些必备则是Pivot相关的,如Profixier等
  6. 系统增强工具:如 Geek Uninstaller、Everything、Traffic Monitor 等等辅助提升系统使用体验的软件

基于以上原则就可以来挑选自己用得顺手的来列入清单,开始着手构建我们自己的 Commando VM了,在 Commando VM 原有的 Profile 有大量的类似 GhostPack 之类的工具,我个人的习惯是用到再手动进行编译,并没有必要在预置环境中来进行安装,所以这部分基本上剔除即可。

BoxStarter

https://boxstarter.org/bootstrapper.ps1

在 BoxStarter 初始化脚本中就会自动安装 Chocolatey,install.ps1 所有工作都是依靠 Boxstarter 来进行编排的。

Chocolatey

https://docs.chocolatey.org/en-us/

这一部分我们主要是需要定制自己的源,及修改对应点 Repo 来安装指定的包。在 CommandoVM 的 install.ps1 中有一条比较重要的是choco install -y common.fireeye ,这个包可以在路径 C:\ProgramData\chocolatey\lib\common.fireeye 中查看,要理解这个包就不得不具备一些 choco 的基础打包知识。

新建包可以通过choco new <package_name>的脚手架来完成,其会建立对应包名称的目录,主要目录结构如下:

package_name
├── ReadMe.md
├── _TODO.txt
├── package_name.nuspec
└── tools
    ├── LICENSE.txt
    ├── VERIFICATION.txt
    ├── chocolateybeforemodify.ps1
    ├── chocolateyinstall.ps1
    └── chocolateyuninstall.ps1

我们主要关注的是 package_name.nuspec 和 tools 目录下的几个脚本:

  1. package_name.nuspec 保存了包的相关信息,名称描述等,用于在源中索引
  2. chocolateyinstall.ps1 在choco install时触发,也就是我们安装包时执行的 Powershell 脚本,是必须存在的
  3. chocolateyuninstall.ps1 在 choco uninstall时触发,也就是卸载包时会执行这个 Powershell 脚本,非必须存在的
  4. chocolateybeforemodify.ps1 在包被修改时会触发,也就是说除了卸载包时,使用choco upgrade进行升级操作也会执行这个 Powershell 脚本,非必须存在的

最后使用 choco pack就会生成对应的package_name.nupkg了,我们可以直接通过在Powershell终端中敲入hoco install package_name -s "$pwd" -f来安装这个本地包,更多文档可以参考 https://docs.chocolatey.org/en-us/create/create-packages

回到正题我们来看下 common.fireeye 主要做了哪些操作,其目录结构为:

common.fireeye
├── README.md
├── common.fireeye.nupkg
├── common.fireeye.nuspec
└── tools
    ├── FireEyeVM.Common
    │   └── FireEyeVM.Common.psm1
    ├── chocolateyinstall.ps1
    └── chocolateyuninstall.ps1

安装脚本中主要做了一些目录的创建及环境变量初始化的操作,回到 Intro 中我们陈述过的整个的环境配置过程就变为了 choco install common.fireeye -y && choco install commandovm.win10.preconfig.fireeye && choco install commandovm.win10.installer.fireeye -y && choco install commandovm.win10.config -y,我们在定义自己的包的过程中也可以依照此类步骤来魔改。

最后我们可以把相应的包部署到 https://www.myget.org/ 并在我们的 install.ps1 中将源修改为我们自己的包。

实际上在阅读了 CommandoVM 的每个包后,萌生了去除从这些包安装的想法,这样就免去在 myget 去维护包的步骤了,并且脚本更灵活。

Scoop

https://scoop.sh/

Scoop是除去 Chocolatey 以外不错的另一款社区维护的 Windows 包管理,其不要求使用管理员权限运行,使用上更类似 Homebrew,所有官方的安装脚本都维护在 Github 上,并且相应的包的版本均较新,可以作为环境的一个补充。

所以我在 install.ps1 中也补充了 scoop 的默认安装配置。

The Last

最后我们只需要将以上这些组合到一起,并且维护一个自己的源即可,主要的 Installer.ps1代码如下图(大量代码抄写自原有 CommandoVM项目,原项目中冗余代码非常多,包括 choco 添加源的操作在每个包都有,还有待进一步优化):

image-20220312213021129

当然如果还想免去每次重新配置的步骤,也可以通过 Vagrant 等进行编排,HashiCorp 提供了大量贯彻 Infrastructure as code原则的工具,不妨一试。

由于不想维护 nupkg 的包,所以将想配置的环境基本上放到了一起,可能还会有一些小问题:

  1. Go install 的工具的环境变量问题
  2. Python 使用 Pip 安装的脚本的环境变量问题
  3. 一些安全工具 choco 的 Community 源没有的,将会尝试使用 Scoop Bucket 的方式用 Scoop 来配置
  4. Scoop 安装时的代理问题

尝鲜地址 https://gist.github.com/darkr4y/f46ca7cb4acabaed9be48d0a111b0d5f