使用GitHub Actions进行红队自动化构建
2022-11-18 07:46:41 Author: 格格巫和蓝精灵(查看原文) 阅读量:56 收藏

本文来源自平安银河实验室

作者:fl4nker27

写本篇文章的起因是某些开源项目未提供编译好的二进制程序,需要进行本地编译,但是因本地环境限制(如云桌面等环境)不方便编译。另外,项目每次更新之后也要重新拉取、编译,十分麻烦。因此,考虑是否可利用云主机进行编译。

一番搜索调研之后,发现Azure提供的DevOps服务、及Github Actions功能可实现该功能,考虑到Github平台在开源界的地位,因此决定使用Github Action进行自动化工具构建。

>>>Github Action概述

GitHub Actions是GitHub推出的持续集成(Continuous Integration,CI)服务,它提供了整套虚拟服务器环境,基于它可以进行构建、测试、打包、部署项目等等操作。如向仓库进行一次提交(push)即执行特定的操作(编译,上传)。
几个重要概念:
  • Workflows
    工作流,可以添加到仓库中的自动化过程。工作流由一个或多个作业组成,可以由事件调度或触发。

  • Event
    事件,触发工作流的特定动作。如PUSH、PR。

  • Jobs
    作业,在同一跑步器上执行的一组步骤。默认情况下,具有多个作业的工作流将并行运行这些作业。
  • Steps
    步骤,可以在作业中运行命令的单个任务。步骤可以是操作,也可以是shell命令。作业中的每个步骤都在同一个运行程序上执行,从而允许该作业中的操作彼此共享数据。
  • Actions
    操作是独立的命令,它们被组合成创建作业的步骤。操作是工作流中最小的可移植构建块。可以创建自己的动作,也可以使用GitHub社区创建的动作。
  • Runners
    运行器,安装了GitHub Actions运行器应用程序的服务器。Github 托管的运行器基于Ubuntu Linux、Microsoft Windows和macOS,工作流中的每个作业都在一个新的虚拟环境中运行。
e.g:

>>>0x01 基础使用

这里仍以Seatbelt项目为例。
如果我们对源仓库做了一些特定修改又不想别人查看,我们可以将仓库私有化。但github不支持直接从公开仓库克隆分支(fork)的同时将其私有化,但是,可以先在github创建一个私有仓库,将项目克隆后再重新推送至新的私有仓库。
e.g
git clone --bare https://github.com/GhostPack/Seatbelt.gitcd Seatbelt.gitgit push --mirror https://github.com/<username>/Seatbelt-fork.git⚠️注:重新推送之前,需要先在Github创建仓库,否则会报错。

创建Action

新建Workflow
选择模版.NET Desktop
我们先使用提供的模板,对其进行修改。其中,需要修改我们要编译的解决方案名。其他的步骤包括,拉取代码、安装.Net运行时环境、配置MSBuild构建工具、编译、上传等。还包括一些单元测试、程序签名等步骤,我们暂时不需要,直接注释掉即可。
提交之后,就将触发一次构建。因为workflow使用的是push触发器,所以每次push操作都会自动触发一次构建。
根据配置的执行情况,将显示整个ACTION是否执行成功,点击对应的jobs,将显示具体每一个步骤的执行情况及日志信息,是否存在警告、错误等。
这里程序编译成功了,但有一个问题,无法下载编译好的程序。因为构建是在Github的构建容器中运行,默认情况下,ACTIONS不会自动将构建的生成文件自动上传至Github仓库,构建完成后在下次构建时将自动删除之前构建的文件。要想下载构建生成的EXE可执行程序,我们还需要先将生成的EXE上传,指令upload-artifact就用于将文件从构建容器上传到GitHub。
该指令需指定要上传的文件的路径和名称,还可以指定多个待上传文件。

