Você está na página 1de 22

ShellterLabs

WEB

Os desafios web vo testar o seu conhecimento em segurana de aplicaes web. Para resolver os
desafios nessa categoria, voc deve entender os conceitos bsicos de como uma aplicao web
funciona, os protocolos usados, os tipos de requisices e configuraes.

Uma das primeiras coisas que voc deve fazer ao se deparar com uma aplicao web "examinar" a
aplicao. Isso significa que voc deve navegar por todos os links para descobrir sobre o que ,
quais funcionalidades possui, quais partes so dinmicas e o que pode ser explorado. Alm disso,
voc deve sempre lembrar de olhar o cdigo fonte da pgina.

Em geral, voc apenas precisa clicar com o boto direito na pgina e escolher "visualizar cdigo
fonte".

Isso ir abrir uma nova aba com o cdigo fonte. Na maioria dos casos, ser necessrio ver em um
formato melhor ou verificar um elemento especifico.

Para fazer isso, apenas clique com o boto direito no elemento e selecione "inspecionar elemento".

Isso ir abrir uma tela com o cdigo fonte, destacando o elemento que voc clicou. Se voc colocar
o ponteiro do mouse sobre os elementos e tags do cdigo fonte, ele ir destacar o elemento referente
na pgina. Voc tambm pode editar elementos HTML, mas estas mudanas s refletem localmente.

O cdigo fonte de uma aplicao pode esconder muitas informaes importantes. Verifique o
cdigo fonte por comentrios que os desenvolvedores possam ter esquecido, veja se voc consegue
pegar alguma informao que no visvel para o usurio final, como inputs escondidos.

Tente voc. Existe algo escondido nessa pgina.

Outra coisa que voc deve sempre checar o arquivo robots.txt. Este um arquivo texto que
comumente utilizado por engines de busca, web crawlers e robs de busca. um padro utilizado
por web sites para determinar quais pastas e pginas devem ou no ser indexadas pelos sites de
busca, como o Google. Ento se voc encontrar algo como:

User-agent: *
Disallow: /admin
Disallow: /scripts
Allow: /site
Allow: /misc

Talvez se voc abrir o caminho admin e scripts voc encontre algo interessante.

Cookies tambm devem ser olhados... E ns no estamos falando de comida aqui. :-) Cookies
geralmente so usados para armazenar dados no navegador do usurio, normalmente especfico a
aquele visitante. Web sites so sem estado, ento os cookies fornecem um tipo de memria para os
sites. Pode ser usado para uma variedade de propsitos como: manter voc logado, salvar as
preferncias que voc definiu e lembrar a prxima vez que voc retornar, ajudar os anunciantes a
rastrear seus interesses.

Desenvolvedores devem usar os cookies com cuidado, considerando que cookies podem ser
perigosos se usado incorretamente. Eles podem revelar dados confidnciais e privados de uma
sesso, podem contribuir para burlar as restries de segurana, entre outros. Como os cookies so
armazenados no lado do cliente, eles so vulnerveis a manipulao.

Para entender o conceito de cookies, ns devemos ter um conhecimento bsico do protocolo HTTP.
HTTP (Hyper Text Transfer Protocol) um protocolo orientado a requisio-resposta que
especifica a comunicao entre o navegador e o servidor web.

Para entender cada campo usado pelo cabealho HTTP, leia mais em:
https://pt.wikipedia.org/wiki/Lista_de_campos_de_cabealho_HTTP.

No 1 uma nica pgina requisitada ao servidor com o referenciador (referer) para o host
http://shellterlabs.com/. O servidor, como podemos ver no 2, define um cookie com a flag de
notificao como verdadeira e o tempo em que aquele cookie ir expirar. Quando um usurio
requisita outra pgina, o navegador l o cookie e envia o cabealho com a flag de notificao no
cookie como verdadeira, assim como foi definido anteriormente.

Voc pode dizer: Tudo bem, mas isso apenas uma flag de notificao. O que tem de errado?

Alguns web sites definem restries de segurana no cookie. Ento ns podemos mudar para burlar
alguma autenticao.
Por exemplo:
Aqui ns tentamos acessa a pgina de administrao, mas no permitido. Prestando ateno ao
cookie, existe uma flag ofuscada, aXNhZG1pbj1mYWxzZQ==.

Ento, ao desofuscar, ns teremos:

>> shellter$ python -c 'import base64; print(base64.b64decode("aXNhZG1pbj1mYWxzZQ=="))'


>> isadmin=false

Desta forma, ns precisamos interceptar a requisio, mudar a flag isadmin para verdadeiro, ento
codificar com base64 novamente e encaminhar para o servidor. Com isso possvel dizer para o
servidor web que ns somos o administrador e acessar a pgina requisitada, burlando a restrio.

Em alguns momentos interessante ter uma ferramenta para interceptar as requisies. Estas
ferramentas agem como um proxy entre voc e o web site que voc est navegando. Ela permite que
voc intercepte, inspecione e modifique os cabealhos e parametros HTTP/HTTPS. Isto muito til
durante a anlise da segurana de uma aplicao web.

