Mostrando entradas con la etiqueta bash. Mostrar todas las entradas
Mostrando entradas con la etiqueta bash. Mostrar todas las entradas

martes, 22 de marzo de 2011

Humo y espejos con el terminal y `cat`

Cross-posteado en el blog de HackXCrack

Si alguna vez se te ocurrió lanzar un cat a un archivo que no fuera de texto, como una imágen o un ejecutable hay ciertas posibilidades de que notaras que había pasado algo raro cuando el comando volvió, el terminal "pensó" que habías escrito algunos caracteres... es más, si pulsaste [enter] para pasar a una línea limpia pensando que solo es basura que dejó el archivo, el terminal había intentado ejecutar el comando!

Me atreveré a decir que lo que pasó fue que en algún momento el cat mostró el par de caracteres \x1b Z  ( \x1b es ESC ), mostrando algo como "62;9;c", hay más combinaciones que producen estos eventos pero esta, por ser la más corta, es la que tiene más probabilidades de darse por casualidad.

Todo esto viene porque el terminal emula un procolo antiguo, que acepta ciertas combinaciones de datos como caracteres de control (algo similar era en lo que se basaba el phreaking analógico :P ), aprovechando esto y esperando que el usuario también pulse instintivamente [enter] para pasar a una línea en blanco intentaremos que el usuario que lea un archivo ejecute un comando :), aunque la verdad sea dicha, estamos muy limitados.

Nota: aquí hablo del comando cat, pero pasa lo mismo con cualquiera que muestre algo directamente por pantalla, head, tail, un echo preparado o el programa que muestra un archivo que escribiste cuando aprendías.

Nota2: realmente todo esto tiene un motivo, pero si hay que profundizar en el protocolo el día de hoy se nos queda corto, si quieres hecharle un vistazo a sus entrañas revisa los links del final.

lunes, 14 de marzo de 2011

Como monitorear un terminal desde otro [tip]

En el terminal que se quiere monitorear

mkfifo tunel
script -q -f tunel


En el terminal donde se quiere mostrar ( se podría enviar a través de la red o lo que fuera )

cat tunel


Una ventaja (o un inconveniente) es que el que monitorea no puede hacer cambios en el terminal. Por otro lado, si se hace esto, el comando script no devuelve el control hasta que alguien se conecte.

ps: si solo quisieramos guardar las sesiones, sin monitorearlas, solo habría que hacer script -f <archivo de log>

A portarse bien ;)

lunes, 14 de febrero de 2011

Descargando el manual 'La guía definitiva de PNG' con bash

Pues eso, hoy va a ser algo corto, el "problema" es simple, tenemos estos ingredientes:
- Un manual sobre el formato PNG [ http://www.libpng.org/pub/png/book/toc.html ]
- Una conexión a Internet intermitente, así que no es una posibilidad leerlo online
- Pereza suficiente para no ponerse a descargarlo a mano
- Ganas de trastear con bash

Y la receta, comentadita [ vacuum.sh ] o coloreado:

lunes, 25 de octubre de 2010

Mostrar el voltaje actual de la batería en gambas

Con el tiempo el hardware deja de funcionar todo lo bien que deberia, esto se nota sobretodo (al menos eso creo) con los portátiles, que al parecer tienen una marcada tendencia a fallar en la batería y en el cargador, piezas que se supongo que resienten especialmente en un uso prolongado.

La última "manifestación" que vi de estos problemas es de vez en cuando la potencia de la corriente que viene del adaptador AC cae por debajo de cierto valor, lo que hace que poco a poco la batería se vaya descargando(¿?). Esto hace que haya que comprobar frecuentemente el voltaje de carga para poder tomar precauciones antes de que se quede sin energía, una forma fácil de hacerlo es con una sencilla línea de bash

viernes, 8 de octubre de 2010

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.

domingo, 3 de octubre de 2010

Script para limpiar archivos borrados del disco duro

Hoy presento un código que acaba con el problema de los archivos ya borrados pero que siguen rondando por el disco duro. No es gran cosa, y seguramente forme parte de muchas colecciones de scripts, pero sigue pudiendo ser útil.

Simplemente genera archivos nuevos con contenido aleatorio (de /dev/urandom, /dev/random se eternizaría) hasta llenar el espacio de la particion, y despues los borra.

viernes, 20 de agosto de 2010

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 <dirección a resolver> <servidor DNS a probar>"
        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 <dirección a resolver> <servidor DNS a probar> )

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.

