SniperlCat, un guardian de red
Hoy traigo un script en perl que vigila la red en busca de nuevos hosts o de ataques de ARP spoofing (buscando cambios en la tabla arp). El nombre, Sniperlcat es (obviamente) una mezcla entre snipercat y perl, lenguaje en el que esta programado. El script se puede descargar aquí [sniperlcat.pl]
Simplemente hay que ejecutarlo y avisa de los cambios usando el libnotify de GTK2 (puede que sea necesario instalar las librerias Gtk para perl, libdesktop- notify-perl, o libgtk2-notify-perl ). Por ejemplo, para un nuevo host en la red:
Si el nuevo host está spoofeado desde otro (si coinciden sus MAC):
Si cambia una MAC:
O si cambia la MAC de uno a través de un ARP spoof:
Hay que tener en cuenta algunas cosas:
* El script no hace nada para evitar los ataques ARP spoof, solo los
detecta
* Si no se lanza con una configuración, utilizará como tal la tabla ARP
en ese momento, si hay entonces un ARP spoof en marcha, lo tomará como
el estado base.
*
Los parámetros aceptados son:
===============================================================================
./sniperlcat [-h]|[-d | -v ] [-nf] [-c] [-n
-h (--help): Muestra este mensaje
-d (--daemonize): Se ejecuta de fondo
-nf (--no-fill): No llena la tabla de hosts (con nmap) antes de leerla
-c (--cansino): Repite los avisos, aun los ya emitidos, en cada iteración
-v (--verbose): Muestra más información por pantalla
-n (--network): Especifica la red donde se ejecuta, por defecto 192.168.1.0/24
-f (--file): Especifica el archivo de red inicial (se obtiene con arp -an)
-s (--sleep): Especifica el tiempo en segundos de "descanso" entre iteraciones (por defeto 60)
===============================================================================
Creo que solo necesitan explicación un par de cosas:
* Antes de leer la tabla ARP, para llenarla con todos los host de la red se
hace un nmap $red -sP
, si consideras que no es necesario, usa -nf
* Si la red es distinta de 192.168.1.0/24 (o 192.168.1.*), la puedes
cambiar con -n red, como solo lo usa nmap, la sintaxis es la misma que
este.
*
Hasta otra.
El script [sniperlcat.pl]
Detectando DNS y ARP spoofing
Pues eso, hoy, unas formas de detectar el spoofing de DNS (falseamiento de un nombre de dominio) y de ARP (que puede servir para suplantar una IP).
DNS
La forma de detectar un DNS spoofing es bastante simple, pero sigue siendo bastante efectiva para entornos de red local, el script es este o descargado aquí [dns.sh]:
!/usr/bin/env bash
if [ "$2" == "" ]
then
echo "$0
exit 1
fi
echo -n "Velocidad: ";((time ping -c 1 "$2" >> /dev/null) 2>> /dev/stdout )|head -n 2|tail -n 1|cut -f2
echo -n "DNS: ";((time nslookup "$1" "$2" >> /dev/null) 2>> /dev/stdout )|head -n 2|tail -n 1|cut -f2
( ./script
La idea es que compara el tiempo que se tarda en hacer un ping a un servidor DNS y el tiempo que tarda el mismo servidor en resolver una dirección, obviamente un servidor que no esta en la red local (como estaría el supuesto intruso), tardaría mas que el intruso, en la red local.
Por ejemplo, suponiendo que los resultados normales (sin spoofing) fueran estos:
===============================================================================
Velocidad: 0m0.068s DNS: 0m0.075s
Velocidad: 0m0.061s DNS: 0m0.066s
Velocidad: 0m0.060s DNS: 0m0.067s
Velocidad: 0m0.061s DNS: 0m0.070s
Velocidad: 0m0.060s DNS: 0m0.066s
===============================================================================
Los valores con un DNS spoofing podrian ser:
===============================================================================
Velocidad: 0m0.060s DNS: 0m0.015s
Velocidad: 0m0.065s DNS: 0m0.014s
Velocidad: 0m0.061s DNS: 0m0.014s
Velocidad: 0m0.066s DNS: 0m0.014s
Velocidad: 0m0.061s DNS: 0m0.014s
===============================================================================
La diferencia es obvia, el tiempo para resolver sin spoofing es ligeramente mayor que el tiempo de ping, mientras que el tiempo para resolver con spoofing es menos de la mitad del tiempo de ping.
ARP
La forma de detectar un ARP spoofing tambien es bastante simple, si al comprobar la tabla ARP hay MAC's repetidas, significa que (alguna de las repetidas) está spoofeada. Quizá sea necesario llenar la tabla con los host de la red para poder comprobar las MAC de todo la red, se puede hacer simplemente con:
===============================================================================
nmap 192.168.0.* -sP
===============================================================================
(El 192.168.0.* habría que cambiarlo por el adecuado para la red) El script es (o aquí [arp.sh]):
!/usr/bin/env bash
mip=""
t=0
for a in $(arp -a|sed -e "s/ /_/g" ); do
ip=echo $a|cut "-d_" -f2|cut -d\( -f2|cut -
d\) -f1
mac=echo $a|cut "-d_" -f4
if [ ${mac,0,1}"" != "<" ]
then
# echo "IP: $ip MAC: $mac"
t=$(($t + 1))
i=0
lip=""
for tmp in $mip ; do
if
[ echo $tmp|cut -d_ -f2
== "$mac" ]
then
echo
"MAC duplicada $ip - "echo $tmp|cut -d_ -f1
" [$mac]"
fi
done
mip="$mip $ip"_"$mac"
fi
done
Simplemente comprueba las MAC duplicadas, y avisa de ello, no requiere interpretación por parte del administrador como el script de DNS (no hay que ver que indican los datos, hay spoof o no).
Y eso es todo, hasta otra.
Buscador de series/peliculas
Antes de nada decir que como los exámenes se acercan y blablabla... el ritmo de posteo descenderá (aún más) y habrá que tirar de cosas improvisadas o que ya hay por el disco duro, avisados estáis ;)
Pues hoy traigo unos script's que buscan los enlaces para descargar/ver series
o peliculas, a partir de 3 páginas:
* SeriesYonkis
* PeliculasYonkis
*
* Cineraculo
*
Sin más dilación, los scripts: [downscripts.zip] (usan una versión aun en desarrollo de PyWC, incluída en el zip).
El motivo de usar PyWC en vez de los parsers de python es que el minidom se rompe con caracteres no ASCII, como una simple ñ, y SGMLlib y HTMLlib ya ni las probé porque se consideran obsoletas y no se portarán a python 3. Hay 3 scripts: sydown.py pydown.py y cinefind.py (lo primero que vino a la cabeza)
sydownmuestra los enlaces (válidos) a megaupload de los capítulos de una serie:
Se puede lanzar como en la imágen, entonces el primer parámetro es el nombre
de la serie (lo que se evaluará es si coincide con el principio del nombre de
otra serie, da igual las mayúsculas o minúsculas), y el segundo parámetro es
el número de idioma, van así (por ninguna razón concreta):
0) Castellano
1) Latino
2) Subtitulado
3) Inglés
O lanzarlo sin opciones, manejandolo por menús.
pydown, es exactamente igual, pero para películasyonkis, mismos parámetros y todo, con la diferencia de que lo que se evaluará es si lo de pidio el usuario está en el título, aunque sea en el medio, porque suelen tener el año antes:
Nota: el -v hace que el script muestre información de como vá (número de páginas ya comprobadas, por ahora como máximo unas 170) por stderr, así que se puede redireccionar la salida tranquilamente
Por último, cinefind busca los enlaces a megavideo y cineráculo de una
película (enlaces que se sacan de cineráculo), como parámetro se usa el
nombre de cada pelicula (puede buscarse más de una a la vez), y la
información que se quiere que muestre con "-f
Nota: cuando muestra las películas comprobadas hay que tener en cuenta de que van de 20 en 20 (ahora mismo hay casi 20.000 en total), no lee 20 páginas a la vez (aunque una vez localizada una, la búsqueda del enlace de megavideo va en otro hilo). Esta información sigue saliendo por stderr, así que se puede redireccionar perfectamente.
Hasta otra.
Script para grabar CD's y guardar la imágen ISO
Hoy presento un pequeño script que permite extraer una imágen ISO de un CD, o grabar una fácilmente. El script se puede descargar aquí [bashBurn.sh], funciona usando Zenity para la GUI, wodim para grabar y dd para recuperar las ISO. Disclaimer: el script no es demasiado fiable para grabar cosas, wodim falla si el nombre está entre " (¿?), de todas formas, si el nombre del archivo es erroneo, no se grabará... En resumen, que no debería haber ningún problema si el nombre del archivo (y el path) no tiene ningún espacio :) . Antes de empezar: puede que requiera permisos de root, si no lo lanzas con "sudo" o "gksudo", lo pedirá en el terminal del script (no en las ventanas). En las líneas 10-14 hay unos parámetros que puede ser interesante modificar: - cdpath : El "dispositivo" del CD (este no debería cambiar) - cdtrue : El dispositivo SCSI del CD, se puede conseguir la lista con "sudo wodim --scanbus" - splitsize : Tamaño máximo de un CD en bytes (no debería cambiar) - CDburnspeed : Velocidad de grabado de un CD (por defecto 48x) - DVDburnspeed: Lo mismo, para DVD (por defecto 2x) Primero pregunta la acción a realizar (no le hagas caso a los iconos de los botones :P ): Después el archivo para grabar/guardar la ISO: Se pide una última confirmación: Se muestra una progressbar mientras el script actúa, y despues se muestra una ventana final: Y ya está :)
Listas de palabras de Wikitionary
Como experimento y para probar la nueva versión de Pywc, nació (más bien se escribió) un script que usa Wikitionary (el diccionario de la Wikipedia) para extraer listas de palabras.
La sintaxis es:
===============================================================================
./wikiwords.py [-help] [-min
La lista de palabras "inútiles" de ejemplo es:
=============================================================================== cual cuales de el la los las o y que se en un una ===============================================================================
El script se puede descargar aquí [wikiwords.zip] (con la lista de palabras) y con Pywc [wikiwords_03.zip]. Y el código coloreado con pygments...
===============================================================================
!/usr/bin/env python
-- coding: utf-8 --
""" Escrito por kenkeiras [CodigoParaLlevar.blogspot.com]
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. """
import pywc, string, sys
argc = len(sys.argv)
def show_help():
print "./wikiwords.py [-help] [-min
print "-help: muestra esto"
print "-min: las palabras de salida serán como mínimo de
print "-lang: se usara el wiki en
print "-nullwd: la lista de palabras \"inútiles\" (artículos) está en
Caracteres que componen las palabras
Characters that compose words
global textchars textchars = u"abcdefghijklmnñopqrstuvwxyzABCDEEFGHIJKLMNÑOPQRSTUVWXYZááíóúÁÉÍÓÚ"
Si es una simple palabra
If is a plain word
def isClean(s):
global textchars try: for c in unicode(s):
if (not c in textchars): return False
except Exception as ex: return False return True
Valores por defecto
By default values
minchars = 0 # Caracteres mínimos maxchars = 100 # Caracteres máximos
numpags = 100 # Páginas que se recorrerán inicial="meta" # Palabra inicial lang = "es" # Lenguaje
nullwords = "nullwd" # Useless word list
Reading command line options
Leyendo las opciónes de linea de comandos
i = 1
while ( i < argc ): if ( sys.argv[i] == "-min" ): # Opción: -min
i += 1 minchars = int (sys.argv[i])
elif ( sys.argv[i] == "-max" ):# Opción: -max
i += 1 maxchars = int (sys.argv[i])
elif ( sys.argv[i] == "-lang" ):# Opción: -lang
i += 1 lang = sys.argv[i]
elif ( sys.argv[i] == "-numpags" ):# Opción: -numpags
i += 1 numpags = int (sys.argv[i])
elif ( sys.argv[i] == "-inicial" ):# Opción: -inicial
i += 1 inicial = sys.argv[i]
elif ( sys.argv[i] == "-nullwd" ):# Opción: -nullwd
i += 1 nullwords = sys.argv[i]
elif ( sys.argv[i] == "-help" ):# Opción: -help
show_help() sys.exit(0)
i += 1
Caracteres que separan palabras
Characters that split words
splitchars = ",.-/+|:!?\"'\&\n"
new = ["http://"+lang+".wiktionary.org/wiki/"+inicial] # próximas Url's
wordlist = ['wikitionary'] # Lista de palabras que ya salieron
Add null characters to the list
Se añaden los caracteres nulos a la lista
if (nullwords.lower() != "off"):
try: f = open(nullwords,"r") line = f.readline()
while ( len (line) > 0 ): line = line.replace("\n","").replace("\r","").strip()
if (len (line) > 0) and (not line in wordlist):
wordlist.append(line) line = f.readline()
f.close() except Exception as ex:
print >> sys.stderr, "Error al leer archivo de palabras nulas:",ex
crawler = pywc.crawler() # Se inicia el crawler
Comienza la acción...
while ( len(new) > 0 ) and (numpags > 0):
site = crawler.crawlsite( new.pop(0) ) # Se lee la página
inPost = False numpags -= 1
for el in site.element_list: # Para todos los elementos de una página
if (el.tag_type == "div"): try:
if ("id" in el.property) and \ ( el.property['id'] == "bodyContent" ): # Si es el inicio
inPost = True # del artículo...
elif ( el.property['class'] == "printfooter" ): # Si es el
break # final... except: pass
if (inPost) and (not el.tag): # Si es parte del artículo
el.text = el.text.lower() tmp = el.text.strip()
for schar in splitchars: # Se separan las palabras tmp = tmp.split(schar)
tmp = string.join(tmp," ")
for word in tmp.split(" "): # Se comprueba cada palabra
# por separado
# Se comprueba que sean palabras normales, que no excedan # los límites y que no están repetidas if (isClean(word)): lonx = len(word)
if ( lonx > 0 ) and ( lonx >= minchars ) and \ ( lonx <= maxchars ):
if (not word in wordlist): wordlist.append(word)
print word new.append("http://"+lang+".wikipedia.org/wiki/"+\ word) ===============================================================================
Pywc 0.3 (antes PyCrawler)
El cambio de nombre viene porque con una búsqueda en Google por "PyCrawler" se encuentran choporrocientos scripts, asi que para evitar confusiones... Python Web Client -> Pywc
Por lo demás, los añadidos son pocos, un poco de DOM con las funciones website.getElementById(element_id), website.getElementsByName(name) y website.getElementsByTagName(tag), y un nuevo atributo de los website, website.title, todo esto se usaría igual que desde JavaScript (que es la idea).
Además hay algunas correcciones, como los elementos que no sean tags (element.tag == False) tienen un atributo element.text que guarda (obviamente) el propio texto. Si se llama a crawlsite con el segundo parámetro (save_raw) a True, se guarda una copia del site original en el atributo web.raw. Por último, se arregló un problema con las URL.
Aquí el ZIP con esto: [pywc_03.zip] El crawler actualizado: [fastcrawler_03.py] Y el descargador de lista de proxies actualizado: [proxylist_03.py]
SSH: Conexiones seguras para tod@s
Seguramente muchos conozcais telnet, una forma de conseguir una consola de
comandos en un ordenador remoto, igualmente muchos sabreis que es inseguro por
que va "en plano" por la red (un ordenador cualquiera de la red podria ver lo
que pasa en el pc remoto, secuestrar la sesion o incluso capturar las
contraseñas), por eso desde hace unos años (desde el 99) se utiliza SSH
(secure shell), que utiliza conexiones seguras, peroo... sabiais que ademas de
utilizarlo como una consola de comandos se puede utilizar para:
* Transferencias de archivos al estilo FTP
* Copia de archivos en red
*
* Cifrar casi cualquier tipo de conexion (todo lo que se pueda a traves de
SOCKS: web, correo, mensajeria instantanea,... )
*
- Acceder a sistemas de archivos remotos como si fuesen locales (SSHFS)
- VPN (aunque mientras se escribe esto solo es posible con el cliente y el
servidor de OpenSSH)
*
Y todo esto sin dejar de lado la seguridad...
Nota:Para las pruebas se utilizo un servidor OpenSSH_5.3p1 y un cliente OpenSSH, el servidor puede necesitar alguna configuracion, pero la mayoria de las veces las distros/flavours ya lo traen listo para usar, ademas algunas cosas solo se pueden hacer con este servidor en concreto (OpenSSH)
Empezando por lo básico:
Para abrir una consola de comandos en el servidor se utilizara el siguiente
comando:
ssh [
La parte de
solo es necesaria si se va a usar un usuario distinto al de la maquina local, y
-p
se usa para acceder por un puerto no estandar (que es el 22).
Este es un ejemplo posible:
Desde el pc 'vBox' el usuario 'kenkeiras' hace ssh al servidor 'sleepless' ssh sleepless
Aquí en vez de haber utilizado el nombre del servidor se puede utilizar su IP... si es la primera vez que se conecta a este servidor se pedira al usuario que confirme que el fingerprint de la clave del servidor coincida con la real (para evitar que se produzca un ataque Man-in-the-middle, por ejemplo)
Y despues la ejecucion seguiria como antes, pide la contraseña y abre la sesion del usuario.
Este comando ssh sleepless
Es el mismo que ssh $USERNAME@sleepless -p 22
Ya que se presupone que el usuario va a ser el mismo en el servidor que en el pc local y que el puerto va a ser el estandar (el 22).
Manejando archivos:
Transferencia de archivos por SFTP (Secure File Transfer Protocol, Protocolo Seguro de Transferencia de Archivos) :
El uso de sftp es bastante sencillo, el comando de inicio es como el de ssh:
sftp [
La unica diferencia es que para especificar un puerto diferente (el estandar sigue siendo 22, todo funciona a traves de ssh) se utiliza -oPort, en vez de -p
Se utliza como un cliente ftp normal, pero siempre se usa binary para las transferencias (para los que no lo entiendan, esto ultimo da igual)
Por ejemplo:
Los comandos basicos son:
cd
Cambia al directorio especificado
-
put
[ ] Envía un archivo 'archivo local' al servidor (si no se especifica el
'archivo remoto' se utilizara como nombre el de 'archivo local')
get[ ] Envía del servidor el 'archivo remoto' al pc local (si no se especifica
el 'archivo local' se utiliza como nombre el de 'archivo remoto')
mkdirCrea un directorio en el servidor
ls [] Muestra los contenidos del directorio actual (o si se especifica una
ruta, de esa)
rmElimina el archivo 'archivo'
rmdirElimina el directorio 'directorio'
exitSalir
!Volver a la consola del pc local (cuando se salga de la consola se
volvera a el SFTP)
*
SCP (Secure Copy, Copia Segura):
El comando básico de scp es el siguiente
scp [[
Es decir, el comando es scp y en cada opcion se utiliza la siguiente notacion
para definir un archivo:
[[
Si el archivo esta (o se va a copiar) a otro pc, se escribe
Si el archivo es local, solo el nombre del archivo, y si el archivo esta en
otro pc, pero se accede a traves de otro usuario,
El primer archivo es el que se va a copiar y los demas es a donde se va a copiar, por ejemplo:
Aquí se copia un archivo ('example') del servidor 'sleepless', a el archivo local 'example'. Las opciones son parecidas a la del programa cp de unix, por ejemplo permite copiar directiorios enteros:
Cifrando conexiones:
Si conoces el protocolo SOCKS sabras que sirve para hacer servidores proxy y clientes para cualquier protocolo que funcione sobre TCP/IP (con SOCKS5 tambien sobre UDP/IP, pero en este caso concreto no), ssh permite utilizarlo para cifrar conexiones entre el cliente y el servidor, para proteger los datos en la red que hay entre los dos (y que puede ser insegura), la idea es algo asi:
[Cliente SSH] ~~~~~> [Servidor SSH] --------------> [Destino]
Red
insegura
Red segura
(Cifrado)
(sin cifrar)
Esto sirve por ejemplo para un portatil que esta conectado a una wifi y que
tiene (ya dentro de la red con cable, protegida, ...) un servidor SSH, se
tunelan los paquetes hasta el servidor (a la aplicacion lo trata como un simple
proxy SOCKS), donde ya no es posible un ataque tan sencillo como usar un
sniffer en una red WEP.
Para hacer esto usaremos
ssh -D [
Como se puede ver es igual que un comando ssh con la diferencia de que se
añade
-D [
La opción -D significa que el tunelado sera dinamico (hay otras opciones que usan tunelado estatico, siempre al mismo pc y en el mismo puerto), sobre SOCKS. La ip del enlace es opcional y sirve para concretar que interfaz de red se va a utilizar para la conexion, si no se especifica (o se usa un '*') cualquier pc en la red podra utilizar el tunel (esto puede ser util o no, dependiendo de las circunstancias), si no hay motivos para dejarlo abierto recomendaria utilizar 'localhost' (o '127.0.0.1') para permitir solo las conexiones locales. Y puerto de enlace es el puerto que se proporcionara a los programas para que se conecten al tunel
Por ejemplo: ssh -D localhost:1234 sleepless
Abrira una conexion SSH con 'sleepless' y un tunel SSH que se puede acceder por 'localhost' y por el puerto '1234' (normalmente solo el superusuario tiene permiso para abrir puertos con un numero menor que 1024)
Y esto es todo por ahora... (proximamente el SSHFS y las VPN)
[Referencias] http://www.openssh.org/ http://www.lucianobello.com.ar/openssh/ http://tuxpepino.wordpress.com/2007/05/11/ssh-el-dios-de-la-administracion- remota/
Hasta otra.
Una ronda de bash ( y II )
[La_primera_parte] (La división va porque se hace incómodo editar el HTML para meter los spoilers con posts largos... si, lo se, soy un vago)
Nota: por alguna razón no se muestran los spoilers si se ven desde la portada, entrad en el post y debería ir.
Los siguientes códigos usan /proc/acpi/ para mostrar la temperatura y Zenity o KDialog para mostrarlo por una GUI
El primero es la base, muestra simplemente las temperaturas por pantalla [temp.sh]:
=============================================================================== ./temp.sh [-c] =============================================================================== El -c para que también se muestre el símbolo de la medida (¿grados?) [Unknown INPUT type] ===============================================================================
!/bin/bash
Escrito por kenkeiras
back=$PWD cd /proc/acpi/thermal_zone/ if [ "$1" = "-c" ]; then lonx=4 else lonx=3 fi
for i in *; do
e=cat $i/temperature
e=${e:expr length "$e"
-4:$lonx}
echo "$i: $e"
done
cd $back
Este es con Zenity, es decir, con Gtk [ztemp.sh]
=============================================================================== ./ztemp.sh ===============================================================================
[Unknown INPUT type]
!/bin/bash
Escrito por kenkeiras
back=$PWD
cd /proc/acpi/thermal_zone/
tmpList=""
for i in *; do
e=cat $i/temperature
e=${e:expr length "$e"
-4:3}
tmpList="$tmpList $i $e"
done
cd $back
zenity --list --text "" --title "ZenTemp" \
--column "Dispositivo" --column "Temperatura" $tmpList
===============================================================================
[http://1.bp.blogspot.com/_26RJWnubh-w/TFBAMo-Sh7I/AAAAAAAAAOk/YVu_OftL41s/ s1600/Pantallazo-7.png]
Visto esto ya no parece tan dificil programar GUI's ^^
Y con KDialog (Qt/Kde) [ktemp.sh]:
=============================================================================== ./ktemp.sh ===============================================================================
[Unknown INPUT type]
!/bin/bash
Escrito por kenkeiras
back=$PWD
dump=kdetempdump
cd /proc/acpi/thermal_zone/
tmpVar=""
for i in *; do
e=cat $i/temperature
e=${e:expr length "$e"
-4:3}
tmpVar=$tmpVar"$i: $e\n"
done
cd $back
echo -en $tmpVar > $dump
kdialog --title "KdeTemp" --textbox $dump
rm -f $dump
===============================================================================
[http://2.bp.blogspot.com/_26RJWnubh-w/TFBBDfcCLTI/AAAAAAAAAOo/ZbF5Q3qZ5LY/ s1600/Pantallazo-9.png]
Y eso es todo, hasta otra
ps: De nuevo todo_bajo_la_WTFPL,_claro
Una ronda de bash ( I )
Hoy... scripts varios en bash.
Empezando por lo más simple, un cracker de MD5, simplemente lee el diccionario y va comparando las lineas con el hash objetivo [md5crack.sh]
===============================================================================
./md5crack.sh
[Unknown INPUT type]
!/usr/bin/env bash
Escrito por kenkeiras
function showuse {
echo "$0
if [ "$1" = "" ] then showuse fi
if [ "$2" = "" ] then showuse fi
i=0
for word in $(cat $1);do
test=echo -en "$word" |md5sum|cut -c1-32
if [ "$test" = "$2" ]
then
echo "-> $word"
i=$(($i + 1))
fi
done
echo "$i resultados"
===============================================================================
Siguiendo con pruebas_de_/dev/tcp, buscar las contraseñas por defecto usando la_web_del_cirt [get_pass_cirt.sh]:
===============================================================================
./get_pass_cirt.sh
!/usr/bin/env bash
Escrito por kenkeiras
if [ "$1" = "" ]; then echo "No has especificado un criterio de búsqueda" exit 1 else key=$1 fi
Se pide la web
exec 3<>/dev/tcp/cirt.net/80 echo -en "GET /passwords?criteria=$key\ HTTP/1.1\r\n" >&3 echo -en "HOST: cirt.net\r\n" >&3 echo -en "Connection: close\r\n\r\n" >&3 res=$(cat <&3) # Se leen los datos exec 3>&- # Se cierra la conexion
n=0 for i in $res do if [ $n -eq 1 ] # Se comprueba si ya muestra el usuario/contraseña then echo $i|cut -d> -f2|cut -d\< -f1 n=0 else if [ $n -ne 0 ] # Sino puede que venga pronto then n=$(($n - 1)) fi fi out=$(echo $i|grep -e User -e >Pass) if [ $? -eq 0 ] # Si es la parte del usuario/contraseña then out=$(echo $out|cut -d> -f3|cut -d\& -f1|cut -d\< -f1) if [ ! $out = "" ] then echo $out|grep Pass >> /dev/null if [ $? -eq 0 ] then n=2 else n=3 fi echo -n "$out:" fi else echo $i|grep -e "" >> /dev/null # Si se acabo el user/ pass if [ $? -eq 0 ] then echo "----------------------------" fi fi done ===============================================================================
O usando la web de phenoelit [get_pass_phenoelit-us.sh] este tarda un rato,
tiene que parsear 256 Kb's:
===============================================================================
./get_pass_phenoelit-us.sh
!/usr/bin/env bash
Escrito por kenkeiras
if [ "$1" = "" ]; then echo "No has especificado un criterio de búsqueda" exit 1 else key=$1 fi
Se pide la web
exec 3<>/dev/tcp/www.phenoelit-us.org/80 echo -en "GET /dpl/dpl.html HTTP/1.1\r\n" >&3 echo -en "HOST: www.phenoelit-us.org\r\n" >&3 echo -en "Connection: close\r\n\r\n" >&3 res=$(cat <&3) # Se leen los datosexec 3>&- # Se cierra la conexion res=$(echo $res|sed -e "s/\n//g" |sed -e "s/ /$/g" |sed -e "s/[<]/\n/g")
t=0 d=0 for i in $res do echo $i|grep "/tr" >> /dev/null if [ $? -eq 0 ] then if [ $t -ne 0 ] then echo "------------------" fi d=1 t=0 else echo $i|grep "" >> /dev/null if [ $? -eq 0 ] then d=0 fi if [ $d -ne 0 ] then d=$(($d + 1)) if [ $d = 3 ] then out=$(echo $i|cut -d> -f2|grep -i "$key") if [ $? -eq 0 ] then echo $out|sed -e "s/$/ /g" t=1 fi fi if [ $t -ne 0 ] then if [ $d = 11 ] then echo -n "User: " echo $i|cut -d> -f2|sed -e "s/$/ /g" else if [ $d = 13 ] then echo -n "Password: " echo $i|cut -d> -f2|sed -e "s/ $º/ /g" fi fi fi fi fi done ===============================================================================
Hasta ahora, la segunda parte por la tarde
ps:_Todo_bajo_la_WTFPL,_claro
Hablando en esotérico
Hoy traigo un script que programa en lenguajes esotéricos, concretamente en Brainfuck, Ook!, Whitespace y Zombie.
Lo único que hace es escribir un programa que muestre por pantalla lo que el usuario pida, su uso es:
===============================================================================
./esoprint.py [-h] [-l
El script se puede descargar [aquí] o al final coloreado
Dejando a parte de Brainfuck y Ook!, de_los_que_se_habló_antes, Whitespace es un lenguaje compuesto únicamente por espacios, tabuladores y saltos de línea, con un conjunto de instrucciones bastante completo [Whitespace_Tutorial] . Zombie está por estar, ni siquiera encontré un intérprete así que no puedo asegurar que funcione, simplemente parecía fácil de programar :).
Y eso es todo.
Tengo que dejar la manía de poner los comentarios en inglés :S ...
[Referencias] http://compsoc.dur.ac.uk/whitespace/ http://esoteric.voxelperfect.net/wiki/Main_Page
===============================================================================
!/usr/bin/env python
-- coding: utf-8 --
""" esoprint.py, encodes in esoteric language code
Supported languages: - Brainfuck - Ook! - Whitespace - Zombie # Blindly coded, not tested
Maybe future supported languages: - Tink - Piet - Befunge - False - Q-BAL # When I find a interpreter - Malbolge # Maybe too big... - Beatnik # Really ¿? - Unlambda
Not future supported languages: # It's not a logical thing to make a computer generate this! - Sheakspere - Haiku - Chef # Make's it boring - Whenever # Impossible - HQ9+ - BIT
Copyright (C) 2010 kenkeiras <kenkeiras@gmail.com>
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.
Usage:
./esoprint.py [-h] [-l
"""
Language dictionary elements for BrainFuck-like langs
init: program initalization
inc
dec
push
pop
show
# get [Actually unused]
def usage(): import sys
print sys.argv[0]+" [-h] [-l
brainfuck = { "init": "", "inc":"+", "dec":"-", "push":">", "pop":"<", "show":".", "get":",", #Unused "loop":"[", # Unused "endloop":"]" # Unused }
ook = { "init": "", "inc":"Ook. Ook. ", "dec":"Ook! Ook! ", "push":"Ook. Ook? ", "pop":"Ook? Ook. ", "show":"Ook! Ook. ", "get":"Ook. Ook! ", # Unused "loop":"Ook! Ook? ", # Unused "endloop":"Ook? Ook! " # Unused }
Encodes in a Zombie program
def zombie_encode(data):
z = "Dundun is a zombie\n" z += " summon\n" z += " task talk\n" for p in data.split("\n"): z += " say \""+str( p.replace("\"","\\"") )+"\"\n" z += " animate\n" z += "animate" return z
Encodes in a Whitespace program
def whitespace_encode(data): for c in data: w += " " # Push into the stack: [Space] [Space] w += " " # Element, always positive [Space] # Character to binary (needed) b = bin( ord( c ) ) w += b[ 2 : ].replace("0"," ").replace("1","\t") # Space: 0 || Tab: 1 w += "\n" # Element end: [LF] w += "\t\n " # Output stack top: [Tab][LF][Space][Space]
w += "\n\n\n" # Ending [LF][LF] return w
Encodes in a Brainf*ck-like language
def stack_encode(lang, data): s = lang['init'] n = 0 for c in data: i = ord( c ) while ( n > i ): s += lang['dec'] n -= 1
while ( n < i ): s += lang['inc'] n += 1
s += lang['show']
return s
bf_like = {"brainfuck":brainfuck,"ook":ook} langlist = {"whitespace":whitespace_encode,"zombie":zombie_encode} if name == "main":
import sys argc=len(sys.argv) lang="" data="" out = "" i=1 while (i < argc): if (sys.argv[i] == "-l") or (sys.argv[i] == "--language"): i += 1 lang = sys.argv[i]
elif (sys.argv[i] == "-o") or (sys.argv[i] == "--output"): i += 1 out = sys.argv[i]
elif (sys.argv[i] == "-h") or (sys.argv[i] == "--help"): usage() sys.exit(0)
elif (sys.argv[i] == "-n") or (sys.argv[i] == "--newline"): data += "\n"
else: data = (data+" "+sys.argv[i]).strip()
i+=1 if (lang == ""): lang = raw_input("Select language: ")
lang = lang.lower() if (lang not in langlist) and (lang not in bf_like):
print "Unknown language (lenguaje desconocido)" sys.exit(1)
if (data == ""): for line in sys.stdin: data += line
if (data == "\n"): print "Sin entrada, saliendo..."
sys.exit(0)
if (lang in langlist): result = langlistlang else: result = stack_encode(bf_like[lang],data)
if (out == ""): print result
else: f = open(out,"w") f.write(result) f.close() ===============================================================================