Algumas das ferramentas mais utilizadas so:

BurpSuite
Da pgina oficial: "Burp Suit uma plataforma integrada para realizar testes de segurana
em aplicaes web. Suas vrias ferramentas trabalham juntas perfeitamente para suportar o
processo completo de testes, do mapeamento inicial e anlise da superficie de ataque da
aplicao, at encontrar e explorar as vulnerabilidades web.". Existem duas edies: Gratuita
e Profissional. A edio gratuita deve atender as suas necessidades.

Website: https://portswigger.net/burp/
TamperData Plugin
uma extenso gratuita do Mozilla Firefox para rastrear, gravar e modificar requisies
HTTP/HTTPS.

Website: https://addons.mozilla.org/en-US/firefox/addon/tamper-data/
OWASP ZAP
Da pgina oficial: "O OWASP Zed Attack Proxy (ZAP) um das ferramentas gratuitas mais
populares do mundo e ativamente mantida por centenas de voluntrios internacionais. Ele
pode te ajudar a automaticamente encontrar vulnerabilidades em suas aplicaes web
enquanto voc desenvolve e testa suas aplicaes. Ele tambm uma tima ferramenta para
pentesters experientes para utilizar em testes de segurana manuais."

Website: https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project
Para fazer qualquer coisa com o Burp, primeiro voc precisa configurar o seu navegador. Ao
executar a ferramenta, uma porta local aberta no seu sistema (padro 8080), ento voc deve
mudar as configuraes de proxy do seu navegador para usar o endereo de proxy 127.0.0.1 e a
porta 8080. Aps fazer isso, todo o seu trfego ir passar atravs do Burp enquanto voc navega.
Tente voc. Com o Burp rodando, acesse qualquer pgina HTTP no seu navegador configurado.

Voc ir perceber que o seu navegador ficar aguardando a requisio completar. Isso ocorre porque
o Burp interceptou a requisio. You will see that your browser will be waiting the request to
complete. This occurs because Burp intercepted the request.

No Burp, v para a aba Proxy e ento para a sub aba Intercept. Voc ir ver a requisio exibida no
painel principal. Voc pode escolher entre: Encaminhar a requisio, para enviar a requisio para
o destino, Drop, para descartar ou desligar o Intercept para navegar normalmente.
Tente desabilitar o Intercept

Volte para o navegador. Voc ir ver que a requisio foi processada normalmente.
Por favor, acesse: https://support.portswigger.net/customer/portal/articles/1783075-installing-burp-
s-ca-certificate-in-your-browser para instrues em como installar o certificado do Burp no seu
navegador, para que seja possvel navegar em sites HTTPS atravs do Burp.

Enquanto navega, cada requisio feita interceptada pelo Burp (considerando que voc est com o
Intercept habilitado). Na aba Intercept voc pode no s visualizar a requisio como tambm
modificar. Isto uma funcionaliadde bem interessante e que voc ir usar logo logo.

O Burp possui mais funcionalidades (incluindo, mas no limitado a):


Spider - Pode ser usado para automaticamente mapear uma aplicao, para descobrir seu
contedo e funcionalidade.
Scanner - usado para automaticamente escanear requisies HTTP para encontrar
vulnerabilidades..
Intruder - Permite que voc realize ataques automticos customizados, para carregar todos
os tipos de tarefas de teste..
Repeater - usado para manualmente modificar e reenviar requisies HTTP de novo e de
novo.
Sequencer - usado para analizar a qualidade da aleatoridade dos tokens de sesso de uma
aplicao.
Decoder - Permite que voc transforme bits de dados da aplicao usando mtodos comuns
de codificao e decodificao.
Comparer - Este usado para realizar uma comparao visual dos bits de dados da
aplicao para encontarr diferenas interessantes.

Algum destes s esto disponveis na Edio Profissional

Voc pode pegar mais informaes sobre o Burp em: https://portswigger.net/burp/help

Desafio:
Agora sua vez! Voc aprendeu o suficiente para completar esses simples desafios. V em frente.
Desafio web de introduo 1:
Como ns comentamos anteriormente, existe algo escondido nessa pgina. Voc encontrou?
Complete o desafio!
<!-- Parabns, voc encontrou o comentrio escondido. Aqui est o link para o
prximo desafio: https://shellterlabs.com/pt/welcome/lesson-2/web-application-
basics/hidden-admin/ -->

Desafio web de introduo 2:


V para o endereo que voc encontrou no nosso cdigo fonte e complete o desafio usando
alguma das coisas que voc aprendeu nessa lio. Encontre o diretrio escondido do
administrador e acesse como admin. Nota: voc no precisa de um usurio e senha.
A Arte da Engenharia reversa

Voc sabe o que acontece quando um programa instalado ou simplesmente executado? Como um
programa verifica cdigos de validao? Como algum poderia passar por cima destas verificaes?
Como algum poderia entender os detalhes mais obscuros de uma vulnerabilidade de forma a
conseguir explor-la ou corrigi-la. Qual o comportamento de um malware no sistema? As
respostas para estas e muitas outras questes, voc entrar atravs da Engenharia Reversa.

