Образец был получен перед рождественскими праздниками, но дошел до реверса я только сегодня. Работа, учеба и PS4 забирали все свободное время. Дед Мороз, кстати, скопирован из оригинальной иконки образца. Реверс под катом.
Не прошло и недели, как я вновь получил заветную смс со ссылкой и коротким текстом в стиле: “Вам пришло ММС”. Причем получил я ее достаточно рано: в 4:35 по МСК. Но раннее утро не остановило меня, и я принялся прощупывать ссылки, пока они еще действительно, чтобы не получилось как в прошлый раз.
Что же я обнаружил?
На этот раз ссылка в сообщении является промежуточным звеном, который в зависимости от того, куда было обращение и с какого устройства (до сих пор определяют по User-Agent, наивные) перенаправляет либо на лендиг под загрузку apk-файла, либо на легитимный сайт. В данном случае, если обратиться в корень (http://da1net.ru), пользователь будет перенаправлен на авито. Если же ротатор определит desktop-версию клиента, то при обращении в каталоги, он будет перенаправлять пользователя на google.
Опытным путем выяснено, что URL лендинга зависит от оператора. В моем случае ссылка http://da1net.ru/t приводит на лендинг для Теле2, в то время как обращение к каталогу m предназначено МТС (к сожалению, на момент исследования лендинг уже был недоступен).
Что касается самого лендинга, то он достаточно прост и состоит буквально из пару стилизованых контейнеров и кнопки, по нажатию на которую выдается apk.
<!DOCTYPE html> <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Вам пришло ММС!</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <div class="head"> <img src="logo.png" alt=""> </div> <div class="text"> <center> Уважаемый пользователь,<br> вам пришло ммс-сообщение!<br> Просмотреть вы его можете<br> по ссылке ниже.<br> </center> </div> <a href="http://photo1img1.ru/foto/fotografiya_458434.apk"> <div class="btn"> <center> <img src="btn.png" alt=""> </center> </div> </a> </body></html>
Загружая apk, я подозревал, что увижу очередной образец уже разобранного вдоль и поперек вредоноса, но на этот раз меня удивили. Итак, вес файла 37,0 kB (36 973 байт) с именем
fotografiya_458434.apk и sha256 хешем bef10b003dbbc7edb8d7ceeecde8a1cf82ee449fd8fd0b08fcb46075e53fbd31.
Без всяких проблем распаковывается стандартными средствами (dex2jar => jdgui). Я уже писал ранее как декомпилировать android-приложение. Количество кода достаточно небольшое, что несколько облегчает реверс.
Что касается работы apk, то здесь все стандартно: клиент серверное приложение по принципу ”получили админа системы через фишинг, отправили все что только можно найти на устройстве, получили команды, выполняем”. Тоесть в общем ничего особенного, очередной бот, но хорошо что на этот раз новый образец. Кстати, продукт уже, судя по ссылкам в панель, пятой версии.
Итак, в манифесте все стандартно, запрашивает доступ ко всему что можно и нельзя. Правда теперь еще добавили доступ к камере устройства и геолокацию.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/> <uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.WRITE_SMS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-permission android:name="android.permission.GET_TASKS"/> <uses-feature android:name="android.hardware.camera"/> <uses-feature android:name="android.hardware.location" android:required="true"/> <uses-feature android:name="android.hardware.location.gps" android:required="true"/>
Код написан полностью на Java, никакой обфускации нет. Ссылка на гейт панели в открытом виде: http://zdoroviedoma.in/tele2_dream_my/index.php. Данные передаются POST-запросом в json-формате, предварительно закодированном в base64. Json предварительно шифруется алгоритмом, похожим на RC4, ключом-константой “12321322869”.
import java.io.UnsupportedEncodingException; public class j { public int[] a = new int[256]; public j(byte[] paramArrayOfByte) // "12321322869".getBytes("UTF-8") { int i = 0; int j = paramArrayOfByte.length; for (int k = 0; k < 256; k++) this.a[k] = k; for (int m = 0; m < 256; m++) { i = (256 + (i + this.a[m] + paramArrayOfByte[(m % j)])) % 256; int n = this.a[i]; this.a[i] = this.a[m]; this.a[m] = n; } } public byte[] a(String paramString) throws UnsupportedEncodingException { return a(paramString.getBytes("UTF-8")); } public byte[] a(byte[] paramArrayOfByte) { int i = 0; int j = paramArrayOfByte.length; byte[] arrayOfByte = new byte[j]; int k = 0; int m = 0; while (i < j) { m = (m + 1) % 256; k = (k + this.a[m]) % 256; int n = this.a[k]; this.a[k] = this.a[m]; this.a[m] = n; arrayOfByte[i] = ((byte)(this.a[((this.a[m] + this.a[k]) % 256)] ^ paramArrayOfByte[i])); i++; } return arrayOfByte; } }
Ответ от сервера приходит в точно таком же формате. Если убрать шифрование, общение между сервером и ботов выглядит следующим образом:
{"id":"e0ba05c3-0951-4013-a15f-7f00e9812cd8","type":"get","info":"imei:357242043237517, country:us, cell:Android, android:2.3.4, model:generic, phonenumber:15555215554, sim:89014103211118510720, app:null, ver:5.0.4"} [{"command":"sent&&&","params":{"to":"+79262000900","body":"\u0410\u0412\u0422\u041e\u041f\u041b\u0410\u0422\u0415\u0416 1000 50","timestamp":1453124123}}] {"id":"e0ba05c3-0951-4013-a15f-7f00e9812cd8","type":"get","info":"imei:357242043237517, country:us, cell:Android, android:2.3.4, model:generic, phonenumber:15555215554, sim:89014103211118510720, app:null, ver:5.0.4"} {"command":"pong","params":null} {"id":"e0ba05c3-0951-4013-a15f-7f00e9812cd8","type":"get","info":"imei:357242043237517, country:us, cell:Android, android:2.3.4, model:generic, phonenumber:15555215554, sim:89014103211118510720, app:null, ver:5.0.4"} {"command":"pong","params":null} {"id":"e0ba05c3-0951-4013-a15f-7f00e9812cd8","type":"get","info":"imei:357242043237517, country:us, cell:Android, android:2.3.4, model:generic, phonenumber:15555215554, sim:89014103211118510720, app:null, ver:5.0.4"} {"command":"pong","params":null} {"id":"e0ba05c3-0951-4013-a15f-7f00e9812cd8","type":"get","info":"imei:357242043237517, country:us, cell:Android, android:2.3.4, model:generic, phonenumber:15555215554, sim:89014103211118510720, app:null, ver:5.0.4"} [{"command":"sent&&&","params":{"to":"+79262000900","body":"953","timestamp":"2465886"}}]
Полный список команд:
get_history get_contacts get_listapp esms&&& get_allsms change_redir block_phone send_ussd update GPS_track_current camera_shot sent&&& send_sms network_protocol pong
И снова, снова натыкаемся на уже упомянутую ранее команду sent&&&. На этом этапе пришло понимание, что за пятая версия и откуда вообще такое большое число. Оказалось все просто: давно бродившие по Интернет образцы либо исходный код модифицировали. На этом моменте я загрустил и закончил реверс.
Добавить комментарий