Introducción bash, paso 2 : variables, expresión regular (grep) y pipe

[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. :wink:

[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. :slight_smile:
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 :smiley:
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. :stuck_out_tongue:
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. :wink: