BalckArch vs ArchStrike

Como dije en el post de Hacking sobre debian:

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.

Es decir, la distro que utilice en mi pc tiene que tener capacidad y herramientas de todo tipo, no solo de seguridad informática.

Anteriormente, adecue Debian para que cumpla, dentro de lo posible, tales fines, sin embargo, justamente en materia de Seguridad informática, eran pocas las herramientas disponibles y poco actualizadas.
Al pasarme a ArchLinux, me tope con BlackArch y ArchStrike, dos distribuciones enfocadas a la seguridad informática, compatibles con su distribución madre, Arch.

Como y cual elegir?
Repasaremos un poco sobre ArchLinux, y luego sobre las versiones live de ArchStrike y BlackArch, veremos como utilizar ambos repositorios desde una instalacion de Arch y compararemos las herramientas disponibles.

Un poco sobre ArchLinux

Como dice en su pagina, Arch es  “a lightweight and flexible Linux distribution that tries to Keep It Simple”

Una de las mayores ventajas de esta distribución, es su comunidad activa, con documentación actualizada, al igual que sus repositorios, una cantidad inmensa de software disponible,  y una flexibilidad muy grande en cuanto a la configuración.
Esta misma flexibilidad, contrae la necesidad saber bien como configurar, administrar y actualizar cada parte del sistema operativo, sin destruirlo.
Por decirlo de otra manera, con Arch, vuelve la diversión de usar linux.

Una característica muy interesante, es que se trata de una distribución Rolling Release, es decir que el sistema de desarrollo de la distribución consiste en liberar continuamente actualizaciones, sin pasar por un estadio previo de pruebas/congelamiento. Por lo que al instalar Arch, tenemos siempre la ultima versión de cada paquete.

Entre las contras que tiene Arch (Por decirlo de alguna manera, ya que en realidad no es una contra si no, una característica adrede), es que Arch no tiene un instalador. Esto que puede asustar a los principiantes, es una ventaja para el usuario avanzado, evitándole caer en la obligación de aceptar configuraciones preestablecidas en un instalador.

Sobre ArchStrike y BlackArch (live)

Ambas distribuciones vienen en versiones live, lo que nos permite bajar sus respectivas ISOs y probarlas. En el caso de ArchStrike, podemos bajar un OVA, tanto para VirtualBox como para VMware, por lo que nos facilita probarla en una maquina virtual.

Menu

En el caso de BlackArch tiene un menu personalizado desde donde se puede acceder a todas las herramientas instaladas. Al igual que en Kali (una de las distros mas difundidas en materia de Pentesting) si la aplicacion/herramienta es de consola (como lo son la mayoria de las herramientas disponibles) abre una consola (xterm) ejecutando el comando sin argumentos.
A diferencia en ArchStrike, el menu no contiene un acceso a todas las aplicaciones, si no solo a las aplicaciones de interfaz graficas (algunas de linea de comando, pero no abre una terminal, por lo que no sirve para nada). Por otro lado, ArchStrike tiene otras herramientas orientadas a la configuracion del sistema y el escritorio que BlackArch no tiene (mas alla de la configuracion basica de fluxbox)

Estetica

Ambas vienen con Windows Managers livianos, en el caso de ArchStrike, OpenBox y Fluxbox por defecto para BlackArch, pero en esta ultima puede elegirse otros WMs, todos ellos livianos y con exactamente la misma estetica.blackarchlogin Esta seleccion de administradores de ventanas, ayuda a concentrarnos en el pentesting y no en otra cosa. Sin embargo, ArchStrike esta mas orientada a proveer una experiencia mas amigable. Por ejemplo, viene por defecto con wicd (un administrador de redes), un applet para mostrar la bateria (en caso de las laptops) y un menu que facilita el acceso a las herramientas de configuracion del sistema, como dije anteriormente.

Instalacion (live)

Ambas vienen con un script para instalar desde la version live, sin embargo solo ArchStrike tiene un acceso directo desde el menu principal. En el caso de BlackArch, hay que iniciarlo desde una terminal con el comando blackarch-install
archstrike

Repositorios

Mas alla del uso que podemos hacer de cada listro desde sus versiones live, podemos utillizar los repositorios de ambas distribuciones, como repositorios de una PC on Arch ya instalado.

BlackArch porvee un script que instala el repositorio y la base de datos de firmas correspondientes. Con estos pasos, quedan a disposicion nuestra las herramientas para ser instaladas:

curl -O https://blackarch.org/strap.sh
sha1sum strap.sh   #El resultado deberia ser  86eb4efb68918dbfdd1e22862a48fda20a8145ff
./strap.sh #Como root o con sudo

Luego de esto, podemos listar los paquetes disponibles de la siguiente manera:

pacman -Sgg | grep blackarch | cut -d' ' -f2 | sort -u

Estas instrucciones pueden leerlas en ingles en el siguiente guia en PDF

En el caso de ArchStrike, tenemos que adicionar un repositorio en el archivo de configuracion de Arch:

cat << EOF >> /etc/pacman.conf
[archstrike]
Server = https://mirror.archstrike.org/$arch/$repo
EOF

Seguido, actualizamos la base de datos de paquetes:

pacman -Syy

Para instalar la base de firmas, debes seguir los pasos indicados en la pagina oficial.

Coexistencia de repositorios: En este momento tengo configurados ambos repositorios y no he tenido problemas.

Herramientas disponibles

Un dato importante a la hora de comparar estas distribuciones es los paquetes disponibles, por lo que me tome el trabajo de hacer un recuento de los paquetes y sus respectivas versiones, transcribo a continuacion los pasos que seguí, por si les interesa repetirlos:
Primero hice una comparacion cuantitativa de los repositorios:

pacman -Sl | awk '/blackarch/ { print $2,$3 }' > /tmp/blackarch
pacman -Sl | awk '/archstrike/ { print $2,$3 }' > /tmp/archstrike
wc -l /tmp/blackarch /tmp/archstrike 
 2145 /tmp/blackarch
 1288 /tmp/archstrike

