監聽技術

監聽技術

監聽技術是一項竊聽技術,在網路中,當信息進行傳播的時候,可以利用工具,將網路接口設定在監聽的模式,便可將網路中正在傳播的信息截獲或者捕獲到,從而進行攻擊。 網路監聽在網路中的任何一個位置模式下都可實施行。

基本信息

而黑客一般都是利用網路監聽來截取用戶口令。比如當有人占領了一台主機之後,那么他要再想進將戰果擴大到這個主機所在的整個區域網路話,監聽往往是他們選擇的捷徑。很多時候我在各類安全論壇上看到一些初學的愛好者,在他們認為如果占領了某主機之後那么想進入它的內部網應該是很簡單的。其實非也,進入了某主機再想轉入它的內部網路里的其它機器也都不是一件容易的事情。因為你除了要拿到他們的口令之外還有就是他們共享的絕對路徑,當然了,這個路徑的盡頭必須是有寫的許可權了。在這個時候,運行已經被控制的主機上的監聽程式就會有大收效。不過卻是一件費神的事情,而且還需要當事者有足夠的耐心和應變能力。主要包括:
數據幀的截獲
對數據幀的分析歸類
dos攻擊的檢測和預防
IP冒用的檢測和攻擊
在網路檢測上的套用
對垃圾郵件的初步過濾

研究的意義

1)我國的網路正在快速發展中,相應的問題也就顯現出來,網路管理及相應套用自然將越發重要,而監聽技術正是網路管理和套用的基礎,其意義當然重要,放眼當前相關工具linux 有snort tcpdump ,snift 等,window 有nexray, sniffer等五一不是國外軟體,隨著中國網路的發展,監聽系統必將大有用武之地,因此監聽技術的研究已是時事的要求。
2)為什麼選擇linux作為環境?中國入世,各種針對盜版的打擊力度和對於正版軟體的保護力度都將大大加強,windows的盜版軟體隨處可見的現象將會一去不返,面對這樣的情況,大部分的公司只有兩種選擇:要么花大價錢向微軟購買正版軟體,要么是用自由作業系統linux,特別是重要部門,如國家機關,政府部門,難道要把自己的辦公系統操縱在國外大公司手裡?北京的政府辦公系統已經轉用紅旗linux,而且linux的界面也在不但的改進,更加友好易操作,我們有理由相信.linux將在我國大有作為,這也是研究Linux下網路監聽的原因。
關於Linux下網路監聽技術主要有兩個要點:
1)如何儘可能完整的截取網路上的數據幀,因為乙太網上每時每刻都可能有信息傳遞,而且根據乙太網的規模不同網路上的信息量也變化不大,所以截取數據幀不僅要保證數據幀的完整,而且還要考慮到如何才能減少漏截取數據幀。
2)就是對截取的數據幀的過濾分析,所謂監聽當然要“聽”得懂才行,所以把截取的數據幀翻譯成我們能用的數據,監聽才算成功。

網路監聽原理

Ethernet協定的工作方式是將要傳送的數據包發往連線在一起的所有主機。在包頭中包括有應該接收數據包的主機的正確地址,因為只有與數據包中目標地址一致的那台主機才能接收到信息包,但是當主機工作在監聽模式下的話不管數據包中的目標物理地址是什麼,主機都將可以接收到。許多區域網路內有十幾台甚至上百台主機是通過一個電纜、一個集線器連線在一起的,在協定的高層或者用戶來看,當同一網路中的兩台主機通信的時候,源主機將寫有目的的主機地址的數據包直接發向目的主機,或者當網路中的一台主機同外界的主機通信時,源主機將寫有目的的主機IP位址的數據包發向網關。但這種數據包並不能在協定棧的高層直接傳送出去,要傳送的數據包必須從TCP/IP協定的IP層交給網路接口,也就是所說的數據鏈路層。網路接口不會識別IP位址的。在網路接口由IP層來的帶有IP位址的數據包又增加了一部分以太禎的禎頭的信息。在禎頭中,有兩個域分別為只有網路接口才能識別的源主機和目的主機的物理地址這是一個48位的地址,這個48位的地址是與IP位址相對應的,換句話說就是一個IP位址也會對應一個物理地址。對於作為網關的主機,由於它連線了多個網路,它也就同時具備有很多個IP位址,在每個網路中它都有一個。而發向網路外的禎中繼攜帶的就是網關的物理地址。
Ethernet中填寫了物理地址的禎從網路接口中,也就是從網卡中傳送出去傳送到物理的線路上。如果區域網路是由一條粗網或細網連線成的,那么數位訊號在電纜上傳輸信號就能夠到達線路上的每一台主機。再當使用集線器的時候,傳送出去的信號到達集線器,由集線器再發向連線在集線器上的每一條線路。這樣在物理線路上傳輸的數位訊號也就能到達連線在集線器上的每個主機了。當數位訊號到達一台主機的網路接口時,正常狀態下網路接口對讀入數據禎進行檢查,如果數據禎中攜帶的物理地址是自己的或者物理地址是廣播地址,那么就會將數據禎交給IP層軟體。對於每個到達網路接口的數據禎都要進行這個過程的。但是當主機工作在監聽模式下的話,所有的數據禎都將被交給上層協定軟體處理。
當連線在同一條電纜或集線器上的主機被邏輯地分為幾個子網的時候,那么要是有一台主機處於監聽模式,它還將可以接收到發向與自己不在同一個子網(使用了不同的掩碼、IP位址和網關)的主機的數據包,在同一個物理信道上傳輸的所有信息都可以被接收到。
在UNIX系統上,當擁有超級許可權的用戶要想使自己所控制的主機進入監聽模式,只需要向Interface(網路接口)傳送I/O控制命令,就可以使主機設定成監聽模式了。而在Windows9x的系統中則不論用戶是否有許可權都將可以通過直接運行監聽工具就可以實現了。
在網路監聽時,常常要保存大量的信息(也包含很多的垃圾信息),並將對收集的信息進行大量的整理,這樣就會使正在監聽的機器對其它用戶的請求回響變的很慢。同時監聽程式在運行的時候需要消耗大量的處理器時間,如果在這個時候就詳細的分析包中的內容,許多包就會來不及接收而被漏走。所以監聽程式很多時候就會將監聽得到的包存放在檔案中等待以後分析。分析監聽到的數據包是很頭疼的事情。因為網路中的數據包都非常之複雜。兩台主機之間連續傳送和接收數據包,在監聽到的結果中必然會加一些別的主機互動的數據包。監聽程式將同一TCP會話的包整理到一起就相當不容易了,如果你還期望將用戶詳細信息整理出來就需要根據協定對包進行大量的分析。Internet上那么多的協定,運行進起的話這個監聽程式將會十分的大喔。
網路中所使用的協定都是較早前設計的,許多協定的實現都是基於一種非常友好的,通信的雙方充分信任的基礎。在通常的網路環境之下,用戶的信息包括口令都是以明文的方式在網上傳輸的,因此進行網路監聽從而獲得用戶信息並不是一件難點事情,只要掌握有初步的TCP/IP協定知識就可以輕鬆的監聽到你想要的信息的。前些時間美籍華人China-babble曾提出將望路監聽從區域網路延伸到廣域網中,但這個想法很快就被否定了。如果真是這樣的話我想網路必將天下大亂了。而事實上在廣域網裡也可以監聽和截獲到一些用戶信息。只是還不夠明顯而已。在整個Internet中就更顯得微不足道了。監聽的協定分析
我們的研究從監聽程式的編寫開始,用Linux C語言設計實現。

監聽剖析

