LSTM-Exploit:基于LSTM 的智能渗透工具

2021-07-16 06:13王玺民朱俊澜黄路一秦朝鹏贺文博
网络安全技术与应用 2021年7期
关键词:端口漏洞神经网络

◆王玺民 朱俊澜 黄路一 秦朝鹏 贺文博

(江苏警官学院 江苏 210031)

1 背景概述

根据2020 年《网络攻击趋势:2020 年上半年报告》显示,2020年上半年网络钓鱼和恶意软件攻击急剧增加,从2 月份的每周不足5,000 次激增至4 月下旬的每周超过20 万次。此外,在5 月和6 月,随着各国开始解除防疫封禁措施,攻击者随之加大了与新冠肺炎疫情相关的攻击。与3 月和4 月相比,6 月底全球所有类型的网络攻击增加了34%。

频繁的网络攻击暴露出了更多的安全问题:一方面,攻击者的攻击目标正从传统的系统漏洞转向各种移动感染媒介,另一方面,传统DDoS 分布式拒绝服务攻击趋缓,APT 高级持续渗透攻击兴起,攻击者往往先通过一系列有组织,有计划的信息搜集活动获得目标可能的攻击点,而后进行大规模,多手段的网络攻击,很容易突破目标防御,直接导致敏感信息泄露或系统瘫痪。

面对日趋复杂的网络环境,渗透测试作为产品安全检测的一个重要环节备受关注。

当前主流渗透测试需要大量手工工作。手动挖掘系统或应用漏洞,有利于发掘0day 漏洞,但是如果目标开放了多个端口,就需要对每个端口进行多个测试,基于端口的测试工具是nmap 和metasploit 框架,在开放多个端口的环境下,利用nmap 扫描后,就需要手动在metasploit中进行测试,在metasploit终端中利用search 命令根据nmap扫描到的服务名搜索exploit 测试模块,在选定exploit 后,通过set target 命令定义测试目标系统,show payloads 命令产生针对不同协议和系统的payloads 测试载荷,set 命令选择payload,再根据已选对象设置对应的option,完成后需要从exploit,target,payload 形成的集合中遍历数据进行测试。但是由于目标系统和端口服务版本限制,往往会产生很多无效测试过程,针对这种情况可以引入现流行的人工智能算法进行预测。

现存的智能工具有GyoiThon 和Deep Exploit 两大类。

GyoiThon:用来实现对存在漏洞的Web 网站实现攻击,机器学习体现在利用朴素贝叶斯算法实现对Web 指纹和服务器的预测,在获得信息后直接传送给metasploit 执行,缺少对metasploit 中exploit,target,payload 数据的学习,预测只体现在信息搜集过程中,在执行Metasploit 命令时,还是根据if来判断使用的exploit,target 和payload,无法满足exploit->target->payloads 大量数据的学习预测,效率依然低下,只不过能够更为广泛地搜集信息。

Deep Exploit:在2018 DEFCON 黑客大会上发布的工具,LSTM-Exploit 学习了它的执行过程,优化了它的以下问题:Deep Exploit 无法针对Windows 的445 端口进行测试,原因是静态文件配置问题。LSTM-Exploit 优化了静态config.ini 文件。Deep Exploit 利用的是A3C 强化学习算法,利用多线程模型提高了预测速度,但是没有将公共训练模型保存下来,只是保存了测试成功的数据,使得每次重新测试一个IP 时都需要重新训练模型,并且鉴于A3C 的结果往往是局部最优解,无法完全将payload 中指定的隧道协议和操作系统值影响到整个payload 预测中。所以LSTM-Exploit 利用LSTM 考虑全局预测结果,并将LSTM 训练好的模型保存下来,方便下一次直接预测,减少因为训练带来的时间损耗。

2 智能渗透

2.1 智能渗透工具简介

渗透测试本质上是开发者和测试者之间的对抗,为了让安全测试人员更加高效地进行渗透测试,主流渗透工具开发大多指向漏洞扫描器或恶意代码检测工具,缺少发现漏洞后精准定位目标环境执行恶意代码的全自动工具,LSTM-Exploit 基于长短期记忆神经网络LSTM,实现从漏洞发掘到恶意代码执行这一全自动过程。

