Como he comentado antes, cuando usan las vulnerabilidades del php la carpeta a la que tienen acceso es la de los temporales, que en una instalación normal es igual a las demás carpetas y pueden ejecutar lo que suban, consiguiendo por ejemplo una shell remota con la que sí tendrán acceso completo. Así que lo que tenemos que hacer es quitar los permisos de ejecución a la carpeta. Si tienes esto en consideración a la hora de instalar el servidor, puedes crear una partición de 1GB por ejemplo para asignarla a /tmp y luego quitarle los permisos en el el fstab (luego veremos cómo). Pero claro, si tenemos el servidor ya montado desde hace años (o días o horas) no podemos volver a reinstalar todo, menuda pereza. ¿Se puede hacer algo? Venga, que es Linux, que preguntas...
Por si te lo preguntabas, la respuesta es sí. Podemos crear un archivo especial y hacer que sea un disco duro (esto por ejemplo se usa también en algunas máquinas virtuales), y luego montarlo para que albergue el /tmp protegiendolo. Es bien sencillo el proceso, primero creamos el archivo:
#dd if=/dev/zero of=/tmp_partition bs=1024 count=500000Con esto crearemos un archivo lleno de ceros y que ocupe 500MB, podemos hacerlo del tamaño que necesitemos, pero con esto suele bastar.
Lo siguiente es darle formato para poder usarlo como disco duro, en este caso usaré ext3, pero puedes usar el que prefieras:
#mkfs.ext3 /tmp_partitionCon "tune2fs -c 200 -i 200 /tmp_partition" cambiaremos la frecuencia del chequeo del disco, en este caso cada 200 días.
Para probar que está correcto, podemos montar el archivo en una carpeta cualquiera:
#mkdir ddNos tendría que salir sólo la carpeta de "Lost+Found", si es así está todo correcto.Desmontamos el la carpeta con "umount dd" y listo, ya lo tenemos casi hecho, sólo nos falta editar el archivo /etc/fstab con nuestro editor favorito y añadir:
#mount -o loop /tmp_partition dd ***
#ls dd
/tmp_partition /tmp ext3 loop,noexec,nosuid,rw 0 2
Para poder montar /tmp nos tenemos que asegurar de que todos los servicios que escriben en /tmp están parados. Lo normal es parar Apache, Oracle, Vmware, etc. Podemos ver si hay más ficheros en uso con "lsof -n | grep tmp". Una vez esté libre /tmp, hacemos:
#mount /tmp
#chmod 1777 /tmp
#mv /var/tmp/* /tmp
#rmdir /var/tmp
#ln -s /tmp /var/tmp
Y ya lo tenemos todo listo. Si queremos probarlo creamos un archivo en /tmp, le damos permisos de ejecución y probamos a ejecutarlo: nos dira que nones.
Me dejo para el final si teniais una partición hecha para /tmp, sería añadir (o editar la linea) en el fstab:
/dev/hdaX /tmp ext3 nosuid,noexec,nodev,rw 0 2Y poner estos comandos:
#cd /var
#mv /var/tmp/* /tmp
#rmdir tmp
#ln -s /tmp /var/tmp
Como éxtra, vamos a quitar permisos de ejecución a algunos binarios que son los que más usan, como el wget para descargar archivos o el gcc para compilar, entre otros. Simplemente tendremos que dejar que el root los ejecute:
#chmod 0700 /usr/bin/makeHay que tener cuidado si algun script de algun usuario utiliza esos comandos, ya que no se lo permitirá. Si fuese necesario dar permisos a ese usuario para que utilice sólo los binarios necesarios.
#chmod 0700 /usr/bin/gcc*
#chmod 0700 /usr/bin/as86
#chmod 0700 /usr/bin/lynx
#chmod 0700 /usr/bin/wget
#chmod 0700 /usr/bin/curl
#chmod 0700 /usr/bin/nc
Con esto podremos dormir un poco más tranquilos. ¡Hasta la próxima!
* Entrecomillado porque me refiero a los niños de copian el código de la web hacker de turno.
** Sin comillas porque me refiero a los que se lo ganan.
*** Si nos da error posiblemente no esté cargado el modulo loop en el kernel, toca o cargarlo con modprobe loop y si no funciona, recompilar el kernel.
Fuente de la información: http://www.ran.es