Как взломать сервер 1с

Обновлено: 07.07.2024

Работал с клиентом по rdp. Ночью, конечно же. Как это обычно бывает у фрилансера: кидают на мыло вопросы, дают логин и пароль - сиди, разбирайся до утра, почему что-то не проводится, проводится не так, не попадает в нужный отчет.

Все бы было хорошо, но в этот раз второпях выделили мне не того пользователя, не с правами администратора, а с правами какого-то удаленного оператора, и передо мной открылся по максимуму урезанный интерфейс «восьмерки», без возможности смены. Свертываю 1С – вижу абсолютно пустой рабочий стол, даже кнопка «Пуск» отсутствует. Сразу видно, сисадмин постарался, чтобы этот самый «удаленный оператор» не лез куда ему не нужно, не смотрел, что не нужно, и кроме пары рабочих документов в 1С ничего не мог открыть. Но мне-то нужно! Нужен конфигуратор, например. Даже – не конфигуратор: достаточно «прощупать» базу собственным отчетом, который бы выводил то, что мне нужно, в табло. Но вот вопрос: как его забросить на компьютер, где сделано все возможное, чтобы этого не допустить?

Все гениальное возникает на стыке технологий. Впрочем, и абсурдное тоже. Интуитивно тыкаю кнопку «Файл» в меню 1С – единственное место на экране, где хоть что-то есть. Вижу пункт «Новый», вижу в списке среди прочего html-документ…

Решил попробовать: вдруг разработчики 1С таки оставили возможность «пошалить». Перехожу к закладке «Текст», стираю всю сгенерированную там муть, и пишу простенький код:

Затаив дыхание, щелкаю по просмотру… На экране появляется веселое окошечко с приветливым заголовком Microsoft Internet Explorer. Ну надо же! А я и не надеялся…

Ну чем Explorer с включенными скриптами - не лазейка на закрытый компьютер через rdp? При желании, я его теперь даже отформатирую удаленно!

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

Что мешает таким же образом, через файлообменник кинуть на удаленный, закрытый от всего (почти от всего) компьютер, скажем, Total Comander, настроить в нем ftp, найти их базу и выгрузить куда-нибудь? Дома-то работать сподручнее! Конечно, только если это – сервер. А если не сервер, то значит, там есть сеть, а в сети тоже можно найти что-нибудь интересное…

Впрочем, вместо тотала можно забросить и что-то более веселенькое, да все, что угодно! Забросить и запустить прямо с рабочего стола, например, собственную программу, работающую с реестром… А можно и не с рабочего стола, а прямо из эксплорера, благо, он сам дает возможность не оставлять следов, когда спрашивает по поводу exe-файла, сохранить его, или запустить… Ну чем не взлом?

Кульминацией всего было то, что я вспомнил про свою переписку когда-то с одним хаккером, и про его восхищенные излияния про возможность использования в эксплорере разных ole-объектов, например, вот этот: ActiveXObject("Scripting.FileSystemObject"); Зачем, спрашивается, коммандер, когда есть такое…

Кстати, очень легко можно было бы этот комп завесить, если бы на то подвернулся повод. Как, спрашивается, проще всего завесить Windows – если не созданием этих самых windows? Для этого, в полюбившемся нам компоновщике меняем вторично содержимое нашего скрипта, и вместо window.location ставим:

for(var k=0; k<10000; k++)
window.open("about:blank");

Попробуйте у себя ради прикола, конечно, снизив число в цикле хотя бы до 5…

ExitWindows, может, в XP и не сработает, а вот rundll32 krnl386.exe,exitkernel должен :)

Но не будет столь экстримичны, для начала, ограничимся запретом мыши на сервере:

А если вы - приверженец старой школы, и считаете мышь вообще вредной ошибкой в истории компьютеров, то запретите ее навечно, прописав это в реестр с помощью того же VB!

WshShell.RegWrite"HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServicesMad", "rundll32 mouse,disable"

Конечно, делать я ничего такого не стал, а клиенту утром сообщил, что их сисадмину стоит серьезно обеспокоиться. Собственно, и сюда публикую только для того, чтобы коллеги, занимающиеся администрированием серверов 1С, учли подобную лазейку и предприняли необходимые меры.

Работал с клиентом по rdp. Ночью, конечно же. Как это обычно бывает у фрилансера: кидают на мыло вопросы, дают логин и пароль - сиди, разбирайся до утра, почему что-то не проводится, проводится не так, не попадает в нужный отчет.