鉴于 nmap 和 metasploit 在渗透测试中的普遍搭配使用,LSTM-Exploit 选择将两者通过LSTM 神经网络整合,完成端口服务到漏洞,再到测试载荷执行的渗透过程。

LSTM-Exploit 将metasploit 中内置的漏洞利用模块作为漏洞集,对于不同的metasploit 版本通过开启msfrpcd,开放metasploit 的rpc服务的55552 或55553 端口,作为LSTM-Exploit 和metasploit 连接通信的api。

工具将连接的rpc 端口和地址,可攻击的服务和系统等信息保存在config.ini 文件中,方便直接引用。

前期信息搜集利用nmap 端口扫描工具,方便探测目标主机信息和开放端口等信息,通过保存nmap 扫描结果为xml 更详细简便的读取扫描信息。之后读取xml 文件信息,探测Web 端口,并对网站进行指纹验证,得到网站所用模板或者中间件信息,将以上所有信息整合并和metasploit 交互选择exploit。

LSTM 模型进行预测需要的训练数据在learning 模式,同时得到exploit 映射到的 target 和 payload,利用遍历的手段攻击metasploitable2 和metasploitable3 两个靶机得到。在得到成功攻击的数据后保存为train.csv,并利用训练数据对LSTM 模型进行训练,将训练完成的模型保存下来,为test 模式下进行真实渗透环境提供训练好的LSTM 模型。

当工具在test 模式下,不需要和metasploit 交互得到payload,只需要利用搜集到的数据通过现存模型预测就可以得到payload,完成一次渗透测试后,会将测试成功的数据更新到train.csv 文件中。

2.2 LSTM 神经网络和渗透测试

LSTM 神经网络存在门限机制,能够较好地记忆和遗忘数据,对于关联性较大的数据可以充分考虑之前数据对之后数据的影响,可以利用这种特点实现对metasploit 中不同payload 进行记忆。

遗忘门:

在遗忘门中,上一层输出状态 payload,例 如Windows/meterpreter/reverse_http 会和本层的输入向量进行处理遗忘掉一些特征,比如http 协议,保留下reverse 这个建立通信隧道的方式,原理如下:

将输入向量xt和上一层的输入状态ht-1合并经过激活函数sigmoid(xt,ht-1)后得到门限向量ft,将ft和共享状态Ct-1进行点积操作,实现令Ct-1遗忘掉需要被舍弃的部分上一层状态和本层输入。

传入门:

在传入层,本层的输入会和上一层的输入状态payload 进行处理,记忆上一层需要记忆的内容,例如Windows/meterpreter/reverse_http就可以记住http 协议和reverse 反弹方式两种对payload 的标注,原理如下:

将输入向量xt和上一层的输入状态ht-1合并经过激活函数sigmoid(xt,ht-1)后得到新的门限向量it。输入向量xt和上一层的输入状态ht-1合并经过激活函数tanh(ht-1,xt)后得到新的门限向量lt,表示需要传入的部分上一层状态和本层输入。再将lt和it进行点积操作it*lt,并将结果和共享状态Ct-1相加,表示需要传入的信息被共享cell 状态记忆,此时的Ct-1已经完成了本层的更新,并成为Ct,等待输出门的输出操作。

输出门:

在输出门,确认本次预测需要输出的payload 信息,例如输出经过记忆和遗忘操作的新payload:Windows/meterpreter/ reverse_tcp,表示遗忘了上一层的http 协议,但是记住了reverse 反弹,原理如下:

将输入向量xt和上一层的输入状态ht-1合并经过激活函数sigmoid(xt,ht-1)后得到新的门限向量Ot,将更新后的Ct经过激活函数tanh(Ct)后和Ot进行点积操作tanh(Ct)*Ot,用于确认哪些信息可以被输出,更新ht-1为ht,传递ht和Ct到下一层重复三个选择层操作。

总的来说,LSTM 门限机制会记忆住payload 中必要的信息,并且在下一预测中更加偏向于这种类型的payload,成功率也就更高。因为测试的是单个目标IP,如果该测试对象可以利用某种协议和某种方式建立单个连接,那么其他类型的漏洞测试也可能适用于这种连接建立方式。

