Seguridad en archivos

Proteger tus archivos en GNU/Linux puede es la roca fundamental de la seguridad

Los Firewalls, rootkit hunters, IDS, Itrusion prevention systems, etc etc no sirve si el administrador del sistema no sabe lo que esta haciendo. Una de las tareas mas importantes en la seguridad que el administrador debe conocer, es controlar la seguridad en nuestros sistemas de archivos.

En este post haremos un repaso de las medidas de seguridad disponibles en GNU/Linux, a la hora de cuidar nuestros archivos:

UGO

Heredado de Unix, los sistemas de archivos en linux, tienen una lista de control de acceso. Esta lista, enumera a tres sujetos. El usuario (el dueño del archivo), el grupo (grupo dueño del archivo) y otros (es decir, todos los que no son ni dueños ni pertenecientes al grupo dueño del archivo. Cada uno de estos sujetos puede tener permiso para, leer (r de read), escribir (w de write) y ejecución (x de eXecution).  Todo esto ya lo sabemos y si no, la wikipedia puede ser una ayuda.

Hay algunas peculiaridades que debes conocer de este sistema:

Falsa restricción de lectura en carpeta

Si una carpeta no tiene permiso de lectura (r), no podrás listar su contenido (hacer un ls), pero si conoces de la existencia de un archivo dentro de ella, podrás listarlo y leerlo (si tienes permisos sobre el mismo).
Ejemplo:

# ls -ld  test
drwxr-xr-x 1 user group 0 sep 1 12:00 test
# ls -l test/
-rwxr-xr-x 1 user group 0 sep 1 12:00 file
# chmod u-r test
# ls -l test/
ls: no se puede acceder a test: No existe el fichero o el directorio
# ls -l test/file
-rwxr-xr-x 1 user group 0 sep 1 12:00 file

Para evitar esto, la correcta manera de denegar el acceso a una carpeta, es quitando el permiso de ejecución (x):

# ls -ld  test
drwxr-xr-x 1 user group 0 sep 1 12:00 test
# chmod u-x test
# ls -l test/
-????????? ? ? ? ? ? file

De esta manera, si bien podríamos listar los archivos contenidos en la carpeta, no podríamos acceder a ellos, ni a las carpetas que estén dentro.

Falsa restricción de ejecución de scripts

Si queremos que un script no se ejecutable por ciertas personas, debemos tener mucho cuidado. Solamente quitar el permiso de ejecución no siempre sirve ya que si otro usuario tiene permiso de lectura del script puede copiarlo y ejecutarlo. Otra forma de hacer esto mismo es ejecutandoló como “source”

# ls -l script.sh
-rwxr--r-- 1 user group 0 sep 1 12:00 script.sh
# chmod -x script.sh
# . script.sh 

Con un . o bien con el comando source, podemos ejecutar el script como si estuviéramos tirando los comandos directamente desde la consola.

El comando perdido

Pocos conocen le uso del comando ‘newgrp’.  Este comando nos permite cambiar nuestro grupo por defecto momentáneamente. Veamos un ejemplo:

# id user
uid=10000(user) gid=10000(group) groups=10000(group),11000(oracle)
# newgrp oracle
# touch newfile
# ls -l newfile
-rwxr--r-- 1 user oracle 0 sep 1 12:00 newfile

Como verán, el archivo newfile fué escrito con el grupo oracle. Para terminar este switch momentaneo podemos ejecutar exit, ya que newgrp en realidad ha abierto una nueva shell, donde nuestro grupo por defecto es oracle.

Bits especiales

Aunque conocidos, no siempre son bien comprendidos.  El sistema de control de lista de acceso a los archivos tiene unas exenciones llamadas SUID, SGID y Sticky Bit. Los tres bit especiales son mostrados (cuando estan activados) en lugar de la x de ejecución.

El SUID, es un bit que permita que un binario o script, sea ejecutable con los permisos del dueño (user) de dicho archivo (effective user id). Es decir:

#ls -l script.sh
-rwsr-xr-- 1 user group 0 sep 1 12:00 script.sh

Si alguien del grupo group ejecuta dicho script, lo hará con los permisos del usuario (user)  y no con sus permisos.
Esto requiere especial atención dadas sus implicaciones!
El SGID, es igual que el SUID, pero aplicado al grupo.

Y finalmente el Stiky bit, se utiliza hoy en dia, solo para directorios. La wikipedia reza:

Cuando se le asigna a un directorio, significa que los elementos que hay en ese directorio sólo pueden ser renombrados o borrados por el propietario del elemento, el propietario del directorio o el usuario root, aunque el resto de usuarios tenga permisos de escritura y, por tanto, puedan modificar el contenido de esos elementos.

El sticky bit está a menudo configurado para el directorio /tmp.

Estos bits, son un parche, a las limitaciones del sistema de control de acceso, y se complementan con los atributos extendidos que veremos a continuación.

Extended Attributes

Los atributos extendidos es una característica soportada por la mayoría de los sistemas de archivos (tanto en linux, como en los unix, y en windows). Por supuesto, cada cual tiene su propia implementación. En este caso, veremos la implementación de ext2,3 y 4 dado que son los sistemas de archivos mas comunes en GNU/Linux.

Estos atributos extendidos nos permiten añadir peculiaridades al comportamiento de acceso a los archivos.  Veamos cuales son:

  • a : append only 
  • c : compressed
  • d : no dump
  • e : extent format
  • i : immutable
  • j : data journalling
  • s : secure deletion
  • t : no tail-merging
  • u : undeletable
  • A : no atime updates
  • C : no copy on write
  • D : synchronous directory updates
  • S : synchronous updates
  • T : top of directory hierarchy

He señalado sólo dos que están mas relacionados con la seguridad. Los otros, o bien no tienen relevancia en la seguridad, o bien no están realmente implementados.  Cada atributo tiene su explicación y uso, y para mas info les recomiendo este link.

El atributo de Append Only, sirve, por ejemplo, para archivos de logs, a los que se les agrega continuamente información. Adicionalmente no estamos interesados en que sean borrados. Para esto podemos utilizar este atributo, de la siguiente manera:

# lsattr file
---------------- file
#chattr +a file
#lsattr file
-----a---------- file
#echo "more data" > file
bash: file: Operación no permitida
#echo "more data" >> file
#

Como verán, podemos agregar mas data, pero no sobre escribirla. Así mismo si utilizamos el atributo inmutable, el archivo no puede ser modificado en absoluto.
Estos atributos pueden ser asignados sólo por el root, y quitados con el mismo comando chattr.
Si bien no son un garantía, son una barrera mas que ayudan a securizar cierta data.

ACL

El sistema UGO, tiene sus limitaciones, y ACL es la respuesta.
Por ejemplo, una limitación clásica del sistema UGO, es que no podemos dar distintos permisos a distintos usuarios, indistintamente del grupo al que pertenezcan. Esto, si se puede hacer con las ACL.
Para que nuestro sistema de archivos soporte esta característica, hay que montarlo con el flag “acl”, ya sea desde el comando mount o desde el fstab.

/dev/sdb1 /pendrive ext3 acl 1 2

ó

mount -o acl /dev/sdb1 /pendrive

En todo caso, al montar el sistema de archivos con soporte de acl, podemos configurar permisos avanzados (siempre utilizando la metodología de lista de control de acceso)
Archivos con ACLs
Cuando listamos archivos que tienen ACLs, los visualizaremos con un + al final de los permisos:

#ls -l script.sh
-rwxr-xr--+ 1 user group 0 sep 1 12:00 script.sh

Listar ACLs

Para conocer que ACLs tiene un archivo, utilizmos getfacl:

# getfacl script.sh
# file: script.sh
# owner: user
# group: group
user::rw-
user:john:rwx
group::r--
mask::rwx
other::r--

Como ven, en este caso, el usuario john, tiene permisos de lectura,escritura y ejecución.

Establecer ACLs
Finalmente, para establecer una ACL, utilizamos setfacl

# setfacl -m "u:john:r-x" script.sh

En este caso, quitamos el permiso de ejecución a john.
Para su uso mas extedido, te recomiendo leas la doco de RedHat

Conclusiones

Configurar correctamente nuestros archivos, es fundamental. Un bit de permisos mal configurados puede ser la ruina del servidor, por consiguiente de la red..
Aunque estos temas son muy básicos para los administradores avanzados, aveces se pierde de vista su importancia. Además de los sistemas repasados, existen medidas mas avanzadas, como por ejemplo, selinux, tripwire, encriptación LUKE, etc. Estas van mas allá de los sistemas de archivos, pero estan muy relacionadas. Las veremos mas adelante.

Antes de dormir hoy, no olvides revisar tu file sytems 😛

~have fun!

EFI Shell – Itanium – HP-UX/Linux

Que es y para que sirve? que podemos hacer con la EFI shell?

La EFI es la precursora de la UEFI, hoy en dia bastante difundida en equipos de uso hogareño. Pero este no es por lejos el tema que nos ocupa, si no mas bien la utilidad de la EFI Shell en servidores del tipo Itanium. Encontrarás en este post, el uso básico y algunos tips de utilidad a la hora de instalar o recuperar sistemas operativos.

Introducción

Si te primera pregunta es: Que es EFI?
La respuesta mas clara la tiene Wikipedia cuando dice:

La Interfaz Extensible del Firmware, Extensible Firmware Interface (EFI), es una especificación desarrollada por Intel dirigida a reemplazar la antigua interfaz del estándar IBM PC BIOS, interactúa como puente entre el sistema operativo y el firmware base.

Básicamente cuando HP decidió vender servidores con procesadores Intel, se comenzó a desarrollar un sistema que permita a los servidores tener altas prestaciones (esto fue cerca del 2002), por ejemplo soportar hasta 9,4 Zetta Bytes en lugar de los 10 Teras que podia llegar a soportar la BIOS en el mejor de los casos. Otro excelente ejemplo es la posibilidad de funcionar nativamente con 32 y 64 bits, cuando BIOS fue diseñada originalmente para andar con 16 bits.

AmiBios2
Server con iLO 2 Booteando con BIOS AMIBIOS

Ademas de estas y otras adelantos que conlleva el uso de la EFI, esta posee un Boot manager y una shell desde donde se pueden ejecutar ciertos programas prescindiendo de un OS.

En este post nos centraremos en esos beneficios, los commandos de EFI y el Boot Manager.

EFI Standard Commands

EFI tiene un set de comandos específicos, los cuales podemos observarlos utilizando el comando help -?. También pueden encontrar una lista completa de los comandos de la EFI en este link.

El funcionamiento de esta “shell” es muy al estilo DOS, aunque tiene un par de ayudas para los que venimos del mundo unix, y escribir ‘dir’ en lugar de ‘ls’ nos cuesta muchísimo.
La primer ayuda que tenemos es el comando ‘alias’, el cual nos mostrará los alias de los comandos y crear nuestros propios ‘comandos’.

La mayoria de las descripciones de los comandos en el comando help -? son muy explicativas, en caso de que necesitemos mas información sobre un comando en particular podemos ejecutar ‘help commando’ o bien ‘commando -?’.

Aquí les dejo algunos comandos básicos:

ver

Existen varias versiones de EFI, por lo que te recomiendo ejecutar el comando ver, para saber que versión de EFI estas usando. Una de las diferencias entre versión y versión es la lista de comando. Quizás alguno de los comandos que tratamos aquí no estén disponibles en tu EFI.

Hardware desde la EFI

A la hora de configurar el hardware del servidor, tenemos algunos comando muy útiles.

map

El comando map, nos muestra una lista de dispositivos reconocidos por la EFI.

Shell> map
Device mapping table
fs0 : Acpi(HWP0002,100)/Pci(1|0)/Scsi(Pun0,Lun0)/HD(Part1,Sig8E89981A-0B97-11D7-9C4C-AF87605217DA)
blk1: Acpi(HWP0002,100)/Pci(1|0)/Scsi(Pun0,Lun0)
blk2: Acpi(HWP0002,100)/Pci(1|0)/Scsi(Pun0,Lun0)/HD(Part1,Sig8E89981A-0B97-11D7-9C4C-AF87605217DA)
blk3: Acpi(HWP0002,100)/Pci(1|0)/Scsi(Pun0,Lun0)/HD(Part3,SigC9D7945C-0BA7-11D7-9B31-FBA1AECDAF7E)

Este listado, por supuesto varía de servidor en servidor, dependiendo de que dispositivos (discos, fibras, placas de red, etc etc)
Puedes encontrar aquí una explicación de la nomenclatura usada.

Si quisiéramos refrescar (escanear nuevamente) el listado

map -r

Si quisiéramos listar sólo los filesystems

map -Fs

Si quisiéramos listar sólo los dispositivos de bloque

map -Blk
devices
Este comando, nos hará un listado de todos los dispositivos administrados por la efi (es decir la efi tiene drivers para esos dispositivos). Este comando es muy útil para poder saber que hard tenemos en el servidor.
devtree
Complementario al comando devices, con devtree podemos hacer prácticamente el mismo listado, pero con vista de árbol.

Acceso a un disco/lun

Para acceder a un filesystem, ejecutamos (muy al estilo MS-DOS):

Shell> fs0
fs0:>

Una vez dentro del filesystem podemos hacer uso de los siguientes comandos:
cd, comp, cp, edit, eficompress, efidecompress, hexedit, ls, mkdir, mode, mv, rm

Detallar estos comandos sería un despilfarro de letras, ya que son lo que todos queremos que sean, sin mas ni menos. Sin embargo, estos mismos comandos son útiles para scripts que podemos realizar con el fin de acortar ciertas tareas (tema que quedará pendiente para un futuro post).

Termino dejando un manual de la UEFI en servers proliants

~have fun!

Hacking desde Debian 7

Uso Debian, ni Ubuntu, ni Backtrak, ni Kali Linux, Debian. Y no es que sea caprichoso, solo es que mi laptop no solo es una herramienta de pentesting, si no tambíen mi herramienta de estudio, mi centro multimedia, me enviroment de programación, y mi herramienta de trabajo diario ademas de mi laboratorio de experimentos. Y es que Debian es “The universal operating system”.

En fin, sea por la razón que sea, en este post haré una lista de programas disponibles en el repositorio de Debian, que nos sirven para utilizar nuestra pc como herramienta de pentesting, preparando nos para la guerra!

El escenario es el siguiente:

Debian 7 Testing en amd64.
Repositorios con main, non-free y contrib (puritanos por favor no se peguen un tiro en la cabeza… o si.. )

Agregamos la arquitectura i386 usando:

dpkg --add-architecture i386

Básico

Una vez que tenemos nuestro sistema al dia, procederemos a la instalación de los paquetes básicos, que no son de pentesting en sí, si no de uso general, pero muy útiles para trabajar.

fluxbox
terminator
guake
tint2
vim
dia
keepassx
keepnote
gedit + gedit plugins

Packet crafting

A la hora de crear paquetes  tenemos varias opciones, dependiendo de la profundidad y el tipo de análisis que necesitemos:

yersinia
python-scapy
netexpect
netwox + netwag
hping3
netexpect
packeth
arping
irpas
macchanger

Sniffing

Para saber exactamente que es lo que pasa por nuestras redes, nada mejor que unos buenos sniffers

wireshark
tshark
dsniff
tcpdump

Scanning / Discovering

Una herramienta típica e infaltable, los scanners:

nmap + zenmap
pnscan
sslscan
sshscan
doscan
netdiscover
dnstracer
dnswalk
smb-nat
xprobe
p0f
cdpr

Brutefoce

Con inteligencia mas la fuerza bruta podemos llegar lejos

hydra + hydra-gtk  (xhydra)
medusa
john
aircrack-ng

Web

Algo de analisis web
w3af
whatweb
wapiti
nikto
aria2
ratproxy
wget
httest
links2
webhttrack

Otros (no menos importante)

corkscrew
tor
privoxy
ipcalc
netmask
gns3

Resumiendo todo en una linea:

apt-get install fluxbox terminator guake tint2 vim dia keepassx keepnote
gedit gedit-plugins yersinia python-scapy netexpect netwox netwag hping3 netexpect
packeth arping irpas macchanger wireshark tshark dsniff tcpdump nmap zenmap pnscan
sslscan sshscan doscan netdiscover dnstracer dnswalk smb-nat xprobe p0f hydra hydra-gtk
medusa john aircrack-ng cdpr w3af whatweb wapiti nikto aria2 ratproxy wget httest
links2 webhttrack corkscrew tor privoxy ipcalc netmask gns3

Conclusiones: Esta no es una lista exhaustiva, pero contiene muchas herramientas que podemos instalar de forma prolija desde los repositorios de debian. Ahora les toca estudiar el uso correcto de cada herramienta!

~ have fun!