乙太網上的數據幀主要涉及Tcp/ip協定,針對以下幾個協定的分析:IP,ARP,RARP,IPX,其中重點在於ip和 arp協定,這兩個協定是多數網路協定的基礎,因此把他們研究徹底,就對大多數的協定的原理和特性比較清楚了。 由於各種協定的數據幀個不相同,所以涉及很多的數據幀頭格式分析,接下來將一一描述。
在linux 下監聽網路,應先設定網卡狀態,使其處於雜混模式以便監聽網路上的所有數據幀。然後選擇用Linux socket 來截取數據幀,通過設定socket() 函式參數值,可以使socket截取未處理的網路數據幀,關鍵是函式的參數設定,下面就是有關的程式部分:
AF_INET=2 表示 internet ip protocol
SOCK_PACKET=10 表示 截取數據幀的層次在物理層,既不作處理。
htons(0x0003)表示 截取的數據幀的類型為不確定,既接受所有的包。
總的設定就是網卡上截取所有的數據幀。這樣就可以截取底層數據幀,因為返回的將是一個指向數據的指針,為了分析方便,我設定了一個基本的數據幀頭結構。
Struct etherpacket
{struct ethhdr eth;
structiphdrip;
struct tcphdr tcp;
char buff;
} ep;
將返回的指針賦值給指向數據幀頭結構的指針,然後對其進行分析。以下是有關協定的報頭:ethhdr 這是乙太網數據幀的mac報頭:
|48bit 目的物理地址 | 48bit 源物理地址 | 16bit協定地址|
相應的數據結構如下
struct ethhdr
unsigned char h_dest[ETH_ALEN];
unsigned char h_source[ETH_ALEN];
unsigned short h_proto;
其中h_dest是48位的目標地址的網卡物理地址,h_source 是48位的源地址的物理網卡地址。H_proto是16位的乙太網協定,其中主要有0x0800 ip,0x8035.X25,0x8137 ipx,0x8863-0x8864 pppoe(這是Linux的 ppp),0x0600 ether _loop_back ,0x0200-0x0201 pup等。Iphdr 這是ip協定的報頭:
由此可以定義其結構如下:
這是Linux 的ip協定報頭,針對版本的不同它可以有不同的定義,我們國內一般用BIG的定義,其中version 是ip的版本,protocol是ip的協定分類主要有0x06 tcp.0x11 udp,0x01 icmp,0x02 igmp等,saddr是32位的源ip地址,daddr是32位的目標ip地址。相應的數據結構:
struct arphdr {unsigned short int ar_hrd;
unsigned short int ar_pro;
unsigned char ar_hln;unsigned char ar_pln;
unsigned short int ar_op;#if 0unsigned char _ar_sha[ETH_ALEN];unsigned char _ar_sip;unsigned char _ar_tha[ETH_ALEN];unsigned char _ar_tip;#end if};
這是linux 的arp 協定報頭,其中ar_hrd 是硬體地址的格式,ar_pro協定地址的格式,ar_hln是硬體地址的長度,ar_pln時協定地址的長度,ar_op是arp協定的分類0x001是arp echo 0x0002 是 arp reply.接下來的分別是源地址的物理地址,源ip地址,目標地址的物理地址,目標ip地址。
Tcphdr ip協定的tcp協定報頭
以下是相應數據結構:
struct tcphdr
{u_int16_t source;
u_int16_t dest;
u_int32_tseq;
u_int32_t ack_seq;
# if _BYTE_ORDER == _LITTLE _ENDIANu_int16_t resl:4;
u_int16_t doff:4;u_int16_t fin:1;u_int16_t syn:1;
u_int16_t rst:1;u_int16_t psh:1;u_int16_t ack:1;
u_int16_t urg:1;u_int16_t res2:2;
#elif _BYTE _ORDER == _BIG _ENDIANu_int16_t doff:4;
u_int16_t res1:4;u_int16_t res2:2;u_int16_t urg:1;
u_int16_t ack:1;u_int16_t psh:1;u_int16_t rst:1;
u_int16_t syn:1;u_int16_t fin:1;
#else#error "Adjust your defines"#endifu_int16_t window;
u_int16_t check;u_int16_t urg_ptr;};
這是Linux 下tcp協定的一部分與ip協定相同取BIG,其中source是源連線埠,dest 是目的連線埠,seq是s序,ack_seq 是a序號,其餘的是tcp的連線標誌其中包括6個標誌:syn表示連線請求,urg 表示緊急信息,fin表示連線結束,ack表示連線應答,psh表示推棧標誌,rst表示中斷連線。window是表示接受數據視窗大小,check是校驗碼,urg ptr是緊急指針。
Udphdr 這是udp協定報頭
struct udphdr {u_int16_t source;
u_int16_t dest;u_int16_t len;u_int16_t check;}
這是Linux下ip協定中udp協定的一部分,結構很明顯 source 源連線埠,dest目的連線埠,len udp 長度,check 是校驗碼。
Icmphdr 這是ip協定的icmp協定的報頭
struct icmphdr{u_int8_t type;u_int8_t code;u_int16_t checksum;union{struct {u_int16_t id;u_int16_t sequence;} echo;u_int32_t gateway;struct{u_int16_t_unused;u_int16_t mtu;}frag;} un;};
這是linux下的ip協定中的icmp的協定,這裡面主要的是前兩項參數,其中type是icmp協定的類型,而code 則是對type類型的再分析。如:type 0x03 是表示unsearchable,這時code的不同表示了不同的unsearchable :0x00表示網路不可尋,0x01表示主機不可尋,0x02表示協定不可尋,0x03表示連線埠不可尋,0x05表示源路由失敗,0x06網路不可知,0x07主機不可知。
Igmphdr 這是ip協定的igmp協定報頭
struct igmphdr{ _u8 type;_u8 code;_u16 csum;_u32 group;};
這是Linux下的ip協定中的igmp協定,協定中主要是前面兩個屬性,Type表示igmp 協定的信息類型,code表示routing code. 然後,將截取的數據幀的地址賦值給定義的結構.由此可根據不同的結構分析數據,得到我們需要的信息。

相關詞條

相關搜尋

熱門詞條

聯絡我們