2.3 LSTM 长短期神经网络实现

更新完训练集文件train.csv 后,即可对神经网络进行训练。通过分割train.csv 文件不同列,得到训练集数据,LSTM 层设置激活函数为relu,利用adam 算法反向传播调整weight 和bias 值以降低损失值。LSTM-Exploit 利用tensorflow.keras 中封装的LSTM 模型实现LSTM 长短期记忆神经网络搭建。

利用keras 搭建单层单向LSTM 神经网络:

3 工具的设计和实现

3.1 总体架构

工具架构如图1 所示。工具由信息搜集,获取模块,执行测试三个功能组成。

图1 工具架构图

(1)Learning 模式下

第一步,利用nmap 扫描目标IP,并将结果导入到XML 文件中。获取打开的Web 端口并利用爬虫爬取网页内容,正则匹配得到网站启用的CMS 和服务器信息。并和XML 文件内容整合。

第二步,根据字典类型数据,向metasploit 中发送搜索exploit命令得到exploit->target->payload 信息,并根据exploit,payload的名称和必要参数筛选匹配的exploit 和payload 数据。

第三步,向Metasploit 发送测试指令,并将测试结果返回,本地将成功的测试结果整理成训练集并进行训练得到LSTM 的模型。

(2)Test 模式下

前两步和Learning 模式相同,第三步,通过Learning 模式训练得到的LSTM 模型训练搜集到的信息,直接得到payload,而不需要再和metasploit 通信得到所有payload,第四步,直接利用预测得到的exploit->payload 进行测试,将成功结果保存到训练集csv 文件中,并重新训练并保存模型,将测试成功的exploit->target->payload 映射保存到csv 文件中方便查看。

Learning 模式用于前期的模型训练,Test 模式适用于真实渗透测试环境,并且能够在每次训练后更新训练数据,提高下一次模型的预测精度。

3.2 信息搜集

产品在不同环境下需要开启不同的端口,实现各种相互配合或者彼此独立的功能。开放的端口可以是WEB 服务器和中间件端口,也可以是数据库端口和隧道协议端口。针对使用相同端口的不同版本服务,可能存在未被补丁修复的已知漏洞。所以,为了发现现存漏洞,不仅需要大规模扫描端口,还需要获取端口表示服务的banner信息,以及目标服务运行环境的主机信息。所以可以启用metasploit 中内置的nmap 功能对目标进行信息搜集,并对搜集到的WEB 端口获取网站信息,用来实现可能的WEB 网站测试。

信息搜集代码为:

#获取nmap_data

filename=nmap_front_scan(self.client,self.command,

self.timeout,self.target_ip,self.front_filename)

nmap_data=nmap_data_process(filename)

#得到nmap 中的Web 端口

Web_ports=get_Web_ports(self.target_ip,nmap_data)

#利用爬虫爬取网站页面

Web_target_info=run_spider(self.target_ip,Web_ports,

self.spider_concurrent_reqs,self.spider_depth_limit,

self.spider_delay_time,self.spider_item_count,

self.spider_time_out,self.spider_page_count,

self.spider_error_count,self.spider_path,

self.output_base_path,self.output_filename)

#利用指纹获取Web 网页信息

signature_data=Web_signature(target_port,self.target_ip,

nmap_data,self.signature_path,

self.signature_file,target_path)

#利用content 获得Web 网页信息

content_data=Web_content(Web_port,self.target_ip,nmap_data,

self.dirsearch_path,self.dirsearch_file)

3.3 获取模块

根据搜集到的信息,以product 和ostype 为参数,与metasploit进行通信执行search product 和show targets 命令,得到每个服务可以执行的exploit 集合,以及exploit 集合中每个exploit 对应的target 集合,并根据ostype 删除不符合操作系统类型的exploit 选项,在Learning 模式和Test 模式下选择不同方法获取payload。

Learning 模式和metasploit 通信,根据选择不同的exploit,获取每个exploit 对应的payload 集合代码如下:

#得到metasploit 中所有的exploit 和payload

exploit_list=get_exploit_list(self.client)

