国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

利用LLKM處理網絡通信---對抗IDS、Firewall

2019-11-17 05:35:05
字體:
來源:轉載
供稿:網友

  ★ 前言

事實上我并沒有翻譯Phrack 55-12,它的文字如此之少,當然必須承認其中閃爍
的聰明之光。閱讀lifeline < mailto: arai@hackers-pt.org >的程序,它就在文章
里,然后再來看這篇文章。

★ 目錄

1. IDS、Firewall的某些特性
2. LLKM能做什么
3. 一個完整的LLKM例子,簡單、臨時改變TCP/ip協議棧的行為
4. 獲取TCP自動機狀態,更改出現在網絡傳輸線路上的TCP標志位
5. 另外一種截留本機發送報文、修改、再發送技術
6. 內核模塊里設置混雜模式
7. 內核模塊里文件I/O操作
8. 內核包轉發的討論

★ 正文

1. IDS、Firewall的某些特性

以snort為例,其大量IDS規則對TCP的PSH、ACK、SYN標志進行判定。比如,在
syn-flood告警中,判定短時間內出現的大量SYN包。而更多的對TCP數據區進行內容
鑒別前,判定了PSH+ACK標志。具體snort規則請參看snort源代碼包中舉例。

Firewall阻塞來自外部的TCP連接請求時,需要判定SYN標志。

IDS和Firewall還有個更重要的通性,對端口的敏感性。21、23、110、513等端
口都屬于敏感端口,許多告警規則、阻塞規則是基于端口的。

2. LLKM能做什么

利用LLKM簡單、臨時改變TCP/IP協議棧的行為??紤]三種情況:

a. 更改出現在網絡傳輸線路上的TCP標志位
b. 更改出現在網絡傳輸線路上的端口
c. 對IP數據區(TCP協議部分)加密處理后傳輸



A Host ----+----- firewall -----+---- B Host
(內部) (外部)

C Host(IDS系統) D Host(普通Sniffer)


假設A和B都是我們控制的主機,在這兩臺主機上都加載LLKM。防火墻不答應來自
外部的任何TCP連接請求,它靠的是判定SYN標志?,F在B想telnet到A,LLKM將把B到A
的SYN標志換成ACK、PSH、RST、RES1、RES2中的任意一個或者幾個的組合,以能滲透
通過防火墻為原則;A上的LLKM先于正常的TCP/IP協議棧接收到這個扭曲處理了的請
求報文,按照約定好的規則逆向處理,恢復SYN標志后再交給正常的TCP/IP協議棧處
理。同樣,A回送SYN+ACK到B的時候,也做一些轉換,B上LLKM會恢復成正常的
SYN+ACK。對于A、B上的TCP/IP協議棧,它們意識不到發生過轉換,用netstat -na看
到的還是正常的、意料中的狀態。對于防火墻,意識不到已經從外部主機成功訪問了
內部主機。對于C、D,會看到希奇的TCP標志出現。在做標志轉換時,還需要考慮對
抗IDS規則,因具體情況而定。比如,避免在網絡傳輸中出現PSH+ACK標志。

防火墻和IDS對端口相當敏感,比如不答應telnet、FTP協議通過,只答應http協
議通過。要做的僅僅是讓A、B把23端口換成80端口出現在網絡傳輸中??赡苡腥苏J為
修改雙方的/etc/services文件更好些,當然,那也是一種可行的考慮。不過有太多
情況下利用LLKM動態修改端口更徹底更靈活。至于IDS,對于大多數非周知端口并不
敏感,意味著逃脫了監測。

最后要做的就是對IP數據區進行加密傳輸,IPSec能做到,可我需要的可能僅僅
是異或處理,僅僅是避開IDS的端口監測、內容監測。一個簡單的insmod就能完成的
任務為什么一定要搬出IPSec呢。

3. 一個完整的LLKM例子,簡單、臨時改變TCP/IP協議棧的行為

例子程序的想法來自華中地區網絡中心(bbs.whnet.edu.cn)Security版的
difeijing朋友,同時感謝AngelFalls朋友參與該版討論,并提供了八篇謝絕轉站的
<<linux的TCP/IP協議棧閱讀筆記>>。

程序演示了

a. LLKM的基本框架和技巧
b. 利用dev_add_pack()對本機即將發送出去的報文進行修改再發送

syn半開掃描依靠于被掃描主機返回ACK+RST標志和ACK+SYN標志兩種情況,前者
意味著相應端口未開。connect掃描則完全依靠TCP連接的成功建立。difeijing提出

了這樣一個想法,利用LLKM轉換ACK+RST成ACK+SYN,此時syn半開掃描和connect掃描
都將認定相應端口是打開的。

--------------------------------------------------------------------------
/*
* File : openallport.c
* Author : scz < mailto: scz@nsfocus.com >
* : http://www.nsfocus.com
* Kernel : 2.2.16 or 2.2.14
* Complie : gcc -O3 -DMODULE -D__KERNEL__ -c openallport.c
* Usage : insmod openallport.o [dev=eth0] -x -y -f
* Date : 2000-10-10 17:40
*/

#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>
#include <linux/netdevice.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/tcp.h>

/*
* 2.2.16內核的/usr/include/linux/version.h文件里定義了這個宏
* 但2.0.35內核里沒有定義
*/
#ifndef KERNEL_VERSION
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
#endif

#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)
#include <asm/uaccess.h>
#endif

static strUCt device * openallport_dev = NULL;
static char * dev = NULL;

/* 定義insmod命令行參數 */
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)
MODULE_PARM( dev, "s" );
#endif

static inline u_long csum_tcpudp_nofold ( u_long saddr, u_long daddr,
u_short len, u_short PRoto,
unsigned int sum )
{
__asm__
("
addl %1, %0
adcl %2, %0
adcl %3, %0
adcl $0, %0
"
: "=r" ( sum )
: "g" ( daddr ), "g" ( saddr ), "g" ( ( ntohs( len ) << 16 ) + proto * 256 ), "0" ( sum )
);
return sum;
}

static inline unsigned int csum_fold ( unsigned int sum )
{
__asm__
("
addl %1, %0
adcl $0xffff, %0
"
: "=r" ( sum )
: "r" ( sum << 16 ), "0" ( sum & 0xffff0000 )
);
return( ( ~sum ) >> 16 );
} /* end of csum_fold */

static inline u_short check_tcpudp ( u_long saddr, u_long daddr,
u_short len, u_short proto,
unsigned int sum )
{
return( csum_fold( csum_tcpudp_nofold( saddr, daddr, len, proto, sum ) ) );
} /* end of check_tcpudp */

int openallport_rcv ( struct sk_buff * skb, struct device * dv, struct packet_type * pt )

{
/* 注重pkt_type是什么 */
if ( ( skb->pkt_type == PACKET_OUTGOING ) && ( skb->protocol == __constant_htons( ETH_P_IP) ) )
{
if ( ( skb->nh.iph->version == 4 ) && ( skb->nh.iph->protocol == IPPROTO_TCP ) ) /* 不考慮ipv6 */
{
skb->h.raw = skb->nh.raw + ( skb->nh.iph->ihl << 2 );
if ( ( skb->h.th->ack == 1 ) && ( skb->h.th->rst == 1 ) )
{
u_short size;
int doff = 0;

skb->h.th->rst = 0;
skb->h.th->syn = 1;
size = ntohs( skb->nh.iph->tot_len ) - ( skb->nh.iph->ihl * 4 ); /* IP數據區長度 */
doff = skb->h.th->doff << 2; /* TCP頭部長度 */
/* 重新計算校驗和 */
skb->csum = 0;
skb->csum = csum_partial( skb->h.raw + doff, size - doff, 0 ); /* data checksum */
skb->h.th->check = 0;
skb->h.th->check = check_tcpudp( skb->nh.iph->saddr, /* tcp or udp checksum */
skb->nh.iph->daddr,
size,
IPPROTO_TCP,
csum_partial( skb->h.raw, doff, skb->csum ) );
}
}
}
kfree_skb( skb );
return( 0 );
} /* end of openallport_rcv */

static struct packet_type openallport_packet_type =
{
__constant_htons( ETH_P_ALL ), /* 此時可以接收到來自lo的回送報文,比如本機發送出去的 */
NULL, /* All devices */
openallport_rcv,

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东乡族自治县| 邢台县| 麻城市| 白河县| 广安市| 共和县| 舞钢市| 土默特左旗| 渑池县| 峨眉山市| 渝北区| 兴义市| 泌阳县| 德保县| 江西省| 项城市| 五原县| 邓州市| 体育| 福安市| 温泉县| 台安县| 瑞丽市| 乌兰浩特市| 富平县| 青铜峡市| 阳朔县| 新巴尔虎右旗| 四川省| 灯塔市| 凌源市| 玉树县| 南昌县| 隆林| 仁寿县| 枣强县| 宣城市| 普格县| 紫云| 定日县| 高阳县|