我为一个网络主机工作,我的工作是查找和清理黑客帐户。我找到一个好的90%的shell\malware\injections的方法是查找“不合适”的文件。例如,eval(base64_decode(.......))
,其中“.....
”是一整组base64'ed文本,通常都不好。当我在文件中搜索关键字字符串时,奇怪的文件跳出来。
如果这些文件以人类的身份突然出现在我面前,我确信我可以在Python中构建某种探查器,从统计上查找“不合适”的东西,并标记它们以供手动查看。首先,我认为我可以比较包含关键字字符串(eval
、base64_decode
、exec
、gunzip
、gzinflate
、fwrite
、preg_replace
、、等)的PHP文件中的行的长度,并查找偏离平均值2个标准差的行。
线路长度变化很大,我不确定这是否是一个好的统计数据。另一种方法是将加权规则分配给cretin事物(超过或低于阈值的行长度=x点,包含单词upload=y点),但我不确定如何实际使用这些分数或如何为每个属性打分。我的统计数字有点生疏。
有人能给我指出统计分析的正确方向(指南、教程、库)吗?
最佳答案
下面是一个简单的机器学习方法来解决这个问题,我要做的就是开始这个问题并开发一个基线分类器:
构建一个脚本语料库,并附加一个标签“好”(label=0)或“坏”(label=1),越多越好。尽量确保“坏”脚本是总语料库的一个合理的部分,50-50好/坏是理想的。
开发指示可疑或错误脚本的二进制特性。例如,“eval”的存在,“base64”解码的存在。尽可能全面,不要害怕包括可能捕获一些“好”脚本的功能。一种帮助实现这一点的方法可能是计算两类脚本中单词的频率计数,并选择在“bad”中突出但在“good”中不突出的单词作为特征。
在文集上运行特征生成器,并用标签构建特征的二进制矩阵。
将语料库分为训练(80%的例子)和测试集(20%)。使用SciKit学习库,用训练集训练几种不同的分类算法(随机森林、支持向量机、NaiveBayes等),并在未公开的测试集上测试它们的性能。
希望我有一个合理的分类精度基准。然后我会考虑改进特性,一些无监督的方法(没有标签)和更专业的算法来获得更好的性能。
对于资源,Andrew Ng关于机器学习(包括示例垃圾邮件分类)的自动学习课程是一个好的开始。
关于python - 使用Python进行异常检测,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6892449/