payload_list=get_payload_list(self.client)

#根据信息搜集结果得到exploit

nmap_to_exploit=nmap_get_exploit(self.client,self.nmap_data,

exploit_list,self.allow_os_types,self.allow_services)

#根据exploit 得到target,payload

exploits_to_payloads=exploit_to_payloads(self.client,

nmap_to_exploit,exploit_list)

#合并以上信息得到完整单项匹配数据

execute_nmap_data,new_path_index=nmap_exploit_to_payloads(

self.nmap_data,exploits_to_payloads,payload_list,

self.path_index)

Test 模式下,利用现存模型预测得到payload,代码如下:

#信息搜集和模块获取

exploit_list=get_exploit_list(self.client)

payload_list=get_payload_list(self.client)

nmap_to_exploit=nmap_get_exploit(client,self.nmap_data,

exploit_list,self.allow_os_types,

self.allow_services)

exploit_to_targets=get_exploit_to_targets(self.client,

nmap_to_exploit,exploit_list)

nmap_exploit_targets,tmp_path_index=get_nmap_exploit_targets(

nmap_to_exploit,exploit_to_targets,

self.tunnel,self.path_index)

#预测payload

lstm_result=lstm_predict(nmap_exploit_targets,

self.model_path,self.model_name)

3.4 执行测试

根据已经探测好的exploit,target,payload 信息和metasploit通信得到测试模块需要设置的options,将本地静态文件中的配置写入对应的options 中后和metasploit 通信测试对应端口服务,并将测试成功的结果保存到训练集文件中。通过导入训练集文件训练LSTM神经网络,更新LSTM 模型,实现每次测试后预测精度的提高。

代码如下:

# Get the options that need to be set for each exploit and payload

exploit_options=get_options_from_etp(self.client,

self.execute_nmap_data,self.exploit_list,

self.allow_options)

# Set the obtained option to the dictionary obtained by collecting information

tmp_execute_nmap_data,tmp_path_index=set_option_to_data(self.client,self.execute_nmap_data,exploit_options,

self.path_index,self.allow_payloads,

self.payload_list)

# Perform the test and save the successful result to a csv file

success_data=start_attack(client,target_ip,

tmp_execute_nmap_data,self.path_index,

self.exploit_list,self.payload_list,self.local_ip)

success_data=success_to_train(success_data,exploit_list,

payload_list)

train_csv=save_to_csv(success_data,self.train_csv_path,

self.train_csv_filename,payload_list)

# Train module

model_file=train_new_model(train_csv,self.epochs,

self.model_path,self.model_name)

4 结束语

metasploit 企业版中存在一键渗透脚本 auto-pwn.rb,LSTM-Exploit 和auto-pwn.rb 脚本有着相同的功能,即能够自动化渗透,但是auto-pwn.rb 等传统脚本采用的是if 判断手段来进行渗透测试,而LSTM-Exploit 采用的是LSTM 模型进行测试,能够明显的提升效率,并且随着测试的增多,也会使预测的准确率得到提升。在面对不同的metasploit 版本时,只需要添加静态端口信息就能够实现信息加载,而不需要大量修改代码来兼容metasploit 的漏洞集。为了和metasploit 框架通信,利用pymetasploit3 库,能够直接访问metasploit内置所有数据,简化了编写网络连接的过程。

但是LSTM-Exploit 也存在一些不足,此工具只能测试提前设定好的静态服务端口,只能识别设置好的网站指纹和目录信息,利用固定参数的漏洞载荷进行测试。在Learning 模式下,由于对metapsploit的rpc 服务访问过多,不同漏洞利用模块执行速度不同,容易产生并发错误导致服务崩溃。在实践过程中还存在一些不便,未来还需要不断完善。

猜你喜欢
端口漏洞神经网络
漏洞
一种端口故障的解决方案
硬件解耦三端口变换器的软开关分析与仿真
神经网络抑制无线通信干扰探究
基于神经网络的中小学生情感分析
交换机生成树安全
三明:“两票制”堵住加价漏洞
漏洞在哪儿
基于神经网络的拉矫机控制模型建立
高铁急救应补齐三漏洞