[h]Introducción a bash[/h]
https://www.wifi-libre.com/img/members/3/bash2_1.jpg
[h]Paso 2 : variables, expresiones regulares y el comando “grep”[/h]
Seguimos nuestro cursillo.
En nuestro “primer paso” (cf. Introducción a bash - paso 1: Bases, echo y “Hola mundo”) hemos aprendido a realizar nuestro primer script en bash.
[code]#!/bin/bash
primer script en bash copyleft GPL v3 @ wifi.libre.com
echo “Hola mundo” # zona para comentarios[/code]
De paso hemos visto lo que era “bash”, lo que era un scriptn bash, como redactarlo lo con su “bang line”, como ejecutarlo y hemos conocido al comando “echo” que sirve a escribir en consola.
Hoy vamos a hablar de dos nociones fundamentales en programación : las variables y las expresiones regulares.
Y acabaremos familiarizándonos con el comando “grep” que permite usar las expresiones regulares Así que con el pipe que nos permite encadenar dos ordenes
Variables y expresiones regulares son palabras que pueden asustar un poco pero veréis que es muy fácil.
[h]Variables[/h]
Creo que la imagen era de 1camaron1 en uno de sus cursos para principiantes en bash : Una variable es como un cajón
En el cual ponemos cosas.
Una vez que hemos puesto cosas adentro (definir la variable) podremos en nuestro script “abrir el cajón” en cualquier momento para sacar las cosas que están a dentro.
Una variable puede contener lo que queremos. números, letras, símbolos raros. Puede ser también otra orden bash (lo veremos al final) .
Para definir un variable de forma básica en bash es muy simple: ponemos el nombre que damos a nuestra variable (el cajón) seguido del símbolo “igual” y luego ponemos el valor que asignamos a la variable (los calcetines en el cajón)
Tomemos un ejemplo con nuestro primer script
Vamos a llegar al mismo resultado ( escribir “¡Hola mundo!” en consola) pero usando una variable.
la variable (el cajón) la llamaremos “mensaje”
Y su valor será nuestro mensaje de bienvenida “¡Hola mundo!”
Para asignar el valor “¡Hola mundo!” a la variable “mensaje” hacemos así
mensaje="¡Hola mundo!"
Y Ahora veamos como hacer para sacar la cosa del cajón, es decir usar el valor de nuestra variable
Para ver el valor de la variable en consola volveremos a usar echo y el símbolo del dolar, es decir $
Asi se pueden acordar : para ver el valor del variable hay que usar dolares
entonces es así…
echo $mensage
probamos en consola… primero definimos la variable y luego la invocamos : https://www.wifi-libre.com/img/members/3/bash2_2.jpg
En complemento les he puesto dos tipos de errores. en programación cada símbolo tiene mucha impotencia y es muy fácil equivocarse si no prestamos atención.
En el ejemplo 4 veís la importancia del símbolo “$” a la hora de llamar la variable para obtener su valor, su contenido. Si no pongo el símbolo del dolar obtengo “mensaje” en lugar de ¡Hola mundo!
En el ejemplo 5 tenemos un falló porque nos hemos puesto entre apostrofes el valor de nuestra variable. Si nuestro variable contiene un espacio (y es el caso en “¡Hola mundo!”) tenemos que “encerrarla” entre “delimitadores”. En bash los “” son una forma para delimitar y nos permiten tener una variable que incluye uno(s) espacio(s)
[h]Expresiones regulares con grep (mediante pipe)[/h]
Una expresión regular puede ser cualquier cadena de símbolos que definimos. Esta cadena, al ser definida como “expresión regular”, se podrá emplear para, por ejemplo, buscar coincidencias.
Grep es un comando fundamental en nuestra panoplia y su función de base es definir y usar expresiones regulares.
¿No entendeís a que sirve?
Tomemos un ejemplo. digamos que quiero saber cual es mi chipset wireless. Una forma de conocer lo es hacer un listado de su hardware (se hace con lshw)
Ups… Obtenemos esta cosa muy larga en consola:
ATTENTION: ce programme devrait être lancé en tant que super-utilisateur.
profezorapplestruff
description: Computer
bits: 64 bits
fonctionnalités: vsyscall32
*-core
description: Motherboard
identifiant matériel: 0
*-memory
description: Mémoire système
identifiant matériel: 0
taille: 3840MiB
*-cpu
produit: Intel(R) Celeron(R) CPU N2840 @ 2.16GHz
fabriquant: Intel Corp.
identifiant matériel: 1
information bus: cpu@0
taille: 1415MHz
capacité: 1415MHz
bits: 64 bits
fonctionnalités: fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp x86-64 constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 movbe popcnt tsc_deadline_timer rdrand lahf_lm 3dnowprefetch ida arat epb dtherm tpr_shadow vnmi flexpriority ept vpid tsc_adjust smep erms cpufreq
*-pci
description: Host bridge
produit: Atom Processor Z36xxx/Z37xxx Series SoC Transaction Register
fabriquant: Intel Corporation
identifiant matériel: 100
information bus: pci@0000:00:00.0
version: 0e
bits: 32 bits
horloge: 33MHz
configuration: driver=iosf_mbi_pci
ressources: irq:0
*-display
description: VGA compatible controller
produit: Atom Processor Z36xxx/Z37xxx Series Graphics & Display
fabriquant: Intel Corporation
identifiant matériel: 2
information bus: pci@0000:00:02.0
version: 0e
bits: 32 bits
horloge: 33MHz
fonctionnalités: vga_controller bus_master cap_list rom
configuration: driver=i915 latency=0
ressources: irq:108 mémoire:d0000000-d03fffff mémoire:c0000000-cfffffff portE/S:f080(taille=8)
*-storage
description: SATA controller
produit: Intel Corporation
fabriquant: Intel Corporation
identifiant matériel: 13
information bus: pci@0000:00:13.0
version: 0e
bits: 32 bits
horloge: 66MHz
fonctionnalités: storage ahci_1.0 bus_master cap_list
configuration: driver=ahci latency=0
ressources: irq:104 portE/S:f070(taille=8) portE/S:f060(taille=4) portE/S:f050(taille=8) portE/S:f040(taille=4) portE/S:f020(taille=32) mémoire:d0916000-d09167ff
*-usb
description: USB controller
produit: Atom Processor Z36xxx/Z37xxx Series USB xHCI
fabriquant: Intel Corporation
identifiant matériel: 14
information bus: pci@0000:00:14.0
version: 0e
bits: 64 bits
horloge: 33MHz
fonctionnalités: xhci bus_master cap_list
configuration: driver=xhci_hcd latency=0
ressources: irq:103 mémoire:d0900000-d090ffff
*-generic
description: Encryption controller
produit: Atom Processor Z36xxx/Z37xxx Series Trusted Execution Engine
fabriquant: Intel Corporation
identifiant matériel: 1a
information bus: pci@0000:00:1a.0
version: 0e
bits: 32 bits
horloge: 33MHz
fonctionnalités: bus_master cap_list
configuration: driver=mei_txe latency=0
ressources: irq:107 mémoire:d0500000-d05fffff mémoire:d0400000-d04fffff
*-multimedia
description: Audio device
produit: Atom Processor Z36xxx/Z37xxx Series High Definition Audio Controller
fabriquant: Intel Corporation
identifiant matériel: 1b
information bus: pci@0000:00:1b.0
version: 0e
bits: 64 bits
horloge: 33MHz
fonctionnalités: bus_master cap_list
configuration: driver=snd_hda_intel latency=0
ressources: irq:109 mémoire:d0910000-d0913fff
*-pci:0
description: PCI bridge
produit: Intel Corporation
fabriquant: Intel Corporation
identifiant matériel: 1c
information bus: pci@0000:00:1c.0
version: 0e
bits: 32 bits
horloge: 33MHz
fonctionnalités: pci normal_decode bus_master cap_list
configuration: driver=pcieport
ressources: irq:16 portE/S:e000(taille=4096) mémoire:d0800000-d08fffff
*-network
description: Ethernet interface
produit: RTL8101E/RTL8102E PCI Express Fast Ethernet controller
fabriquant: Realtek Semiconductor Co., Ltd.
identifiant matériel: 0
information bus: pci@0000:01:00.0
nom logique: eth0
version: 07
numéro de série: f0:76:1c:46:46:64
taille: 100Mbit/s
capacité: 100Mbit/s
bits: 64 bits
horloge: 33MHz
fonctionnalités: bus_master cap_list ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd autonegotiation
configuration: autonegotiation=on broadcast=yes driver=r8169 driverversion=2.3LK-NAPI duplex=full firmware=rtl8106e-1_0.0.1 06/29/12 ip=192.168.2.100 latency=0 link=yes multicast=yes port=MII speed=100Mbit/s
ressources: irq:106 portE/S:e000(taille=256) mémoire:d0804000-d0804fff mémoire:d0800000-d0803fff
*-pci:1
description: PCI bridge
produit: Intel Corporation
fabriquant: Intel Corporation
identifiant matériel: 1c.1
information bus: pci@0000:00:1c.1
version: 0e
bits: 32 bits
horloge: 33MHz
fonctionnalités: pci normal_decode bus_master cap_list
configuration: driver=pcieport
ressources: irq:17 portE/S:1000(taille=4096) mémoire:d0700000-d07fffff
*-network DÉSACTIVÉ
description: Interface réseau sans fil
produit: QCA9565 / AR9565 Wireless Network Adapter
fabriquant: Qualcomm Atheros
identifiant matériel: 0
information bus: pci@0000:02:00.0
nom logique: wlan0
version: 01
numéro de série: 4c:bb:58:0f:ba:aa
bits: 64 bits
horloge: 33MHz
fonctionnalités: bus_master cap_list rom ethernet physical wireless
configuration: broadcast=yes driver=ath9k driverversion=3.16.0-33-generic firmware=N/A latency=0 link=no multicast=yes wireless=IEEE 802.11bgn
ressources: irq:17 mémoire:d0700000-d077ffff mémoire:d0780000-d078ffff
*-pci:2
description: PCI bridge
produit: Intel Corporation
fabriquant: Intel Corporation
identifiant matériel: 1c.2
information bus: pci@0000:00:1c.2
version: 0e
bits: 32 bits
horloge: 33MHz
fonctionnalités: pci normal_decode bus_master cap_list
configuration: driver=pcieport
ressources: irq:18 portE/S:2000(taille=4096) mémoire:d0600000-d06fffff
*-generic
description: Unassigned class
produit: RTS5229 PCI Express Card Reader
fabriquant: Realtek Semiconductor Co., Ltd.
identifiant matériel: 0
information bus: pci@0000:03:00.0
version: 01
bits: 32 bits
horloge: 33MHz
fonctionnalités: bus_master cap_list
configuration: driver=rtsx_pci latency=0
ressources: irq:105 mémoire:d0600000-d0600fff
*-isa
description: ISA bridge
produit: Atom Processor Z36xxx/Z37xxx Series Power Control Unit
fabriquant: Intel Corporation
identifiant matériel: 1f
information bus: pci@0000:00:1f.0
version: 0e
bits: 32 bits
horloge: 33MHz
fonctionnalités: isa bus_master cap_list
configuration: driver=lpc_ich latency=0
ressources: irq:0
*-serial NON-RÉCLAMÉ
description: SMBus
produit: Intel Corporation
fabriquant: Intel Corporation
identifiant matériel: 1f.3
information bus: pci@0000:00:1f.3
version: 0e
bits: 32 bits
horloge: 33MHz
fonctionnalités: cap_list
configuration: latency=0
ressources: mémoire:d0914000-d091401f portE/S:f000(taille=32)
ATTENTION: les informations sont potentiellement incomplètes ou erronées, vous devriez lancer ce programme en tant que super-utilisateur.
Ahora voy a usar grep.
grep nos permite definir expresiones regulares y escribir en consola la liñas dónde se encuentra la expresión regular.
busco información sobre el chipset Wireless, así que voy a elegir como expresión regular “Wireless”
Así obtendré en consola la liñas que contienen como expresión regular “Wireless” y no perderé el tiempo en buscar en este largo “stdout” (así se lama lo se que ve en consola) el modelo de mi chipset wifi
lshw | grep Wireless
Notáis el uso de la barra vertical.
Se llama “pipe” (tubería) y permite encadenar ordenes.
Se ejecuta lshd y el resultado se manda al comando grep.
Así que en lugar de tener el resultado de lshd (el texto tan largo) tendremos el resultado de grep (la liña que contenga la expresión regular definida : Wireless )
El pipe permite de cierto modo alimentar a grep para que busque y encontré expresiones regulares.
https://www.wifi-libre.com/img/members/3/bash2_3.jpg
Con lo que habéis visto podéis ya hacer cosas.
En inició dije que podíamos asignar una orden como valor a una variable.
Y sabemos que con el pipe podemos encadenar ordenes. Una variable puede ser varias ordenes,
Para acabar este capituló vamos a darle jugo al asunto relacionándolo con nuestro famoso ataque pixie dust por el simple hecho de declarar en una variable unas ordenes encadenas con une pipe.
Para poner ordenes en una variable y que se ejecuten necesitamos utilizar los delimitadores ’ ’ en lugar de " " como anterioramente
lo sabemos, en nuestro pixie dust, necesitamos un reaver modificado para obtener le “authkey”. No se puede obtener con reaver normal, es solo para esta dichosa authkey que necesitamos un reaver modificado.
Pues, la vamos a pillar al vuelo así.
authkey=`sudo timeout 2s reaver -i wlan0mon -b XX:XX:XX:XX.XX:XX -vv -n -g 1 | grep -i auth | cut -d ':' -f2-`
He definido una variable llamada hotkey con los delimitadores
lo que hace que puedo poner comandos
En el primer pipe es un comando reaver (tengo revaer mod instalado) limitado a dos segundos de ejecución con “timeout -2s”
su resultado se manda al comando grep
En el segundo pipe tengo un comando grep con expresión regular authkey
entonces obtendría sola la linea que contiene “authkey” (hemos puesto -i así que puede ser con maysuculas)
algo asi : [P] AuthKey : 56:78:90:09:09:09(…)"
que no ponemos en consola pero que mandamos al comando cut
En nuestro ultimo pipe tenemos** cut -d ‘:’ -f2-** dónde
[list=]
]cut - es un comando que permite recortar /]
]-d ‘:’ ** - empleamos cut con el opcion “d” . Es decir Delimitador. Y nuestro delimitador es el simbolo ":**" (dos puntos verticales):. esto significa que cut va a dividir la linea en trozos (campos) delimitados por el simbolo “:” /]
]* -f2-** : Es para definir los trozos (campos o field en ingleś) que guardamos. Aqui con -f2 le decimos de guardar desde el campo 2. Y con f2- le decimos de pillar** todo lo que viene despuès** el campo 2 .
Lo que nos da -f2- /]
[/list]
la idea al final es que tendremos una variable que tenga la liña con la auth key (pillada con grep) de la cual guardaremos todo menos lo que se encuentra antes de los primeros dos puntos verticales (comando cut)
https://www.wifi-libre.com/img/members/3/bash2_4.jpg
la idea no es nada buena pero les permite ver que con dos coitas podéis ya lograr algo como empezar un script para lanzar pixiewps.
En este caso arriamos la misma operación para cada elemento que falta. Declarar una variable PKE que definimos ejecutando tshark.sh de Spawn y su contenido esta depurado para guardar las cadenas que nos interesan. Y repetimos la operación para PKR etc…
Hay muchas formas de llegar a sus fines con bash. En el próximo paso veremos más y será ya algo más “script” que podría ser útil.