Como vemos, BalckArch tiene mayor cantidad de paquetes, sin embargo, esto no me dice mucho, ya que no se si los paquetes que tiene disponibles, son utiles, o desactualizados, o no me interesan.
Por lo que genere un archivo que compare ambos repositorios paquete por paquete, con su respectiva version:

cat /tmp/blackarch | sort > /tmp/blackarch.sorted
cat /tmp/archstrike | sort > /tmp/archstrike.sorted
cat /tmp/blackarch.sorted /tmp/archstrike.sorted  | awk '{ print $1 }' | sort -u > /tmp/allpkgs
join -a 1   archstrike.sorted blackarch.sorted
join -a 1 allpkgs archstrike.sorted > allvsstrike
join -a 1 allpkgs blackarch.sorted > allvsblack
join  -a 1 allvsblack allvsstrike  > black-strike.compared
cat black-strike.compared | tr ' ' ';'  > black-strike.compared.csv

De esta manera obtuve un CSV con todos los paquetes y sus respectivas versiones.
Les dejo a dispocision el CSV (black-strike-compared) y una planilla de calculo (black-strike-compared) que generé a partir del mismo.

Se puede ver con estos resultados, que BlackArch, tiene mas paquetes y en general estan mas actualizados. De hecho no hay paquetes que ArchStrike tenga y BlackArch no.

Conclusiones
Ambas distribuciones tienen su puntos fuertes, sin embargo, me pesa bastante la cantidad superior de paquetes que posee BlackArch, dado que si vamos a utilizar una de esta distribuciones, la estetica será algo que configuraremos por nosotros mismo, al igual que los menus. Por otro lado, BlackArch viene, en su version live, con varios Windows Managers interesantes, como Awesome, Fluxbox e i3, lo que le da un toque mas geek.
A su vez, ArchStrike es quizas una distro que puede abrirse camino en los menos experimentados, ya que provee una experiencia mas amigable.
En particular uso ambos repositorios en una instalacion de Arch ya existente, pero en linea general eh instalado los paquetes desde los repositorios de BlackArch.

Quizas haya algun dato que se me este pasando por alto, pero hasta donde yo puedo ver, mi recomendacion se inclina por BlackArch.

Espero les haya servido la comparación y espero sus comentarios!

~have fun

 

RedHat Certified System Administrator 7 (RHCSA 7) – Sistemas en Funcionamiento III – LOGS

Siguiendo con la serie de posts relacionados al RHCSA 7, hoy nos ocuparemos del objetivo que reza:

Ubicar e interpretar archivos de registro del sistema y diarios

Como lo venimos haciendo en posts anteriores (RHCSA, RHCSA I, y RHCSA II) haremos un somero repaso sobre los temas mas conocidos para un administrador linux y nos centraremos mas sobre las nuevas características de Red Hat 7.

En esta sencilla oración, “Ubicar e interpretar archivos de registro del sistema y diarios”, o mas estéticamente en ingles: “Locate and interpret system log files and journals.”
se nos pide tener un conocimiento, al menos básico de los logs y journals, así que… empecemos!

Logs, historicamente

Syslogd es un daemon originalmente creado por el autor de Sendmail, para ser usado solo por Sendmail, sin embargo, dado su utilidad, se convirtió en un estándar de facto[1] en los sistemas Unix, no solo para Sendmail, si no para administrar todos los registros.
Este estándar de facto consta de 2 partes principales, el daemon syslog y el protocolo syslog.
El daemon es el encargado de recibir (tanto desde el sistema local, como de otoso sistemas, remotamente) y escribir los registros de cada daemon y del mismo kernel. Por otro lado el protocolo es el que se encarga de transmitir mediante la red los registros, desde el daemon emisor al server syslog.

Como bien debes saber ( o no ), syslog establece una prioridad para cada mensaje, esta prioridad se compone por la identificación del recurso, y la severidad, a saber:

Recursos (facility)
0: Mensajes del kernel (kern)
1: Mensajes del nivel de usuario (user)
2: Sistema de correo (mail)
3: Demonios de sistema (daemon)
4: Seguridad/Autorización (auth)
5: Mensajes generados internamente por syslogd (syslog)
6: Subsistema de impresión (lpr)
7: Subsistema de noticias sobre la red (news)
8: Subsistema UUCP (uucp)
9: Demonio de reloj (clock)
10: Seguridad/Autorización (authpriv)
11: Demonio de FTP (ftp)
12: Subsistema de NTP
13: Inspección del registro
14: Alerta sobre el registro
15: Demonio de reloj (cron)
16: Uso local 0 (local0)
17: Uso local 1 (local1)
18: Uso local 2 (local2)
19: Uso local 3 (local3)
20: Uso local 4 (local4)
21: Uso local 5 (local5)
22: Uso local 6 (local6)
23: Uso local 7 (local7)

Severidades  (severity)
0: Emergencia: el sistema está inutilizable (emerg)
1: Alerta: se debe actuar inmediatamente (alert)
2: Crítico: condiciones críticas (crit)
3: Error: condiciones de error (err)
4: Peligro: condiciones de peligro (warning)
5: Aviso: normal, pero condiciones notables (notice)
6: Información: mensajes informativos (info)
7: Depuración: mensajes de bajo nivel (debug)

En base a la Prioridad (facility*8 + severity) el daemon syslogd determina donde guardara los registros.
Esta configuración la podíamos encontrar en /etc/syslog.conf y comúnmente apuntaba a algún archivo dentro del /var/log

Logs en Red Hat 7

Actualmente, y desde hace un tiempo Red Hat utiliza rsyslogd una implementación de syslog que implementa el RFC 3195 , TCP, SSL, carga de diferentes modulos y permite una gran variedad de funciones, que lo transforman en un excelente administrador de registros (logs).

Si bien la configuración de rsyslogd permite una enorme cantidad [2] de variables, su configuración por defecto refleja la utilización mas básica.

Si exploramos el /etc/rsyslog.conf veremos que las siguientes lineas nos indican donde buscar los distintos mensajes

