Saltar ó contido principal

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 ] [-f ] [-s ]

-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 ", el formato es muy básico, hay que añadirle una "t" para que muestre el título de la película, "m" para el enlace a megavideo, y "c" para el enlace a cineráculo (el orden no se tiene en cuenta), el formato por defecto es "tm".

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 ] [-max ] [-lang ] [- numpags ] [-incial ] [-nullwd ] -help: muestra esto -min: las palabras de salida serán como mínimo de letras -max: las palabras de salida serán como máximo de letras -lang: se usara el wiki en -numpags: se leeran páginas -inicial: la palabra inicial será -nullwd: la lista de palabras "inútiles" (artículos) está en o no existe (off) ===============================================================================

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 ] [-max ] [-lang ] [-numpags ] [-incial ] [-nullwd ]"

print "-help: muestra esto"     print "-min: las palabras de salida serán como mínimo de letras"     print "-max: las palabras de salida serán como máximo de letras"

print "-lang: se usara el wiki en "     print "-numpags: se leeran páginas"     print "-inicial: la palabra inicial será "

print "-nullwd: la lista de palabras \"inútiles\" (artículos) está en o no existe (off)"

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 [@] [-p ]

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 [@]servidor [-oPort=]

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')


    mkdir

    Crea un directorio en el servidor


    ls []

    Muestra los contenidos del directorio actual (o si se especifica una
    ruta, de esa)


    rm

    Elimina el archivo 'archivo'


    rmdir

    Elimina el directorio 'directorio'


    exit

    Salir


    !

    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 [:]   [@]< servidor> [- p ]

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 [-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 "     exit 1 }

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 =============================================================================== [Unknown INPUT type] ===============================================================================

!/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  =============================================================================== [Unknown INPUT type] ===============================================================================

!/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 ] [-o ] [ [ | -n [...] ] | -n] -h (--help): muestra esta "ayuda" -l (--language): Selecciona el lenguaje -o (--output) : Selecciona el archivo de salida (a stdout por defecto) El resto se toma como información, el -n (--newline) es considerado un salto de línea ===============================================================================

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 ] [-o ] [ [ | -n [...] ] | -n] -h (--help): prints this help -l (--language): Set's output language, currently supported: Ook!, Brainf*ck, Whitespace, Zombie -o (--output) : Set's output file (to stdout by default) Whatever else is considered as data, the -n (--newline) is considered a line jump

"""

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 ] [-o ] [ [ | -n [...] ] | -n] "     print "-h (--help): prints this help"     print "-l (--language): Set's output language"     print "-o (--output) : Set's output file (to stdout by default)"     print "Whatever else is considered as data, the -n (--newline) is considered a line jump"     print "If no data is entered, it will be received from STDIN"     print "Supported languages:"     print """   - Brainfuck    - Ook!    - Whitespace    - Zombie """

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() ===============================================================================