Тема: Task #6
Показать сообщение отдельно

  #50  
Старый 08.06.2019, 20:57
crlf
Постоянный
Регистрация: 18.03.2016
Сообщений: 663
С нами: 5344886

Репутация: 441


По умолчанию

Ещё хочется выделить пару разборов от бета-тестеров задания. Это не финальные решения, а именно процесс мозгового штурма в первые часы разбора задания. Ребята являются одними из топчиков в своём деле, с кем мне довелось пообщаться за последнее время. Думаю многим будет полезно ознакомиться с этими наработками и проследить за ходом мыслей тру хакеров

-Комрад берёт первый флаг

Код:
1. что имеем nginx1.10.3,openssh7.4,php7.0.30, ось *nix,reverse ip-ничего
2. из скриптов сканер нашел только index.php, из параметров скрипт бечеда зафазил только page. папки uploads и misc можно сбрутить или найти в css файлах. возможно подключаются доп файлы page/contact/portfolio из неизвестной диры с неизвестным расширением
2.1. у index.php нет бекапов,временных файлов итд .ext~,.swp
2.2. пасхальный zip архив
3. повтыкал в параметр page (параметр береться из $_REQUEST не только из GET)
 3.1. очень похоже на обычный basename (aaa/contact-200)
 3.2. пустой page выдает страницу home,массив page[] не выводит ничего.
 3.3. data:,x false,allow_url_iclude off или не инклуд.
 3.4. странное поведение скрипта если первые два символа точки или первый символ слеш  .a/contact(false) a.a/contact (false) aa./contact (true) a/contact (true) /contact (false) либо не basename либо в коде шаманство с первыми тремя символами
 3.5. параметр не попадает в exec функции (;id;||id||--v итд), sql injection отсутствует
 3.6. возможно скрытые значения параметра ?page=xxx (стоит пофазить)
4. подсказки или флаги в статике исключены, чекнул даже exif теги в картинках
5. сценарий contact
 5.1 параметры email,file, необязательные, параметр message обязательный
 5.2 email=,email[],file[] - ерроров нет,message[] - скрипт не выполняется значит конструкция не такого вида !isset($_REQUEST['message']) остальные параметры никак не фильтруются и не проверяется
 5.3 *** знает как и откуда админ читает (если вообще читает) репорты поэтому фазить поле message не вижу смысла, единственное что следовало попробовать - запилить снифер, например через параметр  в надежде получить из реферера админку если таковая есть
 5.3.1. файлы из multipart/form-data заливаются в uploads в виде md5(filename).ext
 5.3.2. файл грузится только если расширение совпадает с указанным
 5.3.3. name.php.txt такая конструкция проходит проверку, но берется последнее расширение, нет проверки по mime type, .php, .php.txt false, очень похоже на in_array
 5.3.4. md5.txt/.php ошибка доступа md5.txt%00.php 404 (а вдруг)
 5.3.5. возможна эксплуатация в связки с page,нужно еще раз повтыкать
-"Разнос" флага #3

[CODE]
auth.php:

...
include('auth_secrets.php'); // подключаем файл с ключами
// вот тут отступлением, если посмотреть в диркуторию /misc/ то в глаза бросается разница в весе файла
// 362 байт у auth_secrets.php и 357 байт у auth_secrets.php.old
// вероятнее всего админ изменил ключи на новые (????)

switch ($login){ // свитчим переменную $login
case 'admin': // если в ней admin
$auth_hash = sha1($auth_id.$secret); // присваеваем переменной $auth_hash хеш значений переменной $auth_id и ключа из файла auth_secret
$local_signature = hash('whirlpool', $id.$secret.$log.$auth_group.$auth_hash); // генерируем local_signature для сверки (??? почему блять тут $id, а выше $auth_id, по логике это должно быть одно и тоже)
break;
case 'superuser':
$auth_hash = sha512($secretx.$$login); // по дефолту нет такой функции, если юзать этого пользователя то код крАшится
$local_signature = hash('ripemd128', $auth_group.$id.$secretx.$log.$auth_hash);
break;
default:
$auth_hash = md5($secrety.$group); // ну вот тут тоже тупо, почему стилистика разная, тут сначала ключ и потом $gorup, которая так же прилетела через _COOKIE, почему не $auth_group
if($auth_id $auth_group - очевидно что auth_group должна быть меньше 4
// $log=='local'
// $auth_id$auth_group&&$log=='local'&&$auth_id
 
Ответить с цитированием