PDA

Просмотр полной версии : Играем в "Предсказателя" с GetSimple CMS


Baskin-Robbins
23.05.2021, 17:21
Сайт - get-simple.info

Версия 3.3.16 - Latest Stable Version.

Интернеты говорят вот так:

В админке имеем возможность редактирования шаблонов - php файлы.

Удаляем стопер, пишем phpinfo и у нас RCE)

Осталось теперь как-то попасть в эту самую админку.



Auth bypass или предсказываем значение rand()

Система использует xml файлы для хранения данных, скулей не увидим.

Посмотрим на то как проходит аутентификация.

admin/inc/login_functions.php


PHP:
if ( ($userid==$USR) && ($password==$PASSWD) ) {
$authenticated=true;


Слабое сравнение(type jugling), но:

1) GetSimple использует sha1, брутить слишком много вариантов

2) Юзер == админ, поэтому их количество будет не большим)

3) Нужный юзер скорее всего имеет пароль отличный от необходимого нам диапозона

С одной стороны вроде как и нет баги. С другой, если мы заглянем на страницу

восстановления пароля, увидим, что этот процесс происходит таким образом:

1) Запрос на восстановление

2) Смена пароля

3) Отправка нового пароля на email

На email не отправляется линк на смену пароля, пароль меняется и отправляется на почту.

Отсюда можно решить 2 и 3 проблемы таким способом:

-- отправляем на аутентификацию всегда пароль, хэш которого 0e[0-9]{38} - например aaK1STfY

-- расстреливаем запросами на смену пароля

Но проблема слишком большого количества вариантов мешает получить сколько-нибудь

значимые результаты. Плюс ко всему, ситуация ослажняется вот этим:

admin/resetpassword.php


PHP:
...
$randSleep=rand(250000,2000000);// random sleep for .25 to 2 seconds
...
usleep($randSleep);
...


Но раз в нашем случае мы можем поменять пароль, посмотрим что это за пароль и

как он генерируется:

admin/inc/template_functions.php

[PHP]
PHP:
[COLOR="#0000BB"]functioncreateRandomPassword() {
$chars="Ayz23mFGHBxPQefgnopRScdqrTU4CXYZabstuDEhijkIJKMNVW vw56789";
srand((double)microtime()*1000000);
$i=0;
$pass='';
while ($i[COLOR="#007700"]

А сколько их, этих начальных чисел? На nix(php-7.3) у меня выплюнул 2kkk результатов.

Т.е. два миллиарда полных вариантов пароля, а вот для win:

Но разрабы решили вписать свое число. Оно устанавливается функцией srand.

Что в ней происходит?

Из текущей метки времени Unix с микросекундами берутся именно микросекунды

и умножаются на 1кк - именно столько вариантов у нас для брута, микросекунды

float 0.XXXXXX, поэтому целочисленное значение у нас никогда не будет больше

одного миллиона.

Для атаки на потребуется лишь один раз запросить смену пароля, а потом

пробрутить наши 1 миллион паролей - дело 20 минут.

Генерируем список вариантов возможных паролей:

[PHP]
PHP:
[COLOR="#000000"]$chars="Ayz23mFGHBxPQefgnopRScdqrTU4CXYZabstuDEhijkIJKMNVW vw56789";
for($i=0;$i[COLOR="#007700"]

crlf
23.05.2021, 17:29
Предлагаю перенести этот пост в статьи, т.к. достойно, а сюда выложить сухую выжимку + приложить эксплоит.

Мораль сей басни такова, что не нужно плодить свои криптовелосипеды

fandor9
23.05.2021, 19:59
[QUOTE="Baskin-Robbins"]
Baskin-Robbins said:
↑ (https://antichat.live/posts/4460946/)
Да и хитрые разрабы предусмотрели этот вариант - в нашем диапозоне не 62 символа,
как должно быть для [a-zA-Z0-9]{6}, а 57 и нашего нолика тут как раз и не хватает))
[PHP]
PHP:
[COLOR="#0000BB"]$chars="Ayz23mFGHBxPQefgnopRScdqrTU4CXYZabstuDEhijkIJKMNVW vw56789";
for($i=0;$i[COLOR="#007700"]

Svan
04.06.2021, 23:27
[QUOTE="Baskin-Robbins"]
Baskin-Robbins said:
↑ (https://antichat.live/posts/4460946/)
Сайт - get-simple.info
Версия 3.3.16 - Latest Stable Version.
Интернеты говорят вот так:
View attachment 13250 (https://antichat.live/attachments/13250.img)
В админке имеем возможность редактирования шаблонов - php файлы.
Удаляем стопер, пишем phpinfo и у нас RCE)
Осталось теперь как-то попасть в эту самую админку.
View attachment 13251 (https://antichat.live/attachments/13251.img)


Auth bypass или предсказываем значение rand()
Система использует xml файлы для хранения данных, скулей не увидим.
Посмотрим на то как проходит аутентификация.
admin/inc/login_functions.php

PHP:
if ( ($userid==$USR) && ($password==$PASSWD) ) {
$authenticated=true;


Слабое сравнение(type jugling), но:
1) GetSimple использует sha1, брутить слишком много вариантов
2) Юзер == админ, поэтому их количество будет не большим)
3) Нужный юзер скорее всего имеет пароль отличный от необходимого нам диапозона
С одной стороны вроде как и нет баги. С другой, если мы заглянем на страницу
восстановления пароля, увидим, что этот процесс происходит таким образом:
1) Запрос на восстановление
2) Смена пароля
3) Отправка нового пароля на email
На email не отправляется линк на смену пароля, пароль меняется и отправляется на почту.
Отсюда можно решить 2 и 3 проблемы таким способом:
-- отправляем на аутентификацию всегда пароль, хэш которого 0e[0-9]{38} - например aaK1STfY
-- расстреливаем запросами на смену пароля
Но проблема слишком большого количества вариантов мешает получить сколько-нибудь
значимые результаты. Плюс ко всему, ситуация ослажняется вот этим:
admin/resetpassword.php

PHP:
...
$randSleep=rand(250000,2000000);// random sleep for .25 to 2 seconds
...
usleep($randSleep);
...


Но раз в нашем случае мы можем поменять пароль, посмотрим что это за пароль и
как он генерируется:
admin/inc/template_functions.php
[PHP]
PHP:
[COLOR="#0000BB"]functioncreateRandomPassword() {
$chars="Ayz23mFGHBxPQefgnopRScdqrTU4CXYZabstuDEhijkIJKMNVW vw56789";
srand((double)microtime()*1000000);
$i=0;
$pass='';
while ($i[COLOR="#007700"]