1 Kernel network Hacking Jon Ander Ortiz Durántez jonbaine[AT]gmail[DOT]com
2 Introducción ● Qué vamos a ver en la charla: – Estructura de la capa de red del kernel de linux. – Intercepción de tráfico de red. – Inyección de tráfico de red. – Detener el tráfico para la libpcap. – Sockets a nivel de kernel. –...
3 Estructura de la capa de red de linux. ● Vamos a ir desde abajo hacia arriba :D – Génesis: Un paquete de red llega a la interfaz de red (HW). Realiza procesamientos básicos. Si está en modo promiscuo, el fw de la tarjeta deja pasar los paquetes. Realiza una interrupción (bloquea que se puedan realizar nuevas interrupciones) HW que llama al driver de dicho dispositivo. – Driver: La interrupción HW llama a la función del driver (net_rx) que se encarga de: ● Reservar una estructura sk_buff.
4 Estructura de la capa de red de linux II. ● Copia del buffer de la tarjeta al sk_buff recién reservado los datos. Esto los drivers más cool lo hacen mediante DMA (Direct memory access) ● Invoca a netif_rx -> Que es el gestor genérico de paquetes. ● netif_rx, es el gestor de paquetes. – Encola en la CPU que está current. – desbloquea las interrupciones. – realiza una softirq NET_RX. ● net_rx_action es la función que se encarga de responder a la softipq de netif_rx. NET_R X
5 Estructura de la capa de red de linux III ● net_rx_action reparte el tráfico por los diferente “encargados de protocolos”: ip, arp... ● Aquí es donde se realizan varias acciones: – ptype_handlers – libpcap
6 ptype handlers ● Son los diversos protocolos que se encargan de llevar el tráfico a los de nivel superior. ● Hay dos tipos de ptype handlers: ptype_all (se registran a todos los paquetes) y los ptype_base, que solo se registran a un tipo concreto de paquetes. ● El funcionamiento: – Si hay protocolos ptype_all -> los llama primero.
7 ptype handlers – Si el paquete no es para la máquina en concreto y es para otra (forwarding), se llama a la función handle_bridged. – Si el paquete es para local, llama a los ptype_base -> típico ptype_base: ETH_P_IP, ETH_P_ARP... – Vamos a meter nuestro própio módulo escuchando a todos los paquetes ^^. ETH_P_
8 libpcap ● Libpcap funciona de la mísma manera que el módulo que hemos creado anteriormente, es decir, crea un nuevo handler de protocolo que se añade a todos los paquetes. ● Internamente aplica filtros BPF, y translada el tráfico a la zona de usuario. (Registra un tipo de sockets: PF_PACKET o SOCK_PACKET)
9 Subverting libpcap ● El código del protocolo (o tipo de socket) PF_PACKET, se encuentra en net/packet/af_packet.c ● En la función packet_rcv, es dónde se encuentra la recepción de los paquetes a la libpcap. ● ¿Queremos pwnearla? -> Técnica de Silvio Cesare. – ELEGANTE!!!!!
10 Pwning libpcap ● Ejemplo de como ownear una función no exportada en el kernel. – Dirección de la función a subvertir->problema. – System.map – kallsyms (ejemplo) – /dev/kmem ya no funciona :'( ● Sobreescribiendo la función: – Escribimos un mov XXXXXX eax; jmp eax; en la dirección de la función. – Ejemplo. – Problemas.
11 Injección de tráfico ● Inyectar tráfico permite desde el kernel inyectar paquetes creados a pelo por nosotros mísmos. ● Idea tomada del pktgen -> inyecta a pelo en el driver el paquete a enviar. ● Utilizando la hard_start_xmit. -> Operación que han de implementar todos los drivers de red.
12 Hooks netfilter ● Netfilter permite registrar hooks que analicen el tráfico de red. ● Ya han sido explicados en la charla del año pasado. ● Posiblidad de aumentar con infinitos módulos ^^. ● Posibilidad de añadir nuevas funcionalidades mediante modulos... ● Explicación de cómo añadir un nuevo módulo de netfilter. Ejemplillo cojo :S
13 Hooks netfilter ● Todo explicado en LINUX NETFILTER HACKING COMO ● para hacer uso desde iptables: – Realizar una librería con las funciones de iptables.h, para dar de alata el modulo – iptables -A -m ghost -> cargaría el módulo “ipt_ghost” ^^
14 Servidores en ring0 ● Se pueden abrir sockets desde un módulo del kernel. ● ¿útil? ¿? ● KHTTP -> Ha estado mucho tiempo. ● malignos ¿? ● Ejemplillo de un servidor de UDP en ring0.
15 Kernel network hacking PREGUNTAS Y TAL