Все бы было хорошо, но в этот раз второпях выделили мне не того пользователя, не с правами администратора, а с правами какого-то удаленного оператора, и передо мной открылся по максимуму урезанный интерфейс «восьмерки», без возможности смены. Свертываю 1С – вижу абсолютно пустой рабочий стол, даже кнопка «Пуск» отсутствует. Сразу видно, сисадмин постарался, чтобы этот самый «удаленный оператор» не лез куда ему не нужно, не смотрел, что не нужно, и кроме пары рабочих документов в 1С ничего не мог открыть. Но мне-то нужно! Нужен конфигуратор, например. Даже – не конфигуратор: достаточно «прощупать» базу собственным отчетом, который бы выводил то, что мне нужно, в табло. Но вот вопрос: как его забросить на компьютер, где сделано все возможное, чтобы этого не допустить?

Все гениальное возникает на стыке технологий. Впрочем, и абсудное тоже. Интуитивно тыкаю кнопку «Файл» в меню 1С – единственное место на экране, где хоть что-то есть. Вижу пункт «Новый», вижу в списке среди прочего html-документ…

Решил попробовать: вдруг разработчики 1С таки оставили возможность «пошалить». Перехожу к закладке «Текст», стираю всю сгенерированную там муть, и пишу простенький код:

Затаив дыхание, щелкаю по просмотру… На экране появляется веселое окошечко с приветливым заголовком Microsoft Internet Explorer. Ну надо же! А я и не надеялся…

Ну чем Explorer с включенными скриптами - не лазейка на закрытый компьютер через rdp? При желании, я его теперь даже отформатирую удаленно!

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

Что мешает таким же образом, через файлообменник кинуть на удаленный, закрытый от всего (почти от всего) компьютер, скажем, Total Comander, настроить в нем ftp, найти их базу и выгрузить куда-нибудь? Дома-то работать сподручнее! Конечно, только если это – сервер. А если не сервер, то значит, там есть сеть, а в сети тоже можно найти что-нибудь интересное…

Впрочем, вместо тотала можно забросить и что-то более веселенькое, да все, что угодно! Забросить и запустить прямо с рабочего стола, например, собственную программу, работающую с реестром… А можно и не с рабочего стола, а прямо из эксплорера, благо, он сам дает возможность не оставлять следов, когда спрашивает по поводу exe-файла, сохранить его, или запустить… Ну чем не взлом?

Кульминацией всего было то, что я вспомнил про свою переписку когда-то с одним хаккером, и про его восхищенные излияния про возможность использования в эксплорере разных ole-объектов, например, вот этот: ActiveXObject("Scripting.FileSystemObject"); Зачем, спрашивается, коммандер, когда есть такое…

Кстати, очень легко можно было бы этот комп завесить, если бы на то подвернулся повод. Как, спрашивается, проще всего завесить Windows – если не созданием этих самых windows? Для этого, в полюбившемся нам компоновщике меняем вторично содержимое нашего скрипта, и вместо window.location ставим:

for(var k=0; k<10000; k++)
window.open("about:blank");

Попробуйте у себя ради прикола, конечно, снизив число в цикле хотя бы до 5…

ExitWindows, может, в XP и не сработает, а вот rundll32 krnl386.exe,exitkernel должен :)

Но не будет столь экстримичны, для начала, ограничимся запретом мыши на сервере:

<script language="vbscript">
<!--
Set Shell=CreateObject("WScript.Shell")
Shell.Run("rundll32 mouse,disable")
-->
</script>

А если вы - приверженец старой школы, и считаете мышь вообще вредной ошибкой в истории компьютеров, то запретите ее навечно, прописав это в реестр с помощью того же VB!

WshShell.RegWrite"HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServicesMad", "rundll32 mouse,disable"

Конечно, делать я ничего такого не стал, а клиенту утром сообщил, что их сисадмину стоит серьезно обеспокоиться. Собственно, и сюда публикую только для того, чтобы коллеги, занимающиеся администрированием серверов 1С, учли подобную лазейку и предприняли необходимые меры.

image

Сегодня мы расскажем, как можно получить права локального администратора на сервере MS Windows Server 2016 через незащищенную базу 1С: Предприятие 8. Мы уверены в том, что данный кейс будет интересен, как специалистам по информационной безопасности, так и системным администраторам. В конце Вас ждет бонус.