jueves, 5 de agosto de 2010

Un wallpaper nuevo cada día (con CFDG)

Trasteando con CFDG, por decirlo así, el "padre" en 2D de Structure Synth, y tras comprobar que tiene la misma capacidad que su versión en 3D de generar gráficos aleatorios "interesantes", y que el fondo de pantalla ya lleva un buen tiempo siendo el mismo, ¿que mejor que hacer que este lo genere un programa, haciendo que sea nuevo cada vez? :D

La idea es bastante simple, hacer un script que llame a CFDG sobre un código hecho antes cada vez que se quiera (que el usuario se loguee o cada cierto tiempo aprovechando cron).

El script en sí es bastante sencillo, algo así lo haría perfectamente


 #!/usr/bin/env bash

wide=1280
high=800

cfdg back.cfdg -oback.png -w $wide -h $high &


Por supuesto, habría que cambiar wide por el ancho de la pantalla y high por su alto, para generar una imágen óptima.

El resto no es más dificil, hacer un archivo de CFDG, este por ejemplo genera espirales que parecen hechas con rotulador (¿?) , es grande para incluir más variaciones:

startshape init

rule init{
    dot { saturation 1}
}

// Dot made
rule dot 0.01 {
     SQUARE { }
     dot { s 0.995 rotate 1 x 1 hue -1  }
}

rule dot  {
     SQUARE { }
     dot { s 0.995 rotate -1 x 1 hue 1 }
}

rule dot 0.9 {
     SQUARE { }
     dot { s 1.005 rotate 1 x - 1}
}

/*// Comment this for removing color
rule init 1000{
    dot { saturation 1 brightness 0.9 }
}

rule dot 0.01{
    dot { brightness 0.90 }
}

rule dot 0.01{
    dot { brightness 0 }
}

rule dot 0.01{
    dot { brightness 0.4 }
}

rule dot 0.005{
    dot { hue 180 }

}
//*/


(El /* se puede eliminar para tener algo de colorido, para gustos...)
Y la imagen resultante de ejecutar el script se utiliza de fondo de pantalla, el resultado podría ser algo así en este caso:

Aunque claro, la gracia está en el cambio. Cómo hacer que se ejecute el script es cosa de cada uno, la forma más facil en las distribuciones con gnome (para Xfce, KDE lo mismo) es a través de Sistema > Preferencias > Aplicaciones al inicio, aunque (como ya se dijo antés), cron puede ser una opción interesante para que se renueve incluso cuando no se hace logout.

Hasta otra.

ps: La instalación de CFDG no tiene ningún misterio, se descomprime, se hace make para compilar y sudo cp cfdg /usr/bin/ para instalar.

[Referencias]
CFDG HowTo

miércoles, 28 de julio de 2010

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


#!/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




#!/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



Visto esto ya no parece tan dificil programar GUI's ^^

Y con KDialog (Qt/Kde) [ktemp.sh]:


./ktemp.sh




#!/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



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 <diccionario> <objetivo>




#!/usr/bin/env bash
# Escrito por kenkeiras
function showuse {
    echo "$0 <diccionario> <hash>"
    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 <Criterio de búsqueda>



#!/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 "</table>" >> /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  <Empresa>



#!/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 "</table>" >> /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

viernes, 9 de julio de 2010

Comprobar links de megaupload desde bash

Gracias a Mungu ayer descubrí que bash puede abrir conexiones tcp/ip directamente, sin depender de netcat ni telnet, así que ahí va una pequeña prueba/experimento...

Dice "OK" y sale con 0 si el link a megaupload es correcto, o dice "Invalid link" y sale con 1 si es incorrecto.

Actualizado: ahora funciona también con links sin "www"


#!/usr/bin/env bash

if [ "$1" = "" ]; then
    echo "No has especificado una dirección"
    exit 1
else
    path="/?"`echo $1|cut -d? -f2`
fi

# Request webpage
exec 3<>/dev/tcp/www.megaupload.com/80
echo -en "GET $path HTTP/1.1\r\n" >&3
echo -en "HOST: www.megaupload.com\r\n" >&3
echo -en "Connection: close\r\n\r\n" >&3
cat <&3|grep "Invalid link" >> /dev/null

result=$?
if [ $result -ne 0 ];then
    echo "OK"
    result=0
else
    echo "Invalid link"
    result=1
fi
exit $result


[Referencias]
Bash socket programming with /dev/tcp

lunes, 5 de julio de 2010

Hablando por el terminal

Hoy traigo algo medio OffTopic, para pasar el rato.

Un intérprete de comandos ya permite pasarse horas programando cosas más o menos útiles, pero si además le añadimos un sintetizador de voz, las posibilidades solo las limita la imaginación.

eSpeak es un programa (disponible a través del paquete correspondiente) que permite usar un sintetizador de voz por línea de comandos (aunque tambien tiene una gui), la entrada por defecto se hace por stdin, así que utilizando tuberías (pipes) se pueden hacer cosas bastante curiosas, el parámetro más a tener en cuenta es la voz (que regulará la pronunciación), por defecto es el inglés, pero con -ves se puede configurar para castellano, la sintaxis, es -v[código del idioma]

Algunos ejemplos de su uso pueden ser



fortune | espeak -ves


para que lea una frase aleatoria

o


i=1
while [ $i -le 10 ]
    do
    j=1
    while [ $j -le 10 ]
        do
        r=$(( $i * $j))
        echo "$i por $j es = a $r"
        j=$(($j + 1))
    done
    i=$(($i + 1))
done|espeak -ves


o en una línea


i=1;while [ $i -le 10 ]; do j=1; while [ $j -le 10 ]; do r=$(( $i * $j)); echo "$i por $j es = a $r"; j=$(($j + 1)); done; i=$(($i + 1)); done|espeak -ves


para que diga la tabla del 1 al 10

El resto es cuestión de imaginación, combinado con un poco de scripting puede servir para que avise cuando la temperatura del PC sube demasiado, cuando llegue una hora preconfigurada (típica alarma)  o cuando alguien está hablando con nosotros por el IRC... lo difícil es encontrar algo para lo que sea realmente necesario :)

Hasta otra.

[Referencias]
http://espeak.sourceforge.net/

sábado, 3 de julio de 2010

Instalando Granola en Trisquel

Actualización: desde que se escribió esto, cambairon algunas cosas (granola ahora usa licencias comerciales para "orgaizaciones" y cosas así, con lo que desconozco si se puede seguir considerando libre, que no gratuito )

Navengando por Linux Hispano me encontre con un software que tiene muy buena pinta, Granola, completamente libre (gracias al canal #trisquel por responder esta duda) y dedicado al ahorro de energía.
La instalación es bastante simple, el típico shellscript, pero no funciona del todo bien en esta distro, así que hay que hacer un par de apaños, intentando ejecutar el shellscript...
"Perdón, pero parece que estas utilizando una distribución o versión sin soporte"
Si se busca el string en el script instalador se encuentra esto:
Así que lo que hay que hacer es que la variable $DISTRIBUTION sea ubuntu o debian (hay más distros soportadas, pero estas son las más similares), solo hay que cambiar.


DISTRIBUTION=unsupported

por


DISTRIBUTION=ubuntu


Y añadir una línea después, dependiendo de la versión de Ubuntu en la que se base, por ejemplo

si es el Trisquel 3.5
CODENAME=karmic

o si es la versión 4
CODENAME=lucid

Para actualizar la lista de software haremos
sudo apt-get update

pero da un error:
"W: Imposible obtener https://download.miserware.com/liux/deb/dists/taranis/main/binary-i386/Packages.gz  The requested URL returned error: 404"

Así que hay que editar /etc/apt/sources.list.d/miserware.list , y en
deb https://download.miserware.com/linux/deb taranis main hay que cambiar el codename de la versión (taranis aquí) por la equivalente de ubuntu (la que pusimos en la variable CODENAME en el script de instalación, en este caso lucid)

Ahora el sudo apt-get update debería funcionar bien, así que por fin podemos instalar el software con sudo apt-get install granola granola-gui

A ver si de paso ahora dura más la batería del portátil :P

Hasta otra!