Galera, neste post vamos ver como criar uma assinatura customizada de IPS, para detectar um ataque de XSS em uma aplicação web atrás do Fortigate.
OBs: O melhor método de proteger aplicações WEB é o Fortiweb, mas, sabemos que nem sempre é possível a compra ou a mesma pode levar um tempo muito grande e estaremos vulnerável durante esse processo.
Chega de blah blah blah e vamos escovar uns bits rsrsrs.
Vamos ao problema:
Temos um site que é vulnerável a XSS em nosso ambiente, excluindo a possibilidade de alteração e correção da vulnerabilidade direta na aplicação, nos resta colocar algo na frente para corrigir o problema, a vulnerabilidade ocorre no campo de busca de nossa aplicação, acessível do mundo externo, a url vulnerável é :
http://ip_aplicacao/index.php?busca=
Fazendo um simples teste para checar a vulnerabilidade.
http://ip_aplicacao/index.php?busca=
Começando com a sintaxe da nossa assinatura:
F-SBID = Esse é um padrão da Fortinet para identificar uma assinatura customizada.
–attack_id = numero da nossa assinatura deve ser um numero alto não usado em outras assinatura (não é obrigatório)
–name = Nome da nossa assinatura
–protocol = Protocolo para dar match em nossa assinatura, ex: TCP ou UDP
–service = Seria SMTP ou HTTP
–parsed_type = São partes do pacote ou sessão que podem ser separadas pelo decoder, ex: HTTP_GET ou HTTP_POST entre outros
–context = É utilizado para especificar qual campo do protocolo a engine do IPS deve procurar o conteúdo do –pattern
–pattern= É utilizado para definir qual conteúdo deve dar match na assinatura, pode utilizar texto ou binário com o uso do | seguido do valor em hexadecimal.
–pcre = É utilizado par inserir conteúdo utilizando a engine de regex do per.
Existem outras centenas de opções bem documentadas que podem ser encontradas em IPS Signature Syntax Guide.
Para criar nossa nossa regra vamos em Security Profiles > IPS Signatures > Create New
Vamos ver como vai ficar a nossa regra:
F-SBID( --attack_id 5100; --name "XSS.MySite"; -- protocol tcp; --service HTTP; --parsed_type HTTP_GET; --context host; --context uri; --pattern "arquivo.php?busca"; --pcre "/((\%3C)|<)((\% 2F)|\ / )*[ a -z 0-9\ %]+((\%3E)|>)/i";)
Explicando a regra:
— protocol tcp; //como é http nosso protocolo só poderia ser TCP
–service HTTP; // Auto explicativo.
–parsed_type HTTP_GET; // Os dados são enviados via GET para a aplicação (o payload do nosso XSS está na url)
–context host; // Os dados são enviados do usuário ao servidor
–context uri; // Procura o conteúdo da nossa assinatura dentro da URL
–pattern “arquivo.php?busca” // Para evitar falsos positivos estou limitando a URL de busca da nossa assinatura.
–pcre “/((\%3C)|<)((\% 2F)|\ / )*[ a -z 0-9\ %]+((\%3E)|>)/i”; // Esse conteúdo é uma expressão regular e vamos dividi-la para entendermos melhor.
((\%3C)|<) // Procura o sinal de “<” ou seu equivalente em HEX.
((\% 2F)|\ / ) // Procura pela “/” ou seu equivalente em HEX.
*[ a -z 0-9\ %]+ // Gera um regex como um coringa para qualquer coisa de “a” a “z” e de “0” a “9” .
((\%3E)|>) // Procura sinal de “>” ou seu equivalente em HEX.
/i //E por ultimo o nosso “/i” para informar que a regex não será case sensitivo (valendo assim para caracteres maiúsculos e minúsculos)
Agora com a nossa regra pronta vamos adiciona-la a um Profile de IPS.
Vamos em Security Profiles > Intrusion Protection > IPS Sensors > Create News
Adicionamos um nome ao nosso Profile e selecionamos a nossa regra criada anteriormente.
E vamos definir a mesma como bloqueio.
Agora temos que adicionar a nossa regra de entrada (VIP) da aplicação a qual desejamos proteger.
Após isso vamos verificar em nosso log o que ocorre.
Funcionou como esperado.
Lembrando que essa assinatura é simples e não contempla nenhuma proteção contra bypass utilizando as inúmeras técnicas disponíveis na internet(isso fica para um outro post), mas, já barra vários scriptkids 🙂 Essa assinatura é especifica para essa falha e não contempla por exemplo a inserção do payload já dentro de uma tag javascript.
Abs.
https://www.trtec.com.br/produtos/fortinet/index.php