Этот пост о том, как обычный взлом обернулся муками совести и душевными терзаниями. Исходников будет не много, больше фоток и анализа. Итак, некто Вася работает «плохим парнем». Степень падения Васи такова, что средства на жизнь ему приносит поиск и разбор информации, доступ к которой был скомпрометирован вследствие неграмотного обслуживания, безалаберности или экономии на обслуживающем персонале.
Так повелось с момента возникновения группы, где Вася проводит большую часть времени, его профилем является анализ добытых данных и составление некоторого отзыва, если того просит заинтересованное лицо.
Будень московский
Обычное московское утро, офис-подвал, кофе, Вася с друзьями обсуждает новый заказ от старого знакомого. Все стандартно, надо достать инфу, всю до чего можно дотянуться. Адреса, сайты, места жительства персонала, страницы в соцсетях и т.д. получены заранее, и чем больше соберет покупатель сведений заранее, тем быстрее и качественнее будет результат. Подопытная фирма оказалась из северной столицы, без сайта (таких еще полно в России-матушке) и занимается поставками некоторого (какого будет разобрано ниже) оборудования, контора вроде как развалилась, но еще агонизирует, и некто мистер Х хочет получить остатки разработок данных. В командировку уехал самый молодой, ибо квалификации, чтобы поснифать wifi-трафик на предмет паролей, явок, ссылок и другой инфы, много не нужно.
В результате этих исследований были добыты секретные слова к почте, далее из переписки выянилось, что для хранения арендован дедик, который стоял на территории подопытного. Сервер иногда удаленно админился извне, на нем крутится старая убунта 12.04 LTS версии (это к вопросу об экономии на оборудовании и персонале). Просканировали на наличие уязвимостей, доступ по ssh настроен только на конкретные ip (достаточно грамотно), открыты с десяток портов, в том числе 21(FTP), 39, 41 и 95, нашлось несколько дырок, сервер сдался на уязвимости CVE-2014-0196, через нее подняли рута с третьей попытки, два раза сервак падал, но никто даже не шевельнулся, чтобы узнать в чем дело. Искали все, что было похоже на исходники, документацию и т.д. Зашли, осмотрелись, собрали урожай, почистили, проверили, еще раз почистили, ушли.
Продолжаем копать
Просматривая слитые каталоги, были обнаружены папки Confluence, Repositories и Secrets со всякой фигней и парочка неинтересных бэкапов, общий объем данных немногим больше 70 гигов. Папка Secrets, равно как и бэкапы, содержала «нежно розовый фарш» из данных, фоток, обрезков текста — такое чувство, что прошлись шредером. Открываем «Repositories», как наиболее интересного кандидата на изучение: тут оказалась куча SVN репозиториев, созданных в период с 2006 по 2013 года. Те папки, которые Вася распаковывал, отличаются по датам создания от основного архива.
Ловля удалась — вот он «Язь» программерский: куча сорцов из приватного репозитория, добытые в «бессонные ночи». Вася шарится по папкам, попутно спрашивая у гугла некоторые названия, на большинство запросов последний отвечает рекламой бессвязным бормотанием, а вот на некоторые — вполне конкретными событиями и координатами:
— moskva_postanovka: ну тут понятно, что-то ставили в столице;
— sochi_bruche_postanovka: гугл не знает, что такое sochi_bruche, зато ответит на вопрос «sochi b ruche». Можете глянуть;
— sosnbor_aes_postanovka: тут гугл с ходу выдал ответ по такой замене «сосн бор аэс постановка»;
— valdai_rosino_postanovka: опять попадание с первого раза — «валдай рощино постановка»;
— volgodonsk_aes_postanovka: ну тут и ежу понятно, что-то ставили на волгодонской атомной станции, Вася там служил в молодости и с местами знаком не понаслышке.
Видимо, серьезные ребята, самое время посмотреть, что за рыбка попалась в наши сети. И да, Васю, как старого сишника очень коробит русский транслит в исходниках (сарказм).
«moskva_postanovka_r»
Смотрим репу — матерь божья, кто же так пишет? Сорцы вперемешку с временными файлами и объектниками, видимо, разработчик находится (находился на момент 2008 года) на первых курсах института… стоп, студент-разработчик большой софтины? Вы серьезно?
Удалив временные файлы получим такую картину:
В папке Capture картиночка завалялась от 30 сентября 2008 года.
Похоже на снимок с гугл-карт. Отличительных чертами этого места является расположение возле воды, и необычность формы набережной. Дальнейший поиск по карте златоглавой привел к такому результату:
«Копаем дальше»
Также в репозитории обнаружился док, объясняющий для чего сделана программа и сорцы, собственно, какого продукта Вася получил.
«Пасхалки»
Разобравшись примерным назначением проги, Вася стал более внимательно изучать исходники в поисках чего-нить необычного. Все ведь знают, что разработчики, необремененные корпоративным этикетом, могут вставить что-нибудь эдакое для развлечения себя любимых. Какие критерии поиска задавались? Прежде всего искались комментарии типа: «WTF,TODO,f*ck и другие смешные слова». И попытки были вознаграждены на третий день дзен-созерцания: были найдены следующие куски кода:
1. Защита от начальства (файл UMainForm.cpp):
Если не найдена либа со специальным названием в папке Windows, то программа будет выдавать следующее предупреждение: «ОАО НПП „ХХХ“ не оплатило разработку это приложения! Приложение будет закрыто!»
Забавное предупреждение, рассчитанное видимо, на начальника-дурака.
2. Граница на замке (файл UBChannel.cpp).
Данный участок кода в период с 5.00 до 5.30 утра, видимо, засылает дальше в программу рандом вместо реальных данных, полученных от оборудования.
3. Черная дыра (файл UBsoDevice.cpp).
Третий подозрительный участок был выявлен здесь. Если сетевой адрес машины установлен в 192.168.88.88, то приходящая информация не отдается дальше (закладка/тестовая машина?).
Что стоит (предположительно)
Поиск в гугле выдает следующие результаты по запросам «ГУПО, Трал М, Галс, Нерпа М, НПП XXX».
Описанный в репозитории софт обслуживает вот это оборудование: раз, два, почитать можно еще тут.
Косвенно подтверждает правильность скомпрометированной информации следующая страница — три, в репозитории также находятся папки с названиями "nerpa-m,nerpau,nerpa-sdp,nerpa_vs,nerpa_sc". Их Вася не изучал, так что останавливаться на них не будем, но стиль программирования похожий. Там же на сайте указано, что срок службы данных изделий не менее 10 лет, т.е. если проги были поставлены в 2008 году, то они еще работают и, возможно, такие же дырявые (или это программные закладки, или перед выпуском в продакшн не закоментили тестовые строки).
Где стоит (предположительно)
Немного покопавшись в репозиториях, удалось выяснить следующие места обитания этого шедевра программисткой мысли.
1. Валдай (предположительно дом отдыха в Рощино, рядом правительственный объект;
2. Калининская АЭС;
3. Ленинградская АЭС;
4. Сочи (предположително дом отдыха «Бочаров Ручей», рядом правительственный объект, предположительно правительственная дача);
5. Москва (предположительно Дом Правительства Московской области);
6. Волгондоская АЭС.
Предположительно общий список мест установки устройств:
Правда жизни
После озвучивания количества желаемых плюшек, заинтересованное лицо как-то пропало из поля видимости, оставив Васю в глубоких раздумьях о смысле бытия в современном мире и растущих без меры цен на оперативку. На общем совете было решено указать незадачливым админам на недостатки в безопасности, с указанием методов их возможного исправления. Также в адрес руководителя ОАО «НПП» ХХХ было направлено письмо с описанием найденных уязвимостей. Как обычно был дан двухнедельный интервал перед обнародованием написанной статьи, однако пришедший ответ Васю несколько обескуражил, приводится с некоторыми ремарками (аудитория все-таки культурная):
«Послушай м[аз]ило мне глубоко по[б]ую как ты получил или спи[н]дил эту информацию. Ты не представляешь в какое г[уа]но вляпался и если об этом узнает кто-нибудь еще то искать тебя будут всей страной а я лично тебя [покараю].» Пунктуация оставлена без изменений.
Эпилог
На общем совете было решено обнародовать часть информации в виде этой статьи, не сливая при этом сорцы в инет, хотя сторонники показать миру «это» почти победили.
Вася, конечно же, удалил сорцы, и забыл все, что увидел и откопал. За державу обидно только, если софт для армии и режимных объектов пишут [студенты] малопрофессиональные программисты, умудрившись при этом запихнуть пару-тройку закладок, а потом неадекватные и грубые люди, которые их наняли, продают «это» за немалые суммы государству. По информации с профильных форумов, стоимость подобного оборудования для армии и других ведомств составляет несколько миллионов деревянных. Надеюсь, что существующие уязвимости изготовитель устранил, но кто гарантирует что там нет других, не таких явных?
P.S.: На момент написания статьи сервак без проблем сканится со старыми дырками. RIP.
Исходники
UBChannel.cpp — pastebin.com/xnA9p80F
UKernel.cpp — pastebin.com/7AZpqkRX
UMainForm.cpp — pastebin.com/PJgdKGcY
Автор: densneg