Во время выполнения внутреннего тестирования на проникновение мы столкнулись с крайне редкой ситуацией, в сети Заказчика не было обнаружено ни одной уязвимости с помощью автоматизированных сканеров уязвимостей. ДИБ (Департамент информационной безопасности) Заказчика тщательно «пропылесосил» все свои активы и этим закрыл большинство стандартных векторов атак. Мы смогли реализовать несколько сценариев и о самом интересном рассказываем.

Получение учетных данных для MS SQL Server

Сканируя ресурсы в сети, мы обнаружили кластер серверов 1С: Предприятия 8:

image

Данный кластер не был защищен паролем и к нему удалось подключиться с помощью стандартной консоли для администрирования серверов 1С Предприятия.

Функционал консоли администрирования серверов 1С позволяет настраивать 1С сервер и работать с информационными базами, в том числе просматривать все созданные базы на сервере. Таким образом, был получен список информационных баз, расположенных на данном сервере:

image

Проанализировав все базы, мы обнаружили, что база perf не защищена паролем.

image

В конфигурации для тестирования производительности требуется указать учетные данные для подключения к серверу баз данных. Учетные данные сохраняются в информационной базе. В нашем случае так и произошло, системный администратор не удалил учетные данные после выполнения тестов производительности:

image

Мы столкнулись с проблемой, пароль скрыт. Не придумав решения лучше, было решено просто отключить свойство «РежимПароля» для поля «SQL пароль». Для этого открыли информационную базу в режиме конфигуратора. С помощью следующей схемы «Конфигурация -> Поддержка -> Настройка поддержки» сняли конфигурацию с поддержки, чтобы появилась возможность изменить форму в конфигурации:

image

Далее нашли форму с отображением учетных данных и отключили свойство «РежимПароля» для поля «SQL пароль»:

image

Сохранив изменения и запустив отладку, нажали клавишу F5. После запуска конфигурации, открыв форму с учетными данными, увидели долгожданный пароль:

image

Прекрасно, половина дела сделана.

Получение доступа к выполнению команд на сервере

Для проверки валидности учетных данных мы использовали модуль «auxiliary/scanner/mssql/mssql_login» из Metasploit Framework, логин и пароль успешно подошли к MS SQL Server, расположенному на том же сервере:

image

Пользователь sa по умолчанию имеет максимально возможные права, это позволяет выполнить команды операционной системы через функцию xp_cmdshell. Для проверки этой возможности мы воспользуемся модулем «mssql _exec» из Metasploit Framework:

image

Как видно на снимке экрана у нас есть возможность выполнять команды на сервере в контексте пользователя «nt service\mssqlserver».

Повышение привилегий в системе

Осталось повысить привилегии на сервере. Для этого откроем сессию meterpreter, используя модуль «exploit/windows/mssql/mssql_payload» из Metasploit Framework:

image

После того как консоль meterpreter открылась, загрузим модуль incognito:

image

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

Как видно на снимке экрана выше интересующие нас токены недоступны.

Нам потребуется применить эксплойт RottenPotato, чтобы привилегированный токен стал доступен. Токен становится доступен на непродолжительное время, нужно действовать очень быстро, чтобы не упустить шанс.

Скачаем эксплойт RottenPotato по ссылке и загрузим его через meterpreter.

Запустим эксплойт командой: execute -cH -f ./rottenpotato.exe. Видим, что в списке доступных токенов появился новый – «NT AUTHORITY\СИСТЕМА» Переключимся на него командой: impersonate_token «NT AUTHORITY\\СИСТЕМА» и нам, наконец, удается получить максимальные права на сервере.

На снимке экрана продемонстрирован процесс повышения привилегий:

image

Отлично, система успешно скомпрометирована.

Бонус

Предположим, что учетные данные для подключения к серверу баз данных не сохранены в информационной базе или была обнаружена вовсе пустая база без конфигурации. Что тогда, спросите Вы?

Специально для этой ситуации мы создали конфигурацию 1C-Shell, которая позволяет выполнять команды на сервере 1С в контексте пользователя USR1CV8, от имени которого работает сервер 1С.

Скачиваем конфигурацию 1C-Shell. Открываем найденную информационную базу в Конфигураторе.

Выбираем Администрирование — Загрузить информационную базу и указываем файл 1C-Shell.dt.

Внимание! Все данные в этой информационной базе будут удалены!

После загрузки новой конфигурации открываем базу 1C. Вводим пароль MArS6M для пользователя Kraud и получаем возможность выполнять команды на сервере 1С.

image

Таким образом, если мы найдем незащищенную информационную базу, то сразу переходим к этапу повышения привилегий в системе.


