Конкурентная разведка на PHDays: шпионим через Интернет вещей

18.07.2017

Автор: Ярослав Бабин, старший специалист отдела безопасности банковских систем Positive Technologies

Онлайновый конкурс по конкурентной разведке проводится на конференции Positive Hack Days уже шестой год подряд - и наглядно показывает, как легко в современном мире получить различную ценную информацию о людях и компаниях. При этом обычно даже не нужно ничего взламывать: все секреты разбросаны в общедоступных сетях. В этом обзоре мы расскажем, какие были задания на «Конкурентной разведке» 2017 года, как их нужно было решать, и кто победил в конкурсе.

В этом году участникам необходимо было найти всевозможную информацию о сотрудниках компании GreatIOT. К обычному поиску и анализу информации в Интернете добавились задания с различными IoT-устройствами. По легенде, с компанией случилось что-то странное, и в один момент все, включая разработчиков, техподдержку и даже CEO — пропали. Задача участников конкурса — найти данные, необходимые для расследования этой интриги.

1. Find information about the missing designer1.1. Nobody at the company of greatiot.phdays.com could even say what his first and last name is. Maybe you can find it?

Переходим на главную страницу сайта, изучаем исходный код:

Пробуем перейти по ссылке на картинку logo-vender.png.

Сохраняем, открываем любым текстовым редактором, видим XMP-теги от приложений Adobe:

Отлично! Похоже на логин доменной учетной записи, где фамилия — Ступинин. Теперь у нас есть три варианта, как получить полный e-mail: догадаться сразу, что доменная учетная запись будет выглядеть как домен, сбрутить поддомен mail.greatiot.phdays.com, который перенаправляет на вход в почту, или посмотреть, какие адреса привязаны к аккаунтам в соцсетях.Twitter в очень удобном формате предоставляет эти данные - количество звездочек действительно равняется количеству букв (в отличие от Instagram):

Понимаем, что полный адрес электронной почты: astupinin@greatiot.phdays.com. Делаем восстановление пароля по разным сервисам и находим профиль нашего Алекса:

Ответ: Alex StupininПравильных решений: 11

1.2. Most excellent. We have logs from his fitness tracker and we need to know where he’s spent his evenings after work. (Name in uppercase)

Найдя профиль дизайнера в Facebook, можно было обнаружить записи чекинов в Foursquare (SwarmApp), показывающие, где он живет и где работает:

Если покопаться в истории, то мы также находим ссылку на файл fitbit_log_07_05.cvs

Сопоставив место работы и дом, посмотрев по карте, мы можем сделать вывод, что это две точки, между которыми больше всего шагов. Также в некоторые дни шагов до дома было сделано больше, чем обычно. После работы он ходит ~700—800 шагов и остается в этом месте некоторое время. Открыв Foursquare, можно было найти несколько пабов в районе 500 метров от его работы. Вариантов немного, и довольно быстро находится бар «Прага».

Ответ: PRAHAПравильных решений: 9

2. Lead IoT developer2.1. We have only a photo of his wife from his desktop background: https://yadi.sk/i/wIMhX59h3J5ufA. Find the IP address of the developer's personal server.

На входе имеем фотографию и дату, когда она, предположительно, сделана (photo_2017-04-25_15-46-33.png). По фото понимаем местоположение: Центральный парк культуры и отдыха имени Горького. Для поиска можно вручную пролистать фотографии в ВК и в Instagram за 25 апреля, а можно воспользоваться сервисом snradar.azurewebsites.net:

Находим!

По имени и фамилии находим упоминание аккаунта в Instagram elena91u:

В самом профиле находим эту фотографию: https://www.instagram.com/p/BTT0hNcj6mz/?taken-by=elena91u — и изучаем лайки, где находим аккаунт softcodermax, найдя который находим профиль на Pastebin:

Ответ: 188.166.76.66Правильных решений: 18

2.2 Apparently the developers used team chat but often head to discuss things via VoIP. Get the address of the VoIP gateway.

На веб-сервере из предыдущего задания можно найти sitemap.xml, содержащий в том числе ссылку на скрипт "/logs.php"

Открыв скрипт logs.php в браузере, получаем сообщение "logdate is missing. last log date 20170428", пробуем указать параметр в виде http://188.166.76.66/logs.php?logdate=20170428 и получаем доступ к access-логам сервера. Проанализировав логи за возможный диапазон дат, находим следующую запись со ссылкой на чат-группу Skype из заголовка Referer:

64.19.23.198 - - [26/Apr/2017:08:26:09 +0000] "GET / HTTP/1.1" 200 2613 "https://join.skype.com/aMxdupsIlSgI" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"

Подключившись к открытой группе Skype, видим в переписке разработчиков упоминание адреса VoIP-шлюза.

Ответ: voip-gw-home-198.phdays.comПравильных решений: 3

2.3 Not bad. Maybe you can also find out the last person he called?

После неудачной авторизации на странице voip-gw-home-198.phdays.com видим следующий HTML-код, содержащий имя вендора DblTek:

