November 11, 2016

В очках и с отвёрткой

Снова бегло и непонятно, пишу для себя.

В 2012 мне удалось взломать промышленную БД, защищенную в MsAccess 2007. Эту базу мне приходится взламывать ежегодно, каждый год они просто добавляли единичку к паролю. А в этом году они перешли на SQLite, и халява закончилась. К счастью, их промышленные программисты пишут в МС Вижуалстудио на Си Шарп (муахаха)! Благодарим Билла за прекрасный подарок, качаем Dotnet IL Editor и начинаем исследовать их творчество.

Обнаруживаем, что исполняемый файл защищен обфускатором, все строки закодированы. Вначале я потратил несколько часов и написал декодировщик строк в надежде получить ConnectionString с паролем. Часть строк удалось расшифровать, но скоро стало понятно, что это неправильный путь. Задачу усложняло то, что на раскодировку каждой строки требовалось несколько минут времени, а разработчики разбросали массу артефактов в виде старых способов доступа.

Заснув с мыслью о проблеме (кстати, прекрасный способ продвинуться вперёд, не изводить себя тупыми полунощными бдениями, а сформулировать проблему и лечь спать), утром я обратил внимание на файл System.Data.SQLite.dll, который шел в комплекте с оболочкой. В DILE находим метод System.Data.SQLite.SQLiteConnection.Open(), ставим на него брейкпоинт, запускаем оболочку. Ждём, пока жертва попадётся в наш капкан. Идём в панель аргументов, находим ConnectionString!
"Data Source=хрум-хрум-хрум.db; Password=gd*i6Tjte^r346Tfggh; Version=3; New=False; Compress=True;"



Есть пароль! Но. Готовые реализации SQLiteDatabaseBrowser и SQLite ODBC Driver доступные для скачки идут без модуля шифрования, компилировать их самостоятельно с SQLCipher желание отсутствовало. Возникла идея воспользоваться средствами длл-ки, которую оболочка использует для доступа к базе. Качаем с торрента Visual Studio 2013, устанавливаем. Рисуем простую форму с единственной кнопкой, подключаем System.Data.SQLite.dll в References. В папку дебага копируем \x64\SQLite.Interop.dll и \x86\SQLite.Interop.dll. На кнопку цепляем следующий нехитрый код:

SQLiteConnection db = new SQLiteConnection("Data Source=D:\\1.db; Password=gd*i6Tjte^r346Tfggh; Version=3; New=False; Compress=True;");
db.Open();
db.ChangePassword("");
db.Close();

(Базу данных перед этим желательно скопировать, чтобы не поломать рабочую инсталляцию).
Всё, пароль снят, теперь это обычный SQLite файл! К данным теперь можно присосаться любым методом, я это сделал через ODBC и MSAccess.

Спасибо промышленным программистам за гимнастику для мозга и ощущение удовлетворения в финале :) Я люблю вас всех!

No comments: