亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Perl > 正文

perl實現簡單的NIDS的方法

2020-02-23 19:45:11
字體:
來源:轉載
供稿:網友

隨著網絡安全的深入發展,基于網絡的入侵檢測技術已成為一個重要而有趣的研究方向,為了學習NIDS技術,最好的方法是自己編寫一個NIDS程序,只有這樣,我們才能真正體會到一些NIDS的實現要求和設計優勢。

本質上說NIDS只是一種網絡流量的分析工具,通過對網絡流量的分析識別出一些已知或未知的攻擊行為,一個最簡單的NIDS完成的主要工作也就是抓包->協議解碼->匹配,眾所周知PERL是極其強大的腳本語言,尤其是它的字符串處理能力可以方便地實現對于網絡流量中惡意特征進行匹配。當然PERL畢竟只是腳本語言,它的執行效率不允許用于真正大流量生產性環境,但PERL的簡單易學及強大功能對于實現一個簡單的NIDS達到學習的目的無疑是非常好的,下面我介紹一個用PERL實現的簡單NIDS框架,我們將在Linux下實現它,在其他操作系統上類似。

PERL的一個強大特性就在于它海量的CPAN模塊庫,很多你想實現的功能都可以找到現成的模塊,你所要做的只是安裝上那些模塊即可,關于PERL的模塊及面向對象特性的管理和使用在這就不介紹了,請參看相關資料,比如O'REILLY出版的《高級Perl編程》。在用PERL編寫網絡流量分析腳本之前,需要安裝一些底層的抓包及基本的數據包解碼模塊,包括如下這些:
http://www.tcpdump.org/release/libpcap-0.8.1.tar.gz
底層基本的抓包庫。

http://www.cpan.org/authors/id/T/TI/TIMPOTTER/Net-Pcap-0.04.tar.gz
libpcap的PERL接口。

http://www.cpan.org/authors/id/T/TI/TIMPOTTER/Net-PcapUtils-0.01.tar.gz
Net-Pcap模塊的wrapper,包裝Net-Pcap的函數,可以更方便地在PERL里調用抓包。

http://www.cpan.org/authors/id/T/TI/TIMPOTTER/NetPacket-0.03.tar.gz
用于基本的IP/TCP/UDP等包解碼的模塊,剝除各種協議頭,抽取各個字段。

下面的代碼演示了一個帶有基本SMB和FTP協議解碼模塊的最簡單NIDS框架,此程序實現最簡單的NIDS功能,面向單包,不關心包的狀態,不具備高級的商業NIDS產品諸如流重組,包狀態及應用層協議的跟蹤等功能。為了提高檢測的準確性,與Snort直接匹配數據區不同的是,這個腳本實現了兩個應用層協議:SMB、FTP的簡單解碼,解碼完全是面向NIDS的需要,代碼也沒有經過仔細的測試可能存在問題。

(一)perl-ids.pl 實現抓包及檢測分析的主程序。
?

?

