En RedCross realizamos una enumeracion a un subdominos donde encontramos una funcion de la aplicacion web que nos permite crear un acceso temporal por SSH a una shell limitada, dentro de los parametros de esta accion descrita realizamos Command Inyeccion lo que nos dio acceso aun primer usuario. Finalmente tomamos ventaja de una funcionalidad de la aplicacion para agregar un usario y obtener acceso root.
Nmap 7.70 scan initiated Mon Jan 14 18:47:33 2019 as: nmap -sC -sV -o tcp 10.10.10.113
Nmap scan report for 10.10.10.113
Host is up (0.22s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u3 (protocol 2.0)| ssh-hostkey:
|2048 67:d3:85:f8:ee:b8:06:23:59:d7:75:8e:a2:37:d0:a6 (RSA)|256 89:b4:65:27:1f:93:72:1a:bc:e3:22:70:90:db:35:96 (ECDSA)|_ 256 66:bd:a1:1c:32:74:32:e2:e6:64:e8:a5:25:1b:4d:67 (ED25519)80/tcp open http Apache httpd 2.4.25
|_http-server-header: Apache/2.4.25 (Debian)|_http-title: Did not follow redirect to https://intra.redcross.htb/
443/tcp open ssl/http Apache httpd 2.4.25
|_http-server-header: Apache/2.4.25 (Debian)|_http-title: Did not follow redirect to https://intra.redcross.htb/
| ssl-cert: Subject: commonName=intra.redcross.htb/organizationName=Red Cross International/stateOrProvinceName=NY/countryName=US
| Not valid before: 2018-06-03T19:46:58
|_Not valid after: 2021-02-27T19:46:58
|_ssl-date: TLS randomness does not represent time| tls-alpn:
| http/1.1
http/1.1 (1000 Lineas de lo mismo)|_ http/1.1
Service Info: Host: redcross.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Mon Jan 14 19:47:25 2019 -- 1 IP address (1 host up) scanned in 3592.63 seconds
Subdominios
Agregamos el subdominio intra a nuestro archivo local /etc/hosts.
1
10.10.10.113 redcross.htb intra.redcross.htb
Al visitar intra.redcross.htb nos muestra un login, podemos probar contraseñas comunes o seguir enumerando la pagina, en este caso el usuario:contraseña que encontramos fue: guest:guest.
GOBUSTER
Realizamos una busqueda de los directorios y archivos (php,html,txt,pdf,doc) que podrian estar en la pagina, utilizamos el parametro ‘-k’ saltarnos la verificacion de SSL de la pagina (-k Skip SSL certificate verification).
Nos dice que si queremos un acceso a la plataforma debemos llenar un formulario en https://intra.redcross.htb/?page=contact con subject “credentials” y en el cuerpo del formulario la contraseña del usuario que queremos.
SQLI
Nos logueamos con el usuario y contraseña, al analizar los directorios y paginas, encontramos una vulnerabilidad SQLi en: https://intra.redcross.htb/?o=1'-- -&page=app
Utilizamos burpsuite para capturar el trafico y capturar una solicitud de la SQLi para luego hacer uso de sqlmap con la solicitud, para luego encontrar usuarios y contraseñas, tambien encontramos mensajes de correos electronicos entre los administradores.
1
2
3
4
5
6
7
8
9
10
GET /?o=1&page=app HTTP/1.1
Host: intra.redcross.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://intra.redcross.htb/?page=app
Cookie: PHPSESSID=vo690q6cktgv56j97dabra5bm3;LANG=EN_US;SINCE=1547616286;LIMIT=10;DOMAIN=intra
Connection: close
Upgrade-Insecure-Requests: 1
Database: redcross
Table: messages
[8 entries]id,body,dest,origin,subject
1,You're granted with a low privilege access while we're processing your credentials request. Our messaging system still in beta status. Please report if you find any incidence.,5,1,Guest Account Info
2,"Hi Penny, can you check if is there any problem with the order? I'm not receiving it in our EDI platform.",2,4,Problems with order 021221283,"Please could you check the admin webpanel? idk what happens but when I'm checking the messages, alerts popping everywhere!! Maybe a virus?",3,1,Strange behavior
4,"Hi, Please check now... Should be arrived in your systems. Please confirm me. Regards.",4,2,Problems with order 021221285,"Hey, my chief contacted me complaining about some problem in the admin webapp. I thought that you reinforced security on it... Alerts everywhere!!",2,3,admin subd webapp problems
6,"Hi, Yes it's strange because we applied some input filtering on the contact form. Let me check it. I'll take care of that since now! KR",3,2,admin subd webapp problems (priority)7,"Hi, Please stop checking messages from intra platform, it's possible that there is a vuln on your admin side... ",1,2,STOP checking messages from intra (priority)8,Sorry but I can't do that. It's the only way we have to communicate with partners and we are overloaded. Doesn't look so bad... besides that what colud happen? Don't worry but fix it ASAP.,2,1,STOP checking messages from intra (priority)
Con la vulnerabilidad SQLi solo se pudo sacar mensajes y usuarios, no se pudo ir más alla (shell, lectura, escritura de archivos,etc). Intentando crackear las contraseñas con hashcat solo logramos sacar dos pero no sirvieron de mucho:
Pero los mensajes nos dan una idea de lo que podriamos hacer, hablan de admin webpanel el cual no pudimos encontrar con gobuster, pero podria ser algo más que un directorio, un subdominio.
Al visitar webpanel.redcross.htb solo nos redirige de nuevo a intra.redcross.htb, pero si visitamos admin.redcross.htb, nos muestra un nuevo panel de administracion.
Intentamos utilizar los mismos credenciales pero nos muestra un mensaje:
1
Not enough privileges!
COOKIES
Ya que el subdominio intra y admin pertenecen a la misma maquina intentamos utilizar las cookies del subdominio intra en el de admin utilizando Cookie Manager con los cuales pudimos logearnos como usuario guest.
Observamos dos User Management, Network Access, en la primera opcion podemos borrar y agregar usuarios, y el server nos genera una contraseña que podemos utilizar para logearnos mediante ssh.
Agregamos un Usuario
Nos devuelve el usuario y contraseña
Nos logeamos con las credenciales al servicio ssh
Con el usuario que creamos(nemesis) no pudimos hacer mucho, pero encontramos un archivo ‘iptctl.c’, el cual restringe o permite el acceso a la maquina, añadiendo una IP.
/*
* Small utility to manage iptables, easily executable from admin.redcross.htb
* v0.1 - allow and restrict mode
* v0.3 - added check method and interactive mode (still testing!)
*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<arpa/inet.h>#include<unistd.h>#define BUFFSIZE 360
intisValidIpAddress(char*ipAddress){structsockaddr_insa;intresult=inet_pton(AF_INET,ipAddress,&(sa.sin_addr));returnresult!=0;}intisValidAction(char*action){inta=0;charvalue[10];strncpy(value,action,9);if(strstr(value,"allow"))a=1;if(strstr(value,"restrict"))a=2;if(strstr(value,"show"))a=3;returna;}voidcmdAR(char**a,char*action,char*ip){a[0]="/sbin/iptables";a[1]=action;a[2]="INPUT";a[3]="-p";a[4]="all";a[5]="-s";a[6]=ip;a[7]="-j";a[8]="ACCEPT";a[9]=NULL;return;}voidcmdShow(char**a){a[0]="/sbin/iptables";a[1]="-L";a[2]="INPUT";return;}voidinteractive(char*ip,char*action,char*name){charinputAddress[16];charinputAction[10];printf("Entering interactive mode\n");printf("Action(allow|restrict|show): ");fgets(inputAction,BUFFSIZE,stdin);fflush(stdin);printf("IP address: ");fgets(inputAddress,BUFFSIZE,stdin);fflush(stdin);inputAddress[strlen(inputAddress)-1]=0;if(!isValidAction(inputAction)||!isValidIpAddress(inputAddress)){printf("Usage: %s allow|restrict|show IP\n",name);exit(0);}strcpy(ip,inputAddress);strcpy(action,inputAction);return;}intmain(intargc,char*argv[]){intisAction=0;intisIPAddr=0;pid_tchild_pid;charinputAction[10];charinputAddress[16];char*args[10];charbuffer[200];if(argc!=3&&argc!=2){printf("Usage: %s allow|restrict|show IP_ADDR\n",argv[0]);exit(0);}if(argc==2){if(strstr(argv[1],"-i"))interactive(inputAddress,inputAction,argv[0]);}else{strcpy(inputAction,argv[1]);strcpy(inputAddress,argv[2]);}isAction=isValidAction(inputAction);isIPAddr=isValidIpAddress(inputAddress);if(!isAction||!isIPAddr){printf("Usage: %s allow|restrict|show IP\n",argv[0]);exit(0);}puts("DEBUG: All checks passed... Executing iptables");if(isAction==1)cmdAR(args,"-A",inputAddress);if(isAction==2)cmdAR(args,"-D",inputAddress);if(isAction==3)cmdShow(args);child_pid=fork();if(child_pid==0){setuid(0);execvp(args[0],args);exit(0);}else{if(isAction==1)printf("Network access granted to %s\n",inputAddress);if(isAction==2)printf("Network access restricted to %s\n",inputAddress);if(isAction==3)puts("ERR: Function not available!\n");}}
Este archivo es utilizado en la segunda opcion del panel de administracion en Network Access, al acceder a la segunda opcion nos muestra las ip que fueron agregada a la lista, en la que tambien podemos denegar el acceso a una IP.
RCE - Reverse SHELL
El archivo que encontramos anteriormente fue compilado y probado localmente, el cual nos pide una opcion y una IP a la cual queremos autorizar|restringir|mostrar y al realizar un analisis a las peticiones al servidor con ‘Burpsuite’ de esta pagina encontramos que podemos realizar una ‘Inyeccion de Comandos’ mediante la opcion de denegar (‘deny’) una IP y asi obtener una shell inversa con python.
Ya dentro de la maquina pudimos enumerar y descargar los archivos pertenecientes a la pagina web y su estructura es la siguiente.
PRIVILEGE ESCALATION
Creando un Usuario - ROOT
Enumerando los archivos que se manejan en /var/www/html/* los cuales pertenecen a la pagina web de la maquina, encontramos varios usuarios y contraseñas a Bases de Datos.
Como pudimos observar, en el panel de administracion podemos crear usuarios, los cuales estan en el grupo de asociados y limitados a una sola carpeta /var/jail/. El codigo php que agrega usuarios a la base de datos.
1
2
3
4
5
6
7
8
9
10
if($action==='adduser'){$username=$_POST['username'];$passw=generateRandomString();$phash=crypt($passw);$dbconn=pg_connect("host=127.0.0.1 dbname=unix user=unixusrmgr password=dheu%7wjx8B&");$result=pg_prepare($dbconn,"q1","insert into passwd_table (username, passwd, gid, homedir) values ($1, $2, 1001, '/var/jail/home')");$result=pg_execute($dbconn,"q1",array($username,$phash));echo"Provide this credentials to the user:<br><br>";<--!echo"<b>$username : $passw</b><br><br><a href=/?page=users>Continue</a>";-->}
El action: adduser realiza una conexion a la base de datos unix y con el usuario ‘unixusrmgr’ y realiza un query para insertar nombre de usuario, contraseña generada aleatoriamente y la encripta en crypt, gid o al grupo de usuarios que existen en la maquina (/etc/group - associates:x:1001:), tambien un directorio especifico para el usuario. Sabiendo esto podemos tomar ventaja de esta funcion y crear nuestro propio usuario.
Utilizando las mismas credenciales en la base de datos en la que se crean los usuarios, encontramos la tabla llamada passwd_table, que contiene:
Ya que el usuario unixusrmgr tiene permisos para insertar datos en esta tabla, podemos tomar ventaja e insertar nuestro propio usuario con permisos sudo a la base de datos, logearnos mediante ssh para luego poder crear y agregar un usuario con permisos(gid) root a la maquina.