#kern.*                                     /dev/console
*.info;mail.none;authpriv.none;cron.none    /var/log/messages
authpriv.*                                 /var/log/secure
mail.*                                    -/var/log/maillog
cron.*                                    /var/log/cron
uucp,news.crit                            /var/log/spooler
local7.*                                  /var/log/boot.log

Tenemos entonces aquí, un punto de partida para saber donde buscar registros,de los distintos daemons sobre los que trabajemos.
En este post hay un artículo sobre como configurar rsyslog para centralizar los registros.

Journald

Por otro lado, Red Hat 7 ya no necesita de un daemon que implemente syslog, para administrar los registros, ya que Journald, un daemon parte de la colección de novedades de systemd, administra y almacena los registros. En este documento, pueden encontrar las razones para utilizar una solución mas avanzada en la administración de logs.

Dentro de las características principales de journald, es que guarda los registros de forma indexada y en formato binario, esto nos permite, entre otras ventajas, poder buscar y visualizar los logs de forma mucho mas rápida y efectiva.

Journalctl

Para la tarea de visualizar los logs de journald, contamos con la herramienta journalctl. Ejecutándolo sin mas, obtendremos la salida de todos los logs almacenados con un ‘pager’, que nos permitirá navegar por los registros.
Con journalctl podemos filtrar por prioridad, por el programa que lo genero, por fecha, y por booteo sin necesidad de ‘entubar’ (usar tuberias/pipes) a otros programas.

Ejemplos:

#Obtener logs desde el ultimo booteo
journalctl -b
#Obtener lista de booteos
journalctl --list-boots
#Obtener logs de ssh
journalctl /sbin/sshd
#Obtener logs de una prioridad determinada
journalctl -p err
#Obtener los logs en base a fechas
journalctl --since=yesterday
journalctl --since=2016-04-01 --until=2016-04-12
#Salida analoga al tailf -f
journalctl -f

Todas estas opciones pueden complementarse entre si, para poder precisar de forma especifica lo que necesitamos, sin necesidad de andar escarbando entre archivos y concatenando greps y awks.
A mas de esto, journalctl nos permite especificar distintos formatos de salidas utilizando el parametro –output:

short
short-iso
short-precise
short-monotonic
verbose
export
json
json-pretty
json-sse
cat

Conclusion

Concluyendo, para tener un conocimiento básico de los logs en Red Hat 7, conviene utilizar journalctl para familiarizarnos con la herramienta, revisar un poco el man y buscar de lograr obtener toda la información que solíamos buscar antes de que systemd nos invadiera.

~have fun

[1] RFC 3164 es la definición original, actualmente no se encuentra en vigencia

[2] Manual de RedHat 7 sobre rsyslog

RedHat Certified System Administrator 7 (RHCSA 7) – Sistemas en Funcionamiento II

Continuando con el post anterior (Redhat Certified System Administrator 7 Sistemas en Funcionamiento I) donde tratamos los primeros 3 puntos del segundo requerimiento del examen RHCSA.

A continuación continuaremos con el siguiente punto de forma sintética:

Identificar los procesos que hacen un uso intensivo de la CPU y de la memoria, ajustar la prioridad de los procesos con renice y eliminar procesos

Tradicionalmente, en cualquier unix ‘ps’ es el comando para identificar los procesos con sus respectivas características, cualidades y estados. Este tradicional comando, en los sistemas GNUs soporta 3 tipos de sintaxis para los parámetros, a saber: UNIX, BSD, y GNU. Para simplificar en este post utilizaremos la sintaxis UNIX la cual permite agrupar las distintas opciones y require un -.
Por ejemplo:

ps -aux

Cabe recalcar, ps a no es igual a ps -a.

Process Snapshot (ps)

El comando ps listará los procesos dependiendo de los parámetros modificadores que la pasemos.

Repasemos los mas pertinentes:
-e / -A  Listar todos los procesos
-x        Lista procesos que estén asociados a una terminal (TTY)-U       Lista los procesos asociados a un o varios usuarios
-o       Permite determinar que características del proceso se listaran

Los parámetros mas interesantes para -o son los siguientes:

%cpu        %CPU      cpu utilization of the process in "##.#" format. 
%mem        %MEM      ratio of the process's resident set size  to the physical memory on the machine, expressed as a percentage
args        COMMAND   command with all its arguments as a string. Modifications to the arguments may be shown.
cgroup      CGROUP    display control groups to which the process belongs.
ni          NI        nice value. This ranges from 19 (nicest) to -20 (not nice to others)
pid         PID       a number representing the process ID
ppid        PPID      parent process ID

Podemos entonces, combinar estos parámetros en una salida como la siguiente:

ps -e -o pid,%cpu,%mem,args

La cuál nos brindaría el pid, el porcentaje de CPU utilizado, el porcentaje de memoria utilizado y los argumentos con los cuales se ejecuto el programa. Otro parámetro interesante es cgroup, ya que desde que tenemos systemd, todos los procesos se ejecutan bajo el control de un grupo (control group).

Pueden encontrar estos parámetros y muchos mas haciendo ‘man ps’, en la sección STANDARD FORMAT SPECIFIERS

El último tip, es el siguiente: para poder ordenar la salida, utilizamos –sort, y especificamos en base a que parámetro queremos ordenar la salida.

Por ejemplo ordenaremos por porcentaje de procesamiento del CPU:

ps -e -o pid,%cpu,command --sort %cpu

Table of Process (top)

Otro comando clásico de los UNIXs, nos listara en tiempo real la table de procesos y su consumo de recursos. Así mismo, por defecto top ordena los procesos por su consumo de CPU, lo que nos facilita encontrar cuáles son los programas que mas recursos consumen.
Presionando r se podrá cambiar el número de prioridad de un proceso y con k podemos enviar una señal para matar al proceso.
Podrán encontrar un buen post sobre top aquí

Nice & renice

Los sistemas UNIXs permiten establecer prioridades de procesamiento para que el CPU se ‘concentre’ mayormente en ciertas tareas y relegue otras.
Nice permite ejecutar un comando con una prioridad determinada:

nice -n 5 comando --argumento

