
O Web Exploit Detector é uma aplicação Node.js usada para detectar possíveis infecções, código malicioso e arquivos suspeitos em ambientes de hospedagem web.

O Detector de Exploits Web é uma aplicação Node.js (e módulo NPM) usada para detetar possíveis infeções, código malicioso e ficheiros suspeitos em ambientes de alojamento web. Esta aplicação destina-se a ser executada em servidores web que alojam um ou mais sites. A execução da aplicação gera uma lista de ficheiros potencialmente infetados, juntamente com uma descrição da infeção e referências a recursos online relacionados.
A partir da versão 1.1.0, a aplicação também inclui utilitários para gerar e comparar instantâneos de uma estrutura de diretórios, permitindo aos utilizadores verificar se algum ficheiro foi modificado, adicionado ou removido.
A aplicação está alojada aqui no GitHub para que outros possam beneficiar dela, bem como permitir que outros contribuam com as suas próprias regras de deteção.
A forma mais simples de instalar o Detector de Exploits Web é como um módulo NPM global: -
npm install -g web_exploit_detector
Se estiver a executar Linux ou outro SO baseado em Unix, poderá ser necessário executar este comando como root (ex.: sudo npm install -g web_exploit_detector).
O módulo deve ser atualizado regularmente para garantir que todas as regras de deteção mais recentes estão presentes. Executar o comando acima irá sempre descarregar a versão estável (testada) mais recente. Para atualizar uma versão já instalada, basta executar o seguinte: -
npm update -g web_exploit_detector
Novamente, poderá ter de usar o comando sudo como acima.
Também pode clonar o repositório Git e executar o script diretamente da seguinte forma: -
git clone https://github.com/polaris64/web_exploit_detectorcd web_exploit_detectornpm installSe instalou o Detector de Exploits Web como um módulo NPM (veja acima), então executar o scanner é tão simples quanto executar o seguinte comando, passando o caminho para a sua raiz web (localização dos ficheiros do seu site): -
wed-scanner --webroot=/var/www/html
Outras opções de linha de comando estão disponíveis, basta executar wed-scanner --help para ver uma mensagem de ajuda a descrevê-las.
Executar o script desta forma produzirá saída legível por humanos na consola. Isto é muito útil ao executar o script com cron, por exemplo, pois a saída pode ser enviada como um e-mail sempre que o script for executado.
O script também suporta a escrita dos resultados num formato JSON mais amigável para computadores para processamento posterior. Para ativar esta saída, veja o argumento de linha de comando --output.
Simplesmente chame o script através do node e passe o caminho para a sua raiz web da seguinte forma: -
node index.js --webroot=/var/www/html
O Detector de Exploits Web também vem com dois utilitários para ajudar a identificar ficheiros que possam ter sido alterados inesperadamente. Um ataque bem-sucedido a um site geralmente envolve a eliminação de ficheiros, adição de novos ficheiros ou alteração de ficheiros existentes de alguma forma.
Um instantâneo (conforme usado por estes utilitários) é um ficheiro JSON que lista todos os ficheiros, bem como uma descrição do seu conteúdo no momento em que o instantâneo foi criado. Se, por exemplo, um instantâneo foi gerado na segunda-feira e o site foi atacado na terça-feira, então executar uma comparação entre este instantâneo e os ficheiros atuais do site mostrará que um ou mais ficheiros foram adicionados, eliminados ou alterados. O objetivo destes utilitários é, portanto, permitir que estes instantâneos sejam criados e que as comparações sejam realizadas quando necessário.
O instantâneo armazena cada caminho de ficheiro juntamente com um hash SHA-256 do conteúdo do ficheiro. Um hash, ou resumo, é um pequeno resumo de uma mensagem, que neste caso é o conteúdo do ficheiro. Se o conteúdo do ficheiro mudar, mesmo de forma muito pequena, o hash tornar-se-á completamente diferente. Isto fornece uma boa forma de detetar quaisquer alterações no conteúdo dos ficheiros.
Os seguintes dois utilitários também são instalados como parte do Detector de Exploits Web: -
wed-generate-snapshot: este utilitário permite gerar um instantâneo para todos os ficheiros (recursivamente) num diretório especificado por "--webroot". O instantâneo será guardado num ficheiro especificado na opção "--output".wed-compare-snapshot: uma vez gerado um instantâneo, este pode ser comparado com o conteúdo atual do mesmo diretório. O instantâneo a verificar é especificado usando a opção "--snapshot". O diretório base a verificar está armazenado no instantâneo, mas se o diretório base tiver mudado desde que o instantâneo foi gerado, a opção --webroot pode ser usada.Os instantâneos podem ser gerados com a frequência necessária, mas, como regra geral, devem ser gerados sempre que um site estiver num estado limpo (não infetado) e sempre que uma alteração legítima for feita. Para sites baseados em CMS como WordPress, os instantâneos devem ser criados regularmente, pois novos carregamentos farão com que o novo estado mude em relação ao instantâneo armazenado. Para sites cujos ficheiros nunca devem mudar, um único instantâneo pode ser gerado e depois usado indefinidamente para garantir que nada realmente mude.
O script src/web-exploit-detector.js é um módulo ES6 que exporta o conjunto de regras como rules, bem como várias funções: -
executeTests(settings): executa o verificador de exploração com base no objeto settings passado. Para utilização, consulte o script index.js.formatResult(result): recebe um único result de teste do array retornado por executeTests() e gera uma string de resultados pronta para saída para esse teste.getFileList(path): retorna um array de ficheiros a partir do path base usando readDirRecursive().processRulesOnFile(file, rules): processa todas as regras do array rules num único file (caminho de string).readDirRecursive(path): função recursiva que retorna uma Promise que será resolvida com um array de todos os ficheiros em e subdiretórios.O script src/cli.js é uma interface de linha de comando (CLI) simples para este módulo, conforme usado pelo script wed-scanner, portanto, ler este script mostra uma forma deste módulo ser usado.
O projeto usa Babel para compilar os módulos ES6 em "src" para módulos JavaScript simples em "lib". Se estiver a executar uma versão mais antiga do Node.js, os módulos podem ser require()'d a partir do diretório "lib".
O pacote contém Babel como uma dependência de desenvolvimento e os scripts "build" e "watch:build". Ao executar o script "build" (npm run build), os módulos ES6 em "./src" serão compilados e guardados em "./lib", onde são incluídos pelos scripts CLI.
O diretório "./lib" está incluído no repositório para que qualquer utilizador possa clonar o repositório e executar a aplicação diretamente sem ter de instalar dependências de desenvolvimento e construir a aplicação.
Por vezes, as regras, especialmente as marcadas com suspicion, identificarão um ficheiro limpo como uma potencial exploração. Devido a isto, um sistema que permite que ficheiros sejam excluídos de serem verificados por uma regra também está incluído.
O script wed-results-to-exceptions recebe um ficheiro de saída do script principal do detector (veja a opção --output) e dá-lhe a escolha de excluir cada ficheiro, um de cada vez, para cada regra específica. Todos os ficheiros excluídos são armazenados num ficheiro chamado wed-exceptions.json (no diretório home do utilizador) que é lido pelo script principal antes de executar a verificação. Se um ficheiro estiver listado neste ficheiro, todas as regras anexadas (por ID) serão ignoradas ao verificar este ficheiro.
Para instruções de utilização, basta executar wed-results-to-exceptions. Primeiro, precisará de ter um JSON de saída válido de uma execução anterior do detector principal usando a opção --output.
Para utilizadores a trabalhar diretamente com o repositório Git, execute node results_to_exceptions.js no diretório raiz do projeto.
A aplicação opera usando uma coleção de "regras" que são carregadas quando a aplicação é executada. Cada regra consiste num ID, nome, descrição, lista de URLs, tags, sinalizador de descontinuação e, mais importante, um conjunto de testes.
Cada teste individual deve ser um dos seguintes: -
Os seguintes tipos de teste são suportados: -
Como as explorações baseadas na web estão em constante evolução e novas explorações estão a ser criadas, o conjunto de regras também precisa de ser atualizado. Como alojo vários sites, estou constantemente a observar novos tipos de explorações, por isso adicionarei ao conjunto de regras sempre que possível. Executo esta ferramenta nos meus próprios servidores, por isso, claro que quero que seja o mais funcional possível!
Isto leva-me às razões pelas quais disponibilizei esta aplicação como um projeto de código aberto: primeiro para que você e outros possam beneficiar dela e segundo para que todos possamos colaborar para contribuir com regras de deteção, de modo a que a aplicação esteja sempre atualizada.
Se descobriu uma exploração que não é detetada por esta ferramenta, por favor contacte-me para me informar ou, melhor ainda, escreva a sua própria regra e adicione-a ao conjunto de regras de terceiros (rules/third-party/index.js) e depois envie-me um pull request.
Não se preocupe se não sabe como escrever as suas próprias regras; o mais importante é que a regra seja adicionada, por isso sinta-se à vontade para me enviar o máximo de informações possível sobre a exploração e tentarei criar a minha própria regra para ela.
As regras são categorizadas, mas a forma mais simples de adicionar a sua própria regra é adicioná-la ao conjunto de regras de terceiros mencionado acima. Os IDs das regras são escritos no seguinte formato: "autor:tipo:sub-tipo(s):id-da-regra". Por exemplo, uma das minhas próprias regras é "P64:php:cms:wordpress:wso_webshell". "P64" sou eu (o autor), "php:cms:wordpress" é o agrupamento (uma regra específica de PHP, para o Sistema de Gestão de Conteúdo (CMS) chamado WordPress) e "wso_webshell" é o ID específico da regra. Ao escrever as suas próprias regras, tente seguir este formato e substitua "P64" pelo seu nome de utilizador do GitHub ou outro ID único.
O projeto contém um conjunto de testes Jasmine que podem ser executados usando npm test. Contém também uma configuração ESLint, e o ESLint pode ser executado usando npm run lint.
Ao desenvolver, os testes também podem ser executados sempre que um ficheiro de origem muda, executando npm run watch:test. Para executar testes e ESLint, pode ser usado o script npm run watch:all.
Note que, a menos que já tenha Jasmine e/ou nodemon instalados, deve executar npm install em modo não produção para garantir que as dependências de desenvolvimento estão instaladas.
Agradecimentos ao utilizador do Reddit mayupvoterandomly por sugerir a funcionalidade de instantâneos de diretório que foi adicionada na versão 1.1.0 e por sugerir novas regras que serão adicionadas em breve.
Licença ISC
Copyright (c) 2017, Simon Pugnet
É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos ficheiros de documentação associados (o "Software"), para lidar com o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, modificar, fundir, publicar, distribuir, sublicenciar e/ou vender cópias do Software, e para permitir que as pessoas a quem o Software é fornecido o façam, sujeitas às seguintes condições:
O aviso de copyright acima e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM FIM ESPECÍFICO E NÃO VIOLAÇÃO. EM NENHUM CASO OS AUTORES OU TITULARES DE DIREITOS DE AUTOR SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, QUER EM AÇÃO DE CONTRATO, ATO ILÍCITO OU OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.
path