因为project的需要,所以要处理大量的字符串分析。python对文本的分析支持相对比较好。所以决定使用。
需求大概是对于dump出来的实验数据,要对不同时间段的数据聚合(其实就是concatenate多个文本文件)。同时提取文件中的关键词,并进行一些关键词的模式匹配。不仅仅是string match,而且要匹配在同一个条目中不相邻的element。
一个数据条目大概是这样的:
03-19-2012,02:01:16,xxx.xxx.xxx.xxx,117.53.122.26,pann.nate.com,/floatbrand_ad.html,?v=1
Date Time Victim IP Attacker IP Domain name File path Query
我们感兴趣的是前五个元素也就是攻击发生的日期时间,被攻击的IP,攻击者的IP和域名。
我们感兴趣的信息是:
1)攻击随着时间发生的次数
2)有多少个不同的受害者,以及每个受害者被攻击的次数和攻击来自于多少个不同的被攻击者
3)有多少个不同的攻击者,以及每个攻击者攻击了多少次和他们所影响的受害者的数目
4)每个受害者被攻击的模式分析。这个分析需要一个聚类的算法。要素是被攻击的数目,攻击发生的时间间隔。准确的说应该是被攻击的密度。
5)同样的对于攻击者,我们希望based on IP,根据攻击的密度来分析他们的攻击模式的种类,有哪些种。
6)Fast Flux的效应,域名与域名所associate的IP地址,合适更换,如何更换,多久更换。
关于模式,暂时的想法有几种:
1)离散攻击型。攻击不是连续进行而是隔一段时间会有一次,可以观察到每次攻击之间的时间间隔,而且会比较均匀。比如 * * * * * * * * * *
2)间歇攻击型。攻击在一个时间段内连续,然后中断一段时间,然后继续。比如 **** ** ***** ***
3)持续攻击型。攻击在其生命周以内持续相当长的时间连续攻击,比如*******************
Next topic, python and sqlite3
使用sqlite的出发点在于在dump file里面匹配两个关键字,并找出出现的次数。dump file本身是一个文本文件。所以如果两个关键字是连续出现,就可以用简单的字符串匹配来实现。这也是最快的方式。但是对于某一些keyword而言的话,他们彼此不相邻,而且中间相隔的并不是确定的字符,故而如果还是要使用字符串匹配,只能用regular expression来做。第一次的实验结果我就是用re来作分析,结果四万多条结果run了有六七个小时才run完。而且那只是六天的实验数据,现在的结果大概就三个星期,所以这样的方式不合理,所以就请教朋友,使用database来做。
用database的思路是把一条record分解为五个token,然后检查任意的两个keyword是否出现在同一条record里面。
故而步骤分为这么几步:
1)根据文本文件建一个table。
create table phishlive_data (date text, time text, src text, dst text, domain text);
.separator ',' #文本中不可以包含空白字符,故而用逗号来分割token
.import 20120319_mal_url_truncated phishlive_data
.backup phishlive_data
2)在python里调用sqlite3,筛选符合要求的record。
python里调用sqlite3,需要
import sqlite;
有的网上文章说应该是sqlite3,但是我是先安装python再安装sqlite3,好像这样是python检索不到sqlite3这个.so。但是使用sqlite是可以的,不是特别理解为什么是这样。
sqlite3有很多自带的命令(非标准SQL语句):
.header ON|OFF:设置是否显示数据表格的列名
.indices TABLE:显示表格的所有列名
.mode MODE:设置数据表格的显示模式。默认是list,用.separator命令设置的字符串分隔字符(默认是|)。我们比较习惯的是column格式
.nullvalue STRING:当数据为空时,用STRING来填充。默认是空字符串,也就是什么也不显示。
.tables PATTERN:使用PATTERN模式来显示表格
.width NUM NUM...:设置当以column模式显示时,数据显示的宽度
.output FILENAME|stdout:设置数据输出的形式:文件或屏幕的标准输出。
.read FILENAME:从文件读取SQL语句
其他系统控制命令:
.databases:显示目前已经匹配的数据库名称
.table:显示当前数据库中的所有表
.help:显示shell的帮助信息
.show:显示shell目前的设置参数
.quit 和.exit:退出shell
python中调用sqlite的命令要这样
os.system("sqlite3 phishlive_data.db '.read db_commands'"); #利用shell调用sqlite3并执行前面创建database的命令
conn = sqlite.connect("phishlive_data.db"); #连接database
curr = conn.cursor(); #创建一个cursor
curr.execute(select_command); #执行select语句
results = curr.fetchall(); #取返回的结果到列表中
再转一篇文章,关于比较详细的python调用sqlite3
http://kb.cnblogs.com/a/2315452/