使用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)即执行特定的操作(编译,上传)。>>>> 0x01 基础使用
如果我们对源仓库做了一些特定修改又不想别人查看,我们可以将仓库私有化。但github不支持直接从公开仓库克隆分支(fork)的同时将其私有化,但是,可以先在github创建一个私有仓库,将项目克隆后再重新推送至新的私有仓库。git clone --bare https://github.com/GhostPack/Seatbelt.git
cd Seatbelt.git
git push --mirror https://github.com/<username>/Seatbelt-fork.git
⚠️注:重新推送之前,需要先在Github创建仓库,否则会报错。
创建Action
我们先使用提供的模板,对其进行修改。其中,需要修改我们要编译的解决方案名。其他的步骤包括,拉取代码、安装.Net运行时环境、配置MSBuild构建工具、编译、上传等。还包括一些单元测试、程序签名等步骤,我们暂时不需要,直接注释掉即可。提交之后,就将触发一次构建。因为workflow使用的是push触发器,所以每次push操作都会自动触发一次构建。
根据配置的执行情况,将显示整个ACTION是否执行成功,点击对应的jobs,将显示具体每一个步骤的执行情况及日志信息,是否存在警告、错误等。
这里程序编译成功了,但有一个问题,无法下载编译好的程序。因为构建是在Github的构建容器中运行,默认情况下,ACTIONS不会自动将构建的生成文件自动上传至Github仓库,构建完成后在下次构建时将自动删除之前构建的文件。要想下载构建生成的EXE可执行程序,我们还需要先将生成的EXE上传,指令upload-artifact就用于将文件从构建容器上传到GitHub。该指令需指定要上传的文件的路径和名称,还可以指定多个待上传文件。⚠️注意:所有的构建操作都是在环境变量${{ github.workspace }}对应的目录中进行,其值默认为D:\a\<github Repo>\<gihub Repo>。
路径处如果使用相对路径,该路径就是相对${{github.workspace}}来指定的,可以从其他步骤的输出日志中进行确认,这里容易混淆出错。当然,也可以使用绝对路径,更方便。提交之后将触发一次新的构建,如果执行成功,就可以在Github看到编译好的可执行文件。
至此,借助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名}}对其进行引用,而不用将其硬编码在配置中。之后的步骤,基本和之前的构建步骤一致,包括安装.Net运行时环境、配置MSBuild构建工具、安装依赖、编译生成exe可执行程序。
⚠️注意:这里的路径问题,在现有仓库中引入了另外的仓库,比如这里的ConfuserEx2-fork,新的仓库内容将保存在${{ github.workspace }}目录中,而非${{ github.workspace}}\ConfuserEx2-fork\目录。这里很容易出错,必要时可使用命令执行模块执行dir进行查看。
混淆器编译成功之后,就该接着编译Seatbelt工具了,然后使用ConfuserEx2针对Seatbelt进行混淆。⚠️注意:默认情况下,在已经拉取了一仓库的情况下,再次使用checkout命令拉取新仓库会覆盖当前仓库。比如这里,已经拉取了仓库ConfuserEx2-fork,再次拉取仓库Seatbelt-fork之后,之前的ConfuserEx2-fork仓库的内容就被覆盖了。
这种情况,可以通过path指令指定拉取的仓库相对于当前路径的保存位置。这里,将Seatbelt仓库保存在了名为Seatbelt-Build的目录中。然后,再编译Seatbelt,生成exe可执行文件。然后,使用ConfuserEx2对Seatbelt.exe进行混淆操作并上传。
⚠️注意:因为ConfuserEx2是基于配置文件进行操作的,因此先要编辑好一个配置文件并上传至Seatbelt-fork仓库。注意配置文件中BaseDir选项的路径,是相对crproj文件本身而言的。
所有配置完成之后,触发并成功构建之后,便可直接下载Seatbelt可执行文件即经过混淆的版本。
未经混淆的Seatbelt直接被Defender查杀,而混淆版则没被查杀。
Github Action与第三方集成
另外,GitHub API提供了对Actions的支持,这也使得我们能够通过API对Github Action进行操作。因此可将Actions集成到其他工具。比如该项目Execute-GithubAssembly,该CobaltStrike插件可直接从Github Action下载编译好的.Net可执行文件,然后利用CS的execute-assembly进行内存执行。完成之后,我们的工作流简化为:git拉取源仓库最新版本源码,推送至私有fork仓库,github自动编译并混淆处理,通过CS插件执行即可。>>>> 0x03 总结
本文对使用Github Actions功能进行自动化构建以及一些扩展用法,如构建过程中自动对程序进行混淆处理进行了一次研究及实验,遇到了一些坑点并成功解决。另外,Github API接口为与第三方工具进行集成提供了方便,利用其进行更高级、更加自动化的红队操作也值得进一步研究。>>>> 0x04 附件
name: Build_obfuscators
on:
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/
文章来源: http://mp.weixin.qq.com/s?__biz=MzI5NDg0ODkwMQ==&mid=2247485123&idx=2&sn=a6e8d1d91dd88464aae1f837bc80640c&chksm=ec5dd629db2a5f3fa2e4ed5b7a0fe209f479a289415c3f7d2a522f27efe9492e26ea0c55133c#rd
如有侵权请联系:admin#unsafe.sh