/Разборы задач
7 ноября 2026
Райтап на задачу «Скоростные Пазлы #3»
Собираем 256 фрагментов пазла с помощью OpenCV: находим кусочки в оригинале и восстанавливаем порядок по координатам.7
10

Misc
Задача «Двери»
Когда-то давно, когда автор был ещё в школе, но уже знал про NAT, пробросы портов и прочее, встал вопрос защиты своих наработок. Софт хостился на материнке от старого нетбука, закреплённого на фанере, а роутер был дешёвым домашним — лишнее количество внешнего трафика очень сильно нагружало сеть. В процессе ресерча и обнаружился такой примитивный, но действенный способ защиты своих сервисов — Port Knocking.
Port Knocking — это всего лишь собирательное описание множества методов, которым можно «обфусцировать» наличие порта, но суть одна — на хост (чаще всего, файервол, стоящий лицом в интернет) отправляются пакеты определённого типа, с определёнными характеристиками и определённой последовательностью. Чем шире доступ к настройкам файервола и глубже анализ пакетов, тем более изощрённые методы для защиты можно придумать. Можно отправлять ICMP ping-пакеты с определённым размером (например, ping -s 1024 <IP>) и создать уникальный ключ, состоящий из последовательности пришедших размеров пакетов. Или чередовать TCP- и UDP-порты, и ещё много прочих вещей…
Эта задача была основана на одном из простейших методов Port Knocking’а — «простукивание» по трём TCP-портам. Контейнер под задачу специально выдавался с минимально доступным набором инструментов для тренировки скриптинга или проброса своих инструментов (мы всё видели в логах 😁 и узнали много полезного). Таким образом, например, участники пробрасывали статически собранный nmap, что не было предусмотрено.
Одна из первых вещей, которые надо было сделать, — это прочитать MOTD или же баннер — сообщение, присылаемое при старте. Так как раньше таких сетевых задач в БАГодельне не было, то там специально было написано:
This container is only an entry point.А также была дана подсказка про слушателя. Несмотря на это, многие стали отправлять запросы на локалхост-адреса (127.0.0.0/8 — вся эта подсеть — это loopback-адреса: всё, что вы отправляете сюда, приходит вам же).
И всё же для начала стоило просканировать подсеть на наличие других хостов. Это можно было сделать таким one-liner-скриптом:
# например, через ifconfig можно посмотреть настройки сети
# только не забудьте поменять подсеть и маску на вашу!
for i in $(seq 1 254); do (ping -c 1 -W 1 169.254.1.$i | grep "64 bytes" &) doneА затем выполнить команду arp -a, чтобы увидеть нашего слушателя:
$ arp -a
cpmgpblj_xxx-xxx-xxx-xxx-listener-1.cpmgpblj_xxx-xxx-xxx-xxx_default (169.254.1.226) at be:37:d6:dc:ee:d3 [ether] on eth0Либо же, вместо всего этого, можно было закинуть nmap.
Дальше, когда мы определились с хостом, нужно понять, что с ним делать. Вспоминаем хайку из MOTD, где написано про three-way dance, что намекает на TCP, и сообщение из прошлой задачи про three-walled bastion. Ещё в процессе ковыряния можно было наткнуться на позднее добавленный хинт — если постучать в локалхост на служебный UDP-порт, можно было увидеть следующее сообщение:
Wrong listener, bud! Try knocking around the subnet.Собрав всё воедино, начинаем сканирование портов на слушателе. Через некоторое время был добавлен ещё один хинт — если простучать правильный порт, то нам в консоль выводился текст knock. Поэтому составить скрипт для сканирования труда не составит: сканируем порты посредством nmap или netcat, если получаем knock в выводе, либо же статус от соответствующей программы, что порт открыт — сохраняем его и сканируем порты снова, на этот раз постоянно простукивая прошлый порт. Кто-то даже бесконечный while-цикл запускал ради этого :)
Сканирование портов скриптом:
for port in $(seq 1 65535); do nc -z -w1 169.254.1.226 $port 2>/dev/null && echo "Port $port is open"; doneПравильно постучавшись три раза, получаем сообщение с флагом:
Fuck, it was THAT easy?!
Take your flag and get out!
xof{флаг-удален-для-поста}❕ В процессе решения этой задачи было выявлено очень много проблем, поэтому хочу сказать спасибо за терпение даунтаймов, багов и в целом непонятных моментов.
Ваш 🦊