Просканировав порты, можно также обнаружить на порте Telnet некий сервис, запрашивающий авторизацию:

После сопоставления этой информации и поиска в интернете находим описание закладки в данном продукте и эксплойт для генерации предсказуемых кодов входа: https://github.com/JacobMisirian/DblTekGoIPPwn.

Воспользовавшись генератором кодов challenge-response для входа, получаем шелл в системе и находим контакт пользователя в sqlite-базе в домашней папке пользователя voip:

Ответ: +79262128506Правильных решений: 3

3. GreatIOT evangelist and hipster3.1. All we could find is his email address: digitalmane@yandex.com. But information about his router is stored somewhere… Uncover its URL! (Format: hostname.com/page/)

Раз аккаунт на Яндексе, попробуем восстановить пароль, где видим секретный вопрос “Favorite artist”. Вариантов поиска любимого исполнителя не так много, это либо ВК, либо SoundCloud или Last.fm. Хорошо, что Google успел все проиндексировать:

Восстанавливаем аккаунт по секретному слову GHOSTEMANE, попадаем в аккаунт. Открываем весь список приложений Яндекса, выбираем те, которые в себе могут хранить URL. Диск, Почта, возможно синхронизация с Браузером, а также Вебмастер, Директ или Метрика. На последнем сервисе в статистике находим проиндексированную страницу old1337.

Ответ: greatiot.phdays.com/old1337/Правильных решений: 66*

* В самом начале конкурса кто-то привязал к почте телефон и восстановление по секретному слову перестало работать, поэтому пришлось указать полный ответ.

3.2. Find the IP address of the router, will you?

Попадая в директорию old1337, получаем такое содержимое:

Поискав в Google все файлы, что есть, понимаем, что большинство из них стандартные для разных приложений (HEX, netcat), кроме how_to_connect.rar. У архивов RAR есть одна особенность — возможность заархивировать альтернативный NTFS-поток, часто для файлов OOXML добавляется стандартный Zone.Identifier:$DATA, который указывает на то, откуда файл попал на машину пользователя, мы же добавили Text.Information:$DATA, который содержал информацию об IP-адресе роутера:

Ответ: 178.62.218.236Правильных решений: 4

3.3. Interesting.. He doesn’t look much like a hipster, especially with a name like that. Find out his first and last name.

Перед нами роутер со стандартными логином и паролем и два интересных раздела: Configuration и Status & Logs:

Где можно восстановить конфигурацию из XML. Ну и первое, что приходит в этом случае на ум: уязвимость XML External Entity. Но какой файл нужно прочитать? Полистав Status & Logs находим:

Так как через XXE прямого вывода на страницу нет, нужно воспользоваться техникой Out-of-Band описанной здесь. Файлы типа /etc/passwd читаются, однако .pcap - бинарный и для этого нужно воспользоваться оберткой php://filter, например взяв ее отсюда: www.idontplaydarts.com/2011/02/using-php-filter-for-local-file-inclusion/ Готовый эксплойт:

Раскодировав Base64 получаем небольшой дамп, из которого получаем запрос на доменную авторизацию:

Теперь, учитывая формат доменных учетных записей ИФамилия, узнаем фамилию: Panteleev. Остается найти имя. Стоит сказать, что учитывая подсказку про «странное имя для хипстера», некоторые начинали перебирать, и несколько человек даже смогли верно угадать. Но решение, которое мы закладывали, опять работало через соцсети:

В ВК для восстановления нужно знать еще и фамилию, в отличие от Facebook, но для этого у нас все есть.

Ответ: Isaac PanteleevПравильных решений: 2

4. The Secretary is hiding something…4.1. We could find only part of a phone number, but her e-mail is brintet@protonmail.com. Have any ideas on how to find the full version? +7985134****

Стоит предупредить, что в самом начале мы не учли некоторые моменты и выложили старую версию задания, поэтому после обновили, добавив почту. А с подсказкой решалось все еще проще: большинство популярных площадок принимает к оплате PayPal, поэтому идем туда и восстанавливаем аккаунт по почте:

Ответ: +79851348961Правильных решений: 19

4.2. Surely it won’t be hard for you to find out her first and last name?

Когда имеется полный номер телефона, идей о том, где можно получить полную информацию, довольно много, однако сюда добавляются еще и мессенджеры: WhatsApp, Viber, Telegram, где мы и находим аккаунт:

Ответ: Maria BrintetПравильных решений: 14

5. Missing Man #15.1. He has a secret related to this wallet LMksJQ3GrHXDSMjwEvPAEJsaXS7agq6DaQ. Find out where he transferred all this money to.

По имени можно определить, что кошелек относится к Litecoin. Воспользуемся одним из сервисов, позволяющих проанализировать блоки Litecoin, и проследим перемещение средств до конечного кошелька:

Ответ: LM33p4m3ZDk5rs1BjkWUvEw3UWWiaH2u2LПравильных решений: 23

5.2. Find out where he is.