e.g
⚠️注意:所有的构建操作都是在环境变量${{ github.workspace }}对应的目录中进行,其值默认为D:\a\<github Repo>\<gihub Repo>。
路径处如果使用相对路径,该路径就是相对${{github.workspace}}来指定的,可以从其他步骤的输出日志中进行确认,这里容易混淆出错。当然,也可以使用绝对路径,更方便。
e.g
提交之后将触发一次新的构建,如果执行成功,就可以在Github看到编译好的可执行文件。
下载执行生成的exe可执行程序,一切正常。
至此,借助Github Action进行一次基本的构建操作便完成了。

>>>0x02 进阶用法

很多红队工具会被杀软查杀,因此考虑在构建过程中,使用混淆器自动对工具进行混淆处理。这里使用ConfuserEx2这款混淆器为例。在之前的Workflow中,会增加几个额外的步骤。包括拉取混淆器ConfuserEx2仓库,编译生成混淆器可执行程序,且在Seatbelt构建成功之后,使用混淆器对Seatbelt可执行文件进行混淆处理。
同之前步骤一样,我们先创建一个ConfuserEx2的私有分支。
因为要访问私人仓库,因此需要配置访问凭据。否则构建容器将无法访问我们的私有仓库。为了实现此目的,我们生成新的Personal Access Token(个人访问令牌),并将其作为secret保存在我们的仓库中。
Github访问Settings->Developer settings——>Personal access tokens,生成新的Token。然后,在要自动构建的仓库Settings选项卡——>Actions——> New secret,创建新的Secret,将之前创建的PAT作为其值进行保存。
然后就可以在Action中,使用环境变量${{ secrets.Secret名}}对其进行引用,而不用将其硬编码在配置中。
e.g
之后的步骤,基本和之前的构建步骤一致,包括安装.Net运行时环境、配置MSBuild构建工具、安装依赖、编译生成exe可执行程序。
⚠️注意:这里的路径问题,在现有仓库中引入了另外的仓库,比如这里的ConfuserEx2-fork,新的仓库内容将保存在${{ github.workspace }}目录中,而非${{ github.workspace}}\ConfuserEx2-fork\目录。这里很容易出错,必要时可使用命令执行模块执行dir进行查看。
e.g
混淆器编译成功之后,就该接着编译Seatbelt工具了,然后使用ConfuserEx2针对Seatbelt进行混淆。
再次拉取Seatbelt仓库
⚠️注意:默认情况下,在已经拉取了一仓库的情况下,再次使用checkout命令拉取新仓库会覆盖当前仓库。比如这里,已经拉取了仓库ConfuserEx2-fork,再次拉取仓库Seatbelt-fork之后,之前的ConfuserEx2-fork仓库的内容就被覆盖了。
这种情况,可以通过path指令指定拉取的仓库相对于当前路径的保存位置。这里,将Seatbelt仓库保存在了名为Seatbelt-Build的目录中。

e.g
然后,再编译Seatbelt,生成exe可执行文件。然后,使用ConfuserEx2对Seatbelt.exe进行混淆操作并上传。
⚠️注意:因为ConfuserEx2是基于配置文件进行操作的,因此先要编辑好一个配置文件并上传至Seatbelt-fork仓库。注意配置文件中BaseDir选项的路径,是相对crproj文件本身而言的。
所有配置完成之后,触发并成功构建之后,便可直接下载Seatbelt可执行文件即经过混淆的版本。
未经混淆的Seatbelt直接被Defender查杀,而混淆版则没被查杀。
未混淆 V.S 混淆版可执行文件

Github Action与第三方集成

另外,GitHub API提供了对Actions的支持,这也使得我们能够通过API对Github Action进行操作。
因此可将Actions集成到其他工具。比如该项目Execute-GithubAssembly,该CobaltStrike插件可直接从Github Action下载编译好的.Net可执行文件,然后利用CS的execute-assembly进行内存执行。
e.g
完成之后,我们的工作流简化为:git拉取源仓库最新版本源码,推送至私有fork仓库,github自动编译并混淆处理,通过CS插件执行即可。

