Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Статьи (https://forum.antichat.xyz/forumdisplay.php?f=30)
-   -   Играем в "Предсказателя" с GetSimple CMS (https://forum.antichat.xyz/showthread.php?t=483845)

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 код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]if ( ([/COLOR][COLOR="#0000BB"]$userid[/COLOR][COLOR="#007700"]==[/COLOR][COLOR="#0000BB"]$USR[/COLOR][COLOR="#007700"]) && ([/COLOR][COLOR="#0000BB"]$password[/COLOR][COLOR="#007700"]==[/COLOR][COLOR="#0000BB"]$PASSWD[/COLOR][COLOR="#007700"]) ) {
[/
COLOR][COLOR="#0000BB"]$authenticated[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"];
[/
COLOR][/COLOR

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

admin/resetpassword.php

PHP код:

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]...
[/
COLOR][COLOR="#0000BB"]$randSleep[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]rand[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]250000[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]2000000[/COLOR][COLOR="#007700"]);[/COLOR][COLOR="#FF8000"]// random sleep for .25 to 2 seconds
[/COLOR][COLOR="#007700"]...
[/
COLOR][COLOR="#0000BB"]usleep[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$randSleep[/COLOR][COLOR="#007700"]);
...
[/
COLOR][/COLOR

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

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

admin/inc/template_functions.php

[PHP]
PHP:
[COLOR="#000000"]functioncreateRandomPassword() {
$chars="Ayz23mFGHBxPQefgnopRScdqrTU4CXYZabstuDEhijkIJKMNV Wvw56789";
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="Ayz23mFGHBxPQefgnopRScdqrTU4CXYZabstuDEhijkIJKMNV Wvw56789";
for(
$i=0;$i[COLOR="#007700"]

crlf 23.05.2021 17:29

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

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

fandor9 23.05.2021 19:59

[QUOTE="Baskin-Robbins"]
Baskin-Robbins said:

Да и хитрые разрабы предусмотрели этот вариант - в нашем диапозоне не 62 символа,
как должно быть для [a-zA-Z0-9]{6}, а 57 и нашего нолика тут как раз и не хватает))
[PHP]
PHP:
[COLOR="#000000"]$chars="Ayz23mFGHBxPQefgnopRScdqrTU4CXYZabstuDEhijkIJKMNV Wvw56789";
for(
$i=0;$i[COLOR="#007700"]

Svan 04.06.2021 23:27

[QUOTE="Baskin-Robbins"]
Baskin-Robbins said:

Сайт - get-simple.info
Версия 3.3.16 - Latest Stable Version.
Интернеты говорят вот так:
View attachment 13250
В админке имеем возможность редактирования шаблонов - php файлы.
Удаляем стопер, пишем phpinfo и у нас RCE)
Осталось теперь как-то попасть в эту самую админку.
View attachment 13251


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

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

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]if ( ([/COLOR][COLOR="#0000BB"]$userid[/COLOR][COLOR="#007700"]==[/COLOR][COLOR="#0000BB"]$USR[/COLOR][COLOR="#007700"]) && ([/COLOR][COLOR="#0000BB"]$password[/COLOR][COLOR="#007700"]==[/COLOR][COLOR="#0000BB"]$PASSWD[/COLOR][COLOR="#007700"]) ) {
[/
COLOR][COLOR="#0000BB"]$authenticated[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"];
[/
COLOR][/COLOR

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

PHP:
[
COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]...
[/
COLOR][COLOR="#0000BB"]$randSleep[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]rand[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]250000[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]2000000[/COLOR][COLOR="#007700"]);[/COLOR][COLOR="#FF8000"]// random sleep for .25 to 2 seconds
[/COLOR][COLOR="#007700"]...
[/
COLOR][COLOR="#0000BB"]usleep[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$randSleep[/COLOR][COLOR="#007700"]);
...
[/
COLOR][/COLOR

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


Время: 16:52