Entrando pela porta da frente
Death Knights Issue 2
by Milly
Ola, sou Milly, a mais nova colaboradora do The Death Knights.
Minha especialidade e' sistemas PC.
Uma das minhas primeiras peripecias foi a invasao de uma netware. Para conseguir isso usei uma filosofia bem simples, por que arrombar a janela se abrir a porta da frente e mais facil e menos suspeito? Portanto ao inves de forcar a barra chamando a atencao do servidor e consequentemente do supervisor eu esperei pacientemente que o supervisor me entregasse sua password.
Apos verificar que os usuarios nao resetavam os micros apos a utilizacao eu me aproveitei dessa brecha e me instalei no teclado, armazenando a senha em uma area publica que criei.
Portanto segui o seguinte plano:
- cirava uma area publica acima de qualquer suspeita (distribuicao de shareware)
- me instalava na memoria;
- aguardava a execucao do arquivo LOGIN.EXE
- armazenava em um arquivo o nick e o pass
- "infectava" o login script dos usuarios inexperientes
LOCALIZANDO O EXECUTAVEL
Para aguardar a execucao do arquivo LOGIN.EXE foi preciso me instalar na INT 21h. A funcao 4Bh carrega e executa um programa na memoria:
INT 21 - DOS 2+ - "EXEC" - LOAD AND/OR EXECUTE PROGRAM
AH: 4Bh
AL: type of load
00h - load and execute
01h - load but do not execute (debugger)
03h - load overlay
04h - load and execute in background (European MS-DOS 4.0
only) "Exec & Go" (see also AH=80h)
DS:DX: ASCIIZ program name (must include extension)
ES:BX: parameter block (see below)
CX: mode (subfunction 04h only)
Format of EXEC parameter block for AL=00h,01h,04h:
Offset Size Description
00h WORD segment of environment to copy for child process (copy caller's environment if 0000h)
02h DWORD pointer to command tail to be copied into child's PSP
06h DWORD pointer to first FCB to be copied into child's PSP
0Ah DWORD pointer to second FCB to be copied into child's PSP
0Eh DWORD (AL=01h)
12h DWORD (AL=01h)
Apos detectar a chamada ao LOGIN.EXE existe a possibilidade do usuario (entenda-se lamer) ter digitado o nick na linha de comando, portanto foi preciso verificar a existencia de algum argumento e ja armazena-lo no arquivo de senhas.
TRATAMENTO DO TECLADO
Depois de digitar a linha de comando o usuarios tem que digitar o nick e o pass, ou simplesmente o pass. Ai entra a interrupcao 09h, essa interrupcao e' ativada por hardware atraves da IRQ 1 ativado pelo controlador do teclado. Quando a interrupcao do teclado e chamada um dado e colocado no port 60h, porem deixei o tratamento da interrupcao para o DOS e me preocupei somente com o que foi digitado. Portanto precisei tambem me instalar na INT 09h. No tratamento de chamda o DOS recupera o dado do controlador do teclado e o insere na lista circular do teclado ou nas flags de status e por ultimo re-habilita o controlador de interrupcao. O buffer do teclado segue o seguinte mapeamento:
40h:1Ah - POINTER TO NEXT CHARACTER IN KEYBOARD BUFFER (word)
40h:1Ch - POINTER TO FIRST FREE SLOT IN KEYBOARD BUFFER (word)
40h:1Eh - DEFAULT KEYBOARD CIRCULAR BUFFER (16 words)
1Ah 1Ch 1Eh 3Eh
++---++--++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--++
||OUT||IN|| | | | | CIRCULAR BUFFER | | | | | | ||
++---++--++--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--++
^ ^
IN OUT
O ponteiro OUT e o offset para a 1a tecla a ser retirado da lista. O ponteiro IN e o offset para o 1o espaco livre onde a INT 09h deve colocar a proxima tecla pressinada. Ja, o buffer circular contem 16 words cada representando o codigo da tecla e o caracter correspondente, respectivamente.
Quando um dado e inserido no Buffer Circular e verificado inicialmente se IN+2 e' igual a OUT, neste caso o buffer esta cheio e nao e inserido nenhum caracter, enquanto que o beep caracteristico e acionado. No caso do buffer nao estar cheio coloca-se os dados na posicao apontada por IN que entao e' incrementado duas vezes.
No caso de se retirar algo do buffer verifica-se se OUT e' igual a IN, neste caso o buffer esta vazio, e nao ha caracteres a se retirar. No caso do buffer nao estar vazio retira-se os dados na posicao apontada por OUT que entao e incrementado duas vezes.
NOTA: o incremento de ponteiros para buffers circulares deve se manter dentro dos limites do buffer, portanto ao se incrementar um ponteiro alem do limite superior do buffer deve-se retorna-lo ao inicio do buffer.
Nesse caso eu nao precisei inserir ou retirar nenhum tipo de dado do Buffer de teclado. O que foi feito foi ao ser chamada a INT 09h armazenei o valor do ponteiro IN e chamei a rotina antiga de tratamento de interrupcao, que incrementara o ponteiro IN do buffer no caso de ser tratar de uma tecla de caracter.
Apos chamar a rotina antiga eu vou verificar se foi inserido algo no buffer, se o ponteiro IN for diferente do antigo ponteiro IN leio o que foi inserido, e' o caracter que precisamos.
MANIPULACAO DE ARQUIVO
Bem, agora ja temos o tratamento da INT 21h e da INT 09h, falta agora a rotina de gravacao do arquivo. Para isso foi preciso a rotina de acesso a disco mais rapida e menor possivel, o que encontrei em C foram as rotinas em IO.H: open e relacionadas, por chamarem a interrupcao diretamente se encaixam perfeitamente nos requisitos necessarios.
Os serviÁos de interrupcao de manipulacao de arquivos sao:
INT 21 - DOS 2+ - "OPEN" - OPEN EXISTING FILE
AH: 3Dh
AL access and sharing modes
DS:DX: ASCIZ filename
CL: attribute mask of files to look for (server call only)
Return: if CF clear: SUCCESSFUL
AX: file handle
if CF set: ERROR
AX: error code
INT 21 - DOS 2+ - "CLOSE" - CLOSE FILE
AH: 3Eh
BX: file handle
Return: if CF clear: SUCCESSFUL
AX: destroyed
if CF set: ERROR
AX: error code
INT 21 - DOS 2+ - "READ" - READ FROM FILE OR DEVICE
AH: 3Fh
BX: file handle
CX: number of bytes to read
DS:DX: buffer for data
Return: if CF clear: SUCCESSFUL
AX: number of bytes read (0 if at EOF before call)
if CF set: ERROR
AX: error code
INT 21 - DOS 2+ - "WRITE" - WRITE TO FILE OR DEVICE
AH: 40h
BX: file handle
CX: number of bytes to write
DS:DX: data to write
Return: if CF clear: SUCCESSFUL
AX: number of bytes actually written
if CF set: ERROR
AX: error code
Antes de armazenar os dados no arquivo, deixe-os na memoria a espera de um enter, que provavelmente indicaria a execucao de um comando qualquer, e consequentemente um acesso a rede.
Para evitar bisbilhoteiros eu criptografei o arquivo de senhas, atraves de uma chave de um byte aplicada com XOR no arquivo. Recomendo funcoes que podem ser facilmente recuperadas, como ADD, SUB ou XOR, rapidas, simples e eficazes.
"Infeccao" do login-script
Logo apos conseguir uma senha podemos utilizar as informacoes de usuarios avanÁados e/ou importantes. Porem ainda existem aqueles usuarios que mal utilizam a rede. Aparentemente inuteis esses usuarios podem se tornar seus colaboradores, basta para isso inserir em seus login-script uma linha que execute seu arquivo, dessa forma em todos os computadores que esses usuarios logarem estarao aptos a robarem senhas para voce.
Ultimas Consideracoes
Preste muita atencao no nome em que colocara no executavel, como ele nao se esconde na memoria, portanto um MEM /C podera identificar um invasor (caso seja utilizado GETPASS.EXE), portanto deve-se utilizar nomes parecidos com drivers de rede, como VMS ou AIX, procure ler alguns livros de redes ethernet ou netware.
E' isso ai, me coloco a disposicao de duvidas!
MillyPad@hotmail.com.