GitHub Actions是一个构建在GitHub中的CI/CD管道,并于2019年11月份正式上线运行。Actions允许开发人员基于类似check-ins和pull request等触发器来构建、测试和部署我们的代码,并自动化实现产品工作流。
在这篇文章中,我们将教会大家如何使用Actions API来下载并执行Cobalt Strike中的工具组件,并部署附带的脚本,这样我们就可以在任务中去使用这些工具组建了。
在我们开始对API动手之前,我们先来快速回顾一下如何配置Actions。在这篇文章中,我使用的是一个私有代码库,其中包含了大量常用工具,比如说GhostPack和SharpHound。这里我已经创建好了一个GitHub的私有代码库了,并将这些工具以子模块的形式添加了进去,使用的命令如下:
git submodule add https://github.com/BloodHoundAD/SharpHound3.git
添加好之后,做一个commit然后push,搞定!
这些子模块会相应的代码库版本进行映射连接,这样不仅方便我们进行后续的工具版本更新,而且也可以保证我们的私有代码库运行不会出现任何意外问题:
接下来,我们需要配置我们的工作流,这一步需要在“Actions”标签页中进行配置:
首先,在如下图所示的GitHub UI界面中,选择我们需要的选项,并创建一个yml脚手架文件:
在这里,我们可以访问很多Actions功能,我们可以在这里整合我们的工作流。在这篇文章中,我们只会使用一些比较简单的东西,然后构建到我们的工具中并对外发布。
为了实现这个任务,我们需要检查我们的代码库,包括子模块在内,然后恢复需要用到的代码包,并以发布模式执行MSBuild:
name: Build
on: [push]
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v2
- name: Checkout submodules
shell: bash
run: |
# If your submodules are configured to use SSH instead of HTTPS please uncomment the following line
# git config --global url."https://github.com/".insteadOf "git@github.com:"
auth_header="$(git config --local --get http.https://github.com/.extraheader)"
git submodule sync --recursive
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
- name: Setup Nuget.exe
uses: warrenbuckley/Setup-Nuget@v1
- name: Nuget Restore
run: nuget restore $Env:GITHUB_WORKSPACE\SharpHound3\SharpHound3.sln
- name: Build SharpHound3
run: |
cd "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\"
.\MSBuild.exe $Env:GITHUB_WORKSPACE\SharpHound3\SharpHound3\SharpHound3.csproj /property:Configuration=Release
- uses: actions/upload-artifact@master
with:
name: SharpHound3
path: SharpHound3\SharpHound3\bin\Release\SharpHound.exe
在这里,每一个Build都运行在一个临时容器上,这些容器具备了运行git命令和执行Build所需的工具链。针对这个Build,我们的目标是.NET代码,因此我们使用了一个Windows容器。
第一步,我们要检查我们的代码库,然后恢复我们的子模块。这里的命令稍微有点复杂,简单说来就是我们需要进入一个shell,然后直接运行git命令。在这里,我们可以获取到一个setuo-nuget Action,它将允许我们针对SharpHound3来运行nuget指令,这个命令可以获取构建SharpHound所需的依赖组件。
接下来,我们就可以通过shell来调用MSBuild,将路径传递给SharpHound的csproj文件并指定一个发布版本。MSBuild运行之后,将会在我们容器的磁盘空间生成一个已编译好的EXE文件。
为了访问我们已编译好的工具,我们首先需要上传工具,这样才能通过Actions API和GitHub UI界面来访问和使用。如果不上传的话,这些工具将会随着构建容器的销毁而销毁。针对我们的每一个工具,都进行相应的构建,这样就可以得到一个包含所有工具组件的工具列表了。
配置完成后,我们就可以开始研究API了。为了访问API,我们还需要准备好一个凭证。GitHub提供了大量认证方法,但好像只有Personal Access Tokens(PAT)符合我们的需求,因此这里我们选择使用一个PAT来代替密码。
令牌创建成功后,我们就可以通过cURL来发送API请求了:
curl -u two06:TryHarder ‘https://api.github.com/repos/two06/redteam-tooling/actions/artifacts’
该请求将返回我们代码库中可用工具组件的详细信息:
关于如何编写攻击脚本的问题,我在此就不进行赘述了,感兴趣的同学可以阅读这篇【文档】了解更多详情。重要的地方在于,我们如何使用Exec方法来调用GitHub API,比如说这样:
sub make_API_request{
$cmd = @('curl', '-u ' . $username . ':' . $access_token, $api_url . $repo_url . $endpoint);
$curl_command = exec($cmd);
$data = readAll($curl_command);
closef($curl_command);
return $data;
}
在这里,我们可以传递用户名、访问令牌和构建的URL,然后读取数据并将其返回进行后续处理。
至此,我们就可以访问Cobalt Strike中的大量工具组件了:
通过使用工具组件名称,我们可以查询下载URL并获取包含了工具组件的ZIP文件。接下来,我们就可以提取文档并使用Execute-Assembly命令来执行工具了:
GitHub Actions官网:
https://github.com/features/actions
PAT令牌:
https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line
攻击脚本文档:
https://www.cobaltstrike.com/aggressor-script/index.html
攻击脚本获取:
https://github.com/mdsecactivebreach/Execute-GithubAssembly-Aggressor/