SET 39 Call For Papers

¿Eres un hacker? Si deseas pasar a formar parte de la historia del hacking hispano, colabora con la próxima edición de SET 39 enviándonos un artículo. No esperes más, esta es tu oportunidad de demostrar lo que sabes. Ayúdanos a construir una revista de hackers para hackers. SET Staff

SET 15

65529 visitas

Este banco esta ocupado

      2085

Autor: FCA000
-[ 0x09 ]--------------------------------------------------------------------
-[ ESTE BANCO ESTA OCUPADO ]-------------------------------------------------
-[ by fca00000 ]------------------------------------------------------SET-15-

Ficheros CSB
------------

Para la transmision de informacion bancaria entre ordenadores, el Consejo
Superior Bancario definio las llamadas normas CSB que especifican el formato
de los registros de ficheros conteniendo informacion sobre nominas, remesas
y transferencias.
La norma CSB34 define las nominas (N) y transferencias (T).
La norma CSB19 define la remesa (R).

Los tres tipos (a partir de ahora llamados NRT) son ficheros ASCII con lineas
de tama€o 163 para R, y 73 para N y T.
N y T son bastante parecidos; la unica diferencia esta en un dato de un
registro que indica si es N o T.

Un ejemplo de T es:
0306H50312276 130995RA    0011309951309952036001833003212370      
0306H50312276             002MI NOMBRE                
0306H50312276             003MI CALLE
0306H50312276             004
0606H50312276 132         01000000050000020350124010038759319  69
0606H50312276 132         011PERICO DE LOS PALOTES
0606H50312276 132         012CALLE GRANDE 47
0806H50312276                000000500000000000010000000008

Como se observa, los registros pueden empezar por:
0306 -> registro de cabecera de documento. Hay 4 lineas de cabecera
0606 -> registro de lineas. Hay una linea primera, una 2§, y hasta 4 mas.
0806 -> registro de importes totales. Solo aparece 1 linea de este tipo.

Registros de cabecera:
Primer registro:
0306H50312276 130995RA    0011309951309952036001833003212370      
Codigo del ordenante: 5-14 (H50312276 )
Numero de documento: 15-26 (130995RA   )
Numero del registro: 27-29 (001)
Fecha del documento: 30-35 (130995) Formato ddmmaa
Fecha de cargo:      36-41 (130995)
Cuenta de cargo 1§:  42-45 (2036)
Cuenta de cargo 2§:  46-49 (0018)
Cuenta de cargo 3§:  64-65 (63) Digitos de control del CCC
Cuenta de cargo 4§:  50-59 (3300321237)

Segundo registro:
0306H50312276             002MI NOMBRE                
Codigo de ordenante:  5-14 (H50312276 )
Numero del registro : 27-29 (002)
Nombre del ordenante: 30-66 (MI NOMBRE                )

Tercer registro:
0306H50312276             003MI CALLE
Codigo de ordenante:     5-14 (H50312276 )
Numero del registro:     27-29 (003)
Domicilio del ordenante: 30-66 (MI CALLE                 )

Cuarto registro:
0306H50312276             004           
Codigo de ordenante:     5-14 (H50312276 )
Numero del registro:     27-29 (004)
Domicilio del ordenante: 30-66 (                         )

Es obligatorio usar 4 registros, pero no todos los datos lo son; eso depende
del banco o entidad financiera con la que se este hablando. Algunos usan
estos datos como una codificacion para sus programas de gestion, por lo que
lo mejor es conseguir un fichero que funcione, y trabajar sobre el.
Los datos que quedan en blanco son de uso libre.

Registros de lineas:
Primer registro:
0606H50312276 132         01000000050000020350124010038759319  69
Codigo de ordenante:  5-14 (H50312276 )
Referenc del benef:  15-26 (132        )
Numero de dato:      27-29 (010)
Importe:             30-41 (000000500000) formato 999999999900 -> 5.000,00 pts
Entidad pagadora 1§: 42-45 (2035)
Entidad pagadora 2§: 46-49 (0124)
Entidad pagadora 3§: 64-65 (69)
Entidad pagadora 4§: 50-59 (0100387593)
Gastos:              60-60 (1). Siempre es "1"
Concepto de Orden:   61-61 (9). "9" si es Transferencia, "1" si es Nomina

Segundo registro (Obligatorio):
0606H50312276 132         011PERICO DE LOS PALOTES
Codigo de ordenante:  5-14 (H50312276 )
Referenc del benef:  15-26 (132        )
Numero de dato:      27-29 (011)
Nombre del benefic:  30-65 (PERICO DE LOS PALOTES)