По номеру кошелька, найденному в предыдущем задании, в Google находим счет на оплату, содержащий реквизиты сторон:

После отправки письма на почту jp.karter7@gmail.com получим следующий автоответ:

Ответ: SeverallsПравильных решений: 12

6. Why so many tears?6.1. All we could find is the developer's account and a CloudPets recording: https://yadi.sk/d/qTNjZYj63J5vHB. Overhear his secret.

Была предоставлена ссылка в котором находился архив с именем cloudpets.7z, что намекает на историю с игрушками CloudPets, которые записывали и выкладывали в облако AWS аудиосообщения, которые в дальнейшем были слиты хакерами (https://www.troyhunt.com/data-from-connected-cloudpets-teddy-bears-leaked-and-ransomed-exposing-kids-voice-messages/).

Открыв архив, обнаруживаем запись длительностью 2:44, слушать всю запись довольно проблематично, поэтому открываем трек в аудиоредакторе (например, в Sonic Visualiser), в котором нам потребуется функция спектрального анализ, где заметнее колебания частот. Немного пролистав несколько выделяющихся моментов, находим разговор по телефону, в котором мужской голос говорит пароль.

Ответ: GHgq217$#178@k12/Правильных решений: 5

7. Pythons crawling everywhere7.1. Get the developer's Twitter login. There's a web service here: devsecure-srv139.phdays.com

Открыв http://devsecure-srv139.phdays.com/, видим страницу авторизации с упоминанием альтернативной возможности входа по клиентскому сертификату. Ответ сервера также имеет заголовки, указывающие на использование CloudFlare:

CF-RAY:3519eafdb3a94e84-DMEServer:cloudflare-nginx

Просмотрим кэш страницы в Google по IP-адресу

Обнаружим фрагменты памяти сервера, содержащие сертификаты и ключ CA (по всей видимости, мы столкнулись с Cloudbleed):

Извлечем сертификаты CA (ca.key, ca.crt) и сгенерируем клиентский сертификат:

openssl genrsa -out client.key 1024openssl req -new -key client.key -out client.csropenssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 3137 -out client.crtopenssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

Импортируем сертификат в браузер, теперь мы можем авторизоваться по сертификату и получить доступ к репозиториям разработчика. Конфигурационный файл Twitter-бота в репозитории содержит нужный нам логин:

Ответ: MontyPythonistПравильных решений: 6

8.System administrator8.1. We found the token d91496dfcaad93f974a715fb58abeeb0 and VDS 188.226.148.233. Try to find the sysadmin's github account.

Используя утилиту для перебора путей, находим ссылку на API — http://188.226.148.233/api/tasks, которая требует токен. Указав токен в GET-параметре, видим список задач в JSON, содержащий в том числе упоминание GitHub-аккаунта anneximous:

Ответ: anneximousПравильных решений: 12

8.2. Looks like a home router… See if you dig up something interesting.

Введя в Google «anneximous» находим единственный репозиторий:

В описании находим IP-адрес и три файла, из которых нам интересны camera_contol.html и left.js.

Просканировав порты на IP-адресе 188.166.30.118, на порте 8080 обнаружим страницу доступа к IP-камере, пароль и логин можно найти в файле camera_control.html, однако при попытке залогинится будем всегда получать ошибку:

Тогда приступим к изучению файла left.js. Первая функция сразу бросается в глаза:

function Call(xml) { if (gVar.httpver == "https") { setCookie("snapcmd", gVar.httpver + "://" + gVar.ip + ":" + mult_https_port[IFs] + "/cgi-bin/CGIProxy.fcgi?" + (urlEncode("usr=" + gVar.user + "&pwd=" + gVar.passwd + "&cmd=snapPicture"))); }

Из нее получаем первый запрос на захват изображения с камеры: http://188.166.30.118:8080/cgi-bin/CGIProxy.fcgi?usr%3Dphdaysiot%26pwd%3Dphdaysiot7%26cmd%3DsnapPicture Однако камера повернута не в ту сторону, и наша задача — найти команды на управление. Хорошо, что есть документация:

В документации находим запросы на поворот камеры по горизонтали и вертикали и команду на остановку движения:

http://188.166.30.118:8080/cgi-bin/CGIProxy.fcgi?usr%3Dphdaysiot%26pwd%3Dphdaysiot7%26cmd%3DptzMoveLeft и другие: ptzMoveDown, ptzMoveUp, ptzMoveRight и функцию остановки движения: ptzStopRun. Остается вслепую повернуть камеру в нужную сторону и получить флаг:

Ответ: AnneximousBADIOTПравильных решений: 7

Результаты

| 1 | noyer | 16 | | -- | ----------- | -- | | 2 | AVictor | 13 | | 3 | mkhazov | 12 | | 4 | crackitdown | 10 | | 5 | topol | 9 | | 6 | Ursus | 9 | | 7 | x010 | 8 | | 8 | buzz | 8 | | 9 | ThreatIntel | 8 | | 10 | mattgrow | 5 |