Si el proceso ya estuviese corriendo, podemos reasignarle la prioridad con renice referenciando su pid:

renice -n 4 2345

Kill y sus derivados

Finalmente, para eliminar un proceso, tenemos el comando kill.
Unix establece distintas señales que podemos enviarle a un proceso, las mas comunes son SIGHUP (1) (morir y volver a ejecutarse), SIGTERM (15) (le avisa al proceso que tiene que terminar su ejecución, pero le da tiempo de que cierre los file descriptors y mate a sus hijos) y SIGKILL (9) (termina el proceso inmediatamente)l.

Así, podemos enviarle estas señales utilizando el PID y el numero de señal:

kill -s 9 2345

Killall  y pkill nos permiten hacer lo mismo, pero buscando el proceso por nombre:

killall -s 9 xchat

Otro post interesante sobre el tema, aqui

Conclusión

Estos temas son básicos para cualquier administrador linux/unix, por lo que simplemente hicimos un brevisimo repaso, no hay diferencias en Red Hat 7 de lo que ya conocemos en este punto.

Saludos!

~have fun

RedHat Certified System Administrator 7 (RHCSA 7) – Sistemas en Funcionamiento I

El segundo de los requerimientos incluidos en la certificación de Red Hat (versión 7) para System Administrator incluye los siguientes puntos:

Usar sistemas en funcionamiento
• Arrancar, reiniciar y apagar un sistema normalmente
• Iniciar sistemas manualmente en destinos diferentes
• Interrumpir el proceso de arranque con el fin de obtener acceso a un sistema
• Identificar los procesos que hacen un uso intensivo de la CPU y de la memoria,
ajustar la prioridad de los procesos con renice y eliminar procesos
• Ubicar e interpretar archivos de registro del sistema y diarios
• Acceder a la consola de una máquina virtual
• Iniciar y detener máquinas virtuales
• Transferir archivos entre diferentes sistemas de forma segura

Estos objetivos, aunque triviales para un administrador linux avezado, presentan un nuevo reto, ya que en esta versión del sistema del gorro rojo se ha incorporado systemd, agregando muchas mas funcionalidades y un poco de complejidad.

Desglosaremos brevemente los primeros 3 puntos en este post:

Arrancar, reiniciar y apagar un sistema normalmente

Puede que este enunciado nos tiente a pensar que ‘shutdown’, ‘reboot’ e ‘init’ sean los comandos necesarios para manejar el tema. Si bien es cierto, no lo es menos, que ahora todo el proceso de inicio, apagado y reinicio es administrado por systemd, por lo tanto, hemos de incorporar el systemd en nuestro repertorio de comandos:


# systemctl reboot

# systemctl halt

# systemctl poweroff

De todas formas podemos seguir utilizando los clásicos:

Reinicio

# reboot
# shutdown -r now
# init 6

Apagado

# halt
# shutdown -h now
# init 0

Apagado ACPI

# poweroff

Por otro lado, con systemd podemos administrar la suspensión/hibernación desde el mismo comando systemctl:

# systemctl suspend
# systemctl hibernate
# systemctl hybrid-sleep

Iniciar sistemas manualmente en destinos diferentes

Así mismo, con systemctl podremos administrar lo que antes conocíamos como ‘run levels’, ahora systemd introduce el concepto de ‘targets’ mejorando en gran manera las dependencias para pasar de un ‘target’ a otro.
Conocidos por todos, los run levels son:

  • 0, halt
  • 1, single: Single user o mantenimiento
  • 2: no network: sistema sin recursos de red
  • 3: multi usuario sin interfaz gráfica
  • 5: multi usuairio con interfaz gráfica
  • 6: reboot

Y podiamos pasar de uno a otro con el comando init:

#init 1

Y para saber en que run level nos encontramos podemos utilizar los siguientes comandos:

# runlevel
# who -r 

systemd es compatible con todos estos comandos, pero se recomienda la utilización del comando systemctl, cuyo uso se detalla brevemente a continuación:

Single user con file systems locales montados:

#systemctl rescue

Single user sin file systems locales montados (sólo el /)

#systemctl emergency

Multi usuario sin interfaz gráfica

#systemctl isolate multi-user.target

Multi usuario con interfaz gráfica

#systemctl isolate graphical.target

También podemos, sin editar ningún archivo, configurar un target, como el target por defecto, utilizando:

#systemctl set-default multi-user.target

Y para saber cual es el run level por defecto

#systemctl get-default

 

Interrumpir el proceso de arranque con el fin de obtener acceso a un sistema

Este punto, aunque simple, es crucial en el examen, ya que difiere en absoluto de lo que solíamos hacer  (iniciar en single mode). En este link de Red Hat, se encuentra un procedimiento un poco mas detallado del que aquí expondremos y en este link, un método alternativo, un tanto mas a la vieja usanza.

Para interrumpir el proceso de arranque, acceder al sistema y cambiar el  pasword de root, seguiremos estos pasos:

  1.  Detenemos el conteo de grub y entramos en modo edición presionando la e
  2. Buscamos la linea que comienza con ‘linux’ (o ‘linux16 o ‘linuxefi’) y borramos los parametros ‘quiet’ y ‘rhgb’ para poder visualizar los mensajes del sistema.
  3. Agregamos el siguiente parametro:
    rd.break enforcing=0

    Booteamos con ‘Ctrl-x’

  4. Nos encontraremos con el prompt de una shell del initramfs ‘switch_root’, desde donde montaremos el / con permiso de escritura:
    switch_root:/# mount -o remount,rw /sysroot
  5. Utilizamos chroot para utilizar /sysroot como nuestro /
    switch_root:/# chroot /sysroot
  6. Ya dentro de la shell del chroot, podemos ejecutar el comando passwd
    sh-4.2# passwd
  7. Una vez cambiada la password, montamos el / como sólo lectura
    sh-4.2# mount -o remount,ro /
  8. Salimos de la shell del chroot con exit y nuevamente con exit salimos de la shell del initramfs para continuar con el proceso de inicio
  9. Ejecutamos restorcon al archivo /etc/shadow para que contenga el contexto selinux adecuado
    restorcon /etc/shadow
  10. Restablecemos selinux a enforcing mode:
    #setenforce 1

