25.03.2014

Автоматизация процесса сбора информации в социальной инженерии с помощью Rapportive

image

При использовании методов социальной инженерии, ключевым фактором успеха является рекогносцировка. В предыдущем посте я продемонстрировал несколько способов, как автоматизировать данный процесс. Тем не менее, показанные мной способы были простыми методами поиска информации о людях, которые могут быть связаны с интересующей нас организацией.

Автор: Jordan Wright

При использовании методов социальной инженерии, ключевым фактором успеха является рекогносцировка. В предыдущем посте я продемонстрировал несколько способов, как автоматизировать данный процесс. Тем не менее, показанные мной способы были простыми методами поиска информации о людях, которые могут быть связаны с интересующей нас организацией.

Во время самого процесса использования социальной инженерии мы зачастую имеем дело с адресами электронной почты (которые, например, видим на веб сайте.) или хотим получить точную структуру адресов электронной почты, используемых компанией (как альтернативу можно рассмотреть, например, jigsaw.rb). Было бы полезно автоматизировать процесс проверки этих адресов с помощью их сопоставления с какой-то дополнительной информацией или профилями в социальных сетях. Именно здесь нам пригодится Rapportive .

Что такое Rapportive?

Rapportive – купленное LinkedIn’ом в феврале 2012 расширение для нескольких браузеров, позволяющее агрегировать информацию о ваших контактах прямо в Gmail. Оно отправляет адреса электронной почты ваших контактов на сервер Rapportive, который ассоциирует общедоступную информацию (например, профили в социальных сетях) с этими адресами.

Обратный инжиниринг модуля Rapportive.

Давайте разберемся, как работает данное расширение (оговорюсь, что я использую Chrome). Расширение представляет собой обычный JavaScript файл «user.js». Когда мы заходим в Gmail, этот файл загружает другой JS файл с именем “launchpad”. Затем launchpad извлекает основной файл “application”, в котором как раз и реализуется весь функционал, предоставляемый Rapportive. Если хотите провести полный статический анализ этого файла, я буду только рад. Для данной статьи мы рассмотрим поведение расширения и проверим, можем ли мы автоматизировать его работу.

Вот запрос, используемый в расширении:

Стоит отметить два интересных момента. В первом вызывается /immediate_login. Она используется для подключения к Rapportive с помощью Google OpenID. Во втором вызывается /contacts/email?[target_email]. Данный вызов происходит, когда мы открывает письмо от одного из наших контактов. Далее приведем пример возвращаемых данных (для краткости я убрал неинтересную нам информацию):

{
"contact":{
"image_url_raw":"https:\/\/secure.gravatar.com\/avatar\/97754d23d40bbe7dce50f3424991b697?s=80&d=404",
"raplets":[],
"memberships":[
{
"profile_url":"http:\/\/www.linkedin.com\/pub\/54\/795\/752",
"view_text":"",
"site_name":"LinkedIn",
},
{
"display_name":"Blogger",
"username":null,
"profile_url":"http:\/\/raidersec.blogspot.com",
"view_text":"View Jordan's profile on Blogger",
"site_name":"Blogger",
},
{
"display_name":"GitHub",
"username":"jordan-wright",
"profile_id":"jordan-wright",
"profile_url":"https:\/\/github.com\/jordan-wright",

"view_text":"View Jordan's profile on GitHub",
"site_name":"GitHub",
}
],
"headline":"Jordan Wright - Security Engineer",
"email":"jmwright798@gmail.com",
"location":"Texas Area",
"occupations":[
{
"job_title":"Security Engineer"
}
],
"name":"Jordan Wright",
},
"success":"image_or_occupation_or_useful_membership",
}

Можно заметить, что в результате запроса возвращается не так много данных. С точки зрения социальной инженерии, теперь мы не только знаем, вероятно, корректные адреса электронной почты (а также корректный формат для других потенциальных целей той же организации), но и можем видеть профили социальных сетей, ассоциированные с исследуемым адресом. Таким образом, мы можем получить дополнительную информацию, которая будет полезна нам позже.

Теперь нам стоит понять, как:

  • (при необходимости) автоматизировать процесс входа
  • Разобрать запрос /contact/email, чтобы определить параметры, которые нужно передавать

Давайте начнем с анализа параметров, передаваемых в запрос /contact/email, и необходимой информации:

Мы сразу же видим интересный заголовок отправленного запроса – «X-Session-Token» (маркер X-сеанса). Оказывается, вся аутентификация запроса основывается на отправке этого самого маркера. Мы можем проверить это с помощью API консоли, как, например, вот этой.