A arte da Engenharia Reversa de Software, mais conhecida como Reversing, trata-se de descobrir
o que est acontecendo com um programa sem ter em mos o cdigo fonte. Isto pode ser alcanado
atravs de uma anlise dinmica ou esttica.

Para dominar o tpico, imprescindvel o conhecimento da programao de baixo nvel, arquitetura


de computadores, sistemas operacionais, compiladores e linguagens assembly. Voc tambm deve
se familiarizar com ferramentas como debuggers, decompiladores, de monitoramento de sistema, e
disassemblers.

Nesta lio ns apresentaremos apenas o bsico da engenharia reversa, mas suficiente para voc
comear a resolver algumas questes.

Os comandos FILE e STRINGS


Um timo comeo, antes at mesmo de executar a aplicao, tentar criar algumas hipteses de
como o programa funciona.

Lembre-se:
Quando estiver analisando um malware ou algum exploit, faa em um ambiente controlado, como
uma mquina virtual ou um computador que no seja crtico para voc. Desta forma, se algo sair
fora de controle, ser mais fcil de recuperar!

Existem dois comandos que devem sempre ser usados: file e strings.

file um comando que determina o tipo do arquivo. file executa uma sequncia de testes para tentar
classficar o arquivo. O processo de engenharia reversa depende do tipo de arquivo e de qual
arquitetura (32 bits ou 64 bits) ele foi construdo. Entretanto, voc deve saber que este comando
nem sempre dar o resultado correto. file executa 3 tipos de testes na seguinte ordem: teste de
filesystem, teste do magic number e testes de linguagem. O primeiro teste que for feito com sucesso
ser a sada impressa pelo comando, e estas informaes podem ser falsificadas, principalmente o
magic number. No confie em tudo cegamente.

strings imprime as strings de caracteres imprimveis contidos no binrio do arquivo, e algumas


vezes, os binrios contm informaes sensveis, ou algo que lhe ajudar no processo de engenharia
reversa, como nomes de bibliotecas sendo usadas e textos do programa. Vale a pena utilizar este
comando e analisar com ateno os resultados.

Antes de seguirmos em frente, teste executar os comandos que acabamos de mencionar no


programa disponibilizado no desafio a seguir. O que voc consegue dizer sobre o arquivo sem
execut-lo? Ele 32 bits ou 64? Existe alguma string sensvel?
https://shellterlabs.com/en/welcome/lesson-3/art-reverse-engineering/hnr4-rev101/

Aps executar o comando file, podemos ver que se trata de um executvel do tipo ELF, e compilado
para 64 bits.
Leia mais sobre o ELF aqui: http://www.thegeekstuff.com/2012/07/elf-object-file-format/

Voc pode ver tambm muito mais informaes que sero teis durante a engenharia reversa mas
ns no entraremos em detalhe agora.

Como mencionamos, strings vai mostrar todo os caracteres que podem ser exibidos no binrio. Ao
ver esses textos, deve te dar uma ideia do que o binrio foi feito. Voc pode ver mensagens como
"Usurio Correto", "Senha Correta" e tambm "Tente Novamente".

Ento, quando voc digita o usurio ou senha, o programa provavelmente vai verificar o que voc
digitou e ento retornar uma dessas mensagens. O usurio e a senha esto embutidos no cdigo, o
que significa que o usurio e senha corretos j se encontram o binrio. Voc pode encontr-los
apenas olhando para o resultado do comando strings? Caso no, no se preocupe, daqui a pouco ns
iremos ajudar voc a encontrar.

Linguagem Assembly
Uma vez que voc sabe algo sobre o arquivo, hora de mergulhar no executvel e descobrir o que
realmente faz. Disassemblers e debuggers vo ser seus melhores amigos nessa etapa. Mas para
entender o que essas ferramentas esto dizendo, voc primeiro deve aprender a linguagem deles.

Ns costumamos dizer que a Linguagem Assembly a linguagem da Engenharia Reversa e o


motivo porque quando se est trabalhando em projetos de engenharia reversa, a maioria das vezes
ser a nica coisa que voc ter que trabalhar. Primeiro, voc deve lembrar que Assembly no o
nome de uma nica linguagem mas o nome de um conjunto de linguagens. Cada arquitetura
diferente possui uma linguagem Assembly ligeiramente diferente.

Quando voc escreve um software, o processo de compilar ir transformar o cdigo fonte que voc
escreveu nessa linguagem de baixo nvel que pode ser entendida pelos computadores. Linguagens
como C/C++ so diretamente traduzidas para o Assembly, enquanto linguagens como Java e C# so
traduzidas para outras linguagens: Java Bytecode no caso do Java e Microsoft Intermediate
Language (MSIL) no caso do C#. O que vai ser interpretado por suas respectivas mquinas
virtuais.

A ideia por trs da mquina virtual fazer com que o cdigo seja compatvel com qualquer
plataforma, j que o cdigo ser compilado para o cdigo da mquina virtual e apenas interpretado
pela mquina virtual para o computador que estiver.

A Engenharia Reversa nessas duas ltimas linguagens so completamente diferentes do C/C++.


Porque estas linguagens que usam mquina virtual contm muitos detalhes do programa, podem ser
decompiladas em um alto nvel de preciso, tornando mais fcil de ler o cdigo fonte original.

Nesta lio ns iremos focar em uma linguagem assembly chamada MIPS e IA-64. Essa
linguagem comumente utilizada em sistemas embarcados como roteadores, videogames como
Nintendo 64, Sony Playstation, entre outros.

Para entender at o mais bsico da linguagem assembly, voc precisa primeiro entender o que so
registradores. O conjunto de registradores de cada linguagem assembly pode ser diferente, mas os
conceitos so essencialmente os mesmos. Os registradores so usados em conjunto com as
instrues que ns iremos ver mais tarde.
Alguns dos Registradores de CPU comuns so descritos abaixo:
EIP: Instruction Pointer - Guarda o endereo de memria da prxima instruo a ser
executada. O CPU olha para ele quando precisa saber o que fazer a seguir. Voc ir ver
bastante esse registrador.
ESP: Stack Pointer - Responsvel por guardar a referncia para o topo da pilha. Em outras
palavras, o ltimo item na pilha.
EBP: Base Pointer - utilizado para "caminhar" pela pilha.
EAX: Tambm chamado de "Acumulador", normalmente utilizado para operaes
aritimticas e para guardar resultados.
EBX: o registrador "Base", normalmente utilizado para armazenar dados em geral e
endereos de memria.
ECX: o registrador utilizado para "Contagem". O nome fala por si s. utilizado como
um contador, principalmente para controlar loops/iteraes.
EDX: Este o registrador de dados e utilizado para armazenar o endereo de uma varivel
na memria.
ESI/EDI: Respectivamente "ndice de Origem" and "ndice de Destino" so menos
utilizados do que os registradores anteriores. Normalmente so usados para transferir dados,
com o ESI armazenando o endereo de origem de uma varivel e o EDI armazenando o
endereo de destino. Eles no podem ser acessados a nvel de byte.

Agora vamos ver um exemplo de uso destes registradores no MIPS.

O add uma instruo aritmtica responsvel por adicionar dois nmeros e salv-los no registrador.
Por exemplo:

Cdigo C:
A = B + C;

Cdigo MIPS:
add $s0, $s1, $s2

Adiciona contedo de $s1 e $s2, armazenando o resultado em $s0.

Tambm existem instrues de comparao como slt e instrues de salto/jump como j.

Instrues de comparao, comparam dois valores e colocam o resultado em um registrador. slt


representa menor que. Por exemplo:
slt $t0, $t1, $t2

O primeiro registrador $t0 o destino, em outras palavras, o registrador no qual o resultado ser
armazenado. O segundo e terceiro registradores so comparados com menor que:
$t1 < $t2

O resultado vai ser 1 se a comparao for verdade e 0 se a comparao for falsa.

A maioria das linguagens de programao modernas so capazes de lidar com declaraes


condicionais como a estrutura se-ento-seno e aes repetidas como loops/iteraes. As
instrues de mquina do processador no possuem essas estruturas, e nem a linguagem assembly.
Ao invs disso, elas possuem suporte para saltos condicionais and inconditionais, que so
basicamente declaraes goto para controlar o fluxo de um programa.

Lembre-se:
Pulos incondicionais sempre ocorrem. No existem condies a serem verificadas.

No MIPS, um pulo condicional chamado de branch. Ns temos diversas instrues jump no


MIPS, como um exemplo, ns temos j.

j significa simplesmente: pule para um endereo.

Mas ns tambm temos jr, que significa: pule para um endereo contido em um registrador.
j alvo # pulo incodicional para o alvo/rtulo do programa
jr $t3 # pule para o endereo contido em $t3

Siga estes links se voc quiser mergulhar na linguagem MIPS e aprender mais instrues:
http://mescal.imag.fr/membres/vania.marangozova-
martin/TEACHING/NACHOS/NACHOS_DOC/04-MIPSintro.pdf
https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/ # MIPS ISA Programming
http://alumni.cs.ucr.edu/~vladimir/cs161/mips.html

Aps voc aprender um pouco mais, veja se voc capaz de entender o que est acontecendo nesse
programa:
https://shellterlabs.com/en/welcome/lesson-3/art-reverse-engineering/mips/

Ferramentas
Disassemblers pegam os executaveis como entrada e devolvem o cdigo assembly equivalente para
voc. Aqui voc ir testar o seu conhecimento em linguagens assembly. Com o cdigo em suas
mos, voc pode aprender sobre o funcionamento interno da aplicao mas algumas partes podem
no ser analisadas apenas por usar um disassembler ou o cdigo esttico que retorna. Estas so as
partes dinmicas do cdigo, aquelas que realmente existem durante o tempo de execuo. a que
outra ferramenta toma lugar, o: debugger.
Ao executar a aplicao em um debugger, voc ser capaz de capturar o seu fluxo de execuo,
identificar areas interessantes e criar alguns pontos de pausa (breakpoints) com o objetivo de parar a
execuo da aplicao e analisar o estado no momento daquela pausa. Muitos debuggers do a
capacidade de mudar os dados utilizados pela aplicao. Muitos debuggers tambm vm juntos com
disassemblers. Dependendo do propsito no qual voc est realizando a engenharia reversa, voc
pode inclusive mudar o seu cdigo em tempo real.
GDB: GDB, o GNU Project debugger, permite que voc veja o que est "dentro" do
programa enquanto o executa -- ou o que o programa est fazendo no momento que deu
erro. https://www.gnu.org/software/gdb/
OllyDBG: O OllyDbg um debugger 32-bit de nvel assembler para Microsoft
Windows. Com nfase na anlise do cdigo binrio, torna-se particulamente til quando o
cdigo fonte est indisponvel. http://ollydbg.de/
Immunity Debugger: O Immunity Debugger uma nova forma poderosa para escrever
exploits, analisar malwares, e realizar a engenharia reversa em arquivos binrios.
construdo em uma slida interface grfica, a primeira ferramenta de anlise heap da
industria construda especificamente para criaao de heap, e uma API Python grande e bem
suportada para fcil extensibilidade. https://www.immunityinc.com/products/debugger/
IDA: O IDA Disassembler e Debugger um disassembler interativo, programvel,
extensvel, multiprocessador, capaz de rodar em Windows, Linux ou Mac OS X. O IDA se
tornou o padro para anlise de cdigos maliciosos, pesquisa de vulnerabilidade e validao
de softwares comerciais. https://www.hex-rays.com/products/ida/
ObjDump: Do manual objdump exibe informaes sobre um ou mais arquivos. As opes
controlam qual informao em particular deve ser mostrada. Essa informao em grande
parte til para programadores que esto trabalhando nas ferramentas de compilao, opondo-
se a programadores que apenas querem que seu programa compile e funcione.
Radare2: O projeto Radare iniciou como uma ferramenta forense, um editor hexadecimal
capaz de abrir arquivos de disco. Mais tarde, passou a suportar anlise de binrios,
disassemble de cdigo, debug de programas e etc.. https://github.com/radare/radare2

Praticando com o GDB


Vamos tentar executar nosso programa com o GDB e ver o que ns temos.
root@kali:~# gdb ./rev001.bin

Primeiramente, voc pode tentar apenas executar o binrio seguindo o fluxo normal sem nenhuma
interao. Para fazer isso, apenas digite r ou run.
Ok. Agora o que ns estamos tentando fazer descobrir o que seria o nome de usurio correto.
Um bom ponto de partida seria ler o cdigo assembly desse binrio. Para fazer isso, dentro do GDB
digite disassemble main.

Ao olhar para o cdigo, ns conseguimos identificar em (1) o primeiro retorno do programa, que
deve ser a mensagem de boas vindas. Ento, ns temos outro retorno em (2), que a mensagem de
usurio. Em (3) voc identifica o mtodo scanf, que ir ler o que voc digitar. Agora chegamos na
parte interessante. Voc j digitou o usurio e o programa deve decidir se voc digitou corretamente.
No endereo 0x000000000040069c chamado o mtodo strcmp. E antes de chamar o mtodo, deve
ser definido os 2 parmetros. Esses parmetros so o texto que voc digitou e o usurio a ser
comparado com esse texto. Um copiado para o registrador %rdx, e o outro para o registrador
%eax. Vamos ver se ns conseguimos ler o que so estes registradores durante a execuo.

Primeiramente, eu irei definir um ponto de pausa no endereo 0x000000000040069c, isso logo


antes de chamar o mtodo para comparar os dois textos e eles j esto definidos para os seus
respectivos registradores. Um ponto de pausa (breakpoint) significa que a execuo alcanou esse
endereo de memria e ir parar e aguardar pelo meu prximo comando.

Para definir o ponto de pausa in GDB, use o comando b *addr. Defina o ponto de pausa e execute
o programa com o comando r.

Quando voc atingir o ponto de pausa, uma mensagem ser exibida e o GDB ir aguardar pela sua
prxima interao. Tudo o que ns precisamos fazer agora ler os valores nesses registradores
atravs dos comandos x/s $rax e x/s $rdx

Agora que ns sabemos o contedo do $rax, user, o que ns digitamos quando fomos
perguntados pelo usurio. Ento, o contedo do $rdx, elliot, que deve ser o usurio que o
programa estava esperando.

Vamos tentar. Digite r para executar o programa novamente, digite o usurio que voc encontrou
no $rdx e quando voc atingir o ponto de pausa, apenas digite c ou continue.
Bom trabalho! Voc pegou o nome correto do usurio. Voc pode prosseguir e realizar o mesmo
para encontrar a senha? Fac esse exerccio mesmo se voc j tenha encontrado atravs do comando
strings anteriormente.

