September 12, 2009 at 18:21 · Filed under seguridad
El último bombazo: provocar una Blue Screen of Death (BSOD) en Windows Vista, Windows 7 RC o Windows 2008 Server (<R2)
La noticia original (con su exploit en python): Windows Vista/7: SMB2.0 NEGOTIATE PROTOCOL REQUEST Remote B.S.O.D. (con fecha de 7 de septiembre).
Esta mañana la he probado en un portátil con Windows Vista:
- He activado la compartición de archivos: en Panel de control hay una opción que dice algo así como Opciones de red y de compartir recursos, y ahí dentro hay varias opciones para elegir qué se comparte. Esto es necesario para activar la pila Samba del kernel de Windows.
- Si hubiera un firewall que cubriera el puerto 445 habría que desactivarlo. No era el caso.
- Utilizando el exploit de Laurent Gaffié y sabiendo la IP del portátil lo tiré abajo sin más que cortar el exploit, pegarlo en un fichero y ejecutarlo contra el portátil.
El funcionamiento
El exploit simplemente se conecta al puerto 445 de la víctima, envía un mensaje de sesión SMB y se desconecta.
En tal mensaje de sesión, en su cabecera, hay un atributo que se llama Process ID High, de 16 bits. Normalmente suele ser 0, pero lo que descubrió Laurent es que si en vez de ser 0 era 0×26 (lo que viene siendo un &), conseguía obtener un bonito fallo de página (error PAGE_FAULT_IN_NONPAGED_AREA).
Es decir, que manipulando ese atributo provocaba que algún puntero en algún lado apuntara hacia alguna zona de memoria que no pertenecía a nadie. Para más inri, el código del SMB2.0 está en el kernel, por lo que este fallo de página se lanzaba en modo kernel, con el consecuente reinicio de la máquina.
Hasta aquí lo que tenemos en un ataque remoto de denegación de servicio.
Lo que posteriormente ha descubierto Rubén Santamarta, de 48bits, es que se puede (con ciertas limitaciones) manipular la dirección a la que salta el kernel según el valor de ese atributo de la cabecera, pudiendo dar lugar a una inyección de código.
Tal y como explica en su artículo:
.text:000156B3 movzx eax, word ptr [esi+0Ch]; packet->SBM_Header->Process_ID_High
.text:000156B7 mov eax, _ValidateRoutines[eax*4]; FALLO – out-of-bounds dereference.
.text:000156BE test eax, eax
.text:000156C0 jnz short loc_156C9
.text:000156C2 mov eax, 0C0000002h
.text:000156C7 jmp short loc_156CC
.text:000156C9 ; —————————————————————————
.text:000156C9
.text:000156C9 loc_156C9: ; CODE XREF: Smb2ValidateProviderCallback(x)+4F3j
.text:000156C9 push ebx
.text:000156CA call eax ; Smb2ValidateNegotiate(x) ;
Inicialmente partimos de que ESI apunta a una parte de la cabecera SMB del paquete recibido. ESI+0x0C es un puntero al atributo Process ID High de tal cabecera, por lo que
movzx eax, word ptr [esi+0Ch]
Nos deja en EAX, los 16 bits de más peso a 0 (siempre) y los 16 de menor peso con el contenido de tal atributo copiado literalmente (ver movzx). Por ejemplo, si el Process ID High fuera 10, EAX tendría el valor 0x0000000A,
La siguiente instrucción
mov eax, _ValidateRoutines[eax*4]
va a la tabla (de punteros a función) _ValidateRoutines, y según el valor de EAX, escoge una entrada u otra (cada una ocupa 4 bytes).
Siguiendo con el ejemplo, esto cogería la undécima entrada de la tabla (en la dirección _ValidateRoutines + 0×28) y la copiaría en EAX, con lo que tendríamos en EAX la dirección de memoria de la función a ejecutar.
A continuación se comprueba si tal puntero no es nulo. De ser nulo, en EAX se guarda el valor 0x0C0000002 y se sigue con la ejecución en otra parte.
test eax, eax
jnz short loc_156C9
mov eax, 0C0000002h
jmp short loc_156CC
Por el contrario, si efectivamente no es nulo, se guarda EBX en la pila y se salta a tal función:
loc_156C9:
push ebx
call eax
Conclusión: según pongamos un valor N en el atributo Process ID High, podemos conseguir que el kernel salte a la posición de memoria indicada en la entrada (N+1)-ésima de la tabla _ValidateRoutines.
¿Y si la tabla tiene menos entradas que N+1? Pues la dirección de memoria la tomará de lo que venga después de esa tabla. Si pudiésemos controlar el contenido de esos datos que están después, se podría hacer que el kernel saltara a una posición a voluntad. Y por eso es que Rubén habla de cierta posibilidad de ejecución de código remoto.
August 26, 2009 at 19:13 · Filed under Arduino
El 30 de junio se unía a los foros de arduino.cc un post acerca de un artículo de Aaron Eechie: Arduino Starter Rundown – Part 2.
Aaron es ese artículo analiza uno por uno los kits de iniciación que ofrecen dos proveedores estadounidenses y tres europeos.
Si bien los tres proveedores europeos nos pueden servir a los que vivimos en España o en Portugal, he preferido hacer un análisis similar para los proveedores ubicados en nuestros países. Los seis proveedores que trataré los he sacado de la página oficial de Arduino.
Todos estos proveedores venden lo que llaman el Kit Workshop – Base level, que es idéntico en componentes en todas las tiendas:
- 1 Arduino Diecimila Board (suele ser opcional)
- 1 USB cable para alimentar y programar el cacharro
- 1 Straight single line pinhead connectors 2,54 40×1
- 1 Breadboard, 840 tie points
- 1 Set of 70 breadboard jumper wires
- 5 10K Ohm Resistors 1/4W
- 5 2.2K Ohm Resistor 1/4 W
- 10 220 Ohm Resistors 1/4W
- 5 330K Ohm Resistors 1/4W
- 5 100nF capacitor polyester
- 5 10nF capacitor polyester
- 3 100uF electrolytic capacitor 25Vdc
- 1 4,7K Ohm Thermistor
- 1 70..100K Ohm LDR VT90N2
- 3 5mm RED LED
- 1 5mm GREEN LED
- 1 5mm YELLOW LED
- 1 10Kohm linear potentiometer, pcb terminals
- 2 BC547 Transistor in TO92 Package
- 1 Piezo buzzer
- 5 PCB Pushbutton, 12x12mm size
- 2 4N35 Optocoupler DIL-6 package
- 2 Tilt sensor
- 1 Diode 1n4007
- 1 MOS Irf540
BricoGeek.com
Proveedor español ubicado en A Coruña.
Trabajan con electrónica en general, no sólo Arduino. Cuentan con gran variedad de dispositivos para desarrollo (servos, ruedas, pantallas LCD, etc.).
Ofertan un Arduino Kit Workshop sin el microcontrolador Arduino por algo más de 41,76 euros (16% IVA incluído).
e-lioness
Proveedor español de la provincia de Granada.
Aunque venden algún producto más aparte de Arduinos, la tienda está enteramente centrada en estos dispositivos.
Ofertan dos KIT Workshop – Base level, uno con una placa Arduino por 58 euros y otra sin ella por 34,8 euros (16% IVA incluído en ambos precios).
Tuxbrain S.L.
Proveedor español
Se centran en todo lo que son dispositivos de código abierto: Arduino, OpenMoko y GP2X entre otros. Matienen una lista de correo sobre OpenMoko en español.
Al igual que e-lioness vende dos KIT Workshop – Base, uno con placa Arduino por 58,00 euros (IVA incluído) y otra sin por 34,80 (IVA incluído).
GTrónica
Proveedor portugués, de Loura
No sólo venden Arduinos, también electrónica y microcontroladores en general (aunque no tanto como bricogeek.com)
Igualmente, vende ambos kits con y sin Arduino por, respectivamente 58.50 y 34.50 euros.
InMotion
Proveedor portugués
Venden Arduinos, Phidgets, ZigBees y sensores varios.
De nuevo lo mismo: el mismo kit con (51 euros) y sin Arduino (32 euros).
Libelium
Proveedor español ubicado en Zaragoza.
Esta empresa es una spin-off surgida en la Universidad de Zaragoza. Se dedica al desarrollo de sensores, redes malladas y sus aplicaciones a distintos entornos. Así mismo coordina redSens: un grupo de trabajo sobre redes sensoriales inalámbricas donde participan varias empresas y universidades españolas.
Al margen de sus actividades con las redes mesh, mantienen una tienda virtual de dispositivos Arduino (y SquidBee).
En esta tienda ofertan diversos kits, ninguno de ellos de iniciación. En cualquier caso, me parece una tienda y un proyecto interesante y por eso he creído importante mencionarlo aquí.
Conclusiones
- Sale más barato comprar un kit con Arduino que comprarlos por separado
- Los precios suelen ser muy similares. El kit es el mismo.
- El kit completo más barato son 51 euros, lo normal son 58 euros.
- El kit sin placa ronda los 34 euros.
- No hay diferencia entre comprarlo en España o en Portugal. De las tiendas francesas ninguna vende kits.
- Ninguno incluye un libro sobre Arduino, aunque en e-lioness por lo menos se puede comprar junto con el kit.
July 11, 2009 at 17:38 · Filed under Python
Pensé que ya tenía una copia de The Little Book of Semaphores, pero por más que la buscaba no la encontraba.
Probablemente no la encontrara debido al enorme barullo que tengo en el directorio donde el aMule deposita todo lo que descarga y yo deposito todo lo que me bajo y quiero compartir.
Seguramente hubiera otro fichero con mismo contenido y distinto nombre. ¿Cómo encontrarlo?
Mediante md5sum *.pdf | sort podría revisar una por una cada entrada devuelta y buscar con un poco menos de dolor si hay algún duplicado, ya que sort ordena, pero que yo sepa no tiene una opción para mostrar sólo los duplicados (y en el manual no viene nada al respecto).
Quizá awk me ayudara, pero el caso es que hay que practicar Python (descargar fuente):
import sys
import hashlib
def do_hash(nombreFichero):
fichero=open(nombreFichero,‘r’)
contenido=fichero.read()
fichero.close()
return hashlib.md5(contenido).hexdigest()
if __name__==‘__main__’:
hashes={}
for fichero in sys.argv[1:]:
clave = do_hash(fichero)
try:
hashes[clave].append(fichero)
except KeyError:
hashes[clave]=[fichero]
for clave in hashes.keys():
if len(hashes[clave])>1:
print ‘Same key %s for:’%(clave)
for fichero in hashes[clave]:
print ‘\t%s’%(fichero)
Funcionamiento:
Una vez comprobado que el script se está ejecutando (__name__ == ‘__main__’), y no ha sido llamado como módulo, por cada fichero en la línea de comandos averigua su hash mediante la función do_hash (que internamente usa MD5, pero podría usar SHA1 sin más que cambiarlo).
En un diccionario se guarda por cada hash, una lista con los nombres de los ficheros que tienen la misma hash.
Posteriormente, por cada hash encontrada, si en la lista de ficheros que tienen esa hash hay más de un fichero, se imprime cada nombre de fichero, de manera que el usuario puede visualizar qué ficheros tienen el mismo contenido:
pablo@golgi:~/Desktop$ python dups.py *.pdf
Same key 3f4568dc0b3e96b94f02c0b58d57b702 for:
tls.2.pdf
tls.pdf
pablo@golgi:~/Desktop$ rm tls.2.pdf
Probablemente, una salida de este estilo (agrupando los ficheros iguales sin verborrea):
pablo
@golgi:~
/Desktop$ python dups.py
*.pdf
tls.2.pdf
tls.pdf
same1_1.pdf
same1_2.pdf
same1_3.pdf
pablo@golgi:~/Desktop$ rm tls.2.pdf same1_2.pdf same1_3.pdf
fuera más amigable para utilizar el comando desde algún script.
Ahí queda eso, por si a alguien (o a mí mismo en el futuro) le sirve para algo.
Ideas:
- hacerlo en bash, o al menos de una manera más simple.
- Si no es posible, programar una opción para ello en el sort.
- Me gustaría ver qué tal funciona la función do_hash() con ficheros enormes (de 1G., p.e.). Esto habría que arreglarlo…
dups.py
June 20, 2009 at 23:50 · Filed under Arquitectura de Computadores, Cultura
“The terms big-endian and little-endian derive from Jonathan Swift‘s 1726 satirical novel, Gulliver’s Travels. In the novel, the fictional Lilliputians‘ major political issue is whether eggs should be cracked open on the big end or the little end. Those who favor the big end are big-endians, whereas those who favor the small are little-endians.
The similarity between the Lilliputians and our big-endian versus little-endian debate is that the argument is rooted deeper in politics than technical merits.”
Procede del libro Linux Kernel Development, de Robert Love.
Capítulo 19: Portabilidad (2ª edición)
Update: Por cierto, se me olvidó poner esto de la misma fuente, está muy elegante (sirve para saber el endianness de la máquina donde se ejecuta):
int x
=1;
if(1==*(char*)&x) {
/* little endian */
}else{
/* big endian */
}
June 5, 2009 at 18:54 · Filed under Estructuras de datos, computación
En los últimos años se ha puesto de relieve que la velocidad a la que operan los microprocesadores crece mucho más rápido que la velocidad a la que se transfieren datos de la memoria al microprocesador.
Precisamente, para evitar esta asimetría Francesc Alted ha diseñado Blosc.
Blosc es un compresor optimizado para datos binarios. Comprime los datos con los que realizar computaciones, de manera que además de ocupar menos memoria, tardan menos tiempo en ser transferidos.
Con Blosc, por cada bloque de datos con el que trabajar, hay que transferir los datos, descomprimirlos, trabajar con ellos, comprimir los resultados y volver transferirlos.
Frente al proceso normal de transferir, computar y volver a transferir, consigue agilizar el tiempo empleado ya que en comprimir y descomprimir tarda muy poco frente a lo que se tarda en transferir los datos descomprimidos, precisamente por la enorme diferencia entre la velocidad de los micros y de las memorias.
Francesc presentará en el EuroSciPy 2009 este sistema, aplicándolo a las PyTables.
Next entries »