Tercer registro (Opcional, y tantos como se deseen):
0606H50312276 132         012CALLE GRANDE 47
Codigo de ordenante:  5-14 (H50312276 )
Referenc del benef:  15-26 (132        )
Numero de dato:      27-29 (012)
Nombre del benefic:  30-65 (CALLE GRANDE 47)


Notar que muchos de los campos de "Nombre de beneficiario" se usan para
informacion generica, tal como la poblacion, los conceptos de movimientos, ..

Registros de totales:
Unico registro:
0806H50312276                000000500000000000010000000008
Codigo de ordenante:         5-14 (H50312276 )
Suma de los importes: 30-41 (000000500000) formato 999999999900 ->  5,000.00
Num. de registros individuales: 42-50 (00000001)
Num. total de registros del soporte: 50-59 (0000000008)


Este formato es soportado por la mayoria de las aplicaciones de contabilidad,
y muchos de los bancos admiten que se les mande un disco con estos ficheros,
que ellos mismos se encargan de meter en sus sistemas de gestion.

Tambien algunos permiten el envio de estos ficheros por medios electronicos,
ya sea mediante codificacion en EDIFACT  en la especificacion PAYMUL:92:1:UN
o ???MUL:D:96A:UN, donde ??? puede ser PAY (PAgo MULtiple), CRE (Abono) o
bien DEB (Cargo)

Otros permiten el envio por Internet mediante modulos de seguridad basados en
claves publicas y privadas.


Como se puede observar, la mayor parte de las veces solo es necesario indicar
una cuenta de cargo para sacar el dinero y una cuenta de abono para meterlo.
Obtener numeros de cuentas es bastante sencillo hoy en dia, pero es preciso
saber si esa cuenta esta permitida en el sistema de gestion del banco para
operar con ficheros de norma CSB. Las comunicaciones entre entidades
financieras distintas (no entre sucursales de la misma entidad) se realizan
en este formato, por lo que las cantidades de dinero que se transmiten
mediante este formato son bastante altas, aunque, a cambio, las medidas de
seguridad son bastante altas, y por ello la confianza en estos sistemas es
muy elevada, por lo que se automatizan todos los procesos y apenas hay
intervencion humana.

El dato del numero de la cuenta corriente es fundamental, asi que voy a
explicar unos conceptos:
El Codigo de Cuenta Corriente (CCC en adelante) se compone de 4 datos:
CCC1: Entidad. 4 digitos
CCC2: Sucursal. 4 digitos
CCC4: Numero de cuenta. 10 digitos
CCC3: codigo de control. 2 digitos
El digito de control es un chequeo de los otros numeros. Aunque algunas
entidades permiten no especificarlo (poniendo "  " o "**" ), lo mas normal
es calcularlo; aqui se presenta el codigo en lenguaje C


strcpy(s1, CCC1);
strcat(s1, CCC2);
strcpy(s2, CCC4);
v[1]=1;
v[2]=2;
v[3]=4;
v[4]=8;
v[5]=5;
v[6]=10;
v[7]=9;
v[8]=7;
v[9]=3;
v[10]=6;
d1=0;
for(x=1;x<=8;x++)
        d1+= ( s1[x] * v[2+x] );
resto=11- ( d1 % 11 )
if(resto==10)   resto=1;
if(resto==11)   resto=0;
c1=resto;

d2=0;
for(x=1;x<=10;x++)
        d1+= ( s2[x] * v[x] );
resto=11- ( d1 % 11 )
if(resto==10)   resto=1;
if(resto==11)   resto=0;
c2=resto;

CCC2[0]='0'+c1;
CCC2[1]='0'+c2;

(Si haces los calculos con el CCC que se usa en este ejemplo, descubriras que
esta mal calculado; lo he hecho a proposito. Pero lo puedes calcular con tu
propia cuenta de tu banco)

A continuacion se proporciona otro programilla.

<++> set_015/csb/lee_csb.c
/* Este programa lee un fichero CSB y lo reduce a una linea por cada
documento que esta dentro.
Vale tanto para remesas como para nominas y transferencias.
Necesita como parametro de entrada un fichero CSB (o una suma de varios)
Toda la salida la muestra por pantalla.
Tiene demasiados  goto  , pero funciona perfectamente
*/

#include <stdio.h>

FILE    *ap;
int     todo_blanco=0;
int     i;
char    cad_leida[400];
char    cad_leida3[400];
char    cad_leida9[400];
char    cad_leida8[400];
char    cad_leida6[400];
char    cad_leida5[400];
int     es_remesa=0;
char    tipo[80];
char    fechadoc[80];
char    emisor[80];
char    numdoc[80];
char    fechaeje[80];
char    ccc1[80];
char    ccc2[80];
char    ccc3[80];
char    ccc4[80];
char    importe[80];
char    nada[80];