Desafio:
https://shellterlabs.com/en/welcome/lesson-3/art-reverse-engineering/it-rules/
https://shellterlabs.com/en/welcome/lesson-3/art-reverse-engineering/mips/
https://shellterlabs.com/en/welcome/lesson-3/art-reverse-engineering/do-dump/
https://shellterlabs.com/en/welcome/lesson-3/art-reverse-engineering/hnr4-rev101/

Leitura Adicional:
Reversing - Secrets of Reverse Engineering
The Art of Debuggingwith GDB, DDD, and Eclipse
https://www.gitbook.com/book/radare/radare2book/details
https://github.com/pwntester/cheatsheets/blob/master/radare2.md
IDA Pro Book, 2nd Edition
http://mescal.imag.fr/membres/vania.marangozova-
martin/TEACHING/NACHOS/NACHOS_DOC/04-MIPSintro.pdf
https://www.sans.org/reading-room/whitepapers/malicious/basic-reverse-engineering-
immunity-debugger-36982
http://www.thegeekstuff.com/2012/07/elf-object-file-format/
http://www.csee.umbc.edu/portal/help/architecture/aig.pdf
Entendendo a Criptografia

Essa lio deve ser um ponto de partida no mundo da criptografia. Este um tpico profundamente
matemtico e analtico, e na rea de segurana ns o vemos mais como se fosse uma "ferramenta"
de suporte. Ns iremos fornecer uma breve viso geral para que voc possa comear a resolver
questes bsicas nesse assunto. Para resolver os desafios dessa categoria, voc deve se familizarizar
com os mtodos mais populares e o bsico da criptografia clssica.

A palavra Criptografia vem do Grego, sgnificando "escrita escondida", e o que ns vamos comear
a aprender aqui a arte da criptoanlise, que significa, a arte de decifrar.
O principal uso da criptografia na vida real garantir a parte da confidencialidade na trade de
segurana (confidencialidade, integridade, disponibilidade). O que significa proteger seus dados de
serem lidos/acessados por algum que no deveria. Mas, como a maior parte das coisas na vida, ela
pode ser usado para o bem e para o mal.

Quando voc se autentica em um website, voc no quer que ningum observando a rede possa ver
sua senha sendo transmitida ao destino, e a onde o Hyper Text Transfer Protocol Secure (HTTPS)
entra. A camada extra usando SSL/TLS no protocolo HTTP cria uma conexo encriptada entre o
cliente e o servidor, evitando que pessoas possam bibliotar seu trfego e ver suas senhas ou outros
dados sensveis que possam estar sendo trafegados.

Voc tambm usa a criptografia para proteger os dados digitais em seu computador. Se voc carrega
dados sensveis, voc no quer que esse dado seja acessado por estranhos no caso de voc perder ou
ser roubado. Isso tambm se aplica aos smartphones. Hoje em dia, a maioria dos smartphones vm
criptografados por padro, o que significa que se algum tentar acessar o disco do seu celular, ele
no vai ter acesso aos dados. Um caso como esse esteve recentemente na mdia, quando o FBI no
estava conseguindo acessar os dados dos smartphones dos atiradores de San Bernadino [1].

Os criminosos tambm usam muito a criptografia nos conhecidos malwares. Hoje em dia, a maioria
das grandes empresas possuem muitos sistemas de proteo, como Firewalls, IPS e IDS, mas muitas
destas solues no podem fazer muito se no conseguem ler o que est sendo transmitido na rede.
Ento, se voc tentar transmitir um payload atravs da rede, as solues de segurana
provavelmente vo pegar facilmente, mas os atacantes podem dificultar um pouco se a conexo
estiver criptografada.

Em CTFs, no entanto, a grande parte das criptografias de alto nvel no so geralmente usadas. Em
alguns casos, voc vai ver alguns mtodos de criptografia "caseiros", que voc pode reverter, ou
ento alguns mtodos j conhecidos e que tudo o que voc precisa fazer alimentar em alguma
ferramenta online para encontrar a resposta. Normalmente, a parte mais difcil em desafios de
criptografia descobrir que tipo de criptografia est sendo usada. Ns veremos aqui algumas das
tcnicas clssicas e como elas funcionam.

Ok, vamos comear.

CODIFICAO BSICA
Comeando com realmente bsico, considere a tabela abaixo:
Onde cada letra atribuda a um nmero entre 65 e 90. Essa a representao das letras maisculas
em nmeros decimais. Portanto, qualquer mensagem pode ser reescrita usando nmeros. Por
exemplo:
GO AHEAD AND CRACK IT

equivalente a:
717932657269656832657868326782656775327384

No comeo pode parecer confuso, mas voc deve notar que existem apenas nmeros decimais, sem
letras ou caracteres especiais. Se voc olhar atentamente e dividir os nmeros, vai ficando mais
claro. Separando os dois primeiros nmeros 71, de acordo com a nossa tabela, ele equivalente a G.
O prximo 79, que equivalente a O, e assim por diante. Isso chamado Tabela ASCII [2] e o que
ns fizemos foi a codificao do texto ASCII para a sua respectiva representao decimal e depois
decodificamos de volta a partir do decimal.

