<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>El rincón de Zerial &#187; bash</title>
	<atom:link href="http://blog.zerial.org/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zerial.org</link>
	<description>Informática, GNU/Linux, Seguridad, Hacking, Programación, Ocio</description>
	<lastBuildDate>Wed, 08 Feb 2012 20:48:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Búsqueda de servicios DNS con Transferencia de Zona abierta (AXFR)</title>
		<link>http://blog.zerial.org/seguridad/busqueda-de-servicios-dns-con-transferencia-de-zona-abierta-axfr/</link>
		<comments>http://blog.zerial.org/seguridad/busqueda-de-servicios-dns-con-transferencia-de-zona-abierta-axfr/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 18:00:39 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[axfr]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bind]]></category>
		<category><![CDATA[dig]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[gnu]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[transferencia de zona]]></category>
		<category><![CDATA[zone transfer]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=2572</guid>
		<description><![CDATA[Ya vimos que los servidores mal configurados que permiten realizar transferencias de zona sin restricciones desde cualquier IP son muchos. Para saber si un servidor DNS es &#8220;vulnerable&#8221; a este tipo de ataque usamos la herramienta dig, primero obtenemos los dns que estan asociados al dominio, para este ejemplo usaremos el dominio zerial.org. $ dig [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.zerial.org/seguridad/axfr-una-vulnerabilidad-que-pasa-desapercibida/">Ya vimos</a> que los servidores mal configurados que permiten realizar transferencias de zona sin restricciones desde cualquier IP son muchos.</p>
<p>Para saber si un servidor DNS es &#8220;vulnerable&#8221; a este tipo de ataque usamos la herramienta <strong>dig</strong>, primero obtenemos los dns que estan asociados al dominio, para este ejemplo usaremos el dominio <em>zerial.org</em>.</p>
<p><code>$ dig NS zerial.org<br />
; &lt; &lt;&gt;&gt; DiG 9.7.3 &lt; &lt;&gt;&gt; NS zerial.org<br />
;; global options: +cmd<br />
;; Got answer:<br />
;; -&gt;&gt;HEADER&lt; &lt;- opcode: QUERY, status: NOERROR, id: 64152<br />
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 6</p>
<p>;; QUESTION SECTION:<br />
;zerial.org.			IN	NS</p>
<p>;; ANSWER SECTION:<br />
zerial.org.		86400	IN	NS	ns1.linode.com.<br />
zerial.org.		86400	IN	NS	ns3.linode.com.<br />
zerial.org.		86400	IN	NS	ns2.linode.com.<br />
zerial.org.		86400	IN	NS	ns5.linode.com.<br />
zerial.org.		86400	IN	NS	ns4.linode.com.</code></p>
<p>Ya tenemos la lista de los servidores dns de <em>zerial.org</em>, para probar la transferencia de zona cambiamos <strong>NS</strong> por <strong>AXFR</strong> y forzamos que use el DNS que nosotros elijamos, en este caso probaremos <em>ns3.linode.com</em>:</p>
<p></code><code>$ dig AXFR zerial.org @ns3.linode.com</p>
<p>; &lt; &lt;&gt;&gt; DiG 9.7.3 &lt; &lt;&gt;&gt; AXFR zerial.org @ns3.linode.com<br />
;; global options: +cmd<br />
; Transfer failed.</code></p>
<p><strong>Failed</strong>. No hemos logrado transferir la zona desde ns3.linode.com, lo que nos indica que aparentemente se encuentra bien configurado.<br />
Otro ejemplo usando un dominio que sepamos que tiene esta falla: <strong>finanzas.gov.ar</strong>.<br />
Obtenemos los dos:</p>
<p><code>$ dig NS finanzas.gov.ar</p>
<p>; &lt; &lt;&gt;&gt; DiG 9.8.0-P4 &lt; &lt;&gt;&gt; NS finanzas.gov.ar<br />
;; global options: +cmd<br />
;; Got answer:<br />
;; -&gt;&gt;HEADER&lt; &lt;- opcode: QUERY, status: NOERROR, id: 38476<br />
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2</p>
<p>;; QUESTION SECTION:<br />
;finanzas.gov.ar.		IN	NS</p>
<p>;; ANSWER SECTION:<br />
finanzas.gov.ar.	7006	IN	NS	ns3.zoneedit.com.<br />
finanzas.gov.ar.	7006	IN	NS	ns9.zoneedit.com.</code></p>
<p>Probamos el segundo dns, <strong>ns9.zoneedit.com</strong>.</p>
<p></code><code>$ dig AXFR finanzas.gov.ar @ns9.zoneedit.com</p>
<p>; &lt; &lt;&gt;&gt; DiG 9.8.0-P4 &lt; &lt;&gt;&gt; AXFR finanzas.gov.ar @ns9.zoneedit.com<br />
;; global options: +cmd<br />
finanzas.gov.ar.	7200	IN	SOA	ns3.zoneedit.com. soacontact.zoneedit.com. 2011266765 2400 360 1209600 300<br />
finanzas.gov.ar.	7200	IN	NS	ns3.zoneedit.com.<br />
finanzas.gov.ar.	7200	IN	NS	ns9.zoneedit.com.<br />
finanzas.gov.ar.	7200	IN	A	201.253.123.35<br />
finanzas.gov.ar.	7200	IN	MX	10 ALT1.ASPMX.L.GOOGLE.COM.<br />
finanzas.gov.ar.	7200	IN	MX	10 ALT2.ASPMX.L.GOOGLE.COM.<br />
finanzas.gov.ar.	7200	IN	MX	0 ASPMX.L.GOOGLE.COM.<br />
finanzas.gov.ar.	7200	IN	MX	20 ASPMX2.GOOGLEMAIL.COM.<br />
finanzas.gov.ar.	7200	IN	MX	20 ASPMX3.GOOGLEMAIL.COM.<br />
finanzas.gov.ar.	7200	IN	MX	20 ASPMX4.GOOGLEMAIL.COM.<br />
finanzas.gov.ar.	7200	IN	MX	20 ASPMX5.GOOGLEMAIL.COM.<br />
mail.finanzas.gov.ar.	7200	IN	CNAME	ghs.google.com.<br />
googleffffffff85ca3fa2.finanzas.gov.ar.	7200 IN	CNAME google.com.<br />
asignaciones.finanzas.gov.ar. 7200 IN	A	186.136.205.252<br />
docs.finanzas.gov.ar.	7200	IN	CNAME	ghs.google.com.<br />
www.finanzas.gov.ar.	7200	IN	A	201.253.123.35<br />
mapas.finanzas.gov.ar.	7200	IN	A	201.253.123.35<br />
finanzas.gov.ar.	7200	IN	SOA	ns3.zoneedit.com. soacontact.zoneedit.com. 2011266765 2400 360 1209600 300<br />
;; Query time: 355 msec<br />
;; SERVER: 66.240.231.42#53(66.240.231.42)<br />
;; WHEN: Thu Aug 11 13:49:31 2011<br />
;; XFR size: 18 records (messages 18, bytes 1138)</code></p>
<p>La transferencia de zona se hizo de forma exitosa.</p>
<p>Para poder analizar de forma automatica un listado de dominios, hice un script en bash que usa DIG para obtener los dns de cada dominio y prueba realizar AXFR por cada dominio en todos sus dns.</p>
<pre name="code" class="c">#!/bin/bash

digcmd=$(which dig)
domain=$1
echo -n "[+] Getting NS domains from $1 ..."
ns_domains=$(dig NS $domain @4.2.2.2|grep ^$domain|awk {'print $5'}|sed 's/.$//g')
echo -e "\t[OK]"
for ns in $ns_domains; do echo "[-] Found: "$ns; done
for ns in $ns_domains
do
	echo -n "Trying Zone Transfer from $ns: "
	$digcmd AXFR $domain @$ns|egrep 'Transfer failed|timed out|end of file'>/dev/null
	if [ $? -eq 1 ]
	then
		echo -e "\tSuccess."
	else
		echo -e "\tFail."
	fi
done</pre>
<p><span id="more-2572"></span></p>
<p>La forma de ejecucion es:</p>
<p><code>]$ sh zonetransfer.sh finanzas.gov.ar<br />
[+] Getting NS domains from finanzas.gov.ar ...	[OK]<br />
[-] Found: ns9.zoneedit.com<br />
[-] Found: ns3.zoneedit.com<br />
Trying Zone Transfer from ns9.zoneedit.com: 	Success.<br />
Trying Zone Transfer from ns3.zoneedit.com: 	Success.</code></p>
<p>Nos indica que es posible realizar una transferencia de zona desde ns3.zoneedit.com y ns9.zoneedit.com para el dominio finanzas.gov.ar.<br />
Tambien podemos pasarle un archivo que contenga una lista de dominios que queramos analizar de forma masiva. Por ejemplo, tenemos un archivo llamado dominios.txt con los dominios:<br />
<code>finanzas.gov.ar<br />
transparencia.cl<br />
gobierno.cl<br />
argentina.gov.ar<br />
gobierno.es<br />
microsoft.com</code></p>
<p>Ejecutamos:</p>
<p><code>$ for dom in $(cat dominios.txt); do sh zonetransfer.sh $dom; done<br />
[+] Getting NS domains from finanzas.gov.ar ...	[OK]<br />
[-] Found: ns9.zoneedit.com<br />
[-] Found: ns3.zoneedit.com<br />
Trying Zone Transfer from ns9.zoneedit.com: 	Success.<br />
Trying Zone Transfer from ns3.zoneedit.com: 	Success.<br />
[+] Getting NS domains from transparencia.cl ...	[OK]<br />
[-] Found: ns02.000webhost.com<br />
[-] Found: ns01.000webhost.com<br />
Trying Zone Transfer from ns02.000webhost.com: 	Fail.<br />
Trying Zone Transfer from ns01.000webhost.com: 	Fail.<br />
[+] Getting NS domains from gobierno.cl ...	[OK]<br />
[-] Found: ga.interior.gov.cl<br />
[-] Found: gb.interior.gov.cl<br />
[-] Found: ns1.presidencia.cl<br />
Trying Zone Transfer from ga.interior.gov.cl: 	Fail.<br />
Trying Zone Transfer from gb.interior.gov.cl: 	Fail.<br />
Trying Zone Transfer from ns1.presidencia.cl: 	Success.<br />
[+] Getting NS domains from argentina.gov.ar ...	[OK]<br />
[-] Found: nsii.arcert.gov.ar<br />
[-] Found: nsii.sgp.gov.ar<br />
Trying Zone Transfer from nsii.arcert.gov.ar: 	Fail.<br />
Trying Zone Transfer from nsii.sgp.gov.ar: 	Fail.<br />
[+] Getting NS domains from gobierno.es ...	[OK]<br />
[-] Found: sun.rediris.es<br />
[-] Found: chico.rediris.es<br />
[-] Found: dns1.mpr.es<br />
[-] Found: dns2.mpr.es<br />
Trying Zone Transfer from sun.rediris.es: 	Fail.<br />
Trying Zone Transfer from chico.rediris.es: 	Fail.<br />
Trying Zone Transfer from dns1.mpr.es: 	Fail.<br />
Trying Zone Transfer from dns2.mpr.es: 	Fail.<br />
[+] Getting NS domains from microsoft.com ...	[OK]<br />
[-] Found: ns3.msft.net<br />
[-] Found: ns4.msft.net<br />
[-] Found: ns1.msft.net<br />
[-] Found: ns2.msft.net<br />
[-] Found: ns5.msft.net<br />
Trying Zone Transfer from ns3.msft.net: 	Fail.<br />
Trying Zone Transfer from ns4.msft.net: 	Fail.<br />
Trying Zone Transfer from ns1.msft.net: 	Fail.<br />
Trying Zone Transfer from ns2.msft.net: 	Fail.<br />
Trying Zone Transfer from ns5.msft.net: 	Fail.</code></p>
<p>Ya tenemos el <em>output</em> del script, donde nos dice que los dns de <em>finanzas.gov.ar</em> y uno de <em>gobierno.cl</em> permite AXFR.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fbusqueda-de-servicios-dns-con-transferencia-de-zona-abierta-axfr%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/seguridad/busqueda-de-servicios-dns-con-transferencia-de-zona-abierta-axfr/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/seguridad/busqueda-de-servicios-dns-con-transferencia-de-zona-abierta-axfr/"  data-text="Búsqueda de servicios DNS con Transferencia de Zona abierta (AXFR)" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/busqueda-de-servicios-dns-con-transferencia-de-zona-abierta-axfr/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>[PoC] Cifrado del historial de bash (.bash_history)</title>
		<link>http://blog.zerial.org/linux/poc-cifrado-del-historial-de-bash-bash_history/</link>
		<comments>http://blog.zerial.org/linux/poc-cifrado-del-historial-de-bash-bash_history/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 14:18:16 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Privacidad]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bash_history]]></category>
		<category><![CDATA[cifrado]]></category>
		<category><![CDATA[comandos]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[gnupg]]></category>
		<category><![CDATA[gpg]]></category>
		<category><![CDATA[pgp]]></category>
		<category><![CDATA[privacidad]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=2077</guid>
		<description><![CDATA[El otro día, en mis momentos de ocio, se me ocurrio buscar una forma de cifrar el historial de comandos que guarda bash. Hay servidores que sólo tenemos -o hemos ganado- acceso como usuarios, y no nos gusta que el administrador (root) vea lo que hacemos o los comandos que hemos ejecutado. Existen varias formas [...]]]></description>
			<content:encoded><![CDATA[<p>El otro día, en mis momentos de ocio, se me ocurrio buscar una forma de cifrar el historial de comandos que guarda bash. Hay servidores que sólo tenemos -o hemos ganado- acceso como usuarios, y no nos gusta que el administrador (root) vea lo que hacemos o los comandos que hemos ejecutado. Existen varias formas de ir contra eso, por ejemplo eliminar el bash_history o bien editarlo cada vez que hacemos algo que no queremos que sepan. Esta forma es un poco mas rebuscada y busca cifrar mediante GPG el historial, de manera tal que el root no podrá leer lo que dice el archivo.</p>
<p>La logica es bastante simple:</p>
<ol>
<li>Cuando ingresamos (login) a nuestra cuenta desciframos el bash history usando nuestra clave privada</li>
<li>Cuando salimos (logout) ciframos el archivo con nuestra clave publica.</li>
</ol>
<p>Para lograrlo vamos a necesitar tener una clave gpg y configurar el comportamiento del login y logout con unos scripts que les mostraré a continuación.</p>
<p><span id="more-2077"></span></p>
<p>Vamos a usar el usuario &#8220;usuario&#8221; de prueba. Primero, creamos la clave GPG:</p>
<p><code>[usuario@belcebu ~]$ gpg --gen-key</code></p>
<p>En mi caso, generé una clave de 2048 bits con el UID<strong> Usuario de Prueba (Historial Cifrado) &lt;test@zerial.org&gt;</strong></p>
<p>Editamos el archivo .<strong>bashrc</strong> y agregamos las siguientes lineas</p>
<pre class="c" name="code">gpg -d -r "Usuario de Prueba (Historial Cifrado) &lt;test@zerial.org>" $HISTFILE >$HOME/._bash_history
mv $HOME/._bash_history $HISTFILE</pre>
<p>Luego creamos el siguiente script, lo llamaremos <strong>.crypt_history.sh</strong>:</p>
<pre class="c" name="code">#!/bin/bash

sleep 2;
gpg -e -r "Usuario de Prueba (Historial Cifrado) &lt;test@zerial.org>" $HOME/.bash_history
mv $HOME/.bash_history.gpg $HOME/.bash_history</pre>
<p>Y agregamos la línea</p>
<pre name="code" class="c">nohup sh $HOME/.crypt_history.sh &#038;</pre>
<p>Al archivo <strong>.bash_logout</strong></p>
<p>De esta forma, al ingresar como <em>usuario</em> se ejecutará automaticamente el comando que descifra el .bash_history y cuando salimos, será cifrado.</p>
<blockquote><p>[root@belcebu ~]# cat /home/usuario/.bash_history<br />
zå¬ÈùrèÿJx¨¸QÕ{¥	±5#ºcHb¶÷çFÀ®ú4ÞÃØÝ­xbZúF çïkågµNÒ¸5îÅ£	³KÝ0U¯º±YHú#ÙÞ©Ù&#038;¶þ¢Lyug<br />
                                                                                                þ<br />
ÓL¹ðú®&#038;°í¾vI?V\9Õx&#8217;{4hÐaÜdÛPÅ©²¦öcñm¾O&#8217;µÔ2Éªðá¸ó²ëÕÁ²Nª<n æq#È`>OÈ`A²U´¬Uîkï<br />
u:÷ÛASþdè¶]1ê¬GBXLT¥3þ0Ñ_8uóâEQ¯`.¾Kn3AÒy»çÌ¡øyà$ßÙkíKzÜ§¸×&#8217;Øx¿S¥<br />
                                                                 ÂâÆâveó´Î/¸)aýü4µÅ:mCú}1Á$äãÑõæ>¥ÈM9IÈÛ³=PË^q{Ñ<br />
3º ë]Å¿74ë*Ø<br />
Öuå¦<br />
   [root@belcebu ~]#</n></p></blockquote>
<p>Y si ingresamos como usuario &#8230;</p>
<blockquote><p>gpg: encrypted with 2048-bit RSA key, ID C8F972E8, created 2011-02-03<br />
      &#8220;Usuario de Prueba (Historial Cifrado) <test @zerial.org>&#8221;<br />
[usuario@belcebu ~]$ history<br />
    1  cat nohup.out<br />
    2  vim .bashrc<br />
    3  vim .crypt_history.sh<br />
    4  ls<br />
    5  history<br />
    6  ls -lia<br />
    7  history<br />
[usuario@belcebu ~]$ </test></p></blockquote>
<p>Existe un pequeño detalle, es que el root puede ingresar como usuario y de esta forma poder el historial. Pero para esto, nosotros debemos proteger nuestro cifrado con un passphrase, asi cuando el root quiera ingresar como usuario, éste le pedira una clave para poder descifrar el archivo bash_history, si el root no maneja esa clave no podrá ver lo que hay.</p>
<p>Esto es solo una prueba de concepto (PoC), se puede hacer cualquier modificación a los scripts usados para adaptarlos a otras necesidades y obviamente mejorar el cifrado mismo del bash_history.<br />
<strong>Nota: </strong>Existen varios <em>peros</em> en esta forma de cifrar, que obviamente pueden ser mejoradas, por ejemplo, podria existir algun conflicto cuando se inicia mas de una vez la sesion del usuario.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fpoc-cifrado-del-historial-de-bash-bash_history%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/poc-cifrado-del-historial-de-bash-bash_history/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/poc-cifrado-del-historial-de-bash-bash_history/"  data-text="[PoC] Cifrado del historial de bash (.bash_history)" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/poc-cifrado-del-historial-de-bash-bash_history/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>[Tip] AND (&amp;&amp;) y OR (&#124;&#124;) en bash</title>
		<link>http://blog.zerial.org/linux/tip-and-y-or-en-bash/</link>
		<comments>http://blog.zerial.org/linux/tip-and-y-or-en-bash/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 01:24:05 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=2021</guid>
		<description><![CDATA[Parece algo muy simple, pero estoy seguro que muchos no lo saben: Usar los operadores lógicos &#38;&#38; y &#124;&#124; al momento de crear scripts o ejecutar comandos en bash. Podemos condicionar la ejecución de un comando en función de otro; por ejemplo, si falla el primer comando, entonces no ejecuto el segundo, o bien, si [...]]]></description>
			<content:encoded><![CDATA[<p>Parece algo muy simple, pero estoy seguro que muchos no lo saben: Usar los operadores lógicos <strong>&amp;&amp;</strong> y <strong>||</strong> al momento de crear scripts o ejecutar comandos en bash.<br />
Podemos condicionar la ejecución de un comando en función de otro; por ejemplo, si falla el primer comando, entonces no ejecuto el segundo, o bien, si no se ejecuta el primero entonces ejecuto el segundo, dependiendo de lo que necesitemos.<br />
Ejemplos:</p>
<p>Ejecutar el comando2 solo si se ejecuta el comando1:<br />
<code>$ comando1 &amp;&amp; comando2</code></p>
<p>Ejecutar el comando2 solo si <strong>no</strong> se ejecuta el primero<br />
<code>$ comando1 || comando2</code></p>
<p>Sería así:<br />
<code>[zerial@balcebu ~]$ comando1 || echo "Como comando1 no existe, entonces ejecuto el echo"<br />
bash: comando1: command not found<br />
Como comando1 no existe, entonces ejecuto el echo<br />
[zerial@balcebu ~]$ echo "El primer echo se ejecuta, pero el segnudo no" || echo "Como comando1 no existe, entonces ejecuto el echo"<br />
El primer echo se ejecuta, pero el segnudo no<br />
[zerial@balcebu ~]$ </code></p>
<p>Es muy útil cuando queremos programar scripts para ejecutar tareas condicionadas a otros comandos.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Ftip-and-y-or-en-bash%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/tip-and-y-or-en-bash/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/tip-and-y-or-en-bash/"  data-text="[Tip] AND (&#038;&#038;) y OR (||) en bash" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/tip-and-y-or-en-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Esteganografía: Ofuscación de archivos (parte 3)</title>
		<link>http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-3/</link>
		<comments>http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-3/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 15:59:06 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[esconder archivos]]></category>
		<category><![CDATA[esteganografia]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[ofuscacion]]></category>
		<category><![CDATA[ofuscacion de archivos]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[split]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1981</guid>
		<description><![CDATA[Luego de haber presentado la primera y segunda parte de este post, les presentaré un script que automatiza el proceso de &#8220;esconder&#8221; y &#8220;encontrar&#8221; el archivo y además mostrar como podemos solucionar el problema de los &#8220;bytes&#8221; para poder separar el archivo original. Es un simple script en bash, que usa los mismos comandos y [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1984" style="margin: 3px;" title="Steganography" src="http://blog.zerial.org/wp-content/uploads/2010/12/Steganography.jpg" alt="" width="85" height="85" />Luego de haber presentado la <a href="http://blog.zerial.org/seguridad/ofuscacion-de-archivos-parte-1/">primera</a> y <a href="http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-2/">segunda</a> parte de este post, les presentaré un script que automatiza el proceso de &#8220;esconder&#8221; y &#8220;encontrar&#8221; el archivo y además mostrar como podemos solucionar el problema de los &#8220;bytes&#8221; para poder separar el archivo original. Es un simple script en bash, que usa los mismos comandos y técnicas mostradas en los <a href="http://blog.zerial.org/?s=Esteganograf%C3%ADa">post anteriores</a>, con comandos basicos como cat, split, etc. Para &#8220;marcar&#8221; la división entre el archivo oculto dentro del archivo original lo haremos de una forma bien simple.</p>
<p><strong>Marcar la división entre los archivos</strong></p>
<p>Para saber exactamente el byte donde debemos cortar con split el archivo para poder separarlo, vamos a agregar, al final de nuestro archivo ofuscado, una linea en texto plano con un numero X = bytes. Puede sonar absurdo por lo simple que es, pero es posible.</p>
<p><span id="more-1981"></span></p>
<p>¿Cómo hacerlo? Es muy simple, tambien usamos <em>echo</em>:<br />
<code>$ echo XXXX &gt;&gt;archivo_ofuscado.jpg"</code><br />
Donde XXXXX corresponde a la cantidad de bytes que la puedes saber por ejemplo con &#8220;ls -l&#8221; sobre el archivo.</p>
<p>Entonces el procedimiento para &#8220;separar&#8221; los archivos sería leer la última línea del archivo y hacer un <em>split -b XXXX</em>.</p>
<p>Ya habiendo aprendido a ocultar y a encontrar archivos, podemos automatizarlo y usar el siguiente script:</p>
<p><strong>esconder.sh</strong></p>
<pre name="code" class="c">
#!/bin/bash

if [ $# -eq 3 ]; then
        separador=$(ls -l $1|awk -F ' ' '{print $5}');
        cat $1 $2 > $3
        echo -e "\n$separador" >>$3
        echo "Archivo $3 creado.";
else
        echo "Sintaxis: $0 archivo1 archivo2 salida"
        exit 1;
fi
</pre>
<p><strong>encontrar.sh</strong></p>
<pre name="code" class="c">
#!/bin/bash

if [ $# -eq 1 ]; then
        separador=$(tail -1 $1);
        sed -i 's/^$separador$//g' $1
        split -b $separador $1
else
        echo "Sintaxis: $0 archivo"
fi
</pre>
<p>Pueden descargar los scripts desde aca:<br />
  * <a href="http://blog.zerial.org/files/esconder.sh.gz">esconder.sh.gz</a> (4Kb)<br />
  * <a href="http://blog.zerial.org/files/encontrar.sh.gz">encontrar.sh.gz</a> (4Kb)</p>
<p>Como pueden ver, para esconder archivos y poder &#8220;separarlos&#8221;, ya sea para enviar informacion ilegible o escondida a otras personas basta con saber usar algunos comandos basicos de unix. Si bien no es una forma an &#8220;profesional&#8221; de hacerlo, es muy simple y no se necesita un programa robusto, simplemente un par de líneas en bash.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Festeganografia-ofuscacion-de-archivos-parte-3%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-3/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-3/"  data-text="Esteganografía: Ofuscación de archivos (parte 3)" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Esteganografía: Ofuscación de archivos (parte 2)</title>
		<link>http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-2/</link>
		<comments>http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-2/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 14:10:22 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[esconder archivos]]></category>
		<category><![CDATA[esteganografia]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[ofuscacion]]></category>
		<category><![CDATA[ofuscacion de archivos]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[split]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1935</guid>
		<description><![CDATA[Luego de haber enseñado como ofuscar un archivo dentro de otro, llegó el momento de saber como &#8220;separarlos&#8221;. En la primera parte, hubo comentarios de quienes tenian problemas porque se corrompía el archivo y no todas las versiones de unrar o unzip lo podían descomprimir, ya que obviamente, el archivo tiene muchos bits y bytes [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1970" style="margin: 3px;" title="Microsoft Word - Document1" src="http://blog.zerial.org/wp-content/uploads/2010/11/fsplit.jpg" alt="" width="128" height="83" />Luego de haber enseñado como<em> ofuscar</em> un archivo dentro de otro, llegó el momento de saber como &#8220;separarlos&#8221;. En la primera parte, hubo comentarios de quienes tenian problemas porque se corrompía el archivo y no todas las versiones de unrar o unzip lo podían descomprimir, ya que obviamente, el archivo tiene muchos bits y bytes extras que no corresponden al zip, al rar o al archivo que escondimos. Una vez <em>separado</em> el archivo que hemos <em>escondido</em>, evitaremos todos estos problemas y tendremos nuestro archivo íntegro.</p>
<p>Para separar el archivo vamos a usar el comando <strong>split</strong>, que nos permite &#8220;dividir&#8221; o &#8220;cortar&#8221; un archivo por líneas, bytes, etc. En este caso, separaremos por bytes el archivo.<br />
La sintaxis de split para separar un archivo es tan simple como:</p>
<p><code>$ split --bytes=XXX archivo</code><br />
o tambien<br />
<code>$ split -b XXX archivo</code></p>
<p>De esta forma, el <strong>split</strong> separará el <strong>archivo</strong> cada <strong>XXX</strong> bytes, creando archivos de la forma <em>xab, xac, xad, &#8230; xaN</em>.<br />
Ejemplo:<br />
<code>[zerial@balcebu ejemplo_split]$ du -sh archivo.jpg<br />
48K	archivo.jpg<br />
[zerial@balcebu ejemplo_split]$ split -b 10000 archivo.jpg<br />
[zerial@balcebu ejemplo_split]$ ls<br />
archivo.jpg  xaa  xab  xac  xad  xae<br />
[zerial@balcebu ejemplo_split]$  du -csh *<br />
48K	archivo.jpg<br />
12K	xaa<br />
12K	xab<br />
12K	xac<br />
12K	xad<br />
8.0K	xae<br />
104K	total<br />
[zerial@balcebu ejemplo_split]$ </code></p>
<p>Para poder separar el archivo <em>ofuscado</em>, vamos a necesitar saber de antemano el tamaño del archivo original, para poder separarlo por esa cantidad de bytes.</p>
<p><span id="more-1935"></span></p>
<p>Siguiendo con el mismo ejemplo del primer post, aquí vamos:</p>
<p>Tenemos los tres archivos; el archivo principal, el archivo que queremos ofuscar y el archivo ya ofuscado<br />
<code>[zerial@balcebu ofuscar]$ ls -l<br />
total 816<br />
-rw-r--r-- 1 zerial users 408482 Oct 27 09:54 archivo.zip<br />
-rw-r--r-- 1 zerial users 414523 Oct 27 09:54 archivo_ofuscado.jpg<br />
-rw-r--r-- 1 zerial users   6041 Oct 27 09:52 dummie.jpg<br />
[zerial@balcebu ofuscar]$ </code></p>
<p>Nuestro fin es separar el archivo &#8220;archivo.zip&#8221; de &#8220;archivo_ofuscado.jpg&#8221;.<br />
<code>[zerial@balcebu ofuscar]$ mv archivo_ofuscado.jpg separacion/<br />
[zerial@balcebu ofuscar]$ cd separacion/<br />
[zerial@balcebu separacion]$ ls<br />
archivo_ofuscado.jpg<br />
[zerial@balcebu separacion]$ </code></p>
<p>Vemos el tamaño en bytes del archivo principal &#8220;dummie.jpg&#8221;<br />
<code>-rw-r--r-- 1 zerial users 6041 Oct 27 09:52 dummie.jpg</code></p>
<p>6041 bytes. Por tanto, tenemos que decirle a split, que nos divida el archivo_ofuscado.jpg en pequeños trozos de 6041 bytes cada uno.</p>
<p><code>[zerial@balcebu separacion]$ split -b 6041 archivo_ofuscado.jpg<br />
[zerial@balcebu separacion]$ ls -l<br />
total 956<br />
-rw-r--r-- 1 zerial users 414523 Oct 27 09:54 archivo_ofuscado.jpg<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xaa<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xab<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xac<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xad<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xae<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xaf<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xag<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xah<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xai<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xaj<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xak<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xal<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xam<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xan<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xao<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xap<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xaq<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xar<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xas<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xat<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xau<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xav<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xaw<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xax<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xay<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xaz<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xba<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbb<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbc<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbd<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbe<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbf<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbg<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbh<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbi<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbj<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbk<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbl<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbm<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbn<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbo<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbp<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbq<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbr<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbs<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbt<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbu<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbv<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbw<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbx<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xby<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xbz<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xca<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcb<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcc<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcd<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xce<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcf<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcg<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xch<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xci<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcj<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xck<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcl<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcm<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcn<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xco<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 xcp<br />
-rw-r--r-- 1 zerial users   3735 Nov 19 10:57 xcq<br />
[zerial@balcebu separacion]$ </code></p>
<p>Ya tenemos dividido el archivo_ofuscado en pequeños trozos. Como nuestro archivo dummie.jpg teina un tamaño de 6041 bytes y es este archivo el que está por sobre el archivo ofuscado, el primer archivo que nos extrajo split corresponde a dummie.jpg; por tanto, renombramos <strong>xaa</strong> a <strong>dummie.jpg</strong> y concatenamos todos los demas archivos y lo llamamos <strong>archivo.zip</strong> (corresponde a nuestro archivo ofuscado)</p>
<p><code>[zerial@balcebu separacion]$ mv xaa dummie.jpg<br />
[zerial@balcebu separacion]$ cat x* &gt;archivo.zip<br />
[zerial@balcebu separacion]$ rm x*<br />
[zerial@balcebu separacion]$ ls -l<br />
total 816<br />
-rw-r--r-- 1 zerial users 408482 Nov 19 10:59 archivo.zip<br />
-rw-r--r-- 1 zerial users 414523 Oct 27 09:54 archivo_ofuscado.jpg<br />
-rw-r--r-- 1 zerial users   6041 Nov 19 10:57 dummie.jpg<br />
[zerial@balcebu separacion]$ </code></p>
<p>Con esto ya hemos extraído nuestro archivo ofuscado. Para comparar que está íntegro y que realmente corresponde al original, comparemos los md5:</p>
<p><code>5c29dbb3975a5ffe31768b79548e1884  archivo.zip<br />
ded467af5a22134c44da18bc8d4fed1b  dummie.jpg<br />
5c29dbb3975a5ffe31768b79548e1884  ../archivo.zip<br />
ded467af5a22134c44da18bc8d4fed1b  ../dummie.jpg</code></p>
<p>Los dos primeros archivos corresponden a los archivos extraídos con split y los dos últimos a los archivos originales. Los md5 coinciden, por lo que lo hemos conseguido. Si ahora <em>unzipeamos</em> nuestro <strong>archivo.zip</strong>, no nos mostrará ningun warning, lo mismo pasara con winrar, etc.</p>
<p><code>[zerial@balcebu separacion]$ unzip archivo.zip<br />
Archive:  archivo.zip<br />
   creating: tipografias/<br />
  inflating: tipografias/Aller_Bd.ttf<br />
  inflating: tipografias/Aller_BdIt.ttf<br />
  inflating: tipografias/Aller_It.ttf<br />
  inflating: tipografias/Aller_Lt.ttf<br />
  inflating: tipografias/Aller_LtIt.ttf<br />
  inflating: tipografias/Aller_Rg.ttf<br />
  inflating: tipografias/AllerDisplay.ttf<br />
[zerial@balcebu separacion]$ </code></p>
<p>Sin warnings ni errores.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Festeganografia-ofuscacion-de-archivos-parte-2%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-2/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-2/"  data-text="Esteganografía: Ofuscación de archivos (parte 2)" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/esteganografia-ofuscacion-de-archivos-parte-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Script monitor de sistemas de archivos y particiones</title>
		<link>http://blog.zerial.org/linux/script-monitor-de-sistemas-de-archivos-y-particiones/</link>
		<comments>http://blog.zerial.org/linux/script-monitor-de-sistemas-de-archivos-y-particiones/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 19:15:42 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[filesystems]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[monitor]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1782</guid>
		<description><![CDATA[Existen herramientas que nos permiten monitorear distintas cosas en un parque de servidores, como Zabbix, Nagios, etc. Pero hay veces que no es posible, ya sea por recursos o por tiempo, implementar una solución de monitoreo de alto nivel, por lo que recurrimos a los scrtips. Estoy seguro que bash, las llaves publicas y privadas [...]]]></description>
			<content:encoded><![CDATA[<p>Existen herramientas que nos permiten monitorear distintas cosas en un parque de servidores, como Zabbix, Nagios, etc. Pero hay veces que no es posible, ya sea por recursos o por tiempo, implementar una solución de monitoreo de alto nivel, por lo que recurrimos a los scrtips. Estoy seguro que bash, las llaves publicas y privadas para la autentificación, y cron son unos de nuestros mejores amigos al momento de querer monitorear o administrar máquinas simultaneamente.</p>
<p>Con <strong>du</strong> podemos saber el uso de disco de nuestro sistema y con un pequeño script en bash podemos mejorar la salida de este comando.</p>
<p><code>ssh 10.0.0.56 -p5022 "df -hPl"|awk -F ' ' '{print $1,$4,$6,$5}' |egrep -v "Avail|Dispo|Use|Use"</code></p>
<p>Esto nos devuelve en 4 columnas el dispositivo, espacio disponible, punto de montaje y porcentaje usado.</p>
<p>Algo similar a:</p>
<blockquote><p>/dev/mapper/VolGroup_25980-LogVol1 3.5G / 75%<br />
/dev/sda1 80M /boot 16%<br />
none 16G /dev/shm 0%<br />
/dev/mapper/VolGroup_25980-LogVolHome 30G /home 69%<br />
/dev/mapper/VolGroup_25980-LogVol2 4.6G /tmp 1%<br />
/dev/mapper/VolGroup_25980-LogVol5 6.6G /usr 29%<br />
/dev/mapper/VolGroup_25980-LogVol4 14G /var 87%<br />
/dev/mapper/VolGroup_25980-mysql 7.0G /var/lib/mysql 63%</p></blockquote>
<p><span id="more-1782"></span></p>
<p>Mi idea es trabajar con <em>threshold</em> (umbral) y gatillar eventos según el umbral alcanzado. Por ejemplo, con un threshold del 80% asociado al porcentaje utilizado, que envie emails de &#8220;advertencias&#8221; y con el 90% notificaciones de &#8220;criticidad del sistema de archivos&#8221;. Lo que querìa lograr era que todos los dias se monitoreen los sistemas de archivos, generando reportes <strong>diarios</strong> de los sistemas criticos y, <strong>semanalmente</strong>, un reporte general, donde me muestre detalladamente los &#8220;normales&#8221;, &#8220;advertencias&#8221; y los &#8220;criticos&#8221;. La salida esperada es algo asi:</p>
<blockquote><p>[+] Server: x.x.x.x (x.hostname)<br />
[-] [Dev:/dev/hda2] [Mount:/] [Free:4.2G] [Used:5%]</p>
<p>[-] [Dev:/dev/hda1] [Mount:/boot] [Free:83M] [Used:11%]</p>
<p>[-] [Dev:/dev/hda3] [Mount:/home] [Free:3.6G] [Used:19%]</p>
<p>[-] [Dev:/dev/hda6] [Mount:/tmp] [Free:1.7G] [Used:1%]</p>
<p>[-] [Dev:/dev/hda5] [Mount:/usr] [Free:8.6G] [Used:3%]</p>
<p>[-] [Dev:/dev/hda7] [Mount:/var] [Free:12G] [Used:21%]</p>
<p>No critical filesystems</p></blockquote>
<p>[...] cuando <strong>no</strong> hay sistemas de archivos criticos y,</p>
<blockquote><p>
[+] Server: y.y.y.y (y.hostname)<br />
[-] [Dev:/dev/mapper/VolGroup00-LogVol00] [Mount:/] [Free:16G] [Used:14%]</p>
<p>[-] [Dev:/dev/sda1] [Mount:/boot] [Free:80M] [Used:15%]</p>
<p>[-] [Dev:/dev/shm] [Mount:/dev/shm] [Free:2.0G] [Used:0%]</p>
<p>[-] [Dev:/dev/mapper/VolGroup00-LogVol02] [Mount:/var] [Free:7.4G] [Used:74%]</p>
<p>[-] [Dev:/dev/mapper/VolGroup00-LogVol03] [Mount:/backup] [Free:13G] [Used:66%]</p>
<p>[-] [Dev:/dev/mapper/VolGroup00-LogVol04] [Mount:/home] [Free:6.6G] [Used:93%] [***CRITICAL***]</p>
<p>[-] [Dev:/dev/mapper/VolGroup00-LogVol05] [Mount:/usr/local] [Free:7.3G] [Used:89%] [***WARNING***]</p></blockquote>
<p>cuando hay criticos y cuando hay emergencias, es decir, cuando se alcanza el umbral del 90% y 80%, respectivamente.</p>
<p>El script que hice es el siguiente:</p>
<pre name="code" class="c">#/bin/bash -e
warning_threshold="80%"
critical_threshold="90%"

warnings=0;
critical=0;
for host in $(grep -v ^# ips.txt);
do
	critical_count=0;
	hostname=$(echo -n $host|cut -f1 -d ":")
        ip=$(echo -n $host|cut -f2 -d ":")
        port=$(echo -n $host|cut -f3 -d ":")
	echo "\n[+] Server: $ip ($hostname)"
	filesystems=$(ssh $ip -p$port "df -Phl"|egrep -v 'Avail|Dispo|tmpfs|udev|Uso|Use'|awk -F ' ' '{print $6}');
	for FS in $filesystems;
	do
		alert="";
		temp=$(ssh $ip -p$port "df -hPl $FS"|awk -F ' ' '{print $1,$4,$6,$5}' |egrep -v 'Avail|Dispo|Uso|Use');
		dev=$(echo $temp |cut -f1 -d " ");
		mountpoint=$(echo $temp |cut -f3 -d " ");
		size=$(echo $temp |cut -f2 -d " ");
		used=$(echo $temp |cut -f4 -d " ");
		_wthreshold=$(echo -n $warning_threshold |sed 's/%//g');
		_cthreshold=$(echo -n $critical_threshold |sed 's/%//g');
		_used=$(echo -n $used |sed 's/%//g');
		case "$1" in
			weekly)
				if [ $_used -gt $_wthreshold ]; then
                                        alert="[***WARNING***]"; warning=$(expr $warning + 1);
                                fi
				if [ $_used -gt $_cthreshold ]; then
					alert="[***CRITICAL***]"; critical=$(expr $critical + 1);
				fi
				echo "[-] [Dev:$dev] [Mount:$mountpoint] [Free:$size] [Used:$used] $alert";
				echo "";
			;;
			daily)
                                if [ $_used -gt $_cthreshold ]; then
                                        alert="[***CRITICAL***]";
					critical_count=$(expr $critical_count + 1);
                                	echo "[-] [Dev:$dev] [Mount:$mountpoint] [Free:$size] [Used:$used] $alert";
					echo "";
				fi
			;;
		esac
	done
	if [ $critical_count -eq 0 ]; then
		echo "No critical filesystems"
		critical_count=0;
	fi
done
if [ "$1" = "weekly" ]; then
	echo "________________"
	echo "Warnings: $warning\t|";
	echo "Criticals: $critical\t|";
fi</pre>
<p>Para que el script funcione, es necesario que en la misma ruta donde se encuentra, exista el archivo <em>ips.txt</em> que debe tener, bajo la sintaxis <strong>hostname:ip:port</strong>, la información para que el script se conecté por ssh a las máquinas. Para que sea más dinámico y no requiera la intervención de un humano, la máquina donde se ejecutará el script debe tener una llave privada cuya llave publica esté repartida en los servidores que se desean monitorear.<br />
El script necesita un argumento para funcionar, puede ser &#8220;weekly&#8221; o &#8220;daily&#8221;, segun se necesite. Con daily el script genera reportes donde mostrará solamente los criticos, mientras que con weekly hará un reporte general.</p>
<p>En el cron tengo agregado que <strong>todos los dias a las 9AM, haga un reporte diario</strong> y <strong>todos los lunes a las 8AM uno general (weekly)</strong> y los envie por correo a los responsables.</p>
<blockquote><p> 8 * * 1 cd /root/du_alert; sh alert.sh weekly |mail -s &#8220;Weekly Disk Usage Status&#8221; encargado@dominio.cl &#8212; -F &#8220;System Administrator&#8221;<br />
0 9 * * * cd /root/du_alert; sh alert.sh daily |mail -s &#8220;Daily Disk Usage Status&#8221; encargado@dominio.cl &#8212; -F &#8220;System Administrator&#8221;</p></blockquote>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-monitor-de-sistemas-de-archivos-y-particiones%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/script-monitor-de-sistemas-de-archivos-y-particiones/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/script-monitor-de-sistemas-de-archivos-y-particiones/"  data-text="Script monitor de sistemas de archivos y particiones" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/script-monitor-de-sistemas-de-archivos-y-particiones/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cosas que encontramos en los archivos .bash_history</title>
		<link>http://blog.zerial.org/seguridad/cosas-que-encontramos-en-los-archivos-bash_history/</link>
		<comments>http://blog.zerial.org/seguridad/cosas-que-encontramos-en-los-archivos-bash_history/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 14:00:47 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Historias]]></category>
		<category><![CDATA[Interes general]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[comandos]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[historial de comandos]]></category>
		<category><![CDATA[prompt]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1668</guid>
		<description><![CDATA[El otro día, haciendo revisión y limpieza en los servidores, me dediqué por un par de minutos a revisar los archivos .bash_history de algunos usuarios y me encontre con varias sorpresas, desde cosas chistosas hasta problemas críticos de seguridad. Los usuarios son muy buenos para inventar comandos, probar cosas, inventar pasarle parametros a los comandos, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.zerial.org/wp-content/uploads/2010/04/bhistory.png"><img class="size-full wp-image-1697 alignleft" style="margin-right: 3px; margin-left: 3px;" title="bhistory" src="http://blog.zerial.org/wp-content/uploads/2010/04/bhistory.png" alt="" width="136" height="201" /></a>El otro día, haciendo revisión y limpieza en los servidores, me dediqué por un par de minutos a revisar los archivos <em>.bash_history</em> de algunos usuarios y me encontre con varias sorpresas, desde cosas chistosas hasta problemas críticos de seguridad. Los usuarios son muy buenos para inventar comandos, probar cosas, inventar pasarle parametros a los comandos, etc, es muy chistoso ver como se pasean por mil directorios antes de llegar a donde quieren llegar, como visualizan los archivos o como encuentran lo que buscan. Está bien que los usuarios son solo usuarios, no deberían por qué saber ni ser expertos en ejecutar comandos unix en un prompt, pero aun asi sigue pareciendo cómico para uno ver cómo lo hacen.<br />
Para quienes no saben, el archivo <em>.bash_history</em> corresponde a un archivo de registro o logs que guarda los comandos ejecutados en bash por un usuario en particular, cuando un usuario ingresa vía ssh a un sistema por ejemplo, ejecuta los típicos comandos &#8220;dir, cd, ls&#8221; y estos quedan registrados.</p>
<p><span id="more-1668"></span></p>
<p>Lo más comun, y que me da muca risa y aveces rabia, y me desespera un poco, es ver como los usuarios avanzan lentamente, directorio por directorio, hasta llegar a la destino final. Por ejemplo:</p>
<p><code>$ cd /<br />
$ cd home<br />
$ cd usuario<br />
$ cd public_html<br />
$ cd includes</code></p>
<p>En lugar de ejecutar directamente<br />
<code>$ cd /home/usuario/public_html/includes</code></p>
<p>Y peor aun, hay veces que el usuario es inseguro y prefiere verificar si lo hizo bien y termina su caminata por los directorios haciendo un &#8220;pwd&#8221;:</p>
<p><code>$ cd /<br />
$ cd home<br />
$ cd usuario<br />
$ cd public_html<br />
$ cd includes<br />
$ pwd<br />
/home/usuario/public_html/includes<br />
$</code></p>
<p>Hay algo que me desespera aun mas, es cuando el usuario tiene la necesidad de listar el contenido de CADA directorio:</p>
<p><code>$ cd /<br />
$ ls -l<br />
$ cd home<br />
$ ls -l<br />
$ cd usuario<br />
$ ls -l<br />
$ cd public_html<br />
$ ls -l<br />
$ cd includes<br />
$ pwd<br />
/home/usuario/public_html/includes<br />
$ ls -l</code></p>
<p>Para los que no saben, para esto existe un truco (tip!), no digo que se aprendan los directorios de memoria, pero pueden ejecutar todo en una sola linea, por ejemplo, cuando escriben / pueden presionar tabular dos veces y automaticamente aparecerá el listado de archivos y directorios dentro de /. Asi mismo, si escriben /home/ y dos veces tabular, veran todo el contenido de /home, sin tener que ejecutar cd /home, presionar enter y luego un ls.</p>
<p>Otra cosa que es muy comun, aunque no lo crean, es encontrar las passwords de las bases de datos, especialmente de MySQL. La gente está acostumbrada a ejecutar el comando mysql para conectarse a la base de datos pasandole como parametro el usuario y la password</p>
<p><code>$ mysql -uproduccion -p4gSg4ws -hlocalhost mydatabase<br />
mysql&gt;</code></p>
<p>Tambien usan esta misma tecnica para generar los típicos respaldos usando mysqldump.</p>
<p><code>$ mysqldump -uproduccion -p4gSg4ws -hlocalhost mydatabase &gt;&gt;mydatabase.sql</code></p>
<p>Obviamente esto es un problema de seguridad, ya sea porque no se educó bien al usuario o simplemente porque no existen medidas de seguridad dentro del contexto donde se está ejecutando este tipo de comandos.</p>
<p>Tambien es muy usual encontrar a usuarios que intentan pasarle la password de root al comando &#8220;su&#8221;, ejecutando comandos tipo:</p>
<p><code>$ su - 354dr2</code></p>
<p>Pensando que 354dr2 es la password de root, al igual que</p>
<p><code>$ sudo su - password_del_usuario</code></p>
<p>Pensando que de esa forma no le pedirá el password. Lo que no sabe el usuario es que todo lo que ejecuta esta siendo logueado y que está comprometiendo la seguridad del servidor.</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/04/bash-history-terminal.png"><img src="http://blog.zerial.org/wp-content/uploads/2010/04/bash-history-terminal-150x150.png" alt="" title="bash-history-terminal" width="150" height="150" class="alignright size-thumbnail wp-image-1711" /></a>El .bash_history o historial de comandos bash, muestra mucho como trabajan los usuarios, qué hacen y de qué forma lo hacen, de esta forma es posible obtener información sobre algun sistema o servicio que esté corriendo en el servidor, por ejemplo si entramos <em>a la mala</em> a un servidor y queremos buscar información privada o información que nos interese, podemos ver el historial de los usuarios para saber qué hacen, por donde se mueven y seguir sus pasos.</p>
<p>Un dia me tocó ver que un usuario tenia un script &#8220;escondido&#8221; que se conectaba vía llave pública a 4 o 5 servidores (incluyendo uno fuera de la red), obviamente, la llave privada estaba en el servidor donde yo estabam por lo que pude acceder a todas sus cuentas en los otros servidores.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fcosas-que-encontramos-en-los-archivos-bash_history%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/seguridad/cosas-que-encontramos-en-los-archivos-bash_history/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/seguridad/cosas-que-encontramos-en-los-archivos-bash_history/"  data-text="Cosas que encontramos en los archivos .bash_history" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/cosas-que-encontramos-en-los-archivos-bash_history/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Imagenes y snapshots: Respaldo de servidores</title>
		<link>http://blog.zerial.org/linux/imagenes-y-snapshots-respaldo-de-servidores/</link>
		<comments>http://blog.zerial.org/linux/imagenes-y-snapshots-respaldo-de-servidores/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 13:15:02 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[automatizacion]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[dd]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[lvm]]></category>
		<category><![CDATA[nfs]]></category>
		<category><![CDATA[respaldos]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[servidores]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[snapshots]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1563</guid>
		<description><![CDATA[Mi propósito era crear imágenes de todos los servidores del datacenter para que, en caso de cualquier contingencia, levantar un nuevo servidor identico simplemente traspasando la imágen de respaldo hacia ese servidor. Los sistemas estaban instalados usando volumenes lógicos (LVM) por lo que sería mucho más fácil crear imágenes y snapshots de respaldos. En un [...]]]></description>
			<content:encoded><![CDATA[<p>Mi propósito era crear imágenes de todos los servidores del datacenter para que, en caso de cualquier contingencia, levantar un nuevo servidor identico simplemente traspasando la imágen de respaldo hacia ese servidor. Los sistemas estaban instalados usando volumenes lógicos (LVM) por lo que sería mucho más fácil crear imágenes y snapshots de respaldos. En un prinicpio pensé hacer directamente <strong>dd</strong> sobre los volumenes lógicos pero la imágen se corrompía y en muchos casos no podía volver a recuperarla. Existe la posibilidad de montar el volumen lógico en un directorio y respaldar, usando tar, bzip y esas cosas, sólo los archivos, pero no era mi propósito, ya que para restaurar solamente los archivos, debía tener una partición ya preparada, con el sistma de ficheros, sistema instalado, etc etc. En cambio, con la imágen simplemente hacia un <strong>dd</strong> para restaurarla, sin tener el sistema de archivos creado, etc.</p>
<p>Por twitter me recomendaron varias opciones. <a href="http://twitter.com/apostols">@Apostols</a> me recomendó las herramientas &#8220;puppet&#8221; y &#8220;rlbackup&#8221;, mientras que <a href="http://twitter.com/ssugasti">@ssugasti</a> &#8220;mondorescue&#8221;, pero yo seguia con mi idea de usar directamente &#8220;dd&#8221;. Debía hacer el mismo procedimiento en mas de 40 servidores, por lo que usar una aplicación &#8220;cliente->servidor&#8221; no era mi solución. Usar aplicaciones que requieran modo grafico o que requieran mucha interacción con el usuario tampoco me servian, yo necesitaba algo automatizado que pueda dejar corriendo de noche y volver al otro día y encontrar el trabajo hecho.</p>
<p><span id="more-1563"></span></p>
<p>Leyendo el manual de LVM, especialmente el de <strong>lvcreate</strong>, encontré la opción &#8220;<strong>snapshot</strong>&#8221; que básicamente le toma una &#8220;foto&#8221; al volumen lógico de origen y crea un nuevo volumen con ese preciso instante en que se hizo el snapshot, de ésta forma la partición original podrá ser actualizara mientras que el snapshot se respalda sin problemas. Luego de eso, el snapshot se elimina y se guarda la imágen. La rutína sería mas o menos asi:</p>
<p><code># lvcreate --snapshot /dev/Vol00/var --name var-snap -L100k<br />
# dd if=/dev/Vol00/var-snap of=/backup/var.img<br />
# lvremove -f /dev/Vol00/var-snap </code></p>
<p>De esta forma, creamos un snapshot llamado &#8220;var-snap&#8221; en base a la partición (o volumen) /dev/Vol00/var, luego, usando dd, creamos la imágen de dicha partición y la guardamos en /backup. Finalmente eliminamos el snapshot.<br />
Para tener aún más certesa de que todo funcionaría, tambien decidí empaquetar, comprimir y guardar los ficheros, por lo que antes de eliminarla (lvremove) la debo montar y hacer un tar. La rutina quedaría así:</p>
<p><code># lvcreate --snapshot /dev/Vol00/var --name var-snap -L100k<br />
# dd if=/dev/Vol00/var-snap of=/backup/var.img<br />
# mount /dev/Vol00/var-snap /mnt<br />
# tar cfjv /bakcup/var.tbz2 /mnt<br />
# umount /mnt<br />
# lvremove -f /dev/Vol00/var-snap </code></p>
<p>En mi caso, /backup corresponde a un punto de montaje de red NFS.<br />
Mi misión era realizar ésta misma rutina en más de 40 servidores, por lo que necesitaba hacer un script que se paseara por todos los servidores y ejecutara estos comandos.</p>
<pre name="code" class="c">
#!/bin/bash

IDENTITYFILE=$HOME/.ssh/id_rsa
MACHINES=servidores.list
DATE=$(date +%d%m%Y)
NFS=/mnt/imagenes/servers/
DIR_SNAPSHOT=/mnt/snapshot

for server in $(cat servidores.list);
do
        echo "Respaldando $server ..."
        ssh -i $IDENTITYFILE $server "lvdisplay" >/tmp/lvdisplay_temp
        lvdisplay=$(awk '
                /LV Name/ { name = $3 }
                /VG Name/ { print name","$3 } ' /tmp/lvdisplay_temp)
        for _logicalv in $lvdisplay;
        do
                lvname=$(echo $_logicalv |cut -f1 -d ","|cut -f4 -d "/")
                logicalv=$(echo $_logicalv |cut -f2 -d ",")
                echo -e "\tVolumen Logico: $lvname"
                ssh $server "lvcreate --size 100m --snapshot --name $lvname-snap /dev/$logicalv/$lvname"
                ssh $server "mount /dev/$logicalv/$lvname-snap $DIR_SNAPSHOT"
                ssh $server "mkdir $NFS$server"
                ssh $server "tar cfj $NFS$server/snapshot_$lvname-$DATE.tar.bz2 $DIR_SNAPSHOT"
                ssh $server "umount $DIR_SNAPSHOT"
                ssh $server "dd if=/dev/$logicalv/$lvname-snap of=$NFS$server/image_$lvname-$DATE.img"
                ssh $server "lvremove -f /dev/$logicalv/$lvname-snap"
                echo -e "\tArchivo imagen: $NFS$server/image_$lvname-$DATE.img"
                echo -e "\tArchivo tarball: $NFS$server/snapshot_$lvname-$DATE.tar.bz2"
        done
done
scp /tmp/lvdisplay_temp $server:$NFS$server/lvdisplay
</pre>
<p>El script trabaja con la salida del comando <strong>lvdisplay</strong> que entrega una salida con los detalles de cada volumen lógico. Lee un fichero llamado <em>servidores.list</em> y hace un recorrido línea por línea, conectándose a cada servidor y ejecutando las instrucciones necesarias. Para hacer el proceso más eficiente y automatizado es necesario, previamente, copiar todas las claves públicas a cada servidor, para evitar la autentificación.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fimagenes-y-snapshots-respaldo-de-servidores%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/imagenes-y-snapshots-respaldo-de-servidores/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/imagenes-y-snapshots-respaldo-de-servidores/"  data-text="Imagenes y snapshots: Respaldo de servidores" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/imagenes-y-snapshots-respaldo-de-servidores/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Asaltando un sitio de series online</title>
		<link>http://blog.zerial.org/seguridad/asaltando-un-sitio-de-series-online/</link>
		<comments>http://blog.zerial.org/seguridad/asaltando-un-sitio-de-series-online/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 00:33:35 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[ocio]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[series]]></category>
		<category><![CDATA[sitios vulnerables]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1545</guid>
		<description><![CDATA[De aburridos, junto con E.A.S (o xwall), nos dedicamos a buscar un sitio que brinde el servicio de series de en linea para encontrar la forma de tomar prestadas todas las series alojadas en el servidor. Imaginense algo como YouTube, pero tan vulnerable que fuese posible extraer todos los videos que hay en la red. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1546" title="geekthief" src="http://blog.zerial.org/wp-content/uploads/2010/02/geekthief.jpg" alt="" width="100" height="100" />De aburridos, junto con E.A.S (o xwall), nos dedicamos a buscar un sitio que brinde el servicio de series de en linea para encontrar la forma de tomar prestadas todas las series alojadas en el servidor. Imaginense algo como YouTube, pero tan vulnerable que fuese posible extraer todos los videos que hay en la red.<br />
Bien, nuestro objetivo fue un sitio de series de animé en línea llamado &#8220;<a href="http://efectoanime.com" target="_blank"><em>Efecto animé</em></a>&#8221; que, mediante el sitio <em><a href="http://www.satanick.net" target="_blank">Satanick.net</a> </em>logramos descargar todas las series y capítulos que se servían.</p>
<p><strong>La teoría</strong> es sencilla, la idea era encontrar un link directo a los distintos archivos multimedia o bien un enlace a algun directorios que los contenga, para luego descargar todo el contenido del directorio.<br />
<strong>El fallo</strong> por parte de ellos fue dejar que se liste el contenido de directorios, de esta forma pudimos tener acceso a informacón como la siguiente:</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/02/listing_thundercats.png"><img class="aligncenter size-medium wp-image-1548" title="listing_thundercats" src="http://blog.zerial.org/wp-content/uploads/2010/02/listing_thundercats-235x300.png" alt="" width="235" height="300" /></a></p>
<p>Luego, con un poco de magia, simplemente descargamos el contenido de todo ese directorio.</p>
<p><span id="more-1545"></span></p>
<p>Todo fue gracias al sitio &#8220;<em>Satanick</em>&#8221; el cual contiene un flash que provee al usuario poder ver series en línea, <span style="text-decoration: line-through;">afortunadamente</span> lamentablemente si vemos el código fuente nos encontramos con la siguiente sorpresa:</p>
<pre name="code" class="html">

<embed id="mpl" name="mpl" src="http://satanick.fxanime.org/wp-content/uploads/utilidades/player10.swf" width="800" height="460" type="application/x-shockwave-flash" quality="high" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" flashvars="&amp;file=http://efectoanime.com/server/dn0te/06.mp4&amp;logo=http://satanick.net/wp-content/uploads/2010/01/tondr.png&amp;#&amp;backcolor=111111&amp;image=http://satanick.fxanime.org/wp-content/uploads/2009/10/canavassata.jpg&amp;frontcolor=cccccc&amp;lightcolor=00aeff&amp;controlbar=over&amp;volume=100&amp;autostart=true"></embed>
<input type="button" value="Ir a lista de capitulos" onclick="window.location.href='http://satanick.net/?page_id=3692'" />
</pre>
<p>Miren detenidamente el código a ver si encuentran algo que nos ayude a nuestro propósito. Encontramos:</p>
<p><strong>file=http://efectoanime.com/server/dn0te/06.mp4</strong></p>
<p>Con esto ya podemos deducir que todos los videos se encuentran en la URL http://efectoanime.com/server/XXX, donde XXX corresponde al nombre de la serie. Como vimos en la imágen que les mostré anteriormente (donde se listaban los archivos del directorio thundercats/), está permitido listado de archivos de un directorio. Nuestro amigo <strong>wget</strong> será la salvación, ya que con el parametro <strong>-r</strong> es posible descargar un directorio.</p>
<p>Bien, ahora nos falta automatizar el proceso. Las URL de Satanick, donde se encuetran los videos, son de la forma http://satanick.com/?page_id=XXX, por lo que podemos asumir que cada ID corresponde a una página y en cada página es posible que encontremos links como el que les acabo de mostrar (el html de más arriba). Entonces mi idea fue crear un script que recorriera todas las páginas desde XXX hasta XXX+n. Pensando que si lo hago desde 0 se iba a demorar una eternidad, solo lo hice desde el 3000 hasta el 10000, luego cada página examinada deberá ser <em>parseada</em> y se debe encontrar un patrón que nos permita obtener la URL donde se encuentran los videos.<br />
Yo lo hice de la siguiente forma:</p>
<p><code>for x in $(seq 3000 10000); do wget -O - http://satanick.net/?page_id=$x |grep "http://efectoanime.com/server" |awk -F '&amp;amp;' {'print $2'}&gt;&gt; lista_videos_satanick; done</code></p>
<p>Si lo queremos ver más bonito y en forma de &#8220;script&#8221;:</p>
<pre name="code" class="c">#!/bin/bash
for x in $(seq 3000 10000);
do
   wget -O - http://satanick.net/?page_id=$x |grep "http://efectoanime.com/server" |awk -F '&amp;' {'print $2'}>> lista_videos_satanick;
done</pre>
<p>El archivo &#8220;<em>lista_videos_satanick</em>&#8221; va a guardar todas las URL que encuentre y quedarás más o menos así:</p>
<blockquote><p>file=http://efectoanime.com/server/hades/h29.mp4<br />
file=http://efectoanime.com/server/hades/h29.mp4<br />
file=http://efectoanime.com/server/hades/h30.mp4<br />
file=http://efectoanime.com/server/hades/h30.mp4<br />
file=http://efectoanime.com/server/hades/h31.mp4<br />
file=http://efectoanime.com/server/hades/h31.mp4<br />
file=http://efectoanime.com/server/hades/h31.mp4<br />
file=http://efectoanime.com/server/thundercats/Th71.mp4<br />
file=http://efectoanime.com/server/thundercats/Th71.mp4<br />
file=http://efectoanime.com/server/thundercats/Th71.mp4<br />
file=http://efectoanime.com/server/thundercats/Th72.mp4<br />
file=http://efectoanime.com/server/thundercats/Th72.mp4<br />
file=http://efectoanime.com/server/thundercats/Th72.mp4<br />
file=http://efectoanime.com/server/thundercats/Th73.mp4<br />
file=http://efectoanime.com/server/thundercats/Th73.mp4<br />
file=http://efectoanime.com/server/thundercats/Th73.mp4<br />
file=http://efectoanime.com/server/thundercats/Th74.mp4<br />
file=http://efectoanime.com/server/thundercats/Th74.mp4
</p></blockquote>
<p>Lo único que debemos hacer es quitarle el principio &#8220;file=&#8221; y quitar las líneas repetidas:<br />
<code>sed -i 's/file=//g' lista_videos_satanick</code><br />
Nos quedará algo así:</p>
<blockquote><p>http://efectoanime.com/server/shippuden/Shippuden_144.mp4</p>
<p>http://efectoanime.com/server/bl34ch/B255.mp4</p>
<p>http://efectoanime.com/server/shippuden/Shippuden_145.mp4</p>
<p>http://efectoanime.com/server/md/612.mp4</p>
<p>http://efectoanime.com/server/bl34ch/B256.mp4</p>
<p>http://efectoanime.com/server/shippuden/Shippuden_146.mp4</p>
<p>http://efectoanime.com/server/thundercats/Th90.mp4</p>
<p>http://efectoanime.com/server/thundercats/Th92.mp4</p>
</blockquote>
<p>De todas estas URL lo que nos interesa es sólo <strong>http://efectoanime.com/server/XXX</strong>, entonces lo arreglamos:</p>
<p><code>awk -F '/' {'print $1"/"$2"/"$3"/"$4"/"$5'} lista_videos_satanick</code></p>
<p>Quedará algo así:</p>
<blockquote><p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/bl34ch</p>
<p>http://efectoanime.com/server/bl34ch</p>
<p>http://efectoanime.com/server/bl34ch</p>
<p>http://efectoanime.com/server/shippuden</p>
<p>http://efectoanime.com/server/shippuden</p>
<p>http://efectoanime.com/server/shippuden</p>
<p>http://efectoanime.com/server/MD</p>
<p>http://efectoanime.com/server/MD</p>
<p>http://efectoanime.com/server/MD</p></blockquote>
<p>Ahora debemos eliminar las repetidas:</p>
<p><code># awk -F '/' {'print $1"/"$2"/"$3"/"$4"/"$5'} lista_videos_satanick |sort|uniq -d</p>
<p>http://efectoanime.com/server/avatar</p>
<p>http://efectoanime.com/server/bl34ch</p>
<p>http://efectoanime.com/server/Chihiro</p>
<p>http://efectoanime.com/server/dn0te</p>
<p>http://efectoanime.com/server/hades</p>
<p>http://efectoanime.com/server/lcanvas</p>
<p>http://efectoanime.com/server/manga</p>
<p>http://efectoanime.com/server/md</p>
<p>http://efectoanime.com/server/MD</p>
<p>http://efectoanime.com/server/sayns</p>
<p>http://efectoanime.com/server/shippuden</p>
<p>http://efectoanime.com/server/thundercats</p>
<p>http://efectoanime.com/server/trailers</p>
<p>http://efectoanime.com/server/Vshow</code></p>
<p>Luego un script que descarge todos los contenidos de los directorios:</p>
<p><code>for link in $(cat lista_videos_satanick); do wget -r $link; done</code></p>
<p>Y listo.</p>
<blockquote><p><strong>1.6G	Death Note.tar<br />
1.6G	Saga de Hades.tar</strong>
</p></blockquote>
<h3>ACTUALIZADO <em>16/02/2009</em></h3>
<p>Luego de los comentarios de los responsables de los sitios, dando las gracias y diciendo que no les importa porque de todas formas tiene una marca de agua, etc etc.. Los directorios ya no se pueden listar:</p>
<blockquote><p>http://efectoanime.com/server/thundercats/</p></blockquote>
<p>Al fin y al cabo, si les importó el tema. Me alegro que les sirviera el post.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Fseguridad%2Fasaltando-un-sitio-de-series-online%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/seguridad/asaltando-un-sitio-de-series-online/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/seguridad/asaltando-un-sitio-de-series-online/"  data-text="Asaltando un sitio de series online" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/seguridad/asaltando-un-sitio-de-series-online/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
<enclosure url="http://efectoanime.com/server/dn0te/06.mp4" length="46993332" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/hades/h29.mp4" length="55590277" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/hades/h30.mp4" length="55734802" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/hades/h31.mp4" length="55676125" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/thundercats/Th71.mp4" length="49280711" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/thundercats/Th72.mp4" length="49235801" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/thundercats/Th73.mp4" length="49207779" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/thundercats/Th74.mp4" length="49227983" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/shippuden/Shippuden_144.mp4" length="41486718" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/bl34ch/B255.mp4" length="53645980" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/shippuden/Shippuden_145.mp4" length="63605490" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/bl34ch/B256.mp4" length="36685761" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/shippuden/Shippuden_146.mp4" length="39210296" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/thundercats/Th90.mp4" length="37847843" type="video/mp4" />
<enclosure url="http://efectoanime.com/server/thundercats/Th92.mp4" length="37878330" type="video/mp4" />
		</item>
		<item>
		<title>Script para escanear la red en busca de servidores y servicios</title>
		<link>http://blog.zerial.org/linux/script-para-escanear-la-red-en-busca-de-servidores-y-servicios/</link>
		<comments>http://blog.zerial.org/linux/script-para-escanear-la-red-en-busca-de-servidores-y-servicios/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 13:40:07 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[nmap]]></category>
		<category><![CDATA[puertos]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[scan]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[servicios]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1515</guid>
		<description><![CDATA[Hace un par de días tuve la necesidad de escanear 3 redes completas, mas de 50 direcciones ip, en busca de servicios que corrieran en ellas. Obviamente, no iba a ingresar a cada servidor y hacer un netstat o revisar uno por uno que servicios tenia instalado, si para eso existe nmap! Lo que hicste [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.zerial.org/wp-content/uploads/2010/02/eyes_scan1.png"><img class="aligncenter size-full wp-image-1519" title="eyes_scan" src="http://blog.zerial.org/wp-content/uploads/2010/02/eyes_scan1.png" alt="" width="422" height="80" /></a></p>
<p>Hace un par de días tuve la necesidad de escanear 3 redes completas, mas de 50 direcciones ip, en busca de servicios que corrieran en ellas. Obviamente, no iba a ingresar a cada servidor y hacer un <em>netstat</em> o revisar uno por uno que servicios tenia instalado, si para eso existe <a href="http://nmap.org" target="_blank"><strong>nmap</strong></a>!<br />
Lo que hicste fue separar los rangos de ip en archivos distintos, para tener un orden y escanear la red en orden según los segmentos y luego hice un script que leia cada archivo y escaneaba la ip en busca de servicios, la salida del nmap la <em>parseaba</em> y lo guarda en un archivo separado por comas. En un principio el script mostraba todo en el <strong>stdout</strong> pero para que quedara más ordenado, preferí hacerlo en un CSV para poder abrirlo con <em>oocalc</em>.<br />
El script me genera un archivo con la siguiente información:</p>
<p><strong>host, IP, Servicio, Puerto, Version</strong></p>
<p><span id="more-1515"></span></p>
<p>El script es el siguiente:</p>
<pre name="code" class="c">
#!/bin/bash

nmap=/usr/bin/nmap
params="-sV"
tmp_file=/tmp/nmap_scanner_output
output=Servidores.csv
export SCANNER_ERROR=0

echo "host,IP,Servicio,Puerto,Version" >> $output
for ips in ips.*
do
	echo "Analizando $ips ..."
	for ip in $(cat $ips)
	do
		echo -e "\t-> $ip ..."
		ping -c 1 $ip 1>/dev/null 2>&#038;1|| export SCANNER_ERROR=1
		if [ $SCANNER_ERROR = "1" ]; then
			echo -e "\t\t- Host no activo"
		fi
		if [ $SCANNER_ERROR = "0" ]; then
			$nmap $params $ip |grep -v "Starting Nmap" |grep -v "Nmap scan report" |grep -v "Host is up" |grep -v "Not shown" |grep -v "Service detection performed" |grep -v "Nmap done" > $tmp_file
			export _host=$(grep "Service Info" $tmp_file |sed 's/,//g'|grep "Host" |awk -F ' ' {'print $4'} |sed 's/;//g')
			grep tcp $tmp_file |scanner_ip=$ip awk -F " " '{print ENVIRON["_host"]","ENVIRON["scanner_ip"]","$3","$1","$4,$5,$6,$7,$8;}' >>$output
			echo -e "\n" >>$output
		fi
		export SCANNER_ERROR=0
	done
done
</pre>
<p>El script necesita para funcionar archivos con el listado de direcciones ip. Los (o el) archivo(s) se deben llamar &#8220;<em>ips.<algo></algo></em>&#8220;. En mi caso, tengo los siguientes archivos:<br />
<code>ips.192 ips.10 ips.172</code><br />
Dentro de cada archivo hay direcciones del tipo 192.168.0.X, 10.0.0.X, 172.20.20.X&#8230;</p>
<p><code>$ sh scan.sh<br />
Analizando ips.10 ...<br />
	-&gt; 10.0.0.2 ...<br />
	-&gt; 10.0.0.3 ...<br />
	-&gt; 10.0.0.11 ...<br />
		- Host no activo<br />
	-&gt; 10.0.0.20 ...<br />
		- Host no activo<br />
	-&gt; 10.0.0.21 ...<br />
		- Host no activo<br />
	-&gt; 10.0.0.70 ...<br />
	-&gt; 10.0.0.72 ...<br />
	-&gt; 10.0.0.73 ...<br />
Analizando ips.172 ...<br />
	-&gt; 172.20.20.2 ...<br />
	-&gt; 172.20.20.3 ...<br />
Analizando ips.192 ...<br />
	-&gt; 192.168.0.55 ...<br />
	-&gt; 192.168.0.101 ...</p>
<p>[...]</code></p>
<p>El script generará un output a un archivo llamado &#8220;Servidores.csv&#8221;, el cual lo podemos encontrar en la misma ruta donde tenemos el script.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fscript-para-escanear-la-red-en-busca-de-servidores-y-servicios%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/script-para-escanear-la-red-en-busca-de-servidores-y-servicios/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/script-para-escanear-la-red-en-busca-de-servidores-y-servicios/"  data-text="Script para escanear la red en busca de servidores y servicios" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/script-para-escanear-la-red-en-busca-de-servidores-y-servicios/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>mpd-twitter: Publicar en twitter lo que estas escuchando</title>
		<link>http://blog.zerial.org/linux/mpd-twitter-publicar-en-twitter-lo-que-estas-escuchando/</link>
		<comments>http://blog.zerial.org/linux/mpd-twitter-publicar-en-twitter-lo-que-estas-escuchando/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 19:56:18 +0000</pubDate>
		<dc:creator>Zerial</dc:creator>
				<category><![CDATA[Documentacion]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[archlinux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[gnu/linux]]></category>
		<category><![CDATA[mpc]]></category>
		<category><![CDATA[mpd]]></category>
		<category><![CDATA[music player daemon]]></category>
		<category><![CDATA[pkgbuild]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[twtiter]]></category>

		<guid isPermaLink="false">http://blog.zerial.org/?p=1370</guid>
		<description><![CDATA[Ultimamente he estado usando el Music Player Daemon (MPD) para escuchar música. Tambien me he dado cuenta que en Twitter hace varios días está de trending topic el hashtag #nowplaying, donde la gente publica lo que está escuchando. En base a ésto y a un poco de imaginación y tiempo libre, cree un script en [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente he estado usando el <a href="http://mpd.wikia.com/" target="_blank">Music Player Daemon (MPD)</a> para escuchar música. Tambien me he dado cuenta que en Twitter hace varios días está de <a href="http://twitter.com/#search?q=%23nowplaying" target="_blank"><em>trending topic</em> el hashtag #nowplaying</a>, donde la gente publica lo que está escuchando. En base a ésto y a un poco de imaginación y tiempo libre, cree un script en bash que me permite publicar lo que estoy escuchando.</p>
<p><a href="http://blog.zerial.org/wp-content/uploads/2010/01/shot_nowplaying.png"><img class="aligncenter size-full wp-image-1371" title="shot_nowplaying" src="http://blog.zerial.org/wp-content/uploads/2010/01/shot_nowplaying.png" alt="" width="600" height="200" /></a></p>
<p>El script, llamado <a href="http://dev.zerial.org/mpd-twitter" target="_blank">mpd-twitter</a>,  usa el cliente <strong>mpc</strong> para conectarse a <strong>mpd</strong> y obtener el artista y nombre de la reproducción actual, hacer el <em>parseo</em> necesario y posteriormente publica un estado en twitter.</p>
<p><span id="more-1370"></span></p>
<pre name="code" class="c">
#!/bin/bash
#
# Author: Zerial <fernando @zerial.org>
# Version: 0.1
# URL: http://dev.zerial.org/mpd-twitter
# License: GPL
#

CONF_FILE=$HOME/.mpd-twitter
USER=$(grep ^USERNAME $CONF_FILE |cut -f 2 -d "=")
PASS=$(grep ^PASSWORD $CONF_FILE |cut -f 2 -d "=")

if [ -f $CONF_FILE ]; then
	BEFORE=$(grep ^BEFORE $CONF_FILE |cut -f 2 -d "=")
	AFTER=$(grep ^AFTER $CONF_FILE |cut -f 2 -d "=")
else
	Xdialog --title "Error" --beep --msgbox "Can't read your local config file. Please copy the /usr/local/share/mpd-twitter/mpd-twitter.local to $HOME/.mpd-twitter" 200 100
	exit
fi

CURRENT_SONG=$(mpc current)
MY_UPDATE="$BEFORE $CURRENT_SONG $AFTER"

curl -u "$USER:$PASS" -d "status=$MY_UPDATE" -d "source=mpd-twit" "http://twitter.com/statuses/update.json"
exit
</fernando></pre>
<p>El archivo de configuración, que debe estar ubicado en <strong>~/.mpd-twitter</strong>, es:</p>
<pre name="code" class="c">
#
# Local Config file for mpd-twitter
#
#
# Config the username and password
#
USERNAME=your_username
PASSWORD=your_password
#
# Text before and text after the song.
# example:
# if BEFORE=Listening and AFTER=(powered by xxx)
# mpd-twitter will send "Listening <current song> (powered by xxx)"
#
BEFORE=#nowplaying
AFTER=(powered by mpd)
</current></pre>
<p>Para los usuarios de Archlinux que quieran probarlo, he creado un PKGBUILD:</p>
<pre name="code" class="php">
# Contributor: Zerial <fernando @zerial.org>
pkgname=mpd-twitter
pkgver=0.1
pkgrel=4
pkgdesc="Publish on twitter what you are listening on MPD"
arch=('i686' 'x86_64')
url="http://dev.zerial.org/mpd-twitter"
license=('GPL')
depends=('xdialog' 'curl' 'mpc')
source=(http://dev.zerial.org/mpd-twitter/${pkgname}_${pkgver}.tar.gz)
md5sums=('3d73b79fa38bd60f637386146137999b')

build(){
	cd $startdir/src/$pkgname
	install -d $startdir/pkg/usr/local/share/mpd-twitter
	mkdir $startdir/pkg/usr/bin
	install -m744 $startdir/src/$pkgname/mpd-twitter.local $startdir/pkg/usr/local/share/mpd-twitter/
	install -m755 $startdir/src/$pkgname/mpd-twitter $startdir/pkg/usr/bin/
}
</fernando></pre>
<p>Tambien lo pueden encontrar <a href="http://aur.archlinux.org/packages.php?ID=33483">en el repositorio AUR</a>.</p>
<p>La idea es lanzar el script con algun hotkey de nuestro gestor de ventanas y asi, cada véz que quieras mostrar lo que estás escuchando, simplemente precionas la combinacion de teclas que configuraste. Por ejemplo, en DWM la he configurado asi:</p>
<pre name="code" class="c">
[...]
/* commands */
static const char *mpdtwittercmd[] = { "mpd-twitter", NULL };
static Key keys[] = {
[...]
      { MODKEY|ShiftMask,                     XK_t,   spawn,  {.v = mpdtwittercmd } },
[...]
</pre>
<p>De esta forma, cada vez que presiono Alt+Shift + T, aparece en twitter lo que estoy escuchando.</p>
<div id="bottomcontainerBox" style="border:1px solid #808080;">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zerial.org%2Flinux%2Fmpd-twitter-publicar-en-twitter-lo-que-estas-escuchando%2F&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width=85px; height:21px;" allowTransparency="true"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zerial.org/linux/mpd-twitter-publicar-en-twitter-lo-que-estas-escuchando/"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zerial.org/linux/mpd-twitter-publicar-en-twitter-lo-que-estas-escuchando/"  data-text="mpd-twitter: Publicar en twitter lo que estas escuchando" data-count="horizontal" data-via="Zerial">Tweet</a>
			</div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zerial.org/linux/mpd-twitter-publicar-en-twitter-lo-que-estas-escuchando/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

