《web安全之机器学习入门》第5章K近邻算法读书笔记【下】

Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络连接等信息。

待分析数据集:
KDD-99数据集,链接:http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html
该数据集是从一个模拟的美国空军局域网上采集来的9个星期的网络连接数据,分成具有标识的训练数据和未加标识的测试数据。
数据集已经进行了数据采集、清洗、提取特征、打标签等动作。每一行包括41个特征和1个标签,总共42列。

根据书中,我们将第9列~第20列作为rootkit的关键特征,描述如下:
第9列:hot:连续类型:访问系统敏感文件和目录的次数;如访问系统目录、建立或执行程序等
第10列:num_failed_logins:连续类型:尝试登陆失败的次数
第11列:logged_in:离散类型:成功登陆则为1,否则则为0
第12列:num_compromised:连续类型:满足被攻击条件出现的次数(疑问,具体的被攻击规则集合是什么???)
第13列:root_shell:离散类型:获得超级用户权限为1,否则为0
第14列:su_attempted:离散类型:出现su root命令则为1,否则为0
第15列:num_file_creations:连续类型:文件创建的次数
第16列:num_shells:连续类型:使用shell命令的次数
第17列:num_access_file:连续类型:访问被控制文件的次数,如访问/etc/passwd或者/etc/hosts文件的访问
第18列:num_outbound_cmds:连续类型:一个ftp会话中出站连接的次数
第19列:is_hot_login:离散类型:是否属于hot登陆,即超级用户或者管理员登陆

第20列:is_guest_login:离散类型:如果是guest登陆则为1,否则为0

代码如下:

#coding:utf-8
import os
import numpy as np 
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score

DATAPATH = os.path.normpath(os.path.dirname(os.path.abspath(__file__)) + "/data")

def parse_data():
    test_data = list()
    label_data = list()
    FULLPATH = DATAPATH + "/kddcup.data.corrected"
    with open(FULLPATH, "r") as f:
        for line in f.readlines():
            lines = line.split(",")
            test_data.append(lines[9:21])
            if lines[-1] == 'rootkit':
                label_data.append(1)
            else:
                label_data.append(0)

    return [test_data,label_data]

if __name__ == '__main__':
    test_data, label_data = parse_data()
    neigh = KNeighborsClassifier(n_neighbors = 3)
    scores = cross_val_score(neigh, test_data, label_data, cv=10)
    print scores
    print "precision:", np.mean(scores)*100

webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。

分析的数据集:https://www.unsw.adfa.edu.au/unsw-canberra-cyber/cybersecurity/ADFA-IDS-Datasets/
系统调用序列被广泛认为是基于异常的系统在检测入侵的时候的最准确的方式。ADFA数据集是澳大利亚国防学院(缩写为ADFA)对外发布的一套主机级入侵检测系统的数据集合,被广泛应用于入侵检测类产品的测试。数据集内已经将各类系统调用完成了特征化,并针对攻击类型进行了标注。该数据集包括Linux(ADFA-LD)和Windows(ADFA-WD)两个OS平台,分别记录了各类系统调用次序。
数据里每一个文件,记录了系统调用的序列,并且已经用数字标识了每一种系统调用。

算法里的特征,是先把所有文件里的系统调用组成一个词集,然后特征就是用的每一个文件里的系统调用在词集里的分布情况组成的向量空间。

代码如下:

#coding:utf-8
import os
import numpy as np 
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score

DATAPATH = os.path.normpath(os.path.dirname(os.path.abspath(__file__)) + "/data")

#生成词集
def get_words():
    FULLPATH = DATAPATH + "/ADFA-LD/Attack_Data_Master"
    files = os.listdir(FULLPATH)
    words = set()
    for item in files:
        if item in ['.', '..']:
            continue
        CPATH = FULLPATH + "/" + item
        cfiles = os.listdir(CPATH)
        for citem in cfiles:
            if citem.endswith(".txt"):
                fullpath = FULLPATH + "/" + item + "/" + citem
                with open(fullpath, "r") as f:
                    for line in f.readlines():
                        lines = line.split()
                        for ccitem in lines:
                            words.add(ccitem)
    return list(words)

def parse_data(words):
    test_data = list()
    label_data = list()
    words_len = len(words)

    FULLPATH = DATAPATH + "/ADFA-LD/Attack_Data_Master"
    files = os.listdir(FULLPATH)

    for item in files:
        if item in ['.', '..']:
            continue
        CPATH = FULLPATH + "/" + item
        cfiles = os.listdir(CPATH)
        label = 0
        if item.startswith("Web_Shell"):
            label = 1
        for citem in cfiles:
            if citem.endswith(".txt"):
                fullpath = FULLPATH + "/" + item + "/" + citem
                with open(fullpath, "r") as f:
                    c_test_data = [0]*words_len
                    words_dict = dict()
                    for line in f.readlines():
                        lines = line.split()
                        for ccitem in lines:
                            if ccitem not in words_dict.keys():
                                words_dict[ccitem] = 1
                            else:
                                words_dict[ccitem] = words_dict[ccitem] + 1
                    for key in words_dict.keys():
                        for i in range(0, words_len):
                            if key == words[i]:
                                c_test_data[i] = words_dict[key]
                                break
                    test_data.append(c_test_data)
                    label_data.append(label)
    return [test_data,label_data]


if __name__ == '__main__':
    words = get_words()
    test_data, label_data = parse_data(words)
    
    neigh = KNeighborsClassifier(n_neighbors = 3)
    score = cross_val_score(neigh, test_data, label_data, cv=10)
    print score
    print "precision:",np.mean(score)*100

10轮交叉验证效果如下:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值