Si necesitáramos iniciar en modo ‘rescue’ o ’emergency’, hemos de saber que es posible, editando la linea ‘linux’ (como hacemos en el paso 2) y agregando

systemd.unit=rescue.target

o

systemd.unit=emergency.target

En cualquiera de los dos casos, necesitaremos el password de root para acceder.

En el próximo post, seguiremos revisando los puntos importantes de este objetivo, hasta entonces:

~have fun

RedHat Certified System Administrator 7 (RHCSA 7) – Herramientas esenciales

El primer punto de los requerimientos para certificar RedHat 7 como System Administrator, pide los siguientes requerimientos:

Conocer y usar las herramientas esenciales
• Acceder a una instancia shell y escribir comandos con sintaxis correcta
• Utilizar redirección de entrada-salida (>, >>, |, 2>, etc.)
• Utilizar expresiones regulares y grep para analizar texto
• Acceder a sistemas remotos mediante ssh
• Iniciar sesión y cambiar de usuario en destinos multiusuario
• Archivar, comprimir, desempaquetar y descomprimir archivos utilizando tar, star,
gzip y bzip2
• Crear y editar archivos de texto
• Crear, borrar, copiar y mover tanto archivos como directorios
• Crear enlaces físicos y simbólicos
• Enumerar, configurar y cambiar permisos ugo/rwx estándar
• Localizar, leer y utilizar documentación de sistema, incluido man, info y archivos
en /usr/share/doc

Como estos requerimientos suelen ser conocidos por cualquier administrador Unix/Linux, me limitaré a compartir con uds un Cheat Sheet, donde se ejemplifican en comandos los requerimientos.

 

~have fun

Net Tools vs IPRoute2 – Parte I

 

Linux es una excelente plataforma para experimentar  y trabajar sobre networking. Las herramientas más básicas han sido heredadas de Unix (ifconfig,netstat,arp.. etc) y a decir verdad, estamos bastante cómodos con ellas. Sin embargo, hace años que el desarrollo de linux ha creado nuevas herramientas, mas poderosas aunque no tan populares; Como sabrán, me refiero, al set de herramientas iproute2.

La pregunta es: ¿Vale la pena el esfuerzo de cambiar a iproute2?

Veremos en los siguientes posts, ventajas y desventajas, uso y desusos…

Net Tools

Net Tools, también llamado mas precisamente NET-3 Networking toolkit, es un set de herramientas heredado históricamente de Unix.
Estas son: arp, hostname, ifconfig, netstat, rarp, route, plipconfig, slattach, mii-tool,  iptunnel  y ipmaddr.
A que algunas te han sorprendido eh!?
Hagamos un apropos:

arp (8): manipulate the system ARP cache
hostname (1): show or set the system's host name
ifconfig (8): configure a network interface
netstat (8):  Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
rarp (8): manipulate the system RARP table
route (8): show / manipulate the IP routing table
plipconfig (8): fine tune PLIP device parameters
slattach (8): attach a network interface to a serial line
mii-tool (8): view, manipulate media-independent interface status
iptunnel (8): creates, deletes, and displays configured tunnels
ipmaddr (8): adds, deletes, and displays multicast addresses

Ahora bien, si utilizas linux dia a dia, muy difícilmente no conozcas arp, netstat, ifconfig, hostname y route, si no conoces algunos de esos comandos, este artículo no es para vos; Sin embargo, el resto de los comandos se utilizan en situaciones mas especificas.
Convenimos pues, en que la costumbre y la simplicidad histórica de estos comandos nos gustan.
Sin embargo, veamos ahora, como una comparación con IPRoute2 nos da una mejor idea de las diferencias que hay entre ambos.

IPRoute 2

El protagonista de iproute2 es el comando ip, en el cual se resumen la mayoría de las tareas que solíamos hacer con net-tools.
Aquí tenemos una pequeña tabla de referencia:

ifconfig ip addr show
arp ip neigh show
route -n ip route show

Hay mas, pero esto sirve para que veas que el comando ip se robará el protagonismo. Desde el comando ip podremos configurar prácticamente todo lo relacionado con las redes en linux.

Veamos como usar iproute en el día a día y dejaremos para mas adelante, las opciones mas avanzadas:

Rutas

Listar rutas:

Con net-tools usabamos:

route -n

Ahora con ip route podemos usar:
ip route | ip route ls | ip route show
Cualquiera de estos tres comandos nos da como resultado algo como lo siguiente:

default via 192.168.1.1 dev eth0 proto static
10.42.0.0/24 dev wlan0 proto kernel scope link src 10.42.0.1 metric 9
148.91.164.0/24 dev eth0 proto kernel scope link src 148.91.164.131 metric 1
169.254.0.0/16 dev eth0 scope link metric 1000

Mas adelante veremos como hacer un filtrado por tipo de ruta y otras caracteristicas, pero sigamos por lo básico.

Agregar una ruta:

Con net-tools usabamos:

route add -host ip ip-gw
route add -net netip-gw

Ahora utilizamos:

ip route add ip/net via ip-gw

Por ejemplo:

ip route add 10.1.1.0/24 via 192.168.4.1

o bien:

ip route add 10.1.1.20 via 192.168.4.1

Como verán, es indistinto si es un host o una red. Nos es muy diferente en principio, pero mas adelante veremos cuantas otras opciones tenemos para agregar.

Quitar una ruta:

Con net-tools usabamos:

route del -host ip gw ip_dw
route del -net net gw ip_gw

Ahora utilizamos:

ip route del ip via ip_gw
ip route del net via ip_gw

Direcciones IP

Es dificil pensar en no usar el ‘ifconfig’, pero hagamos un intento y veamos que sale:

Listar interfaces

Con net-tools usabamos
ifconfig | ifconfig -a

Con iproute utilizamos

ip addr | ip addr list | ip addr show

Que nos devolverá un output como el siguiente:

