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

в 11:17, , рубрики: PHDays, Блог компании Positive Technologies, взломы, информационная безопасность, конкурентная разведка, поиск информации, социальная инженерия

image

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

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

1. Find information about the missing designer

1.1. Nobody at the company of greatiot.phdays.com could even say what his first and last name is. Maybe you can find it?

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

image

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

image

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

image

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

image
image

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

image

Ответ: 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), показывающие, где он живет и где работает:

image

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

image

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

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

2. Lead IoT developer

2.1. We have only a photo of his wife from his desktop background: yadi.sk/i/wIMhX59h3J5ufA. Find the IP address of the developer's personal server.

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

image

Находим!

image

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

image

В самом профиле находим эту фотографию и изучаем лайки, где находим аккаунт softcodermax, найдя который находим профиль на Pastebin:

image

Ответ: 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":

image

Открыв скрипт logs.php в браузере, получаем сообщение «logdate is missing. last log date 20170428», пробуем указать параметр в виде 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:

image

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

image

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

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

image

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

3. GreatIOT evangelist and hipster

3.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 успел все проиндексировать:

image

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

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

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

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

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

image

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

image

Ответ: 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:

image

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

image

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

Готовый эксплойт:

image

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

image

image

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

image

В ВК для восстановления нужно знать еще и фамилию, в отличие от 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, поэтому идем туда и восстанавливаем аккаунт по почте:

image

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

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

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

image

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

5. Missing Man #1

5.1. He has a secret related to this wallet LMksJQ3GrHXDSMjwEvPAEJsaXS7agq6DaQ. Find out where he transferred all this money to.

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

image

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

5.2. Find out where he is.

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

image

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

image

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

6. Why so many tears?

6.1. All we could find is the developer's account and a CloudPets recording: 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/).

image

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

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

7. Pythons crawling everywhere

7.1. Get the developer's Twitter login. There's a web service here: devsecure-srv139.phdays.com

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

CF-RAY:3519eafdb3a94e84-DME
Server:cloudflare-nginx

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

image

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

image

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

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

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

image

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

8.System administrator

8.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:

image

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

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

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

image

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

image

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

image

image

Тогда приступим к изучению файла 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

Однако камера повернута не в ту сторону, и наша задача — найти команды на управление. Хорошо, что есть документация:

image

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

image

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

image

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

Результаты

66 участников конкурса сделали хотя бы одно задание. Все три дня в лидерах был noyer (Сипан Варданян) — единственный, кто смог решить все задания. На втором месте AVictor (Виктор Алюшин), на одно очко обогнавший mkhazov (Максима Хазова).

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

Автор: Positive Technologies

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js