我为一个虚拟主机工作,我的工作是找到并清理被黑客入侵的帐户。我找到90%的shell / malware \ injections的方法是寻找“不合适”的文件。例如,eval(base64_decode(.......))
,其中“.....
”是一大堆base64'ed文本,通常永远不会好。当我查看关键字符串的文件时,奇怪的文件会跳出来。
如果这些文件作为人类向我跳出来,我确信我可以在python中构建某种类型的分析器,以便在统计上查找“不合适”的内容并标记它们以供人工审核。首先,我想我可以比较包含关键字符串的php文件中的行长(eval
,base64_decode
,exec
,gunzip
,gzinflate
,{ {1}},fwrite
等)并查找与平均值相差2个标准偏差的行。
线路长度变化很大,我不确定这是否是一个很好的统计使用。另一种方法是将加权规则分配给cretin事物(线长超过或低于阈值= X点,包含单词upload = Y points)但我不确定我可以对分数实际做什么或如何对每个分数进行评分属性。我的统计数据有点生疏。
有人能指出我正确的方向(指南,教程,图书馆)进行统计分析吗?
答案 0 :(得分:5)
这是一个简单的机器学习方法来解决这个问题,这是我开始研究这个问题并开发基线分类器的方法:
构建一个脚本语料库并附加标签'good'(label = 0)或'bad'(label = 1)越多越好。尽量确保'坏'脚本是总语料库的合理分数,50-50好/坏是理想的。
开发指示可疑或错误脚本的二进制功能。例如,'eval'的存在,'base64_decode'的存在。尽可能全面,并且不要害怕包括可能捕获一些'好'脚本的特征。帮助实现这一目标的一种方法可能是计算两类脚本中单词的频率计数,并选择在“坏”中突出显示但在“好”中不显着的单词。
在语料库上运行要素生成器,并使用标签构建二进制矩阵。
将语料库分成火车(80%的例子)和测试集(20%)。使用scikit学习库,训练一些不同的分类算法(随机森林,支持向量机,朴素贝叶斯等)和训练集,并在看不见的测试集上测试它们的表现。
希望我有一个合理的分类准确度来进行基准测试。然后我会考虑改进功能,一些无监督的方法(没有标签)和更专业的算法来获得更好的性能。
对于资源,Andrew Ng的机器学习课程(包括示例垃圾邮件分类,我相信)是一个良好的开端。