1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 16436 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 63:34:55:66:11:3a brd ff:ff:ff:ff:ff:ff
inet 123.41.14.135/24</strong> brd 123.41.14.255 scope global eth0
inet6 fe80::6531:50ff:fe68:1d34/64 scope link
valid_lft forever preferred_lft forever
3: wlan0: &lt;BROADCAST,MULTICAST&gt; mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 00:26:82:dc:9d:51 brd ff:ff:ff:ff:ff:ff

En principio, el output de ip addr tiene mas info del que acostumbramos con ifconfig, pero nada de que preocuparse. Verán señalado en el output anterior, alguna data interesante señalada.

Asignar direcciones:

Con net-tools usabamos ifconfig de la siguiente manera para asignar una dirección IP:

ifconfig eth0 ip netmask netmask

Con iproute usaremos:

ip addr add ip/prefix dev eth0

Y para eleminar una ip de manera similar:

ip addr del ip/prefix dev eth0

Primeras conclusiones

Si bien iproute no parece incrementar la dificultad de configurar básicamente nuestras redes, no deja de ser cierto que la costumbre tira para seguir usando el viejo set de utilidades unix-like, sin embargo, en los próximos posts veremos usos mas avanzados y útiles que haran inclinar la balanza.

~have fun

Pretty Ping

No es más que un script en bash, pero que útil que es.
Hablamos de Pretty Ping, un script que nos mostrará un bello output del viejo y siempre útil ping:

pettyping

Puedes bajarlo aquí, y seguir los siguientes pasos para que quede andando en tu sistema:

# vi /usr/local/bin/prettyping #Copiamos el código
# chmod +x /usr/local/bin/prettyping
# prettyping google.com

~have fun

Mi Spider favorito (o hacking con wget)

Wget es una herramienta conocida por todos, pero su potencial es generalmente subestimado.
Aunque quizas tengas en tu mente algo como:

 wget http://www.foo.com/varfoo.iso

Pero en realidad wget tiene mucho mas para dar.
Repasemos algunos usos y utilidades interesantes para nuestro pentesting

– Link Status
Para checkear los headers y estado de cada link del sitio:

wget -o results.txt --spider -nd -S -r -l inf www.example.com

– Busqueda de archivos
Podemos buscar archivos, para luego extraer meta data por ejemplo:

wget -r -l inf -nd -nc --ignore-case -A *.pdf www.example.com

o bien

wget -r -l inf -nd -nc --ignore-case -A jpg,gif,png www.example.com

– Guardar cookies para su estudio:

wget -r -l inf -nd -nc --save-cookies cookies.txt www.example.com

– Mirror de un sitio

wget -r -l inf -E -k -p -N http://www.example.com

– Análisis de cache:
Podemos pedirle a wget que pida al servidor http deshabilitar el cache con –no-cache. Esto simplemente hace que el servidor http nos entregue los archivos directamente, no los cacheados.

Por otro lado, a estas utilidades le sumamos las siguientes utilidades:

Especificar un ‘Referer’:
Esto le dirá al servidor http ‘desde donde accedimos al link’

--referer=http://www.google.com/search

Esta opción, en conjunto con otras, pueden ayudar a evitar que un IDS o un PDS detecten que se esta analizando el sitio.

Especificar un ‘User-Agent’:

Si no especificamos un ‘User-Agent’, wget utilizará Wget/version lo que puede ser un disparador de alarmas. Algo como esto puede ser menos sospechoso:

--user-agent='Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0'

En el siguiente link, hay una enorme lista de User Agents

Especificar un header:

La opción –header nos permite

Especificar los tiempos:
Otro disparador de alarma pueden ser los tiempos en que descargamos un sitio, para eso wget tiene las siguientes variables:

--wait=seconds # Especifica la cantidad de segundos entre download y download
--random-wait # Multiplica el valor de --wait por un número al azar entre 0.5 y 1.5 (Muy útil!!!)
--wait-retry=seconds # Especifica cuantos segundos esperará antes de reintentar descargar un link que ha dado error inicialmente

Una buena combinación de estos tiempos ayudará a pasar inadvertido.

Usar un archivo de input

Con -i podemos especificar un archivo donde tengamos un lista de URLs. Asimismo utilizando –force-html, el archivo de input será leído como un html. Si los links dentro del html son relativos podemos utilizar –base=url con el fin de especificar la url utilizada como base.
Por otro lado, si utilizamos ‘-i -‘ wget tomará la lista de URLs desde el standard input, lo que lo hace combinable con otros comandos utilizando un pipe.
Por ejemplo:

lynx -dump "http://www.example.com" | grep -eo "http:.*" | wget -xi -

Conclusiones

Como vemos, wget tiene opciones muy interesantes por ser una herramienta que no esta pensada originalmente para hacer pentesting. Quizas podríamos esperar  la posibilidad de especificar múltiples valores en –user-agent y –referer, pero no es nada que no se arregle un par de lineas en bash. En conclusión, has tenido wget todo este tiempo en tu consola subutilizandolo, quizás sea hora de que te des una vuelta sobre su man.

~have fun

Flags del Kernel para Firewall o Tuneando el /proc

Opciones de Seguridad en el kernel de Linux (proc)

 

IpTables es la herramienta en espacio de usuario, que permite establecer filtros con NetFilter, el cual es parte del kernel de Linux. Pero independientemente de las herramientas en espacio de usuario, existe una forma de indicar al kernel, como manejar ciertas cosas. Esta forma es, a saber, mediente variables del kernel que pueden modificarse desde el directorio /proc.

/proc

No tengo que detenerme mucho sobre le directorio /proc, ya que basta googlear para encontrar información sobre este pseudo sistema de ficheros. Solo hay que decir que mediante el proc podemos acceder a información del kernel, y modificar “on the fly” ciertas configuraciones.

Por ejemplo en /proc/sys/kernel/hostname encontramos el hostname de nuestro linux, y lo cambiamos haciendo

echo otroHostname > /proc/sys/kernel/hostname

De esta misma manera, podremos cambiar “a mano” ciertos valores del funcionamiento del kernel, y consecuentemente, el comportamiento del networking del mismo. Sin embargo, existe una manera mas “prolija”: sysctl