Disclaimer: всё ниженаписанное написано исключительно с просветительскими и исследовательскими целями, а также понимания механизмов защиты от взлома. Автор ни в коем случае не рекомендует использовать данную информацию для взлома программ.

Перейдём, собственно, к взлому.

0. Обнуление триала

Собственно, это даже не взлом, а полулегальный способ продлить срок использования неактивированной программы. Заключается он в том, что находится место, где хранится дата первого запуска и меняется/уничтожается. После этого всё можно пользоваться программой до следующего срока.

Посмотрим на нашего подопытного рефлектором. Немного погуляв по коду, находим интересную строчку в конструкторе MainForm:


Открываем редактор реестра, идём в HKEY_CURRENT_USER\Software\Ultrapico\Expresso и видим следующие ключи:


Удаляем их и получаем ещё 60 дней работы.

Данный вариант, конечно, прост и очевиден, но если он даже был бы сложнее — потребовалось бы чуть больше времени провести в рефлекторе, чтобы выяснить все места, куда пишется информация и зачистить их.

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

1. Написание keygen'а

Самый ужасный для разработчика вариант, и самый приятный для конечного злобного пользователя. Программа считает себя лицензионной, никаких страшных телодвижений не нужно делать.

Открываем рефлектор и ищем код на предмет классов содержащих License или Registration, видим:


При вводе имени и кода по имени вычисляется некий хеш, который и сравнивается с кодом.


Данный хеш использует DES и всякие префиксы


Байты конвертятся в строку с помощью данного метода.

Теперь всё выяснилось, открываем IDE и копируем все необходимые куски кода (или сами реализовываем). Осталось только выяснить, какие значения у Prefix, Suffix и параметры реализации MyDES. Я их приводить не буду, это уже технические детали.

В результате генерируем ключ на любое имя и видим:


Защита от кейгенов проста и очевида: использовать в каком либо виде ассиметричное шифрование. Т.е. сделать так, чтобы без знания приватного ключа сгенерировать код было бы невозможно, а данный ключ находится только в одном месте — у автора программы.

2. Использование враппера

Проверка корректности лицензии, достаточно хлопотное дело, и небыстрое. Поэтому разработчики программ обычно проверяют лицензию один раз, и дальше используют полученный флажок — валидна/невалидна (как вариант насколько валидна, если допускается несколько типов лицензии, отличающихся возможностями). Тут можно на этом сыграть, использовав следующий алгоритм:

  1. Указать программе, что лицензия уже проверена
  2. Указать программе, что лицензия корректна



Воспользуемся этим. Сделаем новый проект, добавим Reference на Expresso.exe и запустим его через себя:


Смотрим, что получилось:


Ну кто бы сомневался.

В данном случае всё оказалось просто, но если бы автор программы заменил публичные свойства на приватные, то всего-лишь пришлось бы использовать Reflection для доступа и всё бы свелось к исходной задаче.

Думаю понятно, как можно пробовать защититься от этого — проверять лицензию периодически, смотреть окружение из которого запущена программа, сделать невозможным установку нужной переменной.

Но все эти защиты приведут к тому, что злоумышленник будет использовать

3. Физический взлом программы

Запускаем ildasm, открываем Expresso.exe и сохраняем дамп в .il файл. Находим уже рассмотренный метод IsRegistered и добавляем немножко своего кода (без меток):


Потом берём ilasm и собираем всё назад (не забыв подключить ресурсы).

Что делает данный код: устанавливает нужное имя для регистрации (не обязательно), и возвращает статус, что всё хорошо.


Т.е. вполне очевидно, что теперь всё будет хорошо:


Немного про код в MSIL: это стековая машина, у которой нет регистров, все операции имеют вид: засунуть в стек нужное количество параметров, выполнить функцию, которая заберёт нужное количество параметров и положит результат. Ну и обратно: установить значение переменной тем, что лежит в стеке. Чтобы лучше понять работу всего этого рекомендую простой приём: пишите маленькую программу на привычном языке, компилируете, смотрите что получилось в MSILe и разбираетесь в конструкциях языка.

Чем жертвует злоумышленник: подписью программы, теперь она уже не автора, а его. В некоторых случаях это проблема, если в программе используется множество библиотек. Тогда злобному хакеру придётся разбирать их все и собирать их заново, но если он с этим справится, то у него будет «своя» версия программы подписанная его ключом.

Защиты от всего этого безобразия собственно немного: проводить обфускацию или выносить часть логики/проверки защиты в нативный код.

Читайте также: