大数据比赛的一个小心得

本来是自己研究扫描器的一天,结果D和小白把公司比赛要用到的那个钓鱼网站文件发我。基于大数据的安全比赛,基本很多做大数据的公司都参加。我负责筛选出这一批文件里可能是钓鱼网站的文件以及url。

比赛给的东西如下:

一个文本文档,存了经过bmh(白帽汇),hash的文件名,对应的url

1000个以hash命名的文件,其实都是html文件,里面的内容有钓鱼网站的,有其他的网站的,而我的任务就是搞出那些钓鱼网站的文件。

文件名做了哈希加密的,所以批量起来还是小麻烦。既然是处理大数据,那么肯定要用大数据的处理方法。手工岂不是太落下乘了: )

首先处理这类的文档思路是:获取特征->获取文件内容对比特征->筛选出含特征的文件->获取文件名,对文件名进行操作等。

但是,实际上这个没有这么简单,在实践的流程还是踩了不少坑的。

00x1 采集特征

我们筛选的方法有两种,白名单和黑名单。在安全攻防中这个思想是常用的,可能你们认为白名单比黑名单安全,但是这个仅仅针对防御,具体的问题要具体讨论。

抛开讨论,我们先采集一批特征。

存在的特征:

Apple ID AliCloud iCould 95568 iPhone 中银E贷 APPLE 銀行 ICBC 银行 苹果 lounge 95566 娱乐城 ---------------

不存在的特征:

7e.hk 访问线路 建设中 无法找到该页 运行时错误 404

这里解释下,繁体中文和简体中文的的字符集是不一样的,特别是转化成unicode编码,所以要区分开来。

采集之后又轮到我们抉择了,到底是要用白名单还是黑名单。

白名单:准确性高,但是你采集到的特征可能不全。容易遗失一些文件(站点)。

黑名单:找到存在这些内容的站点,将这些站点过滤,剩下的就是我们想要的,但是有可能错杀。找到的有可能不是我们想要的,就是所谓的误差~

00x2: 白名单采集

来公司之后老大给的理念就是细心细心,然后精准。

无脑的选择了白名单~

由于老大看不起我,先给了我1000个文件,所以我给出如下的代码:

# encoding:utf-8
import os
import re
def file_name(file_dir): 
    result = open("result.txt","w")
    for files in os.walk(file_dir):
        for file in files:
            try:
                for i in range(1000):
                    nowfile_old = files[2][i]
                    nowfile= open(nowfile_old)
                    for line in nowfile.readlines():
                        if re.search("IPhone",line) or re.search("Apple ID",line) or re.search("AliCloud",line) or re.search("iCould",line) or re.search("95568",line) or re.search("Apple ID",line) or re.search("Apple ID",line) or re.search(u"\u4e2d\u94f6\u0045\u8d37",line) or re.search(u"\u94f6\u884c",line) or re.search(u"\u82f9\u679c",line) or re.search(u"\u9280\u884c ",line) or re.search("bank",line) or re.search("ICBC",line) or re.search("lounge",line) or re.search("95566",line):  
                            result.writelines(nowfile_old+"\n")
                            break
            except Exception,e:
                print e
    result.close()
dir = os.getcwd()
file_name(dir) 

采用了正则来匹配,将中文的特征转化成url编码,其实这段代码有坑,让小白笑了下。=-=,这样我们就获取到我们存在这些白名单特征的文件名。

但是比赛的要求是获取到文件名之后,还要将不相关的文件删除,并且我们获取到这些hash值是不对的,要将hash值和url对应起来。

我们再借助个小脚本:

#encoding: utf-8
file_begin= open("url.txt","r")
file_result = open("result.txt","r")
file_ok = open("ok.txt","w")
def first():
    file1 = []
    for datas in file_begin.readlines():
        file1.append(datas)
    return file1
def second():
    file2 = []
    for datas in file_result.readlines():
        file2.append(datas)
    return file2
datas = first()
results = second()
for data in datas:
    d = 0
    bmh,key,url = data.split(",")
    for result in results:
        if key==result.strip():
            d+=1
    if d==1:
        file_ok.writelines(bmh+",")
        file_ok.writelines(key+",")
        file_ok.writelines(url)

讲url.txt与我们获取到的这些result做对比,如果存在就输出一个类似url.txt格式的文档。其实这段代码我也碰到坑,坑就在,result.strip()这边。我上一个脚本获取文件名是这样写的,result.writelines(nowfile_old+"\n")。然后就把自己坑惨了,为什么输出的ok.txt一直是0kb???擦,百思不得其解,后面小白说下个断电试试,果然老司机!

下了断点就发现多了一个回车符,我们肉眼看不到看不到,将它strip过滤一下就ok了。

第三步,就是获取到这些存在特征的文件。

同样一个脚本搞定:

#!python
# -*- coding:utf8 -*-
import os
import os.path
import shutil

filePath = os.getcwd()
destDir  = "D:/xiaobaibai"
def write(filename,content):
    a = open(filename,"a")
    a.write(content)
    a.close()
def loadlist():
    r = []
    with open("ok.txt") as content:
        for temp in content:
            r.append(temp)
    return r
dellist = []
l = loadlist()
    for fl in l:
        bmh, fn, url = fl.split(",")
        destPath = destDir + os.path.sep + fn
         rcPath = filePath+os.path.sep+fn
          shutil.copy(srcPath, destPath)

这里我们不对文件进行删除,将它们复制到D盘的小白白。

ok了。有四百多个文件,刚要叫D过来交差,D说:这咋整滴,怎么会ze么sao。哈哈哈 ,最近学他普通话都不标zun了。

不过,1000多个文件,我搞出了400多个你要我怎么办,迷茫,无助...

00x3 黑名单

后面刚不住他就用了黑名单的方法。

其实黑名单更简单,只需要改部分代码,获取文件名的正则那个改成(也可以不用正则):

if re.search("7e.hk",line) or ("访问线路" in line) or("建设中" in line) or ("无法找到该页" in line) or (
            "404" in line) or ("运行时错误" in line):

第二个脚本照旧,第三个脚本就改成了:

#!python
# -*- coding:utf8 -*-
import os
import os.path
import shutil
filePath = os.getcwd()
files = os.listdir(filePath)
def write(filename,content):
    a = open(filename,"a")
    a.write(content)
    a.close()
def loadlist():
    r = []
    with open("ok.txt") as content:
        for temp in content:
            r.append(temp)
    return r
dellist = []
l = loadlist()
     for fl in l:
         bmh, fn, url = fl.split(",")
         for file in files:
             if file == fn:
                    os.remove(fn)

删除文件的脚本,将黑名单对应的删除。

ok,执行完就有500多个文件了。不过我想问有差么...

这篇文章主要还是想说一下这类比赛的一个解题的思路和我在python中遇到的坑。好了,不要喷,然后赞助给点飞机票吧。

原文发布于微信公众号 - 晨星先生(MoXuanIT)

原文发表时间:2017-04-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CDA数据分析师

Excel2016四个超强的数据分析功能

摘要:三维地图、预测工作表、引用外部数据查询、数据透视表更强大的功能改进、将Excel 表格发布到Office 365 Power BI实现数据的商业智能分析…...

29850
来自专栏FreeBuf

安卓新型恶意木马Xavier的发展过程和技术分析

近日,一个名为Xavier的安卓系统广告库木马被发现,它会在用户不知情的情况下窃取和泄露用户的信息,同时还可以在root过的安卓设备上静默安装任何APK。 据统...

35270
来自专栏机器之心

业界 | 微信团队开源围棋AI技术PhoenixGo,复现AlphaGo Zero论文

26540
来自专栏嵌入式程序猿

mscan VS flexcan

在嵌入式程序猿的公众号里,曾多次介绍过NXP的flexcan以及基于flexcan的一些其他协议和开发,最近在用NXP的另外一款片子,使用的是mscan,这两种...

49290
来自专栏知识分享

STM32采集电阻触摸贴膜

公司的项目用电阻屏,触摸的时候发现获取的位置会漂,后来自己发现是由于压力的问题....如果亲们用电阻屏发现触摸的位置有问题,可以看一下这篇文章,,先测量触摸的压...

31860
来自专栏测试开发架构之路

MatlabR2014a 安装破解详细图文教程(附下载链接(内附CVX工具箱))

MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据...

34770
来自专栏机器之心

专栏 | 想免费用谷歌资源训练神经网络?Colab详细使用教程

631110
来自专栏数据魔术师

词云图:论一个精致猪猪男孩的数据修养

“词云”就是对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过...

16740
来自专栏腾讯云数据库团队的专栏

Greenplum 简单性能测试与分析

通过TPC-H基准测试,可获得数据库单位时间内的性能处理能力,为评估数据库系统的现有性能服务水平提供有效依据。

1.3K120
来自专栏SpringBoot 核心技术

印象笔记下的MarkDown

印象笔记终于还是终于出了markdown语法编辑方式,苦苦等了几年的我们是一个什么样子的体验?

24020

扫码关注云+社区

领取腾讯云代金券