Observe que a nossa tabela consiste apenas de letras maisculas. E se ns tambm tivssemos letras
minsculas? Como ficaria a nossa tabela? Tente descobrir.

Neste caso, um nmero decimal estava relacionado com a letra. Outra forma comum de encode que
funciona de forma similar e que voc ver com frequncia so: octal, decimalm hexadecimal e
HTML.
Existem muitos websites que fazem a codificao e decodificao automaticamente para voc. No
entanto, importante saber como funciona e, em alguns CTFs, voc pode estar participando sem
acesso a internet. Para uma tabela de fcil acesso, tente digitar no seu terminal:
$ man ascii

Hora do desafio
Voc percebeu que a nossa tabela contm apenas letras maisculas? E se ns tambm
tivssemos letras minsculas? Como seria a nossa tabela? Tente descobrir.
Voc consegue desenvolver um programa que codifica e decodifica strings no formato octal,
decimal e hexadecimal?
Ganhe alguns pontos: ASCII Encoding
Codificao Base64
Outro famoso mtodo de codificao o chamado base64. Esse mtodo til para codificar
arquivos em um formato ASCII. Ele no um mtodo de criptografia mas muito utilizado para
codificar e transferir dados por no possuir caracteres especiais como %$!; ou qualquer outro
caractere no ASCII, que poderia quebrar alguns softwares.

Esse mtodo consiste em pegar trs bytes, dividir estes bytes em quatro grupos de seis bits. Cada
conjunto de seis bits pode ser de 0 a 63, que , 64 possveis valores (da a origem do nome do
mtodo). Ento, a codificao em base64 utiliza a seguinte tabela:

possvel que ao codificar, voc no consige obter trs bytes. Neste caso, necessrio preencher o
contedo da mensagem. Isso pode ser realizado usando o smbolo de preenchiment =.

Vamos codificar a palavra SHELLTER usando base64 como um exemplo.

Primeiro de tudo, ns precisamos obter os binrios dos caracteres que ns queremos codificar:

Se ns pegarmos todos os binarios juntos, ns iremos obter um total de 64bits. Ns os dividimos em


3 bytes (blocos de 24 bits). O leitor atento j percebeu que ns no temos bits suficientes para 3
bytes, e o ltimo bloco vai ter apenas 16 bits, ento ns precisamos preencher o resto dos bits
faltantes adicionando 0s a direita.
010100110100100001000101 010011000100110001010100 0100010101010010

Depois disso, ns dividimos cada um destes blocos em pedaos de 6 bits cada, ento todos eles
podem ficar entra 0 at 63, como mencionado anteriormente. After that, we split each of these
blocks in chunks of 6 bits each (1byte), so they can all be on the range from 0 to 63, as we
mentioned earlier.

Ento ns teremos os conjuntos como este:


010100 110100 100001 000101 010011 000100 110001 010100 010001 010101 001000 000000

Agora ns iremos converter cada byte em base64 usando a tabela.

Ento, a palavra SHELLTER codificada em base64 seria:


U0hFTExURVI=

Outros mtodos similares que voc deve verificar so Base32 e Base16 [3].

Hora do desafio
Voc consegue escrever um programa que codifica e decodifica o texto de/para Base64?

Ganhe alguns pontos: Base64 Encoding

Cifra de Deslocamento (Shift) / Cifra de Csar


Uma cifra muito famosa e clssica a cifra de Csar. Ela foi criada em tempos antigos e utilizada
para proteger mensagens militares. Como o nome diz, cifra de desolocamento desloca ou rotaciona
as letras, e ela pode ser um deslocamento de qualquer nmero. Nos tempos de Jlio Csar, a cifra
foi usada com deslocamento de 3 caracteres, mas hoje em dia o termo Cifra de Csar se refere a
todas as variantes (deslocamentos/rotaes) desse sistema. O deslocamento mais comum usada hoje
em dia o rot-13. [4]

Em um deslocamento de 3, por exemplo, ns adicionamos 3 para cada letra no alfabeto, ento ns


temos:

Pegue a nossa frase anterior:


GO AHEAD AND CRACK IT

e ao deslocar 3 para cada letra, ns temos:


JR DKHDG DQG FUDFN LW
comum o uso de letras maisculas para indicar um texto cifrado.

Hora do desafio
Qual a mensagem que gerou o texto cifrado abaixo?
Voc precisa descobrir o valor de deslocamento para decifrar a mensagem.
OHJRPUN PZ NYLHA

Qual o nmero mximo de tentativas seria necessrio?

Ganhe alguns pontos: Shift Cipher 01


Ganhe alguns pontos: Shift Cipher 02