Sysctl, nos permite configurar las mismas variables (ver mas abajo) que esten configuradas en el /proc/sys , de forma centralizada en el archivo /etc/sysctl.conf. Siendo su sintaxis muy simple:

clave.a.configurar = valor

Para no ahondar mucho sobre el tema, simplemente hagamos un breve repaso y vayamos a lo importante

Breve repaso:

 

sysctl -a # muestra todas las variables configurada
sysctl -w kernel.hostname=MyHaxorName # asigna "MyHaxorName" como hostname del sistema
sysctl kernel.hostname # muestra el valor asignado a la variable
echo "kernel.hostname = MyHaxorName" >> /etc/sysctl.conf # cada vez que se inicie el sistema, sysctl configurará
las variables como se encuentran en este archivo 

A continuación, una lista de las variables mas importantes a tener en cuenta para la seguridad de nuestro firewall

Filtro anti-spoof

/proc/sys/net/ipv4/conf/eth0/rp_filter

En /proc/sys/net/ipv4/conf tenemos una carpeta por cada interfaz de red (eth0, lo, wlan0.. etc, además de las carpetas default y all). En cada una de ellas, encontramos archivos que configuran comportamiento especifico de cada interfaz, en el caso de rp_filter, es un filtro anti spoof: solo permite que la respuesta a un paquete sea enviada por la misma interfaz por la cual se recibió el paquete.

Habilitamos con 1, deshabilitamos con 0.

Ignorar pings

/proc/sys/net/ipv4/icmp_echo_ignore_all

Bastante conocido, con un 1 en este archivo, ignoramos todos los paqutes ICMP tipo echo, es decir, los pings.

El no responder pings, permite que pasemos desapercibidos en algunos escaneos simples, pero también nos bloquea la posibilidad de hacer pruebas de pings.

Syn Cookies

/proc/sys/net/ipv4/tcp_syncookies

El ataque syncooky conciste en enviar muchos paquetes TCP con el flag SYN activado,  pero no completa el HandShake, por lo que ocupa memoria en conexiones que quedan a la espera, causando un DoS. Colocando un 1 en este archivo, le pedimos al kernel, que no abra un buffer hasta que la conexión este abierta.

Paquetes Marcianos

/proc/sys/net/ipv4/conf/all/log_martians

Envia señales a syslog cuando entran paquetes de redes ilegales (cuando el kernel no sabe como rutearlas).

Paquetes Icmp Redirect

/proc/sys/net/ipv4/conf/all/accept_redirects

Un paquete ICMP Redirect, informa cuando hemos mandado un paquete a travez de una ruta que no es la optima.

Un ejemplo casero, es cuando tenemos ROUTER1 conectado a internet y a la LAN, en la cual existen 2 pc (PC1 y PC2), la configuración normal seria configurar a PC1 y PC2 con Default Gatewat en ROUTER1. Si cometieramos la tontera configurar PC2 con su default gateway en PC1 (teniendo por Default Gateway a ROUTER1 en esta pc) PC1 nos informaria que hay una ruta mas directa, y es atravez de ROUTER1. Esa funcion de anunciar esa ruta la cumple los paquetes ICMP Redirect. Con este tipo de paquetes, “alguien” podría realizarte un MITM.

ICMP Send_Reditect

/proc/sys/net/ipv4/conf/all/send_redirects

La explicación de esta variable esta explicada en Paquetes ICMP Redirect, pero en este caso, implica no enviar dichos paquetes ICMP.

Si tu linux no actua como ruter, en una red con varios routers, lo mas aconsejable es deshabilitarlo, poniendo un 0.

Ip Connection Tracking

/proc/sys/net/ipv4/ip_conntrack_max ó

/proc/sys/net/ipv4/netfilter/ip_conntrack_max

En este archivo podemos colocar un numero, el cual será la cantidad máxima de conexiones IP que el kernel puede manejar. Este numero suele estar fijado segun la cantidad de memoria ram que poseamos. Esto puede ser un punto clave a la hora de lidiar con DoS. Asi mismo, podemos encontrar unos cuantos archivos similares, pero más especificos, haciendo ls /proc/sys/net/ipv4/netfilter/ip_conntrack*, los nombres de cada uno dan una idea de funcionalidad, y si conoces bien el funcionamiento del protocolo IP podrás retocar estos valores.

Source Route

/proc/sys/net/ipv4/conf/all/accept_source_route

Cuando internet nacio, inocentemente creia que todos serían buenas personas, por lo que sus protocolos, permitian a cualquiera obtener mucha información, en este caso, Ipv4,  permite que solicitemos a un determinado host, una ruta especifica por donde enviar paquetes, pudiendo ser utilizada esta información para conocer las “Relaciones de Confianza” entre routers. Fuera de eso, hoy en dia no se usa. Lo deshabilitamos con un 0

ICMP Broadcasting  (protección smurf)

/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

ICMP tiene la facultad de poder enviar paquetes Broadcast, es decir, enviar un paquete, el cual todos los hots reconoceran como enviados hacia si mismos, ya que el destino de dicho paquete es una dirección de broadcast. Al recibir este paquete, el host actua en consecuencia y lo responde. Si todo funcionara como corresponde, no habria problema con esta funcionalidad… pero si “alguien” decide enviar paquetes ICMP Broadcast a una gran lista de IPs con un “source” spoofeado, todos los IPs de la lista enviarian una respuesta a la IP inocente (la spoofeada), causandole probablemente un DoS. Para evitar que nos usen como “reflector” enviandonos paquetes broadcast, ignoramos dichos paquetes colocando un 1 en este archivo.

ICMP Dead Error Messages

/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

El RFC 1122, nos pide que los paquetes ICMP erroneos sean completamente descartados silenciosamente, para no probocar tormentas de broadcast.  Para cumplir con dicho requerimiento, colocamos un 1 en dicho archivo.

IP Forward

/proc/sys/net/ipv4/ip_forward

