Copy Link
Add to Bookmark
Report
Minotauro Magazine Issue 05 02 Tunneling
Minotauro Magazine Issue #5
Tunneling
Por Trurl
% Introducci¢n: Tcnicas de protecci¢n %
Cuando uno hace virus se topa con tres tipos de conocimientos
referentes a como hacerlos: Tcnicas de reproducci¢n, Tcnicas de Ataque y
Tcnicas de protecci¢n. Las tcnicas 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 tcnicas 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 tcnicas 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 tcnicas de protecci¢n, entonces,
apuntan sencillamente a hacer la presencia del virus poco visible, y un
ejemplo de esto es el Directory-Stealth, tcnica 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 tcnicas usadas para enga¤ar al Antivirus, entre ellas el
stealth y el Tunneling.
% 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 tcnica, 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?
% 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 tcnica, 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
tcnicos...
% La referencia %
Antes de ponerse a buscar, por cualquiera de los dos mtodos, 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 tcnicas...
% Trace Tunneling %
Para entender la primera tcnica 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
...
% 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)
% 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¡.
% 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.
% 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!).
% Conclusi¢n %
Espero que les haya sido de utilidad. El tunneling es una tcnica
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.