dirHack

El siguiente script sirve para hacer auditorias de seguridad en cuanto a los permisos en la estructura de directorios de nuestros servidores.
#!/bin/sh
# Written by Zerial & Pons
# McDonald's Day ...
# 21.34, Jun 13 2006 - Updated: 01.41, Jun 15 2006
# # # # # # # # # # # # # # # # # # # # # # # # # #
#  ____  _      _   _            _
# |  _ (_)_ __| | | | __ _  ___| | __
# | | | | | '__| |_| |/ _` |/ __| |/ /
# | |_| | | |  |  _  | (_| | (__|   < # |____/|_|_|  |_| |_|__,_|___|_|_
#
# # # # # # # # # # # # # # # # # # # # # # # # # #
version="1.0.2"
if [ $# -lt 2 ]
then
	echo
	echo "DirHack eXploit $version"
	echo "This thing will list all sub-home directories"
	echo "that are accesable by the user running the"
	echo "script."
	echo -e "tusage: $0 id output-file bz2|gz|text (default is text)"
	echo -e "texample: $0 999 out bz2"
	echo
	break
else
	echo > $2
	if [ ! -w $2 ]
	then
		echo "File $2 doesn't have write permissions"
		break
	fi

	freedirs="public_html public_ftp etc tmp mail"
	echo "Starting DirHack $version"
	echo "DirHack eXploit $version" >> $2
	for dir in $freedirs
	do
		for user in `awk -F':' ' {printf $1 "n"} ' /etc/passwd`
		do
			userhome=`cat /etc/passwd |grep $user: |grep :$(id -u $user): |awk -F':' ' {printf $6 "n"}'`
			fulldir=$userhome/$dir
			if [ `id -u $user` -gt $1 ]
			then
				if [ -d $fulldir ]
				then
					echo "" >> $2
					echo "-------------------------------------------------------------" >> $2
					echo "User: $user" >> $2
					echo "Directory: $fulldir" >> $2
					echo "Size: `du -sh $fulldir`" >> $2
					echo "" >> $2
					ls -Rla $fulldir >> $2
			fi
		fi
		done
	done
	case $3 in
		bz2)
			bzip2=`which bzip2`
			if [ -x $bzip ]
			then
				$bzip2 -f $2
				echo "File ready and compressed in $2.bz2"
			else
				echo "No exec permissions for bzip2 or bzip2 not found."
				echo "File left uncompressed in $2"
			fi;;
		gz)
			gzip=`which gzip`
			if [ -x $gzip ]
			then
				$gzip -f $2
				echo "File ready and compressed in $2.gz"
			else
				echo "No exec permissions for gzip or gzip not found."
				echo "File left uncompressed in $2"
			fi;;

		*)
			echo "File ready in $2";;

		esac
Funcionamiento: Lee todos los usuarios desde /etc/passwd y luego, por cada usuario obtenido, ingresa al directorio public_html y lista, recursivamente, todos los directorios y subdirectorios. Generalmente, el usuario en el que corre apache se llama apache y obviamente, debe tener acceso de lectura a todos los directorios y ficheros que se desean mostrar, por ejemplo /home/user/public_html/index.php. Si no tiene permisos de lectura para apache dificilmente se podria ingresar via web. Muchas veces, estos ficheros tienen permisos de escritura y de lectura y es cuando hay que actuar. Si no encontramos ficheros con permisos de escritura no importa, al menos tenemos acceso para leerlos. Por ejemplo, en los CMS mas populares como Wordpress, Joomla, etc. suelen tener un fichero de configuracion con el usuario y clave, en texto plato, de la base de datos con lo que podemos generar un script que nos permita ingresar y/o apoderarnos de esa base de datos. Este script nos creara un listado, en txt (opcionalmente comprimido en gz o bz), con todos los ficheros y sus permisos, para que podamos indagar en la estructura de directorios. Una forma de solucionar este problema es con chroot.

Comentarios (4)

base de datos-base de datos de email
hola, muy bueno el blog, si lo deseas, ingresa a mi pagina, a publicar un comentario. saludos
jcarlosn
No está mal el script, aunque no entiendo por que simplemente no notifica los archivos con el problema de permisos, en lugar de comprimirlos :)
Zerial
@jcarlosn: No es que comprima los archivos, lo que hace es generar un listado con todos los ficheros y sus respectivos permisos, guardarlos en un fichero de texto plano y comprimir ese fichero. Si es un servidor grande, ese fichero podria pesar 10, 100, 200Mb y mas, pero comprimido por ejemplo con bzip, pesaria casi un 70% menos.
jcarlosn
Entiendo, gracias por la aclaración, es que no tuve tiempo de probar el script y leí por encima lo del bzip, y no entendía bien el motivo.

Muchas gracias!

Deja un comentario