Conocida por todos, esta variable, habilita o deshabilita el reenvio de paquetes. En los casos donde nuestro linux haga NAT, debe estar habilitada, en caso contrario, es recomendable deshabilitarlo.

TCP FIN TimeOut

/proc/sys/net/ipv4/tcp_fin_timeout

Tiempo en segundos que esperaremos antes de descartar una conexión parcialmente cerrada, por defecto 60 segundos, ya que así lo pide el RFC correspondiente a TCP, pero si queremos podemos disminuirlo a fin de evitar algún DoS.

TCP KeepAlive Time

/proc/sys/net/ipv4/tcp_keepalive_time

Cantidad de segundos que esperará el kernel, antes de enviar un paquete para mantener abierta la conexión, a pesar de que no esta siendo utilizada momentaneamente. Por defecto el valor es 7200 (2 horas),  pudiendo ser reducido en algunos casos a 1 hora o 1/2 hora, en segundos 3600 o 1800.

Proxy Arp

/proc/sys/net/ipv4/conf/all/proxy_arp

Con un 0 podemos deshabilitar esta funcionalidad, que no suele ser necesaria, a menos que seamos servidor de VPN, Firewall o Router que lo requiera.

Cache ARP

/proc/sys/net/ipv4/neigh/[interfaz de red]/gc_stale_time

Los segundos que configuremos en esta variable, definiran el tiempo en que se actualiza el cache ARP. Dicho cache, es el que se envenena cuando se realiza un ARP Poisoning Attack, por lo que cuanto mas bajo sea, mas vulnerable a este ataque, pero al mismo tiempo,  mas rapido sabremos cuando una IP quedo fuera de servicio o una MAC cambio de IP (arp -n para verificar las entradas del cache y su estado)

Escalado de Ventana

/proc/sys/net/ipv4/tcp_window_scaling

Dicha variable, habilita (con un 1) o deshabilita (con un 0) la posibilidad de que la conexión TCP negocie el tamaño de la ventana. Dependiendo del segmento de la red y la topologia de la misma, suele ser conveniente que esté habilitada, sin embargo, nos expone a ciertos escaneos (nmap windows scaling) y a posibles DoS.

Algoritmo SACK

/proc/sys/net/ipv4/tcp_sack

SACK es un algoritmo para detectar perdidas de paquetes. Si habilitamos dicha opción (colocando un 1) siempre y cuando pueda, TCP lo utilizará, en caso contrario, ignorará dicha opción. Es recomendable habilitar dicha opción, ecepto que nuestras conexiones TCP las hagamos en un ambito sin demasiadas perdidas de paquetes.

Rango de Puertos Locales

/proc/sys/net/ipv4/ip_local_port_range

En este archivo no colocaremos ni un 1 ni un 0, si no que colocaremos de números, que definiran un rango de puertos, el cual será utilizado para puertos locales, es decir, puertos desde donde comenzaremos conexiones hacia el exterior. En general el rago es 1024 a 4999, pero es conveniente ejecutar:

#echo "32768 61000" > /proc/sys/net/ipv4/ip_local_port_range

en sistemas donde se usen los puertos 1024 a 4999 para brindar servicios.

TTL de nuestros paquetes

/proc/sys/net/ipv4/ip_default_ttl

TTL es Time To Live, o bien, el tiempo de vida que le otorgaremos a los paquetes generados por nuestro host. Este “tiempo” no se cuenta en segundos, sino en cantidad de routers que puede atravesar antes de ser descartado (morir). Es asi que cada router, descuenta uno a dicho valor.

Llegar de sudamerica a china nos cuesta de 12 a 20 saltos, por lo que un paquete que tenga mas de 30 saltos es un tanto raro. El valor mas recomendado en general es 64 (traceroute y a sacarnos las dudas)

Explicit Congestion Notification

/proc/sys/net/ipv4/tcp_ecn

Como lo recita su nombre, ECN es una opción de TCP que permitenotificar cuando un host esta congestionado, para que se busque otra ruta. Algunos firewalls o routers pueden llegar a filtrar los paquetes que tengan esta opción habilitada, pero son los menos. Habilitamos con un 1, que sería lo mas recomendable.

Conclusión:

A la hora de armar un Firewall para nuestro linux, no es cuestión de ejecutar cualquier script a fin, si no conocer bien que es lo que necesitamos, para que y como. El conocer estas variables nos permite conocer donde debemos tocar en caso de ser necesario.

Sentimentalismo de la #Eko10 episodio 2 (o generación del 80-90)

En el panel de comienzo de la #eko10, se hablo de como comenzo todo (el hacking en Argnetina), una charla bastante sentimental, sobre las primeras experiencias de quienes hoy son referentes en la seguridad infromática en argentina. Ahora bien, no soy de la misma generación, yo no me conecte nunca a una BBS, ni leí virus report. Pero soy de una generación (calculo yo, no seré el único) que leía la EKO y HBO magazines en txt (algunas bajadas de zinestore), que aún compilaba kernels, que uso el NetBUS, el Sub7, que jugaba al AgeOfEmpires, que instalo el “Caldera Linux” y leyó el libro de Facundo Arena de Linux Avanzado (con cd slackware 7!) y las primeras 3 ediciones de USER Linux (antes del relanzamiento), y de los que maldijeron los “winmodems”.

Los recuerdos son muchos, y similares a los que se presentaron en ese panel. Para ambos el inframundo era mas inocente, para ambos la cuenta de teléfono fue un problema. Ellos abrieron un camino,  nosotros lo continuamos y abrimos los propios.  El hacking no sólo se trata de lo que suele suponerse, si no de descubrir nuevos caminos, cada uno a su manera y en lo que le gusta.

En fin, además del sentimentalismo y la nostalgia, esta edición de la EKO me dejó un par de conocidos muy interesantes. Si no fuiste te animo a que pienses en hacerlo la próxima edición, no solo se trata de seguridad informática, si no de un lugar de encuentro para SysAdmins, Frikis, Hackers, Developers, y todo tipo de Nerds/Informáticos jugando a abrir candados, capturar paquetes wifi, pegandolé al muñeco de SysARmy, etc etc.