Cifra de Vigenre
At agora, ns precisvamos saber apenas que tipo de codificao estava sendo usado para
decodificar para texto plano. Mas, estes so os fceis. Algumas cifras requerem uma chave para
decifrar. Os criptosistemas clssicos tambm so chamados de criptosistemas simtricos porque a
chave utilizada para descriptografar a mesma utilizada para criptografar. As chaves assimtricas,
no entanto, utilizam chaves diferentes para criptografar e descriptografar. Nessa lio ns falaremos
apenas sobre as cifras simtricas, isso siginifica que, para decifrar, voc vai precisar saber a chave
que foi utilizada para cifrar.

"E como eu pego a chave?" Voc deve estar perguntando. Bom, existem muitas formas de fazer na
vida real, como explorar uma vulnerabilidade que te d acesso ao cdigo fonte onde a chave est
gravada (hardcoded), entender o algoritmo de criptografia e encontrar uma falha lgica, ou realizar
um ataque de fora bruta. Em CTFs, quando voc enontra cifras que requerem uma chave,
normalmente a melhor abordagem realizar fora bruta com chaves bvias. Se a chave uma
string, por exemplo, tente algo como 'flag', ou o nome da competio, ou algo que possa estar na
descrio da questo.
Para dar um exemplo de cifra que usa chave, ns iremos mostrar a Cifra de Vigenre. realmente
similar a Cifra de Csar.

Para criptografar o texto, voc vai precisar usar uma tabela vigenre como a seguinte:
Se voc observar, cada linha corresponde a um deslocamento de X do alfabeto. Na Cifra de Csar
ns vimos um deslocamento de X=3, que significa usar a linha 'D'. A Cifra de Vigenre pode usar
todas as linhas da tablea (diferentes rotaes), mas o que vai decidir qual rotao usar a chave.

assim que funciona:

Pegue a primeira letra da chave e encontre a linha da tabela que comea com aquela letra;
Pegue a primeira letra do texto que voc quer criptografar e encontra a coluna correspondente a ela.

Pegue SHELLTER como chave, por exemplo. Para criptografar o texto:


CRACK THE CRYPTO

A posiao correspondente na tabela que tem a linha S e coluna C : U


A posio correspondente na tabela que tem a linha H e a coluna R : Y

Se voc continuar letra por letra, voc vai perceber que a chave menor que o texto a ser
criptografado, mas isso no um problema. Uma vez que voc pegue o ltimo caractere da chave,
voc vai recomear a partir da primeira letra at voc criptografar todo o seu texto.

Ao final do algoritmo, voc deve ter um texto como esse:


UYENV MLV UYCAEH

Hora do desafio
Voc consegue escrever um programa que criptografa e descriptografa o texto de/para
Vigenre? O programa deve solicitar ao usurio uma chave.
Qual a chave utilizada para gerar o texto abaixo?
Qual a mensagem em texto plano?
DLECYBRXNPKPYXVVOPXSDAICDAIC

Ganhe alguns pontos: Vigenre Cipher

Cifra de Substituio
Outro tipo de criptografia a cifra de substituio, que ao invs de usar simples descolocamentos,
utiliza uma permutao aleatria do alfabeto. Para essa lio, ns criamos essa tabela aleatria.

Nesse caso, se ns quisermos criptografar o seguinte texto: In this case, if we want to encrypt the
following text:
Hacking n Roll is great

Ns obteremos:
DKFTMPZ P VIEE MC ZVYKJ

fcil perceber que existem 26!=403291461126605635584000000, ou, 4*10^26 possibilidades de


permutao.
Apesar do nmero grande, possvel usar anlise de frequencia para detectar as letras mais comuns
no texto e realizar a substituio mais provvel.
Por exemplo, em ingls, a letra mais comum E, enquanto no portugus do Brasil A Ento, se
voc tiver um texto criptografado, apenas construa um histograma para as letras e use a tabela de
distribuio como voc pode encontrar aqui:
https://en.wikipedia.org/wiki/Letter_frequency#Relative_frequencies_of_letters_in_other_language
s para escolher a letra mais provvel.

Note que nem sempre essa tcnica ir funcionar, e isso porque voc precisa de um texto
criptografado que tenha quase a mesma frequncia de distribuio das letras. Na flag anterior, ns
temos apenas um Y (E) e dois K (a).

Ento, a anlise de frequncia no fcil. Felizmente, no comum na vida real um texto


encriptado muito curto.

Concluso
Este foi o bsico da criptografia, no tutorial ns mal arranhamos a superficie da criptografia, mas
deve ser um bom ponto de partida para trilhar o seu caminho nessa rea e ganhar alguns pontos em
CTFs.

Agradecimentos
Ns gostaramos de agradecer ao Professor Incio Alves (@icanolargv) pela contribuo durante a
escrita e criao de desafios para essa lio.

Leitura Adicional
dCode.fr
Understanding Cryptography: A Textbook for Students and Practitioners
Applied Cryptography: Protocols, Algorithms and Source Code in C
Break the Code: Cryptography for Beginners
Computer Security: Art and Science (Chapter 9)

Referencias
[1] Why can't the FBI hack into San Bernardino killer's iPhone? Apple's mobile security explained
[2] RFC 20
[3] RFC 4648
[4] Aalgoritmy.net - Caesar Cipher