ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Å -
Tunneling Por Trurl - Å
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
1.- Introducci¢n:
T‚cnicas de protecci¢n %
**************************************
Cuando uno hace virus se topa con tres
tipos de conocimientos
referentes a como
hacerlos: T‚cnicas de reproducci¢n, T‚cnicas de Ataque y
T‚cnicas de
protecci¢n. Las t‚cnicas de ataque son las que permiten al
virus mostrar su
presencia (o da¤ar), y no son muy interesantes, y la
mayor¡a de virus no
las usa. Las t‚cnicas de reproducci¢n incluyen todos
los conocimientos
relacionados con como y cuando infectar ("como infectar
EXE", "Como
hacer un fast infector" etc) que son tratadas en otros
art¡culos de esta
ilustre revista :-).
Las t‚cnicas de protecci¢n apuntan a
proteger el virus de sus
"enemigos
naturales": El usuario observador y El Antivirus. El Usuario
Observador amenaza la
vida del virus d ndose cuenta de su existencia en el
sistema (para luego
sacarlo). Algunas t‚cnicas de protecci¢n, entonces,
apuntan sencillamente
a hacer la presencia del virus poco visible, y un
ejemplo de esto es el
Directory-Stealth, t‚cnica que consiste sencillamente
en ocultar el size de
los archivos infectados en el comando DIR.
El Antivirus, segundo enemigo natural,
amenaza la vida del virus
d ndose cuenta
de la presencia del virus y avisando al usuario. Existen
muchos tipos de
t‚cnicas usadas para enga¤ar al Antivirus, entre ellas el
stealth y el
Tunneling.
2.- Tunneling %
***********
El tunneling apunta a proteger al virus
de los m¢dulos residentes de
los antivirus, que
monitorean todo lo que sucede en la maquina para
interceptar todas las
actividades "t¡picas" de los virus.
Para entender como funciona esta t‚cnica,
basta saber como trabaja
este tipo de
antivirus. El modulo residente queda colgado de todas las
interrupciones
usualmente usadas por los virus (INT 21, INT 13, a veces INT
25 Y 26) y entonces
cuando el virus intenta llamar a INT 21, por ejemplo,
para abrir un
ejecutable para lectura/escritura (y luego infectarlo), el
antivirus chilla,
pues los ejecutables no son normalmente abiertos, ni
menos para escritura.
Y as¡ con todas las llamadas t¡picas de los virus. En
cambio, cuando se
hace una llamada com£n y corriente, el antivirus no
chilla y la deja
pasar, llamando a la INT 21 original.
Un virus con tunneling, entonces, antes
de llamar a ninguna funci¢n ni
hacer nada, intenta
obtener el address absoluto de esta INT 21 original,
que esta en alguna
parte de la memoria del antivirus residente. Una vez que
obtiene este address,
accede al DOS por medio de el, sin llamar al
antivirus. Y as¡,
efectivamente, le "pasa por debajo", lo "tunelea". ¨Como
se hace esto?
2.1.- Tipos de
tunneling %
*********************
Existen dos formas fundamentales de
obtener este address. La primera,
y la mas usada, es
utilizando la interrupci¢n de trace (INT 1) y la trap
flag. (Que son usadas
por los DEBUGGERS) para atravesar el c¢digo orden a
orden hasta hallar lo
que se busca. La segunda, hacer un simple y llano
scanning del c¢digo,
byte a byte, hasta hallar el address.
La primera forma de tunneling es usada
por todos los virus que usan
esta t‚cnica, como
por ejemplo, el Predator II o el (ya viejo) Yankee
Doodle. La segunda no
se usa en ning£n virus, pero es la que usa Kohntark
en su celebre
Kohntark Recursive Tunneling Toolkit. Pasemos a los detalles
t‚cnicos...
2.2.- La referencia
%
***************
Antes de ponerse a buscar, por cualquiera
de los dos m‚todos, es
necesario obtener el
segmento del DOS, para poder ir comprobando a medida
que se encuentren
addresses si son o no el de la INT 21. Hay varias formas
de obtener el
segmento de DOS antes de empezar a "tunelear". Una de ellas
es obtener las INTs
internas del DOS y ver cual es su segmento (Usada en la
KRTT). Otra es llamar
a la funci¢n (no documentada) del sistema, funci¢n
1203h, interrupci¢n
2Fh. El Yankee Doodle sencillamente considera que todo
segmento menor a 300h
es el de la INT 21. Todos estas formas son validas,
con sus pros y sus
contras, a saber:
Ints internas: El obtener los segmentos
de las INTS internas es seguro
en la mayor¡a de los
casos, pero ¨que pasar¡a si estos segmentos son
distintos entre si?
Esto querr¡a decir que alguna de las INTs fue capturada
por alg£n programa, y
no se podr¡a tunelear. Y lo que es peor, podr¡a
suceder que TODAS las
ints internas del dos estuvieran capturadas, con lo
cual el virus
considerar¡a que el segmento del DOS es el segmento del
programa que capturo
las INTS sin darse cuenta de nada! (Fatal! ARGH!)
Funci¢n 1203, INT 2F: Esta es una funci¢n
No-Documentada del DOS, que
retorna el DS del
sistema. Un punto en contra es precisamente que sea no
documentada, ya que
podr¡a dejar de aparecer en futuras versiones de DOS.
(Adem s podr¡a
ser capturada, aunque no lo creo, porque es interna).
Segmento DOS < 300: Es efectiva, pero
podr¡a suceder que en
determinadas
configuraciones fuera mayor a 300. Es un dato "de hecho", en
ning£n lugar esta
documentado, pero siempre es menor. Sin embargo, quien
sabe en futuros DOS,
en futuras configuraciones, lo que podr¡a pasar.
Ahora veamos, esas t‚cnicas...
2.1.1.- Trace
Tunneling %
*****************
Para entender la primera t‚cnica basta
una breve explicaci¢n de como
funciona un debugger.
Para hacer un sencillo trace, en un debugger ('T' en
DEBUG y F7 en Turbo
Debugger) primero se prende la "trap flag". Esta flag
es el primer bit del
byte mas alto del registro de flags (flags=100h). No
hay ordenes para
prenderla, por lo que se lo debe hacer manipulando un
poco. Este c¢digo
enciende la flag:
pushf
pop ax
or ax, 100h
push ax
popf
Cuando esta encendida esta flag, cada vez
que se ejecuta una
instrucci¢n, la INT 1
es llamada. Entonces el DEBUGGER tiene interceptada
esta interrupci¢n, y
manipula todo para suspender la ejecuci¢n y volver al
debugger. De este
modo, se ejecuta UNA instrucci¢n y se vuelve al prompt
del debugger.
¨Como sirve esto al tunneling? Pues es
sencillo: el virus enciende la
trap flag y llama a
la INT 21 (osea, al antivirus que esta colgado de la
int 21 :-)). Y
recordemos que al llamar a una INT (la INT 1 en este caso,
que es llamada luego
de ejecutada cada instrucci¢n) quedan en la stack seis
bytes: las flags, y
el CS:IP de retorno. La rutina de INT 1 del virus se
fija cada vez que es
llamada en ese CS que queda en la stack, y si es igual
al del DOS (que tiene
de antes), entonces apaga la trap flag y guarda el
CS:IP, pues este es
el addres de la INT 21 "posta". Y el laburo ya esta
hecho...
He aqu¡ una rutina basica y tipica de INT
1 para tunneling:
NewInt1:
push bp
mov bp, sp
push dx
mov dx, cs:DosSegm
cmp [bp+6], dx
jz Found
pop dx
pop bp
iret
Found:
mov dx, [bp+6]
mov cs:OldInt21+2, dx
mov dx, [bp+4]
mov cs:OldInt21, dx
pop dx
pop bp
add sp, 6
...
2.1.1.1.- Flaquezas
del trace tunneling %
******************************
El problema mayor del trace es que
REALMENTE se esta ejecutando el
c¢digo del antivirus.
Esto da lugar a muchos problemas, como por ejemplo,
que el antivirus
deshabilite interrupciones con CLI o poniendo a OFF la
TRAP FLAG. O que
reemplace la rutina en INT 1 por una rutina "dumb".
Otro tema es que el trace no inspecciona
las INTs por adentro. Es
decir, ejecuta la
INT, pero no la tracea. Por ejemplo:
mov ax, 1 ; ok, trace
mov bx, 2 ; sigue el trace
int 25h
; pero ac no tracea la int 25 por adentro, sino
nop
; que viene ac , al NOP.
Esto hace que si el antivirus
redireccion¢ la INT 21 a otra INT sin
usar, y la usa
llamando a esta nueva INT, te jode. (Por ejemplo, copio el
addres de INT 21 a
INT 60, y llama a INT 60 para hacer sus llamadas).
Cabe observar, sin embargo, que en
principio uno tiene cierto control.
Uno podr¡a fijarse,
desde la rutina de INT 1, si la pr¢xima orden es un CLI
y saltearlo. Pero
esto deberia hacerse con un mont¢n mas de otras cosas, y
presumiblemente
ocasionar¡a que la maquina se cuelgue en muchos casos. (Por
ejemplo, saltearse un
CLI hecho antes de que se haga un cambio de stack
seria fatal)
2.1.2.- Byte-to-Byte
scanning: KRTT %
*****************************
El KRTT es el £nico en el caso de
scanning byte-a-byte. Este consiste
en sencillamente en
buscar byte a byte hasta encontrar instrucciones que
entreguen el control
a rutinas remotas (FAR). Osea, se scanea buscando los
c¢digos maquina de
las siguientes instrucciones:
JMP FAR XXXX:XXXX ; (n¢tese que estos no son las £nicas)
CALL FAR XXXX:XXXX ; (instrucciones para pasar el control)
CALL FAR CS:VVVV ; (a rutinas FAR. Es una de las)
JMP FAR CS:VVVV ; (flaquezas del KRTT)
Cuando se encuentran estos
c¢digos-maquina, se toman los addreses a
los que se quiere
pasar el control, y se compara con el segmento del DOS.
Si son iguales, se
encontr¢ la INT 21 original. Si no, se sigue scaneando
desde ah¡.
2.1.2.1.- Flaquezas
del scaning byte a byte %
***********************************
Parece muy sencillo, pero la rutina,
necesariamente, tiene que ser
recursiva.
Adem s, tiene el problema de que se scanea siempre hacia
adelante, y no se
sigue el flujo de control; (seria f cil seguirlo si se
encuentra un JMP NEAR
o CALL NEAR, pero ¨que hacer con un JZ o cualquier
otro condicional?)
esto produce que si el JMP o CALL a la int 21 se
encuentra ANTES del
punto de entrada de la INT del antivirus, el tunneling
falla.
Adem s hay otras formas de entregar
el control a una rutina remota,
como por ejemplo: con
RETF. Seria _muy_ dif¡cil, por no decir imposible,
que un tunneling con
scaning pudiera seguir con ‚xito QUE esta pasando en
la stack, como para
poder considerar un RETF. En el KRTT ni siquiera esta
contemplado, y sin
embargo es tan f cil entregar el control con RETF...
Y otra fuerte falla del scanning byte a
byte es que si por casualidad
pasa sobre una zona
de datos, que por una de esas cosas del destino
contiene, como dato,
el c¢digo binario de una de las instrucciones de
entrega de control,
el scanning la tomar¡a como instrucci¢n, aunque es
dato. Esto es
imposible de evitar en este tipo de tunneling.
2.2.- Problemas
Generales del Tunneling %
**********************************
Pero el problema principal del tunneling
es que aun teniendo ‚xito en
obtener la INT 21
posta, se pueden tener problemas si hay alg£n residente
importante y uno lo
esta pasando por debajo. Es famoso ya el caso del
Predator II y el
DoubleSpace. El predator II tuneleaba por debajo del
DoubleSpace y trataba
de acceder al disco directamente por DOS. Esto
produjo que trasheara
mas de un disco (:-)). En definitiva, esto es
contrario a las
intenciones del tunneling, pues el usuario no necesita que
el antivirus le diga
que tiene virus: se da cuenta solo al ver que su disco
esta hecho pur‚.
(JA!).
2.3.- Conclusi¢n
%
************
Espero que les haya sido de utilidad. El
tunneling es una t‚cnica
bastante buena, y al
mismo tiempo sencilla (mucho mas sencilla que
polimorfismo o
stealth, por ejemplo), y sin embargo no es tan usada. Vamos
muchachos, p¢nganse
las pilas, que con 50 bytes tienen un tunneling (medio
truch¢n, pero bueno
:-))!
Para ayudarlos, les prometemos los
sources de la KRTT, y del Yankee
Doodle, comentados,
para que tengan buenos ejemplos. Y por ahi, tambien el
del Predator II.
Hasta la pr¢xima...
Trurl, el gran constructor.Minotauro Magazine