Archive for January, 2009

Remover direcciones IP bloqueadas por DenyHosts

Sunday, January 25th, 2009

DenyHosts es un script escrito en Python que analiza los logs del servidor sshd y determinar posibles intentos de ataques. En caso de que se detecte tal intento se actualiza el archivo /etc/hosts.deny con la IP del posible ataque para prevenir cualquier intento futuro.

A través del archivo /etc/denyhosts.conf se setea la configuración, por ejemplo cantidad de intentos fallidos por el puerto ssh (por defecto 22) para que se considere un ataque.

¿Qué sucede si por equivocación DenyHosts nos confunde con un atacante al habernos confundido en la cantidad de intentos posibles? Nuestra IP es almacenada en /etc/hosts.deny y por lo tantos tenemos el acceso bloqueado. Para remediar esta situación no bastará con remover nuestra IP de hosts.deny. Tenemos que hacer lo siguiente:

  • Detener DenyHosts (i.e. /etc/init.d/denyhosts stop)
  • Remover la IP bloqueada de /etc/hosts.deny
  • Remover la IP bloqueada de WORK_DIR/hosts
  • Remover la IP bloqueada de WORK_DIR/hosts-restricted
  • Remover la IP bloqueada de WORK_DIR/hosts-root
  • Remover la IP bloqueada de WORK_DIR/hosts-valid
  • Remover la IP bloqueada de WORK_DIR/user-hosts
  • Arrancar DenyHosts (i.e. /etc/init.d/denyhosts start)

Nota: Para obtener WORK_DIR utilizar el siguiente comando:


$ cat /etc/denyhosts.conf | grep 'WORK_DIR ='

En Debian Etch la salida del comando anterior es WORK_DIR = /var/lib/denyhosts

Fuente

Normalizando paths

Friday, January 16th, 2009

Básicamente normalizar un path consiste en remover todas las ocurrencias ‘..’ y ‘.’ para obtener un path absoluto. Por ejemplo, si tenemos: /foo/bar/../baz, normalizado quedaría /foo/baz.

Podemos hacer una sencilla función de normalización en Ruby con la ayuda de expresiones regulares. Por ejemplo:


def normalizar path
  ret = path.split(%r{/\.(/|\Z)}).join
  ret = ret.split(%r{/[^/]+/\.\.}).join
  raise “path incorrecto” if %r{/\.\.(/|\Z)} =~ ret ||
                                      ret[0] != ?/
  ret
end

Expliquemos que hace cada línea:

  • path.split(%r{/\.(/|\Z)}).join; remueve todas las ocurrencias ‘.’ del path.
  • ret.split(%r{/[^/]+/\.\.}).join; remueve todas las ocurrencias ‘..’ del path.
  • %r{/\.\.(/|\Z)} =~ ret || ret[0] != ?/; larga una excepción en caso de que se ingrese un path que no pueda ser normalizado. Verifica que el primer caracter del path sea ‘/‘ y que no se tengan situaciones como ‘/../foo‘.

Dejo un par de ejemplo de prueba:


irb(main):002:0>  normalizar "/foo/../bar/."
=> "/bar"
irb(main):003:0> normalizar "/foo/./bar/../baz"
=> "/foo/baz"
irb(main):004:0> normalizar "./foo/./bar/../baz"
RuntimeError: path anormal `./foo/./bar/../baz'
        from (irb):4
irb(main):005:0> normalizar "../foo/"
RuntimeError: path anormal `../foo/'
        from (irb):5
irb(main):006:0> normalizar "/../foo/"
RuntimeError: path anormal `/../foo/'
        from (irb):6

Pueden probar los ejemplos online desde aquí: http://www.rubular.com/

Son bienvenidos aportes y comentarios :-)