Теперь нам нужно определить, где узнать маркер нашего сеанса. В ходе нашей работы был только один запрос, не перехваченный Burp’ом, и он был отправлен при первом входе в Gmail. Это был запрос к login_status?[email_address]. Ответ на него выглядит слеюущим образом:

{
"user_full_name":" ",
"status":200,
"authenticated_as":null,
"active_auths":[],
"claimed_emails":null,
"plan":{
"key":"free",
"price":0,
"name":"Free"
},
"session_token":"BAgiX09ON0<snip<ece684be8",
"user_preferences":{<snip<},
"authenticity_token":"7KNIosqb<snip>csaXzbQFOFi7jg=",
}

Данный запрос возвращает маркер сеанса для текущего пользователя. Однако тут есть небольшой фокус: это сработает для любого адреса электронной почты. Без шуток – попробуйте. Даже не войдя в Rapportive (то есть, используя случайный адрес почты), мы все еще можем получать маркер сеанса и совершать запросы по почтовым адресам, подобно показанному примеру. Таким образом, нам не стоит беспокоиться по поводу автоматизации процесса аутентификации.

Давайте посмотрим, как автоматизировать процесс получения маркера сеанса и отправления запросов для списка адресов.

Автоматизация запросов к Rapportive

Теперь, когда нам известен принцип работы Rapportive, мы можем автоматизировать процесс для осуществления поиска интересных нам пользователей. Давайте начнем с получения маркера сеанса для определенных адресов:

import requests
random_email = 'asdfqwer@gmail.com'
response = requests.get('https://rapportive.com/login_status?user_email=' + random_email).json()
print response['session_token']
# output - BAgiX0IvUmJHMUQ3Z2pOUWhmM0ZKRX...

Ничего сложного! Теперь, когда у нас есть маркер сеанса, мы можем выполнить запрос об интересующем нас почтовом адресе следующим образом:

profile = requests.get('https://profiles.rapportive.com/contacts/email/' + target_email,
headers = {'X-Session-Token' : response['session_token']}).json()

Возвращаемый профиль будет в JSON формате, из которого мы очень просто можем получить любую информацию, например, ссылку на профиль в соц. сетях, имена пользователей и т.д. Не буду докучать вам с реализацией парсера, давайте сразу перейдем к последнему скрипту.

Представляю вам rapportive.py

Для выполнения всей работы я написал простой Python-скрипт rapportive.py. На вход через STDIN ему нужно передать список адресов электронной почты или один адрес с помощью ключа –e, а затем просто получить результат работы. Скрипт может быть полезен, если мы хотим передать список адресов из другой программы, например, jigsaw.rb. Также у моего скрипта есть возможность записи лога в файл.

Пример использования:

1 ~# cat emails.txt | ./rapportive.py
2 10-25 23:37 rapportive INFO Using owcdf@gmail.com
3 10-25 23:37 rapportive INFO Found match for jmwright798@gmail.com
4
5 Name: Jordan Wright
6 Position: Security Engineer
7 Company: CoNetrix
8 LinkedIn - http://www.linkedin.com/pub/54/795/752
9 Blogger - http://raidersec.blogspot.com
10 GitHub - https://github.com/jordan-wright

1 ~# ./rapportive.py -e jmwright798@gmail.com
2 10-25 23:31 rapportive INFO Using ntmai@gmail.com
3 10-25 23:31 rapportive INFO Found match for jmwright798@gmail.com
4 Name: Jordan Wright
5 Position: Security Engineer
6 Company: CoNetrix
7 LinkedIn - http://www.linkedin.com/pub/54/795/752
8 Blogger - http://raidersec.blogspot.com
9 GitHub - https://github.com/jordan-wright

Файлы здесь.

Наслаждайтесь!

Джордан.

или введите имя

CAPTCHA
dem
27-03-2014 11:32:47
Юникод, юникод, юникод. Должно быть так: def __str__(self): return dedent(""" Name: {0} {1} {2} """).format( self.name.encode('UTF-8'), "\n".join( "{0} {1}".format(title.encode('UTF-8'), company.encode('UTF-8')) for title, company in self.jobinfo), "\n".join( "\t{0} {1}".format(site_name, url) for site_name, url in self.memberships) )
0 |
Михаил
01-10-2015 02:01:28
Я очень долго искал подходящую программу для сбора контактов и адресов, и перепробовал уйму самых различных проектов, но.. Остановил свой выбор я именно на замечательном проекте StandartHarvesterID. Данный сервис является довольно таки простым и разобраться в нем сможет даже начинающий пользователь. Ну а более детально ознакомиться с самим проектом вы всегда сможете на сайте http://standartsoft.ru/harvester .
0 |