美文网首页
使用LSTM检测DGA

使用LSTM检测DGA

作者: doinb1517 | 来源:发表于2021-12-10 22:49 被阅读0次

    前言

    DGA可谓是网络安全领域的一个绕不过的话题,针对DGA的检测通常分为两类:一类是通过域名相关字符特征判断一个域名是否为DGA域名,另一类是对DGA所属家族的判别和划分。因为根据域名的字符特征进行DGA的检测可以抽象为NLP领域的二分类问题,NLP二分类问题目前已经有很多成熟的解决方案,本次实验尝试使用LSTM对DGA域名做检测,使用的数据集是360lab每日发布的DGA域名集合,将此数据集作为黑样本;白样本选择Alexa的域名集合。

    实现

    1、使用字符序列模型,将域名以单字符形式拆分,转换为对应的ASCII码。

    2、设定最大域名长度,对长度不足的域名在前面填充0,对长度超过最大域名长度的直接截断。

    3、对填充后的字符序列经过embedding层编码。

    4、直接输入LSTM层

    5、使用softmax做分类任务。

    网络层级如下:

    _________________________________________________________________
     Layer (type)                Output Shape              Param #   
    =================================================================
     input_2 (InputLayer)        [(None, 60)]              0         
                                                                     
     embedding_1 (Embedding)     (None, 60, 128)           1280000   
                                                                     
     lstm_1 (LSTM)               (None, 10)                5560      
                                                                     
     dense_1 (Dense)             (None, 2)                 22        
                                                                     
    =================================================================
    

    主要代码如下:

    def char2num(domain_list):
        """使用字符序列模型
        @param domain_list:
        """
        t = []
        for i in domain_list:
            v = []
            for j in range(0, len(i)):
                v.append(ord(i[j]))
            t.append(v)
        return t
    
    def do_lstm(x_train, x_test, y_train, y_test):
        """训练并保存LSTM模型
        """
        x_train = char2num(x_train)
        x_test = char2num(x_test)
        train_x = pad_sequences(x_train, maxlen=max_domain_length)
        test_x = pad_sequences(x_test, maxlen=max_domain_length)
    
        # 定义模型 size = (batch, 10)
        sequence_input = Input(shape=(max_domain_length,))
        embedding_layer = Embedding(input_dim=10000, output_dim=128, input_length=max_domain_length)
        embedding_sequences = embedding_layer(sequence_input)
        lstm1 = LSTM(10, dropout=0.2)(embedding_sequences)
        
        # 输出层
        preds = Dense(2, activation='softmax')(lstm1)
        model = Model(sequence_input, preds)
    
        # 训练模型
        model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
        model.fit(train_x, y_train, batch_size=100, epochs=epochs, validation_data=(test_x, y_test))
        model.save('lstm.h5')
        
    
    def do_predict(domain_list, model):
        """实现预测结果输出
        @param domain_list:
        @param model:
        """
        t = []
        for d in domain_list:
            v = []
            for i in d:
                v.append(ord(i))
            t.append(v)
        seq = pad_sequences(t, maxlen=max_domain_length)
        probs = model.predict(seq)
        for i in range(len(domain_list)):
            if np.argmax(probs[i]) == 0:
                print("{} is dga".format(domain_list[i]))
            elif np.argmax(probs[i]) == 1:
                print("{} is legit".format(domain_list[i]))
        return probs
    

    总结

    • 基于传统机器学习的DGA检测算法可解释性强,引入了安全专家选择的特征。LSTM等深度学习算法可解释性较差。
    • 目前97%的准确率在真实环境的海量DNS数据下误报率巨大,运营成本高,而且该算法仅在测试数据集表现良好,真实环境堪忧。
    • 对此类算法的黑盒攻击和白盒攻击技术都较为成熟,安全性堪忧,健壮性不足。
    • 在中文环境下,此类域名与拼音组成的域名,运营商随机域名的碰撞严重。
    • 有多种DGA算法的本质是异或操作,位移操作,此类算法很难学到位的运算这类特征,可能会强化一些随机性字符在判断域名时的比重。

    总的来说不看好此类算法在实际工程环境中的作用,但是作为一个Demo来玩一玩还是很有意思的。

    相关文章

      网友评论

          本文标题:使用LSTM检测DGA

          本文链接:https://www.haomeiwen.com/subject/ommhfrtx.html