void busca_01_03()
{
sigue_01_03:
if(cad_leida[1]=='1')
        {
        es_remesa=1;
        return;
        }
if(cad_leida[1]=='3')
        {
        es_remesa=0;
        return;
        }
fgets(cad_leida, 390, ap);
goto sigue_01_03;
}
void busca_09()
{
sigue_09:
if(cad_leida9[1]=='9')
        {
        return;
        }
fgets(cad_leida9, 390, ap);
goto sigue_09;
}

void busca_06()
{
sigue_06:
if(cad_leida6[1]=='6')
        {
        return;
        }
fgets(cad_leida6, 390, ap);
goto sigue_06;
}

void busca_08()
{
sigue_08:
if(cad_leida8[1]=='8')
        {
        return;
        }
fgets(cad_leida8, 390, ap);
goto sigue_08;
}


main(int argc, char *argv[])
{

ap=fopen(argv[1],"rt");
if(ap==NULL)
        {
        printf("no puedo abrir %s \n", argv[1] );
        exit(1);
        }
principio:
fgets(cad_leida, 390, ap);
if(feof(ap)|| strlen(cad_leida)<20 )
        {
        exit(1);
        }
busca_01_03();
if(es_remesa==1)
        {
        fgets(cad_leida3, 390, ap);
        fgets(cad_leida9, 390, ap);
        busca_09();
        memset(tipo,0,80);
        memset(fechadoc,0,80);
        memset(emisor,0,80);
        memset(numdoc,0,80);
        memset(fechaeje,0,80);
        memset(ccc1,0,80);
        memset(ccc2,0,80);
        memset(ccc3,0,80);
        memset(ccc4,0,80);
        memset(importe,0,80);
        memcpy(tipo,"100",62-62+1);
        memcpy(fechadoc,&cad_leida[17-1],22-17+1);
        memcpy(emisor,&cad_leida[149-1],162-149+1);
        todo_blanco=1;
        for(i=0;i<14;i++)
                if(emisor[i]!=' ')
                        todo_blanco=0;
        if(todo_blanco==1)
                memcpy(emisor,&cad_leida[29-1],68-29+1);
        memcpy(numdoc,&cad_leida[97-1],108-97+1);
        memcpy(fechaeje,&cad_leida3[23-1],28-23+1);
        memcpy(ccc1,&cad_leida3[69-1],88-69+1);
        memcpy(importe,&cad_leida9[89-1],98-89+1);
        if(tipo[0]=='1')
                strcpy(tipo,"REMESA");
        printf("%s;%s;%-40.40s;%s;%s;%s;%s\n", tipo, fechadoc, emisor, numdoc, fechaeje, ccc1, importe );
        }
if(es_remesa==0)
        {
        fgets(cad_leida3, 390, ap);
        fgets(cad_leida6, 390, ap);
        busca_06();
        fgets(cad_leida8, 390, ap);
        busca_08();
        memset(tipo,0,80);
        memset(fechadoc,0,80);
        memset(emisor,0,80);
        memset(numdoc,0,80);
        memset(fechaeje,0,80);
        memset(ccc1,0,80);
        memset(ccc2,0,80);
        memset(ccc3,0,80);
        memset(ccc4,0,80);
        memset(importe,0,80);
        memcpy(tipo,&cad_leida6[61-1],62-62+1);
        memcpy(fechadoc,&cad_leida[30-1],35-30+1);
        memcpy(emisor,&cad_leida3[15-1],26-15+1);
        memcpy(numdoc,&cad_leida[15-1],26-15+1);
        memcpy(fechaeje,&cad_leida[36-1],41-36+1);
        memcpy(ccc1,&cad_leida[42-1],45-42+1);
        memcpy(ccc2,&cad_leida[46-1],49-46+1);
        memcpy(ccc3,&cad_leida[64-1],65-64+1);
        memcpy(ccc4,&cad_leida[50-1],59-50+1);
        memcpy(importe,&cad_leida8[30-1],41-30+1);
        if(tipo[0]=='1')
                strcpy(tipo,"NOMINA");
        if(tipo[0]=='9')
                strcpy(tipo,"TRANSF");
        printf("%s;%s;%-40.40s;%s;%s;%s%s%s%s;%s\n", tipo, fechadoc, emisor, numdoc, fechaeje, ccc1, ccc2, ccc3, ccc4, importe );
        }
goto principio;
}
<-->

Este formato de fichero lleva en vigor mas de 10 a€os, y posiblemente dure
algunos mas, asi que espero que a alguien le sirva y le saque partido.