строгий аудит для 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. Только не на всю папку, иначе она примется падать при запуске. Не забудь заглянуть на диск — там тебя ждет небольшой бонус к статье ;). |