[poc]关于MS17-010自动化扫描的编写浅谈

一种是调用Nsa泄露的smbtouch-1.1.1.exe,另一种是参考巡风的poc

1

import os
import fileinput

print "---This is Ms17010‘s tools for 139/445---"
#ip开始
BeginIP = raw_input(" [+] >输入开始ip:") #172.16.9.1
#ip终点
EndIP = raw_input(" [+] >输入终端ip:")

#Log file
fp = open(‘log.txt‘, ‘w+‘)
#向Smbtouch-1.1.1.xml里面按照xml的格式文档写入默认127.0.0.1
OldIP = ‘      <value>127.0.0.1</value>‘
TempIP = OldIP
print "------------------scaning----------------"
print ""
#切片操作
IP1 =  BeginIP.split(‘.‘)[0]
IP2 =  BeginIP.split(‘.‘)[1]
IP3 =  BeginIP.split(‘.‘)[2]
IP4 = BeginIP.split(‘.‘)[-1]
EndIP_last = EndIP.split(‘.‘)[-1]

for i in range(int(IP4)-1,int(EndIP_last)):
     ip = str(IP1+‘.‘+IP2+‘.‘+IP3+‘.‘+IP4)
     int_IP4 = int(IP4)
     int_IP4 += 1
     IP4 = str(int_IP4)
     NewIP= ‘      <value>‘+ip+‘</value>‘
     for line in fileinput.input(‘Smbtouch-1.1.1.xml‘,inplace=1):
     	print line.rstrip().replace(TempIP,NewIP)
     TempIP = NewIP
     Output = os.popen(r"Smbtouch-1.1.1.exe").read()
     Output = Output[0:Output.find(‘<config‘,1)]
     fp.writelines(Output)
     Flag = Output.find(‘[-] Touch failed‘)
     if Flag == -1 :
	print ‘[+] Touch success:	‘ +ip
     else:
	print ‘[-] Touch failed:	‘ +ip
else:
     fp.close( )
     for line in fileinput.input(‘Smbtouch-1.1.1.xml‘,inplace=1):
     	print line.rstrip().replace(NewIP,OldIP)

  前两天看到freebuf的关于《如何转换永恒之蓝(Eternalblue)的POC》

  ms17-010 poc

#!/usr/bin/python
# coding: utf-8
‘‘‘
The poc is used to detecte MS17-010
‘‘‘

import binascii
import socket
import struct
import sys
import threading

negotiate_protocol_request = binascii.unhexlify(
    "00000085ff534d4272000000001853c00000000000000000000000000000fffe00004000006200025043204e4554574f524b2050524f4752414d20312e3000024c414e4d414e312e30000257696e646f777320666f7220576f726b67726f75707320332e316100024c4d312e325830303200024c414e4d414e322e3100024e54204c4d20302e313200")
session_setup_request = binascii.unhexlify(
    "00000088ff534d4273000000001807c00000000000000000000000000000fffe000040000dff00880004110a000000000000000100000000000000d40000004b000000000000570069006e0064006f007700730020003200300030003000200032003100390035000000570069006e0064006f007700730020003200300030003000200035002e0030000000")
tree_connect_request = binascii.unhexlify(
    "00000060ff534d4275000000001807c00000000000000000000000000000fffe0008400004ff006000080001003500005c005c003100390032002e003100360038002e003100370035002e003100320038005c00490050004300240000003f3f3f3f3f00")
trans2_session_setup = binascii.unhexlify(
    "0000004eff534d4232000000001807c00000000000000000000000000008fffe000841000f0c0000000100000000000000a6d9a40000000c00420000004e0001000e000d0000000000000000000000000000")

def main(ips):
    ip = ips
    if ip != "":
        check_ip(ip)

    if filename != "":
        with open(filename, "r") as fp:
            for line in fp:
                semaphore.acquire()
                ip_address = line.strip()
                t = threading.Thread(target=threaded_check, args=(ip_address,))
                t.start()

num_threads = 10
timeout = 10
filename = ""
print_lock = threading.Lock()

if len(sys.argv) == 5:
    ip = sys.argv[1]
    filename = sys.argv[2]
    timeout = sys.argv[3]
    num_threads = sys.argv[4]
    semaphore = threading.BoundedSemaphore(value=num_threads)
else:
    print "[!] >............... "

def print_status(ip, message):
    global print_lock

    with print_lock:
        print "[*] [%s] %s" % (ip, message)

