tag:blogger.com,1999:blog-40907908989453999082024-03-13T18:38:59.514+01:00Blog funsecurity.netresearching | reversing | pentesting | developing | exploiting & fun! - Security research | Ethical hacking | Security enthusiast | Malware analyst | from AlmeríaAdrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.comBlogger22125tag:blogger.com,1999:blog-4090790898945399908.post-30551544221867835012017-11-27T21:00:00.001+01:002017-11-27T21:01:43.292+01:00Mi write-up noviembre "uno al mes"He subido mi <b>write-up</b> del reto de noviembre de "uno al mes".<br />
<br />
write-up: <a href="https://anonfile.com/k099fbd1ba/write_up_unaalmes_15-11-17.pdf" target="_blank">https://anonfile.com/k099fbd1ba/write_up_unaalmes_15-11-17.pdf</a><br />
reto: <a href="http://unaaldia.hispasec.com/2017/11/quieres-jugar-un-juego-demuestra-tus.html" target="_blank">http://unaaldia.hispasec.com/2017/11/quieres-jugar-un-juego-demuestra-tus.html</a><br />
<br />
Enjoy!Adrián Ruizhttp://www.blogger.com/profile/08144747976913055116noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-39201039420975530522017-10-10T12:14:00.000+02:002017-10-10T12:14:19.198+02:00Troyano bancario Trickbot - webinjects y bancos españoles.<b>Trickbot </b>es un troyano bancario que se estima que lleva funcionando desde el 2016 y que afecta a una gran cantidad de bancos y de entre ellos a muchos españoles.<br />
<br />
Se han escrito varios artículos sobre su funcionamiento, persistencia, tipos de inyecciones, etc. De modo que sólo quiero tratar el tema de los <b>webinjects </b>o inyecciones dimámicas (<b>dinj</b>).<br />
<br />
Una vez Trickbot se ha instalado en el sistema y demás, inspecciona la lista de procesos en busca de los tres principales navegadores: firefox, chrome y iexplore. Si encuentra uno de ellos, reserva espacio de memoria dentro de cada uno de los procesos e inyecta una dll que es la encargada de realizar el <b>hooking </b>para inspeccionar y alterar el tráfico entre nuestro navegador y el servidor web del banco.<br />
<br />
De entre la lista de bancos afectados, están los siguientes españoles:<br />
<br />
<i>caixaontinyent.es</i><br />
<i>cajamar.es</i><br />
<i>bancopopular.es</i><br />
<i>caja-ingenieros.es</i><br />
<i>caixabank.es</i><br />
<i>lacaixa.es</i><br />
<i>finconsum.es</i><br />
<i>cetelem.es</i><br />
<i>liberbankbancaprivada.es</i><br />
<i>openbank.es</i><br />
<i>bmn.es</i><br />
<i>cajasur.es</i><br />
<i>kutxabank.es</i><br />
y más...<br />
<br />
Voy a realizar una prueba con mi banco, ya que me preocupa especialmente porque es dónde tengo mi dinero.<br />
<br />
Al conectar a <b>cajamar.es</b> con el navegador Internet Explorer versión 11, se puede apreciar que Trickbot ha instalado un hook en la función <b>HttpSendRequestW </b>dentro de la librería <b>WININET.DLL</b> realizando un salto incondicional <b>JMP </b>hacia la dirección <b>0x0A1EBFA0</b>:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoM2VNnLdLYEZXsH5JKDOyGifCEOcm68qCSHCI7uuJQ752fcVSOw8bpiGTH7jQ7aI0_N6ZU-rRoqCkpn5LXVLQFs_B_qsRN3te46GNFPNzr4ntNHTvO7fhwSl6D8ori7LtU_2UmgpzRtg/s1600/trickbot_hook_wininet_httpsendrequestw.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="470" data-original-width="478" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoM2VNnLdLYEZXsH5JKDOyGifCEOcm68qCSHCI7uuJQ752fcVSOw8bpiGTH7jQ7aI0_N6ZU-rRoqCkpn5LXVLQFs_B_qsRN3te46GNFPNzr4ntNHTvO7fhwSl6D8ori7LtU_2UmgpzRtg/s1600/trickbot_hook_wininet_httpsendrequestw.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Hook instalado en la función HttpSendRequestW</td></tr>
</tbody></table>
Para que se pueda apreciar la diferencia entre la función <b>hookeada </b>y la que no lo está, hice la misma prueba pero sin Trickbot instalado.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt2vjIHykKnHMkBuru6yn2tpOwDbYEP295aGuPcFuRQAtd71OzRCsVOgfYP2tBjNLTg46H0kiR2Aqzp18Sj58d5IO3gQmUzzBT4FcrD6OY_Yz37d5Zh9xIKdKUKUJjmw6iWHgXm_8JxFs/s1600/trickbot_NOhook_wininet_httpsendrequestw.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="498" data-original-width="471" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt2vjIHykKnHMkBuru6yn2tpOwDbYEP295aGuPcFuRQAtd71OzRCsVOgfYP2tBjNLTg46H0kiR2Aqzp18Sj58d5IO3gQmUzzBT4FcrD6OY_Yz37d5Zh9xIKdKUKUJjmw6iWHgXm_8JxFs/s1600/trickbot_NOhook_wininet_httpsendrequestw.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Sin hook instalado</td></tr>
</tbody></table>
Una vez da el salto al <b>hook</b>, Trickbot realiza las comprobaciones para determinar si el sitio al que se ha conectado el usuario está entre la lista de las inyecciones dinámicas o "<b>dinj</b>". En ese caso, realiza una petición con el servidor malicioso y devuelve, entre otra información, la inyección a realizar en el sitio web:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9Rj8pX5aLO9LC8EmJBLUaZY1WbICQ43SDvu9nZLsBNVkkH1gWQImpMAPMZMLuR9dKc9J_H7xy9h_GWvOI6eNIxc9bZkOECPna0ArUHP-o8meJAsNMvywsEH38WEmZ_L6VhRUki6gfVog/s1600/trickbot_webinject_cajamar1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="599" data-original-width="1008" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9Rj8pX5aLO9LC8EmJBLUaZY1WbICQ43SDvu9nZLsBNVkkH1gWQImpMAPMZMLuR9dKc9J_H7xy9h_GWvOI6eNIxc9bZkOECPna0ArUHP-o8meJAsNMvywsEH38WEmZ_L6VhRUki6gfVog/s400/trickbot_webinject_cajamar1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Inicio de la inyección en cajamar.es</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDOIUWHHPy8kUHKoSEY86lJBACLGpaHxnpw3FiVc2HXDE8KrCJvkCRKyBAjBU8Z1SH2NTurKEru9dv6LfeFyJ6wIdQ54r72ZgrZYZnEhdZmn8Y8c3Ngx4GOzceQf2m6ebpNYMNuzIUB-0/s1600/trickbot_webinject_cajamar2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="603" data-original-width="844" height="285" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDOIUWHHPy8kUHKoSEY86lJBACLGpaHxnpw3FiVc2HXDE8KrCJvkCRKyBAjBU8Z1SH2NTurKEru9dv6LfeFyJ6wIdQ54r72ZgrZYZnEhdZmn8Y8c3Ngx4GOzceQf2m6ebpNYMNuzIUB-0/s400/trickbot_webinject_cajamar2.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Función Javascript que roba credenciales de acceso a la banca electrónica de cajamar.es</td></tr>
</tbody></table>
<br />
Para que la inyección pueda realizarse sobre el sitio legítimo, Trickbot tiene que <b>hookear </b>la función <b>InternetReadFile </b>dentro de la librería <b>WININET.DLL </b>que es la encargada de leer la respuesta del servidor web bancario y alterarla para poder incluir la inyección correspondiente:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkXs4e2r4tV5Hn-B7tLNGN-fOFM_pfVwA46GJKlH_GJRySJzqTzQMG1T_TUpj_UkWYTClOoWGkfVXj0jB-UsBsRXRVFDh1raUgkpoJy9v9YN4jon-SIUyVF0CmMxKJR99GswWom0jauQU/s1600/trickbot_hook_wininet_internetreadfile.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="612" data-original-width="993" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkXs4e2r4tV5Hn-B7tLNGN-fOFM_pfVwA46GJKlH_GJRySJzqTzQMG1T_TUpj_UkWYTClOoWGkfVXj0jB-UsBsRXRVFDh1raUgkpoJy9v9YN4jon-SIUyVF0CmMxKJR99GswWom0jauQU/s400/trickbot_hook_wininet_internetreadfile.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Hook instalado encargado de devolver a petición al navegador con la inyección</td></tr>
</tbody></table>
Una mitigación que se puede implementar desde el lado del servidor web del banco, es leer la cookie "<b>tknz_referrer</b>" para determinar si el usuario/cliente del banco está infectado y actuar en consecuencia.<br />
<br />Adrián Ruizhttp://www.blogger.com/profile/08144747976913055116noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-62644316448511020962017-10-03T23:56:00.000+02:002017-10-10T22:28:26.103+02:00TOR con Python y cambiar circuito programáticamenteEn este artículo voy a mostrar cómo tunelizar todas las conexiones de nuestro script Python y además la posibilidad de cambiar de circuito para salir cada vez por una IP distinta.<br />
<div>
<br /></div>
<div>
Los ingredientes necesarios son Python y TOR, obviamente. Una vez tenemos nuestro sistema listo, debemos configurar TOR habilitando la directiva <b>ControlPort </b>para poder interactuar con el servicio por medio del puerto configurado:</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSEOfP-BqX8nAJutdMLMj0ipbpILmTuGOFLFJbIJlNkG2myaBELpachhmRS4YXAAs3YAq9PYDZb86ptFaNsXtsGlYa5b0PhdsDtiWl8yiSgcPQ8Y6Q0Sbotg2p0Z9snF9k-mZS33B5Mms/s1600/controlport.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="132" data-original-width="564" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSEOfP-BqX8nAJutdMLMj0ipbpILmTuGOFLFJbIJlNkG2myaBELpachhmRS4YXAAs3YAq9PYDZb86ptFaNsXtsGlYa5b0PhdsDtiWl8yiSgcPQ8Y6Q0Sbotg2p0Z9snF9k-mZS33B5Mms/s1600/controlport.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">/etc/tor/torrc</td></tr>
</tbody></table>
<div>
Para esta prueba de concepto, he deshabilitado la autenticación del puerto de control <b>CookieAuthentication </b>con el valor 0. Para sistemas en producción configurar este valor adecuadamente.</div>
<div>
<br /></div>
<div>
Reiniciamos nuestra instancia TOR y vamos al código:</div>
<div>
<br /></div>
<div>
<script src="https://gist.github.com/funsecurity/ba404daad21b0e341b3951de627e46b5.js"></script>
</div>
<div>
<br /></div>
<div>
Ejemplo de ejecución:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj07bv4ZkKLoAEnuq8qiFmx_6oj-xZEzja5nHEpOE6FCvOWkmkUNxiy752hBNB8z3cj77lpQ-zKHmB5zJxO4mgiQZz1A1WIKmXBmO8H0fx8dzdxFwMjVst5yaRYx6w1lHGs1dIcpxzQzrw/s1600/torcircuit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="163" data-original-width="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj07bv4ZkKLoAEnuq8qiFmx_6oj-xZEzja5nHEpOE6FCvOWkmkUNxiy752hBNB8z3cj77lpQ-zKHmB5zJxO4mgiQZz1A1WIKmXBmO8H0fx8dzdxFwMjVst5yaRYx6w1lHGs1dIcpxzQzrw/s1600/torcircuit.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Para cambiar el circuito, básicamente se establece una conexión en texto plano al puerto 9051 sin autenticación y se envía el comando "<b>SIGNAL NEWNYM</b>". Establecemos un tiempo de espera de 10 segundos para dar tiempo a que se cambie el circuito. </div>
<div>
<br /></div>
Adrián Ruizhttp://www.blogger.com/profile/08144747976913055116noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-32700005831698558352017-10-01T23:08:00.000+02:002017-10-01T23:16:03.188+02:00Wordlist para fuzzing web con Apache y LogrotateCrear una wordlist para fuzzing web puede ser relativamente sencillo, efectivo y sin apenas esfuerzo aprovechando la tecnología y la "inteligencia" que nos brindan los diferentes actores que ponen a prueba nuestro servidor web Apache donde tenemos alojadas nuestras webs, honeypots, etc.<br />
<div>
<br /></div>
<div>
Los ingredientes necesarios son un servidor web Apache y Logrotate. Para el que no sepa que es Logrotate, como su nombre indica, nos permite realizar rotación de archivos evitando que crezcan y nos colapsen el espacio de disco duro. Para ello se vale de varias directivas y demás. Para nuestro propósito nos valdremos de la directiva "<b>prerotate</b>".</div>
<div>
<br /></div>
<div>
Abrimos el archivo "/etc/logrotate.d/apache2" y justo debajo de "prerotate", añadimos:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">PATH_LOGS="/var/log/apache2/*.log"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">PATH_WORDLIST="/home/cukz"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">grep "HTTP/1.1\" 404" $PATH_LOGS | awk '{print $7 } ' | sort | uniq | sort >> $PATH_WORDLIST/wordlist.tmp && cat $PATH_WORDLIST/wordlist.tmp | sort | uniq > $PATH_WORDLIST/wordlist.txt</span></div>
<div>
<br /></div>
<div>
Modificar la variable "PATH_LOGS" y "PATH_WORDLIST" con los valores adecuados según nuestro sistema.</div>
<div>
<br /></div>
<div>
Quedaría algo así:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih2f1R1BDEjo4qrC3ZVPtt-MD1IJLOJh4YE8FL7ZC7Zvem5HyPl76LjVWDmRqQ4dVdHLEHASRDxm4A-eMmafTfJBW7UWxVzyzMiEjGxSzXZL06E3oSVeEm1SCckL1C_xFOC17VjB-WuOM/s1600/logrotate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="395" data-original-width="850" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih2f1R1BDEjo4qrC3ZVPtt-MD1IJLOJh4YE8FL7ZC7Zvem5HyPl76LjVWDmRqQ4dVdHLEHASRDxm4A-eMmafTfJBW7UWxVzyzMiEjGxSzXZL06E3oSVeEm1SCckL1C_xFOC17VjB-WuOM/s320/logrotate.png" width="320" /></a></div>
<div>
<br /></div>
<div>
Logrotate se ejecutará diariamente gracias a cron y en la ruta "PATH_WORDLIST" tendremos un archivo ordenado con todas las peticiones 404 que se hayan realizado sobre nuestro servidor web.</div>
<div>
Hay que tener en cuenta que no todas las peticiones nos valdrán para nuestro diccionario, nos tocará filtrarlo y eliminar lo que no nos interese.</div>
<div>
<br /></div>
<div>
Esta wordlist también nos puede valer para realizar un posterior análisis forense, estudiar tendencias de ataques, etc.</div>
Adrián Ruizhttp://www.blogger.com/profile/08144747976913055116noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-235086459235137482015-11-29T12:13:00.000+01:002016-04-07T09:32:26.832+02:00Problemas con el HDMI de la app de Orange TV en Android y cómo solucionarlo.La app de <b>Orange TV</b> para <b>Android</b> viene de serie capada para que no podamos usar el <b>HDMI</b> de nuestra <b>tablet</b> o <b>smartphone</b> para poder ver los canales en nuestro flamante <b>televisor</b>.<br />
<br />
Tal día como hoy, me dispuse a conectar mi tablet por HDMI al televisor. Arranqué la app de Orange TV y puse un canal al azar. Conecté el cable HDMI a la tablet y WTF!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgluTLknp6MUg8CoLXOZu2pEJ6TYWSJOaV9lddGEJLq-K5Hwg4BcYgn_8yKIk0A-KRlSXBH5vvYAXcmCZzNbl3hFL4qEo6uDSePwLW1lyGuztshXRnjPmb81Iaqe24NYUdkoPS_DLmP4ho/s1600/Screenshot_2015-11-26-20-54-31.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Error HDMI Orange TV" border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgluTLknp6MUg8CoLXOZu2pEJ6TYWSJOaV9lddGEJLq-K5Hwg4BcYgn_8yKIk0A-KRlSXBH5vvYAXcmCZzNbl3hFL4qEo6uDSePwLW1lyGuztshXRnjPmb81Iaqe24NYUdkoPS_DLmP4ho/s400/Screenshot_2015-11-26-20-54-31.jpg" title="Error HDMI Orange TV" width="400" /></a></div>
<br />
A santo de que los lumbreras de Orange deciden capar el HDMI para poder ver el contenido desde mi televisor? No me parece justo, ya que además de cliente de TV, también lo soy de móvil y ADSL / Fibra y me gasto los cuartos para que encima decidan si puedo usar o no el HDMI!<br />
<br />
Ante esta indignación e imagino que la de mucha gente, indico una serie de pasos básicos para poder usar el puerto HDMI con la app de Orange TV de Android.<br />
Básicamente consiste en eliminar el <b>IntentFilter</b> para que la aplicación no se entere cuando ocurran los eventos / acciones relacionados con:<br />
<br />
<div>
<ul>
<li><b>HDMI_AUDIO_PLUG</b></li>
<li><b>HDMI_PLUGGED</b></li>
</ul>
</div>
<br />
Asumo que tienes conocimientos de reversing en Android, por lo que no voy a comentar muchos de los pasos por lo que los doy por sabidos.<br />
<ul>
<li>Hazte con una copia del apk de Orange TV.</li>
<li>Decompilamos con <b>apktool</b>: </li>
<ul>
<li>./apktool d com.orange.es.orangetv-1.apk</li>
</ul>
<li>Modificar constructor privado "<b>.method private constructor <init>()V</b>" de la clase "com/discretix/drmdlc/api/<b>DxBroadcastReceiver</b>.smali" <b>eliminando</b> estas líneas:</li>
</ul>
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<table><tbody>
<tr><td></td><td><pre style="line-height: 125%; margin: 0;"> const-string <span style="color: #007020;">v1</span>, <span style="background-color: #fff0f0;">"android.intent.action.HDMI_AUDIO_PLUG"</span>
invoke-virtual {<span style="color: #007020;">v0</span>, <span style="color: #007020;">v1</span>}, <span style="color: #333399; font-weight: bold;">L</span>android/content/<span style="color: #bb0066; font-weight: bold;">IntentFilter</span>;-><span style="color: #0066bb; font-weight: bold;">addAction</span>(<span style="color: #333399; font-weight: bold;">L</span>java/lang/<span style="color: #bb0066; font-weight: bold;">String</span>;)<span style="color: #333399; font-weight: bold;">V</span>
const-string <span style="color: #007020;">v1</span>, <span style="background-color: #fff0f0;">"android.intent.action.HDMI_PLUGGED"</span>
invoke-virtual {<span style="color: #007020;">v0</span>, <span style="color: #007020;">v1</span>}, <span style="color: #333399; font-weight: bold;">L</span>android/content/<span style="color: #bb0066; font-weight: bold;">IntentFilter</span>;-><span style="color: #0066bb; font-weight: bold;">addAction</span>(<span style="color: #333399; font-weight: bold;">L</span>java/lang/<span style="color: #bb0066; font-weight: bold;">String</span>;)<span style="color: #333399; font-weight: bold;">V</span>
</pre>
</td></tr>
</tbody></table>
</div>
<ul>
<li>Compilamos con apktool: </li>
<ul>
<li>./apktool b com.orange.es.orangetv-1</li>
</ul>
<li>Firmar (Me he generado el keystore "apktool.keystore" con contraseña "apktool" para firmar con el certificado "apktool")</li>
<ul>
<li><b>jarsigner</b> -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore apktool.keystore -storepass apktool com.orange.es.orangetv-1.apk apktool</li>
</ul>
<li>Verificamos firma</li>
<ul>
<li><b>jarsigner</b> -verify -verbose -certs com.orange.es.orangetv-1.apk</li>
</ul>
<li>Alineamos</li>
<ul>
<li><b>zipalign</b> -v 4 com.orange.es.orangetv-1.apk "com.orange.es.orangetv-1.align.apk"</li>
</ul>
<li>Desinstalamos la app original de Orange TV.</li>
<li>Conectamos nuestro dispositivo e instalamos la app "tuneada"</li>
<ul>
<li><b>adb</b> install com.orange.es.orangetv-1.align.apk</li>
</ul>
</ul>
<div>
Para los más perezosos, dejo una copia del apk modificado. Es la versión 1.3.2, la tenéis <a href="https://mega.nz/#!TlclUK6D!n9zxZpMTK1bE_wRrMXep_n2PqSoif_rwCIXCYzSHDmw" target="_blank">aquí</a>.</div>
<div>
<br /></div>
<div>
Saludos,</div>
Adrián Ruizhttp://www.blogger.com/profile/08144747976913055116noreply@blogger.com5tag:blogger.com,1999:blog-4090790898945399908.post-20200168269695879172015-10-09T21:24:00.000+02:002015-10-09T21:24:00.173+02:00Exploit KCodes NetUSB disponible en GitHub y Google Play<div>
Buscando y buscando el exploit de NetUSB y nunca dí con nada, así que decidí investigar para intentar sacarlo y poder determinar si alguno de nuestros dispositivos está afectado por la vulnerabilidad CVE-2015-3036.</div>
<div>
<br /></div>
Tienes a tu disposición el exploit de NetUSB descubierto a últimos de mayo de 2015.<div>
<br /></div>
<div>
GitHub: <a href="https://github.com/funsecurity/NetUSB-exploit" target="_blank">https://github.com/funsecurity/NetUSB-exploit</a></div>
<div>
<br /></div>
<div>
App para android: <a href="https://play.google.com/store/apps/details?id=net.funsecurity.netusbexploit" target="_blank">https://play.google.com/store/apps/details?id=net.funsecurity.netusbexploit</a></div>
<div>
<br /></div>
<div>
For fun & profit!</div>
<div>
<br /></div>
<div>
saludos,<br /><div>
<br /></div>
</div>
Adrián Ruizhttp://www.blogger.com/profile/08144747976913055116noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-30545616484896470972014-04-07T19:36:00.001+02:002014-04-07T19:37:34.081+02:00apk_binder_scriptReseña en <a href="http://www.hackplayers.com/" target="_blank">hackplayers.com</a> de la herramienta que he desarrollado para "bindear" apk's:<br />
<br />
apk_binder_script<br />
<a href="http://www.hackplayers.com/2014/04/apkbinderscript-herramienta-para-bindear-apks.html" target="_blank">http://www.hackplayers.com/2014/04/apkbinderscript-herramienta-para-bindear-apks.html</a>Adrián Ruizhttp://www.blogger.com/profile/08144747976913055116noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-90657638364471293432012-04-18T00:54:00.000+02:002012-04-18T00:56:43.442+02:00Google Translate sin SSLVaya, de nuevo Google parece que se toma en serio la seguridad, a ratos.<br />
<br />
Este problema de "implementación" puede acarrear que, en redes inseguras, nuestras cookies sean interceptadas y por lo tanto una suplantación de identidad, session hijacking.<br />
<br />
El logado se realiza de forma segura, el problema se encuentra cuando navegamos hacia:<br />
<br />
<a href="http://translate.google.com/" target="_blank">http://translate.google.com/</a><br />
<br />
y de esa forma deja de estar cifrada la información que transmitimos.<br />
Al igual ocurre con:<br />
<br />
<a href="http://translate.google.com/toolkit/" target="_blank">http://translate.google.com/toolkit/</a><br />
<br />
cuidadito cuando accedáis a estas webs mientras Google no implemente el cifrado SSL.<br />
<br />
saludos,Adrián Ruizhttp://www.blogger.com/profile/08144747976913055116noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-8231349555960742912012-04-13T19:21:00.002+02:002012-04-13T19:21:21.001+02:00Blogger sin SSLContribución en "<a href="http://www.securitybydefault.com/" target="_blank">Security by default</a>"<br />
<br />
<a href="http://www.securitybydefault.com/2012/04/blogger-sin-ssl.html" target="_blank">Blogger sin SSL</a><br />
<br />
saludos,Adrián Ruizhttp://www.blogger.com/profile/08144747976913055116noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-80559656067512222652012-04-07T12:36:00.002+02:002012-04-07T12:38:24.596+02:00Google Authenticator 2Contribución en "<a href="http://www.securitybydefault.com/" target="_blank">Security by default</a>"<br />
<br />
<a href="http://www.securitybydefault.com/2012/04/google-authenticator-2.html" target="_blank">Google Authenticator 2</a><br />
<br />
saludos,Adrián Ruizhttp://www.blogger.com/profile/08144747976913055116noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-12298469124864898652012-03-17T15:48:00.000+01:002012-03-17T15:48:50.564+01:00Concienciación en seguridad tecnológica<div style="font-family: inherit;">
La tecnología nos ayuda en nuestra labor diaria, por todos es sabido que en el mundo en el que actualmente vivimos, pocas son las personas que pueden prescindir, por mínimo que sea, de usarla.</div>
<div style="font-family: inherit;">
El usarla de manera imprudente sin la concienciación adecuada, puede ocasionar que la perdamos, roben, manipulen, intercepten, etc. Debemos de salvaguardar toda la información que precisemos importante. Con importante no quiere decir que sea privada. Podemos tener información importante y pública e información para nada importante para los demás pero con caracter privado y confidencial para nosotros.
Analizar que información manejamos, nos ayudará a protegerla. Cual consideramos pública y cual privada.
Unas recomendaciones básicas para el uso correcto de la información y mantenernos en la medida de lo posible actualizados.
<br />
<ul>
<li><b>Cifrar</b>. Con cifrar nos referimos a cualquier nivel de la capa <a href="https://es.wikipedia.org/wiki/OSI" target="_blank">OSI</a>. Ya sean archivos, particiones, comunicaciones, etc.</li>
<li><b>Actualizar</b>. Mantén en la medida de lo posible tu software actualizado. Este software puede ser cualquier que sea ejecutado por cualquier dispositivo tales como routers, pc, móvil, etc.</li>
<li><b>Monitorizar</b>. De vez en cuando, no está de más realizar pequeñas auditorías sobre nuestros datos, revisar logs, fechas de modificaciones de archivos, software instalado, conexiones realizadas, etc. </li>
<li><b>Autenticidad</b>. Parece difícil saber cuando algo es auténtico y cuando no, pero en cuanto a las comunicaciones con entidades bancarias (por poner un ejemplo), podemos siempre verificar los certificados digitales si han sido emitidos por entidades de confianza y si éstos a su vez no han sido revocados (las entidades de confianza). Al igual pasa con verificar la firma del software que vamos a instalar si está firmado digitalmente por una entidad de confianza.Véase <a href="https://es.wikipedia.org/wiki/Infraestructura_de_clave_p%C3%BAblica" target="_blank">PKI</a>.</li>
<li><b>Desconfiar</b>. Hasta que no se demuestre lo contrario, en internet, nada es lo que parece ser. No abrir enlaces no solicitados, no abrir archivos sospechosos y que no hayamos solicitado, no transferir información personal y privada por redes inseguras, si sospechas de algo, en vez de proporcionar información real, que sea falsa, etc.</li>
</ul>
Son unos pequeños consejos para sobrevivir en la red de redes. El día en el que para entrar, tengamos que acreditar nuestra identidad, paquete a paquete, byte a byte, bit a bit... todo cambiará.<br />
<br />
saludos,</div>
<div style="font-family: inherit;">
</div>Adrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-44501757320207641602010-12-12T12:34:00.000+01:002011-08-13T12:43:36.455+02:00Volver al pasado...Hace algún tiempo di con esta página y me resulta de lo más curiosa. Te permite ver páginas webs desde el año 1996 en adelante. Como han evolucionado, como han desaparecido, cambios de propietario... todo un historial con sus cambios a lo largo de la vida de una web.<br/><br/>enlace: <a href="http://www.archive.org/" target="_blank">http://www.archive.org/</a>Adrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-80380319349777770312010-06-13T14:44:00.000+02:002011-08-13T12:43:36.455+02:00Página curiosa http://www.superbad.com/Dejo un enlace de una página muy curiosa donde cada una de ellas contiene enlaces a otras páginas con otros diseños y formas totalmente diferentes!<br/><br/>Algo desconcertante, curioso, desordenado y divertido!. Merce la pena que le eches un vistazo.<br/><br/><a target="_blank" href="http://www.superbad.com">http://www.superbad.com</a>Adrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-20041760194045130722010-04-25T14:26:00.001+02:002012-04-13T19:34:14.172+02:00Ejecutar procesos en PHP (Windows)Después de mucho tiempo sin escribir nada voy a hacerlo con una pequeña pero útil prestación de php.<br />
<br />
El proceso que voy a realizar aquí va dedicado para Windows mediante <b>COM</b>, que a resumidas cuentas un objeto COM permite la comunicación entre procesos dando igual el lenguaje, implementación, etc desde donde proceda.<br />
<br />
Veamos un ejemplo:<br />
<script src="http://pastebin.com/embed_js.php?i=RcAF0NHr"></script>
<br />
<br />
Supongamos que necesito ejecutar dede php un script también escrito en php.<br />
Podría hacerlo mediante una redirección desde el navegador que apuntase al script que necesito ejecutar, ¿pero qué ocurre si no deseo que se ejecute por la salida del navegador y sea como un proceso independiente?, pues ahí radica el kid de la cuestión. Necesitamos ejecutar un script como si se tratase de un proceso independiente del sistema donde ejecutamos el servidor web.<br />
<br />
Estableciendo el escenario.<br />
Nuestro script se va a encargar de rastrear un sitio web completo en busca de direcciones de correo electrónico.<br />
Por un lado, tenemos el script que se encargará de realizar la llamada al script que se ejecutará como proceso independiente pasándole como parámetro le URL del sitio web a rastrear.<br />
<br />
<b>lanzadera.php</b><br />
<script src="http://pastebin.com/embed_js.php?i=bBfB0M1p"></script>
<br />
<br />
A continuación el script que procesa la petición para buscar emails<br />
<br />
<b>buscas_emails.php</b><br />
<script src="http://pastebin.com/embed_js.php?i=xDd26xLB"></script>
<br />
<br />
El resto del código te lo dejo pendiente para que lo finalices, pero la idea es:<br />
<ul>
<li>Tener un formulario de entrada donde recibir por GET la dirección del sitio web a rastrear.</li>
<li>Realizar la llamada al script que se va a ejecutar como un proceso independiente</li>
<li>Tras realizar la llamada, rastrear el sitio web completo en busca de todos los emails</li>
<li>Los emails encontradros los almacenamos en memoria mediante un vector</li>
<li>Finalizado el rastreo del servidor, volcamos todos los emails encontrados en un fichero en el sistema</li>
<li>Mediante Ajax, realizar un seguimiento del fichero donde se encuentran todos los emails para comprobar si tal fichero tiene o no contenido. En caso de tenerlo mostrarlo</li>
</ul>
<br />
<br />
Espero te sirva de utilidad y completes el ejemplo satisfactoriamente!Adrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-25117163209518796212009-12-18T23:59:00.013+01:002014-03-30T23:48:52.838+02:00Subir archivos con Java mediante HTTP y tratamiento con PHPMás de una vez me ha surgido la necesidad de subir varios archivos al servidor asíncronamente y de tal forma que muestre al detalle el total de archivos subidos, progreso, tamaño total ,etc.<br />
Pues bien, en uno de mis <b>experimentos</b>, me decidí a desarrollar mi propio <b>uploader en Java</b>, que es lo que voy a tratar de explicar aquí. Para ello analizaremos los paquetes que son enviados al servidor mediante el protocolo HTTP, oséase al servidor web y así poder implementar dicho protocolo en Java.<br />
<br />
La subida de archivos por el protocolo HTTP mediante PHP y un servidor web tal como APACHE, para un programador experimentado es bien conocida, no obstante, vamos a repasar algunos conceptos de cómo se hace con este método tan rudimentario y tan usado por muchos.<br />
<br />
<b>upload.html</b><br />
<br />
<script src="http://pastebin.com/embed_js.php?i=tZ92dMKz"></script>
Tenemos preparado el documento html para la entrada de datos, una vez que se pulsa el botón "Subir!", la petición se redirige al script especificado en el atributo "<b>action</b>", en este caso vamos a parar a "<b>tratar-upload.php</b>".<br />
<br />
<b>tratar-upload.php</b><br />
<script src="http://pastebin.com/embed_js.php?i=FxMWMVH3"></script>
Bien, ya tenemos todo listo, ahora nos toca <b>analizar</b> cómo hace intrínsicamente la operación de subir archivos. Para ello nos valemos de un analizador de protocolos de red tal como <a href="http://www.wireshark.org/" target="_blank">wireshark</a>. Ponemos a la <b>escucha</b> en el interfaz de red pertinente, seleccionamos archivos en el documento html y pulsamos el botón "Subir!".<br />
<br />
<b>Análisis</b> de subida de archivos por el protocolo HTTP usando el método <b>POST</b>.<br />
<br />
<b>Petición HTTP</b><br />
<script src="http://pastebin.com/embed_js.php?i=RLFma9d3"></script>
Quiero hacer una objeción respecto a -RETORNO DE CARRO + SALTO DE LINEA-. Indica que existen <b>2 bytes no visibles</b> adicionales para el <b>salto a la siguiente línea</b>. Véase más sobre <b>secuencias de escape</b>, pero para el ejemplo sólo usaremos dos:<br />
<br />
Retorno de carro:<b>\r</b><br />
Salto de línea: <b>\n</b><br />
<br />
Donde se indica "2 x", es que existen <b>dos saltos</b>.<br />
Pasemos a analizar paso a paso cada campo de la <b>cebecera</b> de la petición.<br />
<br />
Realizamos petición para "<b>mandar</b>, <b>fijar</b>, <b>poner</b>" en el script "tratar-upload.php" los datos de la petición.<br />
<pre class="html" name="code">POST tratar-upload.php HTTP/1.1</pre>
Dirección completa del servidor desde donde realizamos la petición.<br />
<pre class="html" name="code">Host: localhost</pre>
<b>Agente-navegador</b> usado desde donde realizamos la petición.<br />
<pre class="html" name="code">User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.16)</pre>
<b>Tipos de datos</b> que acepta el agente-navegador para procesar la respuesta una vez concluida la petición.<br />
<pre class="html" name="code">Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</pre>
<b>Lenguajes</b> aceptados para la respuesta por parte del navegador.<br />
<pre class="html" name="code">Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3</pre>
Tipos de <b>codificación</b> aceptados para la respuesta por parte del navegador.<br />
<pre class="html" name="code">Accept-Encoding: gzip,deflate</pre>
<b>Conjunto de carácteres</b> aceptados para la respuesta por parte del navegador.<br />
<pre class="html" name="code">Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7</pre>
Representa el número máximo de segundos entre envío y respuesta de paquetes sobre una <b>conexión persistente</b>.<br />
<pre class="html" name="code">Keep-Alive: 300</pre>
Indica que el navegador soporta <b>conexiones persistentes</b> sobre una misma conexión <b>TCP</b>.<br />
<pre class="html" name="code">Connection: keep-alive</pre>
Indica desde donde <b>procede</b> la petición.<br />
<pre class="html" name="code">Referer: http://localhost/upload.html</pre>
<b>Muy Importante</b>.<br />
Establece que la petición puede estar formada por diferentes <b>partes</b> de datos y se indica el <b>separador</b> (límite) entre las partes involucradas. Oséase, que cada archivo debe estar separado convenientemente por el límite establecido <b>boundary</b>. La serie numérica que le sigue está formada aleatoriamente y no sigue ningún tipo de lógica.<br />
<pre class="html" name="code">Content-Type: multipart/form-data; boundary=---------------------------265001916915724</pre>
Tamaño en <b>bytes</b> del conjunto de datos que vamos a enviar <b>excluyendo</b> la cabecera.<br />
<pre class="html" name="code">Content-Length: total_bytes_de_los_ficheros_incluyendo_los_delimitadores<2 x RETORNO DE CARRO + SALTO DE LINEA></pre>
<br />
A continuación voy a explicar las partes de cada archivo que enviamos al servidor.<br />
<br />
Indica el <b>comienzo</b> de una parte, osea, los datos de un archivo<br />
<pre class="html" name="code">-----------------------------265001916915724</pre>
Aquí se establece el <b>nombre del campo</b> del fichero especificado en el form y el <b>nombre del archivo</b> que vamos a enviar.<br />
<pre class="html" name="code">Content-Disposition: form-data; name="f1"; filename="archivo1.ext"</pre>
Tipos de datos que contiene el archivo. Normalmente <b>binarios</b>.<br />
<pre class="html" name="code">Content-Type: application/binary<2 x RETORNO DE CARRO + SALTO DE LINEA></pre>
Los datos en bruto del fichero son colocados aquí, acabamos con un salto de línea.<br />
<pre class="html" name="code"><datos><retorno carro="" de="" linea="" salto="">
</retorno></datos></pre>
<br />
Para <b>terminar la retransmisión</b> de datos hacia el servidor, debemos indicarlo con el siguiente campo.<br />
<pre class="html" name="code">-----------------------------265001916915724--</pre>
(nótese que acaba con dos guiones -- más retorno de carro y el salto de línea correspondiente.)<br />
<br />
Ya creo que estamos listos para ver el código fuente del programa que desarrollé en Java para la subida de ilimitado número de archivos. El código se corresponde con la clase más significativa del programa, el <b>uploader</b>. He suprimido algunas partes del código para exponer más claramente lo que estamos tratando aquí.<br />
<br />
<b>Uploader.java</b><br />
<script src="http://pastebin.com/embed_js.php?i=YtznrJQJ"></script>
<br />
Si estás interesado en todo el desarrollo del <b>applet</b>, puedes ponerte en contacto conmigo.<br />
Para poder usarlo correctamente, el applet está <b>firmado</b> para poder explorar el disco duro del cliente con los archivos que desea subir al servidor.Adrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.com3tag:blogger.com,1999:blog-4090790898945399908.post-89383236880707389092009-12-01T14:38:00.001+01:002014-03-30T23:51:11.401+02:00Implementando cliente DNS para resolver servidores MX (MAIL EXCHANGE) con CA continuación listo el codigo fuente totalmente comentado para resolver servidores de correo saliente a partir de un email, un servidor DNS y el puerto usado por el servidor (normalmente el 53 por UDP).<br />
<br />
Uso del programa:<br />
<br />
DNS-MX.exe <Email> <Servidor DNS> <Puerto servidor DNS><br />
<br />
<b>DNS-MX.c</b>
<br />
<script src="http://pastebin.com/embed_js.php?i=erQmZ7KA"></script>Adrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-31550382383294958002009-12-01T12:40:00.001+01:002011-08-13T13:12:15.572+02:00Analizando la respuesta DNSProcederemos a analizar la respuesta que nos devuelve el servidor DNS.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyYHa_V45KvWKq3rAWN6QPJvlq4IT1njtz0vo3XKPWJyncbYCaZfHVc5_Uq049n2W74mqYCJcd7Yl9_dSGgLRwTIzff9tcgRBc9zbx2vqMjthfrSv99Q-aBUNS8a6UBs6WUPRULD8Duug/s1600/respuest_dns_mx.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyYHa_V45KvWKq3rAWN6QPJvlq4IT1njtz0vo3XKPWJyncbYCaZfHVc5_Uq049n2W74mqYCJcd7Yl9_dSGgLRwTIzff9tcgRBc9zbx2vqMjthfrSv99Q-aBUNS8a6UBs6WUPRULD8Duug/s320/respuest_dns_mx.jpg" width="320" /></a></div><br />
<br />
Voy a pasar a comentar sólo algunos campos que nos resultan de interés para la práctica que estamos realizando.<br />
<ul><li>Transaction ID: Como vemos, coincide el ID de la consulta con la de la respuesta.</li>
<li>Answer RRs: Nos indica que el número de servidores tipo MX resueltos.</li>
<li>Additional RRs: Son campos adicionales donde se muestran las direcciones IP de cada servidor MX resuelto.</li>
</ul><br />
Ahora vamos a desglosar los campos Answers donde se encuentran los servidores MX resueltos por el servidor DNS.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF9gmCUzZ5BrbiSEQsrjIUXewfCyoxktqlRQdS6iUp-vIYtRU5P-tRhuv-kVhjRQysTvZful047QLpsmfwJx6Od-NMGxCmkUCTJB0B6x7Da_hxU85XrNop5zuFBIEsvQKlX0AGmiX7RpM/s1600/answers_respuesta_dns_mx.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="199" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF9gmCUzZ5BrbiSEQsrjIUXewfCyoxktqlRQdS6iUp-vIYtRU5P-tRhuv-kVhjRQysTvZful047QLpsmfwJx6Od-NMGxCmkUCTJB0B6x7Da_hxU85XrNop5zuFBIEsvQKlX0AGmiX7RpM/s320/answers_respuesta_dns_mx.jpg" width="320" /></a></div><br />
<br />
Datos de la estructura Answers:<br />
<ul><li>Name: gmail.com = <b>0xc00c</b>. c0 indica que hay compresión y el siguiente byte establece el byte de desplazamiento donde se encuentra la información, osea: 0c, que en decimal se traduce a 12. En la posición 12 de la respuesta se encuentra lo que buscamos. Los primeros 12 bytes de la respuesta corresponden a parámetros de la consulta, el byte siguiente, osea, el 13, nos deja justo en el campo Name de la estructura Queries, que es nada más ni nada menos que: gmail.com. Todo este procedimiento se traduce como <b>compresión</b>.</li>
<li>Type: MX = <b>0x000f.</b> Indica el tipo de servidor (servidor de correo saliente)</li>
<li>Class: IN = <b>0x0001</b>. Indica la clase de servidor (servidor de internet)</li>
<li>Time to live: 47 minutes, 52 secons = <b>0x00000b38</b>. Marca de tiempo que establece el tiempo que puede ser el servidor cacheado hasta vovler a interrogar para resolverlos de nuevo.</li>
<li>Data length: 27 = <b>0x000b</b>. Indica el tamaño de la cadena en bytes del servidor resuelto.</li>
<li>Preference: 5 = <b>0x0005</b>. Indica preferencia de uso del servidor entre los resueltos.</li>
<li>Mail exchange: gmail-smtp-in.l.google.com</li>
</ul><br />
Nos detenemos en el campo Mail exchange ya que merece la pena para analizar la compresión.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY3JgdSY8PyyTCrwdN2SMymw7KP8-M2QbjJupIj-i0mY1mXaNezHO47bc8FPPZ0nDZySeLz8wkem2JjKIxj5iywuh1QpaodjYTJ8o2SeSzNZ-8LVEOIHBSCSqS0aoZRJUVyvHD6dGGv5U/s1600/compresion_dns.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY3JgdSY8PyyTCrwdN2SMymw7KP8-M2QbjJupIj-i0mY1mXaNezHO47bc8FPPZ0nDZySeLz8wkem2JjKIxj5iywuh1QpaodjYTJ8o2SeSzNZ-8LVEOIHBSCSqS0aoZRJUVyvHD6dGGv5U/s320/compresion_dns.jpg" width="320" /></a></div><br />
<br />
Este tipo de procedimiento se repite una y otra vez mientras se pueda hacer uso de la compresión.<br />
Como ya dije, se hace uso de la compresión para dar una rápida respuesta y demorar lo menos posible en resolver las consultas de los clientes. Es un buen mecanismo pero un tanto engorroso, se deben de tener bien claros los conceptos porque en el capítulo siguiente veremos la implementación de un cliente DNS para resolver servidores tipo Mail exchange.Adrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-71436343186035371452009-12-01T12:28:00.003+01:002011-08-13T13:22:24.902+02:00Analizando la consulta DNSHace algún tiempo, desarrollé un cliente <b>DNS</b> para resolver consultas tipo <b>MX</b>(MAIL EXCHANGE), que no son más que consultas para resolver servidores de correo saliente a partir de un nombre de dominio.<br />
<br />
Para obtener más información sobre DNS <a href="http://www.faqs.org/rfcs/rfc1035.html" target="_blank" title="http://www.faqs.org/rfcs/rfc1035.html">RFC 1035</a><br />
<br />
La siguiente captura está realizada con <a href="http://www.wireshark.org/" target="_blank" title="http://www.wireshark.org/">wireshark</a> para ilustrar un poco que campos intervienen a la hora de realizar una consulta DNS.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0AEji1EbTHRtDO69-D1lxD3MsvEDh7cGTbJ_10UIDrWLILbeTSsjZw8hQDBxiZYS4sVfGB6Nw_LanYLBfRGeuApUxwEy0QTE2pc6nP0nEY5TzhVuO3Q4vsPhPJ4MpCLPql5QRM3j5H4c/s1600/consuta_dns_mx1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0AEji1EbTHRtDO69-D1lxD3MsvEDh7cGTbJ_10UIDrWLILbeTSsjZw8hQDBxiZYS4sVfGB6Nw_LanYLBfRGeuApUxwEy0QTE2pc6nP0nEY5TzhVuO3Q4vsPhPJ4MpCLPql5QRM3j5H4c/s320/consuta_dns_mx1.jpg" width="320" /></a></div><br />
<br />
Voy a explicar un poco que significan los siguientes campos.<br />
<ul><li><b>Transaction ID</b> (2 bytes): Identifica la consulta del cliente que debe conincidir con la respuesta del servidor.</li>
<li><b>Flags</b> (2 bytes): Son parámetros para la consulta a realizar, si es una consulta inversa, el mensaje está truncado, etc. De momento nos basta saber que la consulta a que hemos realizado es recursiva, es decir, si el servidor DNS al que hemos realizado la consulta no contiene la información que necesitamos, éste acude a otros servidores para obtener la respuesta.</li>
<li><b>Questions</b> (2 bytes): Número de consultas a realizar, por defecto sólo una.</li>
<li><b>Answer RRs</b> (2 bytes): Número de entradas que aparecen en la sección de respuesta, siempre a cero en la consulta.</li>
<li><b>Authority RRs</b> (2 bytes): Número de entradas que aparecen en la sección de autoridad, siempre a cero en la consulta.</li>
<li><b>Additional RRs</b> (2 bytes): Número de entradas que aparecen en la sección adicional, siempre a cero en la consulta.</li>
<li><b>Queries</b><br />
Este campo especifica las consultas a realizar.<br />
En este caso es de 15 bytes</li>
<li><b>Name</b> (11 bytes): Nombre del dominio a consultar para obtener los servidores de correo saliente para enviar el mensaje</li>
<li><b>Type</b> (2 bytes): Tipo de consulta a realizar. En este caso es 0x000f para especificar que es tipo MX.</li>
<li><b>Class</b> (2 bytes): El tipo de consulta pertenece a internet, la más usada.</li>
</ul><br />
A excepción del campo <b>Queries</b>, la cabecera de la consulta DNS tiene siempre una constante de <b>12 bytes</b>.<br />
Vamos a ver al detalle el campo <b>Name </b>que contiene el dominio a consultar ya que resulta un tanto interesante en la forma en la que lo hace.<br />
<br />
<table border="1"><tbody>
<tr> <td>1</td> <td>2</td> <td>3</td> <td>4</td> <td>5</td> <td>6</td> <td>7</td> <td>8</td> <td>9</td> <td>10</td> <td>11</td> </tr>
<tr> <td>05</td> <td>g</td> <td>m</td> <td>a</td> <td>i</td> <td>l</td> <td>03</td> <td>c</td> <td>o</td> <td>m</td> <td>00</td> </tr>
</tbody></table><br />
El dominio es<b> gmail.com</b>, y como vemos en la anterior tabla, los puntos '<b>.</b>' los sustituye por un campo numérico que indica la longitud del siguiente campo. El final de la cadena siempre acaba en cero.<br />
<br />
Parece fácil, no?<br />
<br />
En el siguiente capítulo veremos la respuesta que nos devuelve el servidor DNS y veremos también la compresión de los mensajes que es utilizada para ahorrar tamaño en el paquete y por consiguiente demorar lo menos posible para obtener un respuesta rápida.Adrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-24712372828718065872009-11-29T15:08:00.003+01:002011-08-14T13:07:47.571+02:00Cómo emitir imágenes con la webcam en tu página web con PHPEl procedimiento que voy a explicar va a consistir en la captura de imágenes de la webcam cada X segundos y la posterior subida de la imagen a un servidor mediante FTP.<br />
<br />
La receta:<br />
<ul><li>Yawcam (software para captura imágenes de la web cam)</li>
<li>Máquina virtual de java (para Yawcam, ya que está desarrollado en Java)</li>
<li>Servidor FTP.</li>
<li>Y por supuesto, PHP ;)</li>
</ul><br />
Una vez te hayas hecho con todo, hay que configurar en Yawcam el intervalo de las capturas cada 5 segundos (a tu gusto) y el acceso al FTP.<br />
<br />
Si ha detectado correctamente tu webcam, accede a<strong> Configuración->Editar configuración->Salida->FTP<br />
</strong><br />
<ul><li>Tipo de archivo: JPG</li>
<li>Calidad: 30% (no pongas un valor muy alto para que el tamaño de la imagen no sea excesivo</li>
<li>Servidor FTP: mihosting.com</li>
<li>Puerto: normalmente 21</li>
<li>Usuario: miusuario</li>
<li>Contraseña: micontraseña</li>
<li>Directorio: /www/webcam (directorio absoluto)</li>
<li>Nombre de archivo: webcam.jpg (el archivo se sube cada 5 segundos y sobreescribe el actual, si actualizamos la página que muestra el archivo de captura cada 5 segundos, obtenemos una secuencia casi real por streaming)</li>
<li>Intervalo: 5 segundos (a tu gusto)</li>
</ul><br />
Bien, ya tenemos configurado el programa. Para activarlo, en el panel de control, <strong>FTP->Activar</strong><br />
Haz la prueba para ver si sube el archivo al servidor y se actualiza cada 5 segundos debidamente.<br />
<br />
Ahora procederemos a crear el script PHP que se encargará de leer el archivo webcam.jpg y mostrarlo.<br />
<br />
Aconsejo crear un archivo .htaccess en el directorio de las imagenes tomadas de la webcam sin permisos de lectura desde los clientes que intentan acceder al recurso donde se aloja el archivo webcam.jpg:<br />
<br />
<strong>.htaccess</strong><br />
<br />
<pre name="code" class="c">Order Deny,Allow
Deny from all
Options None
AllowOverride None</pre><br />
El siguiente script PHP va a leer el archivo webcam.jpg y lo va a devolver para insertarlo en una etiqueta img de html.<br />
<br />
<strong>webcam.php</strong><br />
<br />
<pre name="code" class="php">/**
* Aquí puedes incluir código para verificar si el cliente que está accediendo
* al recurso puede leer el archivo webcam.jpg o no
*/
$webcam = "webcam/webcam.jpg";
header("Content-Type: image/jpeg");
header("Content-Length: ".filesize($webcam));
readfile($webcam);</pre><br />
Ahora necesitamos el código html necesario para mostrar la imagen y que se actualice cada 5 segundos<br />
<br />
<strong>webcam.html</strong><br />
<br />
<pre name="code" class="html"><html> <head> <title>Probando webcam</title> <!-- Le decimos al navegador que no almacene esta página en la caché --> <meta http-equiv="Pragma" content="no-cache" /> <!-- No tiene fecha de expiración --> <meta http-equiv="expires" content="-1" /> <!-- El navegador se refresca cada 5 segundos realizando peticiones una y otra vez a esta misma página para mostrar la imagen actualizada --> <meta http-equiv="refresh" content="5" /> </head> <body> <img src="webcam.php" title="Sesión WebCam en directo" alt="Sesión WebCam en directo"/> </body> </html>
</pre><br />
Y ya esta, es en esencia lo que necesitamos para poder emitir imágenes en semi-directo con nuestra webcam y verlas a través de nuestra página web.<br />
Se puede elaborar de mejor forma dando acceso a usuarios registrados por ejemplo, para ello recurririamos a las variables de sesión para identificar si el usuario que solicita ver la webcam está logueado o no, pero bueno, eso os lo dejo a vosotros.<br />
<br />
Espero os sea de utilidad.Adrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.com2tag:blogger.com,1999:blog-4090790898945399908.post-4132352252503282552009-11-29T14:51:00.003+01:002014-03-30T23:56:29.385+02:00Inyectar código directamente en la memoria de otro proceso con CA continuación expongo el código fuente para cómo inyectar código directamente en la memoria de otro proceso remoto con C, se ha compilado con GNU GCC Compiler en el entorno Code::Blocks 8.02.<br />
<br />
Me he tomado la molestia de comentar todo el código para que lo podáis perfeccionar, depurar, cambiar, etc, todo el procedimiento de inyección.<br />
<br />
<strong>api.h</strong><br />
<script src="http://pastebin.com/embed_js.php?i=EQNpPK7D"></script>
<br />
<strong>funcionInyectar.h</strong><br />
<script src="http://pastebin.com/embed_js.php?i=vC7GF5Hw"></script>
<br />
<strong>funcionInyectar.c</strong><br />
<br />
<script src="http://pastebin.com/embed_js.php?i=13GnQGKt"></script>
<br />
<strong>main.c</strong><br />
<br />
<script src="http://pastebin.com/embed_js.php?i=FxCp1q0H"></script>
<br />
Espero os sea de utilidad.Adrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.com1tag:blogger.com,1999:blog-4090790898945399908.post-54159900480800373762009-11-29T00:03:00.000+01:002011-08-13T12:43:36.457+02:00Depurando pantallazos azulesEn primer lugar, debemos de modificar el archivo <strong>boot.ini</strong> que se encuentra en la unidad raiz.<br/><br/>Los modificadores son parámetros para alterar la forma en la que inicia windows, a continuación muestro los que nos van a ser de utilidad<br/><ul><br/> <li><strong>/bootlog</strong>, crea un archivo de registro donde se almacena la secuencia de arranque de windows. El archivo se guarda en el directorio raiz de la instalación de windows y se llama <strong>ntbtlog.txt</strong>.</li><br/> <li><strong>/sos</strong>, nos muetra un listado de los drivers que va cargando en el arranque.</li><br/></ul><br/>De tal forma que, nuestro boot.ini, quedará una cosa más o menos parecida a esta:<br/><br/><em>multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect <strong>/bootlog /sos </strong></em><br/><br/>(No copies lo anterior, es orientativo, tu sistema puede que no coincida con el anterior)<br/><br/>Otra forma de depurar pantallazos algo más engorrosa pero puede que más efectiva, es la que describo a continuación.<br/><br/>Este procedimiento es válido para analizar los archivos de volcado que windows genera al ocurrir una expceción grave en el sistema, que suelen encontrarse en <strong>%SystemRoot%\MEMORY.DMP</strong><br/><br/>En primer lugar necesitamos el depurador de windows <strong>WinDbg</strong> y los símbolos de depuración para windows xp para que pueda determinar de que librería y función se trata cuando ocurre tal excepción.<br/><br/>Una vez nos hayamos hecho con el archivo de volcado:<br/><ul><br/> <li>Abrimos WinDbg</li><br/> <li>Cargamos volcado: "File -> Open Crash Dump"</li><br/> <li>Especificamos el siguiente comando para que analice el archivo: <strong>!analyze -v</strong></li><br/></ul><br/>Nos arroja al detalle información de la excepción ocurrida, y es ahí donde debemos determinar que función y en que librería, driver, etc, se produce el error. Para ello basta con deshabilitar/desinstalar el componete que ocasiona el error y toca probar de nuevo.<br/><br/>Espero os sea de utilidad.Adrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.com0tag:blogger.com,1999:blog-4090790898945399908.post-29851548757925564872009-11-28T22:59:00.000+01:002011-08-13T12:43:36.457+02:00Descartando problemas de hardware/software comunesPues bien, estos problemas pueden ser debidos a:<br/><ol><br/> <li>Memoria RAM defectuosa.</li><br/> <li>Drivers incompatibles o inadecuados.</li><br/> <li>Programa del sistema básico de entradas y salidas erróneamente configurado, oséase, BIOS :P</li><br/> <li>Sobrecalentamiento del microprocesador o algún componente hardware.</li><br/> <li>Hardware defectuoso.</li><br/> <li>Software que realiza operaciones no permitidas o que llegan a desastibilizar el sistema.</li><br/> <li>Etc.</li><br/></ol><br/>Ahora se nombrarán algunas posibles soluciones a los problemas anteriormente citados:<br/><ol><br/> <li>Realiza un chequeo de tus memorias RAM y asegurate de todas las direcciones se lean/escriban correctamente. Para ello, te recomiendo <a title="http://www.memtest86.com/" href="http://www.memtest86.com/" target="_blank">memtest86</a>, es un programa gratuito diseñado para microprocesadores x86 que realiza un examen exhaustivo de todas las memorias RAM instaladas en el equipo.</li><br/> <li>Desinstala cualquier driver nuevo que hayas instalado. Hazlo bajo modo prueba de errores.</li><br/> <li>Restaura la configuración de la BIOS a su configuración original.</li><br/> <li>Observa la temperatura y voltajes del microprocesador y cercionate que son los valores adecuados. Comprueba que la fuente de alimentación está suministrando la energía necesaria al ordenador en sí. Realiza una limpieza interna e incluso ordena los cables para una correcta ventilación.</li><br/> <li>Si notas que algún componente falla en relación con alguna operación que realizas, desconéctalo.</li><br/> <li>Lo mismo que el paso anterior pero en relación con el software.</li><br/> <li>Si ya has hecho de todo y te has cercionado de que ningún componente está defectuoso, la única solución pasa por reinstalar tu sistema operativo o incluso algo mejor, <strong>formatear</strong> ^^. No obstante, puedes probar un comando que me ha sacado en más de una ocasión de un apuro, <strong>sfc /scannow</strong>, comprueba que los archivos legítimos de windows siguen intactos y en sus versiones originales, para ello debes de insertar el cd de windows y posteriormente ejecutar el comando. Por probar que no quede!</li><br/></ol><br/>Bueno, espero que te haya sido de utilidad, en el siguiente capítulo expondré como depurar los pantallazos azules de windows xp y poder orientarnos al error.Adrián Ruiz Bermudohttp://www.blogger.com/profile/12898592363049720325noreply@blogger.com0