Liber 000 - Astrum Argentum

Liber 000 - Astrum Argentum Liber 000 - Astrum Argentum

astrumargentum.org
from astrumargentum.org More from this publisher
01.01.2013 Views

Compreendendo o netfilter: Quando comecei a ler do documento do bioforge, tinha uma expectativa, que foi muito mais do que suprida! Trabalhar com o netfilter abre todo um leque de opções em relação ao hacking, e agiliza muito o desenvolvimento da camada de networking dentro de um rootkit. Basicamente ele trabalha muito parecido com o iptables, então se vc conhecer um pouco do iptables, de linguagem C, e de desenvolvimento de módulos, vc ja esta bem encaminhado e não terá muitos problemas para compreender o que vou mostrar aqui. Bom algo interessante de se saber é que quando vc esta trabalhando com o iptables, vc ja esta mexendo com o netfilter mas nem sabe hehehehehe, entre outras coisas o iptables constrói e insere hoks dentro do netfilter da mesma forma que faremos aqui. :) Primeiro pra quem não conhece o iptables, vamos responder uma pergunta que talvez estejam se fazendo: O que é uma hok? Uma hok(neste caso), é um momento em que o pacote pode ser analisado e uma função que é disparada para a analise ou alteração do pacote. Um exemplo é o seguinte (válido para ipv4): Um pacote atravessando o Netfilter: --->[1]--->[ROUTE]--->[3]--->[4]---> | ^ | | | [ROUTE] v | [2] [5] | ^ | | v [ROUTE] | Fig.1 Arquitetura do netfilter. Peguei este desenho "emprestado" do site do netfilter.org hehehehe :D. Bom podemos considerar 5 hoks neste desenho: 1. NF_IP_PREROUTING = Esta primeira "hok" é conhecida como NF_IP_PRE_ROUTING, como vc ja deve ter notado pelo próprio nome, ela é disparada logo após a checagem de validade do pacote(checksums, um 110

pacote não-promiscuo, etc), e antes do roteamento do mesmo. Acontece neste momento o roteamento do pacote, a decisão se ele é um pacote destinado a esta máquina ou se este pacote irá apenas atravessar a máquina passando para outra interface. 2. NF_IP_LOCAL_IN = Caso o pacote sejam destinados a esta máquina, este pacote é considerado como um pacote entrante, e é tratado pela hok de NF_IP_LOCAL_IN. 3. NF_IP_FORWARD = Caso o pacote não seja endereçado na máquina mas sim routeado pela mesma repassado para outra interface(haverá repasse do pacote), ele será tratado por esta hok NF_IP_FORWARD. 4. NF_IP_POST_ROUTING = Caso o pacote esteja sendo repassado, esta hok será disparada antes dele ser enviado novamente a rede. 5. NF_IP_LOCAL_OUT = Caso o pacote seja gerado pela máquina, esta hok será disparada antes que ele seja enviado para a rede, fiz uma pequena alteração no desenho, como no próprio site do netfilter diz (http://www.netfilter.org/documentation/HOWTO//netfilter-hacking- HOWTO-3.html ) o roteamento acontece antes desta hok, para obter o endereço de origem do pacote, e fazer outras operações. Podemos conhecer as hoks do netfilter olhando em linux/netfilter_ipv4.h, vamos dar uma olhadinha num pedaço deste header: /* IP Hoks */ /* After promisc drops, checksum checks. */ #define NF_IP_PRE_ROUTING 0 /* If the packet is destined for this box. */ #define NF_IP_LOCAL_IN 1 /* If the packet is destined for another interface. */ #define NF_IP_FORWARD 2 /* Packets coming from a local process. */ #define NF_IP_LOCAL_OUT 3 /* Packets about to hit the wire. */ #define NF_IP_POST_ROUTING 4 A função responsável pela nossa hok: Vcs viram que podemos manipular um determinado pacote em certos momentos dentro do netfilter, mas pense bem como vamos manipula-lo? Bem quando chegar neste momento o netfilter "chamará" automaticamente uma função que registraremos dentro de nossa hok. Vamos ver a declaração desta nossa função, conforme ~/linux/netfilter.h: typedef unsigned int nf_hokfn(unsigned int hoknum, 111

pacote não-promiscuo, etc), e antes do roteamento do mesmo.<br />

Acontece neste momento o roteamento do pacote, a decisão se ele é um<br />

pacote destinado a esta máquina ou se este pacote irá apenas atravessar<br />

a máquina passando para outra interface.<br />

2. NF_IP_LOCAL_IN = Caso o pacote sejam destinados a esta máquina,<br />

este pacote é considerado como um pacote entrante, e é tratado pela hok<br />

de NF_IP_LOCAL_IN.<br />

3. NF_IP_FORWARD = Caso o pacote não seja endereçado na máquina<br />

mas sim routeado pela mesma repassado para outra interface(haverá<br />

repasse do pacote), ele será tratado por esta hok NF_IP_FORWARD.<br />

4. NF_IP_POST_ROUTING = Caso o pacote esteja sendo repassado, esta<br />

hok será disparada antes dele ser enviado novamente a rede.<br />

5. NF_IP_LOCAL_OUT = Caso o pacote seja gerado pela máquina, esta hok<br />

será disparada antes que ele seja enviado para a rede, fiz uma pequena<br />

alteração no desenho, como no próprio site do netfilter diz<br />

(http://www.netfilter.org/documentation/HOWTO//netfilter-hacking-<br />

HOWTO-3.html ) o roteamento acontece antes desta hok, para obter o<br />

endereço de origem do pacote, e fazer outras operações.<br />

Podemos conhecer as hoks do netfilter olhando em linux/netfilter_ipv4.h,<br />

vamos dar uma olhadinha num pedaço deste header:<br />

/* IP Hoks */<br />

/* After promisc drops, checksum checks. */<br />

#define NF_IP_PRE_ROUTING 0<br />

/* If the packet is destined for this box. */<br />

#define NF_IP_LOCAL_IN 1<br />

/* If the packet is destined for another interface. */<br />

#define NF_IP_FORWARD 2<br />

/* Packets coming from a local process. */<br />

#define NF_IP_LOCAL_OUT 3<br />

/* Packets about to hit the wire. */<br />

#define NF_IP_POST_ROUTING 4<br />

A função responsável pela nossa hok:<br />

Vcs viram que podemos manipular um determinado pacote em certos<br />

momentos dentro do netfilter, mas pense bem como vamos manipula-lo?<br />

Bem quando chegar neste momento o netfilter "chamará"<br />

automaticamente uma função que registraremos dentro de nossa hok.<br />

Vamos ver a declaração desta nossa função, conforme<br />

~/linux/netfilter.h:<br />

typedef unsigned int nf_hokfn(unsigned int hoknum,<br />

111

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!