def check_ip(ip):
    global negotiate_protocol_request, session_setup_request, tree_connect_request, trans2_session_setup, timeout, verbose
    # Connect to socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(float(timeout) if timeout else None)
    host = ip
    port = 445
    s.connect((host, port))

    # Send/receive negotiate protocol request

    print_status(ip, "正在准备协议!")
    s.send(negotiate_protocol_request)
    s.recv(1024)

    # Send/receive session setup request
    print_status(ip, "正在设置请求!")
    s.send(session_setup_request)
    session_setup_response = s.recv(1024)

    # Extract user ID from session setup response
    user_id = session_setup_response[32:34]
    print_status(ip, "用户 ID = %s" % struct.unpack("<H", user_id)[0])

    # Replace user ID in tree connect request packet
    modified_tree_connect_request = list(tree_connect_request)
    modified_tree_connect_request[32] = user_id[0]
    modified_tree_connect_request[33] = user_id[1]
    modified_tree_connect_request = "".join(modified_tree_connect_request)

    # Send tree connect request
    print_status(ip, "发送连接!!!")
    s.send(modified_tree_connect_request)
    tree_connect_response = s.recv(1024)

    # Extract tree ID from response
    tree_id = tree_connect_response[28:30]
    print_status(ip, "Tree ID = %s" % struct.unpack("<H", tree_id)[0])

    # Replace tree ID and user ID in trans2 session setup packet
    modified_trans2_session_setup = list(trans2_session_setup)
    modified_trans2_session_setup[28] = tree_id[0]
    modified_trans2_session_setup[29] = tree_id[1]
    modified_trans2_session_setup[32] = user_id[0]
    modified_trans2_session_setup[33] = user_id[1]
    modified_trans2_session_setup = "".join(modified_trans2_session_setup)

    # Send trans2 sessions setup request
    print_status(ip, "发送成功!正在返回!")
    s.send(modified_trans2_session_setup)
    final_response = s.recv(1024)

    s.close()

    # Check for 0x51 response to indicate DOUBLEPULSAR infection
    if final_response[34] == "\x51":
        with print_lock:
            print("\033[0;31m%s\033[0m" % "[*]  存在:DOUBLEPULSAR !!!\n" )

    else:
        with print_lock:
            print "[-]  不存在DOUBLEPULSAR !!!\n"

def threaded_check(ip_address):
    global semaphore

    try:
        check_ip(ip_address)
    except Exception as e:
        with print_lock:
            print "[错误] [%s] - %s" % (ip_address, e)
    finally:
        semaphore.release()

if __name__ == ‘__main__‘:
    ip = ‘192.168.1.1‘
    main(ip)

  扫描这里使用IPy模块处理输入扫描网段和使用multiprocessing机制

# coding: utf-8
# by:adislj
import socket
from datetime import datetime
from multiprocessing.dummy import Pool as ThreadPool  #多线程
import IPy
from MS17_010_poc import *

try:
    print ‘[*] >请输入你要扫描的ip段/如:192.168.1.0/24‘
    remote_server = raw_input("[+] >输入ip段:") #172.16.9.0/24
    ip_list = []
    ips = IPy.IP(remote_server) #Class and tools for handling of IPv4 and IPv6 addresses and networks
    for ipx in ips:
        ip_list.append(ipx)
    ip_list = ip_list[1:-1]
    print ‘-‘ * 41
    print ‘[*] >你扫描的网段是:‘, remote_server
    print ‘-‘ * 41
    socket.setdefaulttimeout(0.5)
except:
    pass

def scan_port(ip_list):
    try:
        port_list = [445]
        for port in port_list:
            s = socket.socket(2, 1)
            res = s.connect_ex((str(ip_list), port))
            if res == 0:  # 如果端口开启
                if port == 445:
                    print ip_list
                    print ‘[*] >端口:{}开放,正在发送MS17-010 Poc‘.format(port)
                    main(str(ip_list))
                    s.close()
                else:
                    print ‘.‘ * 41
            s.close()

    except Exception, e:
        print str(e.message)

if remote_server != ‘‘:
    t1 = datetime.now()
    pool = ThreadPool(processes=5)
    results = pool.map(scan_port, ip_list)
    pool.close()
    pool.join()
else:
    print ‘请输入ip段!‘
    exit(0)

print ‘[*] >MS17-010扫描完成时间:‘, datetime.now() - t1

  

时间: 2024-08-10 21:29:23

[poc]关于MS17-010自动化扫描的编写浅谈的相关文章

前端自动化构建工具-yoman浅谈

如今随着前端技术的飞速发展,前端项目也变得越来越复杂.快速的搭建一个集成多种工具和框架的复杂前端项目也越来越成为一种需求.当然如果你要自己从0开始完全自己diy,绝对可以,只不过需要耗费一些不少的时间.既然如此要是有自动化的项目构建工具,帮你生成各种必须的配置项,你只需愉快的写代码该多方便呀.嗯,是的这样的工具或者说脚手架确实是有的,就是下面要提到的eoman.来吧,一起看一下如何使用这个工具让你的项目秒建吧. 初识yeoman yeoman是什么 yeoman是Google领头开发的一个前端构

使用Python调用Nessus 接口实现自动化扫描