#!/usr/bin/perl
#
# Comments/suggestions to stardust at xfocus dot org
#
#
# $Id: perl-ids.pl,v 1.16 2004/03/04 21:51:12 stardust Exp $
#
# 引用所有相關的模塊
use Net::PcapUtils;
use NetPacket::Ethernet qw(:strip);
use NetPacket::TCP;
use NetPacket::IP qw(:protos);
use NetPacket::SMB;
use NetPacket::FTP;
# 定義日志文件名
$workingdir = "./";
$attacklog = "attack.log";
$monitorlog = "monitor.log";
# 以后臺進程方式運行
daemon ();
sub daemon {
unless (fork) {
SniffLoop ();
exit 0;
}
exit 1;
}
# 抓包循環
sub SniffLoop {
# 進入工作目錄
chdir ("$workingdir");
# 打開日志文件
open (ATTACKLOG,">> $attacklog");
open (MONITORLOG,">> $monitorlog");
# 設置文件讀寫為非緩沖模式
select(ATTACKLOG); $ ++; select(MONITORLOG); $ ++; select(STDOUT); $ ++;
# 設置信號處理函數,因為程序運行于后臺,退出時需要利用信號處理函數做些清理工作
$SIG{"INT"} = 'HandleINT';
$SIG{"TERM"} = 'HandleTERM';
# 進入抓包回調函數
Net::PcapUtils::loop(&sniffit, SNAPLEN => 1800, Promisc => 1, FILTER => 'tcp or udp', DEV => 'eth0');
}
sub sniffit {
my ($args,$header,$packet) = @_;
# 解碼IP包
$ip = NetPacket::IP->decode(eth_strip($packet));
# TCP協議
if ($ip->{proto} == IP_PROTO_TCP) {
# 解碼TCP包
$tcp = NetPacket::TCP->decode($ip->{data});
# 檢查來自SMB客戶端的包
if (($tcp->{dest_port} == 139)    ($tcp->{dest_port} == 445)) {
# 如果目的端口是139或445,認為是SMB協議包,做相應的檢查
SmbClientCheck ($ip->{src_ip},$tcp->{src_port},$ip->{dest_ip},$tcp->{dest_port},$tcp->{data});
} elsif ($tcp->{dest_port} == 21) {
# 如果目的端口是21,認為是FTP協議,做相應的檢查
FtpClientCheck ($ip->{src_ip},$tcp->{src_port},$ip->{dest_ip},$tcp->{dest_port},$tcp->{data});
} else {}
# UDP協議
} elsif ($ip->{proto} == IP_PROTO_UDP) {
} else {}
}
sub SmbClientCheck {
my ($src_ip,$src_port,$dest_ip,$dst_port,$data) = @_;
# 調用SMB解碼模塊解碼
$smb = NetPacket::SMB->decode($data);
# 如果解碼成功
if ($smb->{valid}) {
# 示例檢測新近公布eeye的那個ASN.1解碼錯誤導致的堆破壞漏洞
# BID:9633,9635 CVEID:CAN-2003-0818 NSFOCUSID:6000
# 如果SMB命令是Session Setup AndX
if ($smb->{cmd} == 0x73) {
# 如果設置了Extended Security Negotiation位,表示有包里有Security Blob
if ($smb->{flags2} & F2_EXTSECURINEG) {
# 用正則表達式匹配通常會在攻擊包里出現的OID及引發錯誤的畸形數據串
# 由于不是從原理上檢測加之ASN.1編碼的靈活性,這樣的檢測會導致漏報
if (($smb->{bytecount} > 0) && ($smb->{bytes} =~ m/x06x06x2bx06x01x05x05x02.*[xa1x05x23x03x03x01x07 x84xffxffxff]/)) {
# 記入日志文件
LogAlert ($src_ip,$src_port,$dest_ip,$dst_port,"ASN.1 malform encode attack!");
}
}
}
}
}
sub FtpClientCheck {
my ($src_ip,$src_port,$dest_ip,$dst_port,$data) = @_;
# 調用FTP解碼模塊解碼
$ftp = NetPacket::FTP->decode($data);
# 如果解碼成功
if ($ftp->{valid}) {
# 示例檢測新近公布的Serv-U < 5.0.0.4版FTP服務器MDTM命令溢出攻擊
# BID:9751 NSFOCUSID:6078
# 遍歷從數據包里解碼出來的FTP命令及其參數
for (my $i = 1;$i <= $ftp->{cmdcount};$i++) {
my $cmd = "cmd"."$i";
my $para = "para"."$i";
# 如果FTP命令是MDTM
if (uc($ftp->{$cmd}) eq "MDTM") {
# 用正則表達式匹配引發溢出的參數串,這里體現了正則
# 表達式的強大,用此匹配可以從原理上檢測到畸形參數串
if ($ftp->{$para} =~ m/d{14}[+ -]S{5,}s+S{1,}/) {
LogAlert ($src_ip,$src_port,$dest_ip,$dst_port,"Serv-U < v5.0.0.4 MDTM command long timezone string overflow attack!");
}
}
}
}
}
# 記錄攻擊告警
sub LogAlert {
my ($src_ip,$src_port,$dest_ip,$dst_port,$message) = @_;
my $nowtime = localtime;
printf ATTACKLOG ("%s %s:%s -> %s:%s %s ",$nowtime,$src_ip,$src_port,$dest_ip,$dst_port,$message);
printf ("%s %s:%s -> %s:%s %s ",$nowtime,$src_ip,$src_port,$dest_ip,$dst_port,$message);
}
# 記錄監控信息
sub LogMonitor {
my ($src_ip,$src_port,$dest_ip,$dst_port,$message) = @_;
my $nowtime = localtime;
printf MONITORLOG ("%s %s:%s -> %s:%s %s ",$nowtime,$src_ip,$src_port,$dest_ip,$dst_port,$message);
printf ("%s %s:%s -> %s:%s %s ",$nowtime,$src_ip,$src_port,$dest_ip,$dst_port,$message);
}
# INT信號處理例程
sub HandleINT {
CleanUp ();
exit (0);
}
# TERM信號處理例程
sub HandleTERM {
CleanUp ();
exit (0);
}
# 清理,主要工作是關閉文件句柄
sub CleanUp {
close (ATTACKLOG); close (MONITORLOG);
}

?

(二)FTP.pm FTP協議解碼模塊,抽取數據包里的FTP命令及相應的參數,此文件需要拷貝到NetPacket系列模塊所在的目錄,通常是在/usr/lib/perl5/site_perl/5.x.x/NetPacket/

?

?

#
# NetPacket::FTP - Decode FTP packets
#
# Comments/suggestions to stardust at xfocus dot org
#
#
# $Id: FTP.pm,v 1.16 2004/03/03 l1:16:20 stardust Exp $
#
package NetPacket::FTP;
use strict;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
use NetPacket;
my $myclass;
BEGIN {
$myclass = __PACKAGE__;
$VERSION = "0.01";
}
sub Version () { "$myclass v$VERSION" }
BEGIN {
@ISA = qw(Exporter NetPacket);
# Items to export into callers namespace by default
# (move infrequently used names to @EXPORT_OK below)
@EXPORT = qw(
);
# Other items we are prepared to export if requested
@EXPORT_OK = qw(
);
# Tags:
%EXPORT_TAGS = (
ALL => [@EXPORT, @EXPORT_OK],
);
}
#
# Decode the packet
#
# FTP協議文本參看RFC959,http://www.ietf.org/rfc/rfc0959.txt
# 常見的FTP命令
my @ftp_cmds = qw(ABOR ACCT ALLO APPE CDUP CWD DELE HELP LIST MKD MODE NLST
NOOP PASS PASV PORT PWD QUIT REIN REST RETR RMD RNFR RNTO
SITE SMNT STAT STOR STOU STRU SYST TYPE USER XCUP XCWD XMKD
XPWD XRMD LPRT LPSV ADAT AUTH CCC CONF ENC MIC PBSZ PROT
FEAT OPTS EPRT EPSV LANG MDTM MLSD MLST SIZE DIGT CLNT MACB
);
sub decode {
my $class = shift;
my($data) = @_;
my $self = {};
my $cmdhead = 0;
my $cmdtail = 0;
my @parts = ();
my $cmdcount = 0;
my $returnindex = 0;
my $data_len = length($data);
# 如果數據長度過短則不處理
if ($data_len >= 4) {
# 一個包里的FTP命令個數
$self->{cmdcount} = 0;
# 搜索回車,之前認為是一個命令行,需要注意的是一個包里可能包含多個FTP命令
while ( (($returnindex = index ($data,"x0a",$cmdhead)) >=0)    (($returnindex < 0) && (($data_len - $cmdhead) >= 4))) {
# 調整一個命令行串尾指針
if ($returnindex < 0) {
$cmdtail = $data_len -1;
} else {
$cmdtail = $returnindex;
}
if ((my $cmdlen = ($cmdtail - $cmdhead + 1)) >= 4) {
# 取出命令行串
my $cmdline = substr($data,$cmdhead,$cmdlen);
# 從命令行里拆分出命令名和它的參數串
if (splitcmd($cmdline,@parts)) {
$self->{cmdcount}++;
my $cmdindex = "cmd"."$self->{cmdcount}";
my $paraindex = "para"."$self->{cmdcount}";
# 記錄到要返回到主程序的對象
$self->{$cmdindex} = $parts[0];
$self->{$paraindex} = $parts[1];
}
}
# 調整命令行串頭指針
$cmdhead = $cmdtail + 1;
}
# 如果命令個數大于0,則說明解碼是有效的
if ($self->{cmdcount} == 0) {
$self->{valid} = 0;
} else {
$self->{valid} = 1;
}
} else {
$self->{valid} = 0;
}
# 返回對象
bless($self, $class);
return $self;
}
sub splitcmd {
my ($cmdline,$parts) = @_;
# 去除行尾的回車
chomp($cmdline);
# 用正則表達式抽取出命令名字和參數,既然效率不是考慮的主要問題就“毫無顧忌”地使用正則表達式,因為方便
if ($cmdline =~ m/^s*([a-zA-Z]{3,4})s+(.*)/) {
my $valid_cmd = 0;
# 檢查抽出來的命令名字是否是一個已知的合法FTP命令
for (my $i=0;$i<@ftp_cmds;$i++) {
if ($ftp_cmds[$i] eq uc($1)) {
$valid_cmd = 1;
last;
}
}
# 如果是合法的命令則返回給調用函數
if ($valid_cmd) {
${$parts}[0] = $1;
${$parts}[1] = $2;
return 1;
} else {
return 0;
}
} else {
return 0;
}
}
#
# Module initialisation
#
1;
# autoloaded methods go after the END token (&& pod) below
__END__