>>>0x03 总

本文对使用Github Actions功能进行自动化构建以及一些扩展用法,如构建过程中自动对程序进行混淆处理进行了一次研究及实验,遇到了一些坑点并成功解决。另外,Github API接口为与第三方工具进行集成提供了方便,利用其进行更高级、更加自动化的红队操作也值得进一步研究。

>>>0x04 附件

附完整的workflow配置文件以供参考:
name: Build_obfuscatorson:  push:    branches: [ "master" ]
jobs: build: strategy: matrix: configuration: [Debug] runs-on: windows-latest env: Solution_Name: Seatbelt.sln # 替换为解决方案名
steps: - name: Checkout uses: actions/[email protected] with: repository: <Github账户>/ConfuserEx2-fork ref: refs/heads/master token: ${{ secrets.REPO_ACCESS_TOKEN }} # 替换为自己的PAT fetch-depth: 0
# Install the .NET Core workload - name: Install .NET Core uses: actions/[email protected] with: dotnet-version: 6.0.x
# Add MSBuild to the PATH: https://github.com/microsoft/setup-msbuild - name: Setup MSBuild.exe uses: microsoft/[email protected]
- name: Setup Nuget.exe uses: nuget/[email protected]
# Install Dependencies - name: Nuget Restore run: nuget restore ${{ github.workspace }}\Confuser2.sln
- name: Build ConfuserEx2.CLI run: msbuild ${{ github.workspace }}\Confuser.CLI\Confuser.CLI.csproj env: Configuration: ${{ matrix.configuration }}
- name: Debug run: dir Confuser.CLI\bin\debug
- name: Checkout Seatbelt uses: actions/[email protected] with: path: Seatbelt-Build fetch-depth: 0
- name: Build Seatbelt #run: msbuild $env:Solution_Name /t:Restore /p:Configuration=$env:Configuration run: msbuild ${{ github.workspace }}\Seatbelt-Build\Seatbelt\Seatbelt.csproj env: Configuration: ${{ matrix.configuration }}

- name: Run Obfuscator shell: cmd run: ${{ github.workspace }}\Confuser.CLI\bin\Debug\net461\Confuser.CLI.exe ${{ github.workspace }}\Seatbelt-Build\Seatbelt.crproj
- name: Upload build artifacts uses: actions/[email protected] with: name: Seatbelt path: | Seatbelt-Build\Seatbelt\bin\Debug\Seatbelt.exe Seatbelt-Build\Seatbelt\bin\Debug\Confused\Seatbelt.exe

>>>0x05 参

https://blog.xpnsec.com/building-modifying-packing-devops/
https://www.mdsec.co.uk/2020/03/offensive-development-with-github-actions/

银河实验室

银河实验室(GalaxyLab)是平安集团信息安全部下一个相对独立的安全实验室,主要从事安全技术研究和安全测试工作。团队内现在覆盖逆向、物联网、Web、Android、iOS、云平台区块链安全等多个安全方向。
官网:http://galaxylab.pingan.com.cn/

往期回顾

技术

CVE-2022-38362:Apache Airflow Docker Provider RCE分析

技术

Executor内存马实现的优化

技术

Spring Security RegexRequestMatcher 认证绕过及转发流程

技术

Hadoop 未授权REST API漏洞利用参考

点赞、分享,感谢你的阅读▼ 

▼ 点击阅读原文,进入官网

文章来源: http://mp.weixin.qq.com/s?__biz=MzI5NDg0ODkwMQ==&mid=2247485123&idx=2&sn=a6e8d1d91dd88464aae1f837bc80640c&chksm=ec5dd629db2a5f3fa2e4ed5b7a0fe209f479a289415c3f7d2a522f27efe9492e26ea0c55133c#rd
如有侵权请联系:admin#unsafe.sh