目录 认证 策略模板配置 创建策略模板 任务 创建任务 启动/停止任务 获取扫描结果 获取漏洞信息 获取漏洞输出信息与漏洞知识库信息 最后总结 @(目录) 之前在项目中需要接入nessus扫描器,研究了一下nessus的api,现在将自己的成果分享出来. Nessus提供了丰富的二次开发接口,无论是接入其他系统还是自己实现自动化扫描,都十分方便. 同时Nessus也提供了完备的API文档,可以在 Settings->My Account->API Keys->API documentat

浅谈Linux下Makefile编写

浅谈Linux下Makefile的编写 前言:本文简要介绍Makefile文件的编写规范,结合具体项目中的应用进行讲解. 具体代码地址: https://github.com/AnSwErYWJ/DogFood/blob/master/Makefile 简介 Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作.而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关

APP漏洞自动化扫描专业评测报告(中篇)

前言 上一篇中通过对阿里聚安全[1].360App漏洞扫描[2].腾讯金刚审计系统[3].百度移动云测试中心[4]以及AppRisk Scanner[5] 在收费情况.样本测试后的扫描时间对比和漏洞项专业对比后,本篇将以各个厂商的扫描能力作为分析维度展开. 测试方法 使用自己编写的测试APP测试各个扫描平台的扫描能力.这些扫描能力主要分为静态检测能力和动态检测能力.静态检测能力包括检测隐藏dex.过程间分析.较复杂漏洞检测.逆向分析:动态测试主要是指测试拒绝服务漏洞的能力,拒绝服务漏洞又可以划分

(引用)APP漏洞自动化扫描专业评测报告(中篇)

前言 上一篇中通过对阿里聚安全[1].360App漏洞扫描[2].腾讯金刚审计系统[3].百度移动云测试中心[4]以及AppRisk Scanner[5] 在收费情况.样本测试后的扫描时间对比和漏洞项专业对比后,本篇将以各个厂商的扫描能力作为分析维度展开. 测试方法 使用自己编写的测试APP测试各个扫描平台的扫描能力.这些扫描能力主要分为静态检测能力和动态检测能力.静态检测能力包括检测隐藏dex.过程间分析.较复杂漏洞检测.逆向分析:动态测试主要是指测试拒绝服务漏洞的能力,拒绝服务漏洞又可以划分

APP漏洞自动化扫描专业评测报告(下篇)

上篇.中篇回顾:通过收费情况.样本测试后的扫描时间.漏洞项对比以及扫描能力这几个方面对阿里聚安全[1].360App漏洞扫描[2].腾讯金刚审计系统[3].百度移动云测试中心[4]以及AppRisk Scanner[5]进行了对比分析.作为本系列的最后一篇,我将会以4个随机选取的APP的测试结果来进行对比. 四.扫描结果对比 选取的APP:说明一下这次选择的四个app是根据下载和安装量来选择,分别在网络工具类.天气.社交资讯类和搜索工具类选择了下载量和安装量最大的.出于对应用的隐私保护这里把最后

浅谈Verilog HDL代码编写风格

消失了好久,没有写文章,也没有做笔记,因为最近再赶一个比赛,时间很紧,昨天周六终于结束了,所以趁着周末这会儿有时间,写点东西,记录下来.首先我学习FPGA才一年多,我知道自己没有资格谈论一些比较深层次的问题,对于这个行业来说可能我才是一直脚踩在门外面.所以这篇文章是写给一些刚开始学习FPGA.Verilog HDL的同学,我看过一些大神写的代码,然后尽量模仿大神写法,经过好几个大神的影响和自己的习惯摸索,最终算是总结出了一套自己的代码书写风格,当然我的代码风格还是一直在进化中.现在将自己的一些经

浅谈运维自动化的那些事儿

前言 运维管理兜兜转转十几余载,大家的运维管理再也不是小米加×××.人工费力拉线扛服务器的传统时代,如你所知,这些年大家张口闭口谈的都是运维自动化如何如何.一千个读者就有一千个哈姆雷特,一千个运维就有一千种运维自动化想法或构建思路,小生不才,今日斗胆来聊聊我眼中"运维自动化"的那些事儿!如有不妥,还请大家给出相应的意见...... 运维自动化到底干个啥? 据度娘之意,IT运维自动化是将日常IT运维中大量的重复性工作,小到简单的日常检查.配置变更和软件安装,大到整个变更流程的组织调度等,

浅谈前端自动化构建

前言 现在的前端开发已经不再仅仅只是静态网页的开发了,日新月异的前端技术已经让前端代码的逻辑和交互效果越来越复杂,更加的不易于管理,模块化开发和预处理框架把项目分成若干个小模块,增加了最后发布的困难,没有一个统一的标准,让前端的项目结构千奇百怪.前端自动化构建在整个项目开发中越来越重要. 我们首先来回想一下之前我们是如何来开始做一个项目的. ① 首先要确定这个项目要使用什么样的技术来实现,然后开始规划我们的项目目录,接着就要往项目增加第三方库依赖,比如: 拷贝 CSS库(Yui Reset |