В этом году участникам необходимо было найти всевозможную информацию о сотрудниках компании GreatIOT.
Автор: Ярослав Бабин, старший специалист отдела безопасности банковских систем Positive Technologies
Онлайновый конкурс по конкурентной разведке проводится на конференции 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?
Переходим на главную страницу сайта, изучаем исходный код:
Пробуем перейти по ссылке на картинку 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 developer
2.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.jpg). По фото понимаем местоположение: Центральный парк культуры и отдыха имени Горького. Для поиска можно вручную пролистать фотографии в ВК и в 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 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 успел все проиндексировать:
Восстанавливаем аккаунт по секретному слову 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, например взяв ее отсюда: https://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 #1
5.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 everywhere
7.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-DME
Server:cloudflare-nginx
Просмотрим кэш страницы в Google по IP-адресу
Обнаружим фрагменты памяти сервера, содержащие сертификаты и ключ CA (по всей видимости, мы столкнулись с Cloudbleed):
Извлечем сертификаты 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-бота в репозитории содержит нужный нам логин:
Ответ: 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:
Ответ: 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
Результаты
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 |