?

(三)SMB.pm 對SMB包頭結構的簡單解碼模塊,此文件需要拷貝到NetPacket系列模塊所在的目錄,通常是在/usr/lib/perl5/site_perl/5.x.x/NetPacket/

?

?

#
# NetPacket::SMB - Decode SMB packets
#
# Comments/suggestions to stardust at xfocus dot org
#
#
# $Id: SMB.pm,v 1.16 2004/02/23 12:25:17 stardust Exp $
#
package NetPacket::SMB;
use strict;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
use NetPacket;
my $myclass;
# SMB flags
use constant F2_LONGNAMEALLW => 0x0001;
use constant F2_EXTATTRIBUTE => 0x0002;
use constant F2_SECURITYSIGN => 0x0004;
use constant F2_LONGNAMEUSED => 0x0040;
use constant F2_EXTSECURINEG => 0x0800;
use constant F2_DONTRESOLDFS => 0x1000;
use constant F2_EXECONLYREAD => 0x2000;
use constant F2_ERRORCODTYPE => 0x4000;
use constant F2_UNICODSTRING => 0x8000;
use constant F_LOCKANDREAD => 0x01;
use constant F_RCVBUFFPOST => 0x02;
use constant F_CASESENSITV => 0x08;
use constant F_CANONICPATH => 0x10;
use constant F_OPLOCKSREQU => 0x20;
use constant F_NOTIFYONOPN => 0x40;
use constant F_REQUERESPON => 0x80;
BEGIN {
$myclass = __PACKAGE__;
$VERSION = "0.01";
}
sub Version () { "$myclass v$VERSION" }
BEGIN {
@ISA = qw(Exporter NetPacket);
# Items to export into callers namespace by default
# (move infrequently used names to @EXPORT_OK below)
@EXPORT = qw(F2_LONGNAMEALLW F2_EXTATTRIBUTE F2_SECURITYSIGN
F2_LONGNAMEUSED F2_EXTSECURINEG F2_DONTRESOLDFS
F2_EXECONLYREAD F2_ERRORCODTYPE F2_UNICODSTRING
F_LOCKANDREAD F_RCVBUFFPOST F_CASESENSITV
F_CANONICPATH F_OPLOCKSREQU F_NOTIFYONOPN
F_REQUERESPON
);
# Other items we are prepared to export if requested
@EXPORT_OK = qw(smb_strip
);
# Tags:
%EXPORT_TAGS = (
ALL => [@EXPORT, @EXPORT_OK],
strip => [qw(smb_strip)],
);
}
#
# Strip header from packet and return the data contained in it
#
undef &smb_strip;
*smb_strip = &strip;
# 剝除SMB頭的函數
sub strip {
my ($data) = @_;
my $smb_obj = NetPacket::SMB->decode($data);
return $smb_obj->{data};
}
#
# Decode the packet
#
sub decode {
my $class = shift;
my($data) = @_;
my $self = {};
my $data_len = 0;
my $temp = "";
$data_len = length ($data);
# 如果數據區長度小于39字節(4+32+3),則認為不是一個可解碼的SMB包
if ($data_len < 39) {
$self->{valid} = 0;
} else {
# 取SMB的標志串
my $smb_mark = substr ($data,4,4);
# 是否符合標志串
if ($smb_mark ne "xffx53x4dx42") {
$self->{valid} = 0;
} else {
$self->{valid} = 1;
# Decode SMB packet
if (defined($data)) {
# 用PERL的unpack函數解碼32字節長的SMB頭結構,頭結構可
# 參考 http://www.cs.uml.edu/~bill/cs592/cifs.chm
# 感謝小四(scz at nsfocus dot com)對于SMB頭結構中字段字節序的提醒
($self->{nbt_type}, $self->{nbt_flag}, $self->{nbt_len},
$self->{mark}, $self->{cmd}, $self->{status},
$self->{flags}, $self->{flags2}, $self->{ext},
$self->{ext2}, $self->{ext3}, $self->{tid},
$self->{pid}, $self->{uid}, $self->{mid},
$self->{data}) = unpack("CCna4CVCvVVVvvvva*", $data);
($self->{wordcount},$temp) = unpack("Ca*",$self->{data});
if ((36 + 1 + $self->{wordcount} * 2) <= ($data_len - 2)) {
# 解碼SMB結構下的wordcount字節及bytecount字節數據
my $wordbytes = $self->{wordcount} * 2;
($self->{wordcount},$self->{words},$self->{bytecount},$self->{bytes}) = unpack("C"."a"."$wordbytes"."va*",$self->{data});
} else {
($self->{wordcount},$self->{words}) = unpack("Ca*",$self->{data});
$self->{bytecount} = -1; $self->{bytes} = "";
}
}
}
}
# 返回對象
bless($self, $class);
return $self;
}
#
# Module initialisation
#
1;
# autoloaded methods go after the END token (&& pod) below
__END__

  這是武林技術頻道小編為大家整理的perl實現簡單的NIDS的方法,這是一篇值得我們學習的文章,希望大家在學習的過程中也要謹慎為妙。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91免费看片网站| 成人久久久久久久| 欧美电影免费看| 热草久综合在线| 国产精品永久免费观看| 国产精品久久久久久久久久| 欧美肥老太性生活视频| 国产精品美女无圣光视频| www.精品av.com| 国产欧美久久久久久| 亚洲精品乱码久久久久久金桔影视| 亚洲欧美综合精品久久成人| 正在播放欧美视频| 伊人伊成久久人综合网站| 夜夜躁日日躁狠狠久久88av| 91精品国产91久久久久福利| 国产精品久久久久久久久久免费| 日韩欧美一区二区三区久久| 精品国产成人在线| 日韩中文字幕在线精品| 成人免费看黄网站| 亚洲性视频网站| 精品中文视频在线| 97av视频在线| 国产a∨精品一区二区三区不卡| xxxxx91麻豆| 久久精品精品电影网| 91精品国产免费久久久久久| 亚洲网站在线播放| 欧美一级bbbbb性bbbb喷潮片| 国产亚洲精品一区二555| 久久久久久久999精品视频| 欧美另类老女人| 亚洲精品欧美极品| 久久成人人人人精品欧| 1769国产精品| 国产精品美乳一区二区免费| 日本久久91av| 日产精品99久久久久久| 国模私拍一区二区三区| 精品视频在线播放| 亚洲老司机av| 欧美精品免费播放| 日韩电影免费观看在线观看| 日韩视频第一页| 日韩欧美亚洲范冰冰与中字| 正在播放国产一区| www.色综合| 91精品国产自产在线| 久久久久久网站| 国外成人性视频| 亚洲福利视频久久| 欧美亚州一区二区三区| 国产精品欧美亚洲777777| 亚洲成人黄色在线观看| 精品中文字幕乱| 亚洲欧美国产精品| 亚洲偷熟乱区亚洲香蕉av| 欧美综合在线第二页| 中文字幕v亚洲ⅴv天堂| 亚洲精品电影在线| 在线色欧美三级视频| 97香蕉久久超级碰碰高清版| 91牛牛免费视频| 久久av在线看| 亚洲女人天堂成人av在线| 日韩中文有码在线视频| 91色琪琪电影亚洲精品久久| 亚洲精品aⅴ中文字幕乱码| 欧美一区视频在线| 91成人在线播放| 国产乱人伦真实精品视频| 久久精品91久久久久久再现| 久久久久久综合网天天| www.日韩.com| 国产中文字幕日韩| 亚洲美女中文字幕| 国产精品香蕉在线观看| 亚洲综合日韩中文字幕v在线| 精品爽片免费看久久| 成人久久一区二区| 成人高h视频在线| 国产精品久久久久久中文字| 成人激情电影一区二区| 国产狼人综合免费视频| 91精品国产777在线观看| 国产精品久久久久国产a级| 欧美另类老肥妇| 亚洲精品国产免费| 精品免费在线观看| 日韩网站在线观看| 成人黄色在线观看| 亚洲美女视频网站| 91午夜理伦私人影院| 亚洲女人被黑人巨大进入| 日韩精品视频在线观看网址| 日韩中文字幕网| 51午夜精品视频| 国产在线播放不卡| 欧美国产第一页| 91av视频在线播放| 色多多国产成人永久免费网站| 久久综合亚洲社区| 欧美精品久久一区二区| 欧美剧在线观看| 亚洲视频电影图片偷拍一区| 成人日韩在线电影| 国产成+人+综合+亚洲欧美丁香花| 成人做爽爽免费视频| 国产亚洲欧美aaaa| 欧美成人精品在线播放| 欧美精品在线网站| 日本欧美一级片| 日韩在线免费av| 欧美一级片在线播放| 不卡av电影院| 欧美成人精品不卡视频在线观看| 青草青草久热精品视频在线观看| 曰本色欧美视频在线| 日韩电影免费观看中文字幕| 国产精品久久久久91| 日韩精品免费在线视频观看| 欧美午夜性色大片在线观看| 日韩毛片在线观看| 国产精品高清在线| 91tv亚洲精品香蕉国产一区7ujn| 亚洲第一福利视频| 亚洲人成电影在线观看天堂色| 亚洲成人网在线| 成人免费网视频| 夜夜嗨av一区二区三区四区| 亚洲一区二区黄| 国产成人激情小视频| 97香蕉超级碰碰久久免费的优势| 久久91精品国产91久久久| 色偷偷亚洲男人天堂| 日韩在线观看免费网站| 国产999在线| 怡红院精品视频| 色偷偷88888欧美精品久久久| 久久久www成人免费精品张筱雨| 欧美激情在线狂野欧美精品| 亚洲男人天堂九九视频| 国产精品扒开腿做爽爽爽男男| 中文字幕欧美在线| 久久久精品999| 欧美日韩福利电影| 亚洲最新av在线网站| 国产精品欧美日韩一区二区| 中文字幕日韩欧美在线视频| 日本三级韩国三级久久| 4k岛国日韩精品**专区| 一级做a爰片久久毛片美女图片| 日产精品久久久一区二区福利| 欧美激情a在线| 精品一区二区三区四区在线| 欧美激情2020午夜免费观看| 欧美成人一区在线| 97香蕉久久超级碰碰高清版| 日韩成人免费视频| 久久99热这里只有精品国产| 日韩av理论片| 97av在线视频免费播放| 久久99久国产精品黄毛片入口|