如何高效运用nmap进行网络扫描?

2026-05-19 16:131阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计3331个文字,预计阅读时间需要14分钟。

如何高效运用nmap进行网络扫描?

0x00+简介:nmap依然有用吗?搞安全的还有不知道或不会用nmap的吗?据我观察,能全面灵活运用nmap的人其实并不多见。其实,nmap早已不再是你眼中那个简单的网络层扫描软件了。早在……

0x00 简介

nmap还用介绍吗?搞安全的人还有不知道或者不会用nmap的吗?据我观察,能够全面灵活运用nmap的人其实并不多见。其实nmap早已经不再是你眼中那个网络层的扫描器软件了,早在十年前它就已经进化成为一个全功能的安全评估框架。今天,利用nmap强大的脚本功能,你可以轻松开发出任何漏洞检测和利用的功能,甚至完全不需要掌握那些常见的编程语言。本课我向你介绍了nmap几乎全部参数功能,同时演示了如何自己开发一个脚本的过程。

本文使用的nmap版本是7.92

0x01 历史进程
  • 诞生于1997年
    • 最早的版本只有2000行代码,没有版本号
    • 只作为端口扫描工具
    • 6个月后成为黑客社区中网路扫描的事实标准
  • 2003年发布3.45版本
    • Fyodor开始全职维护nmap
    • 增加了服务检测、OS检测、时间控制等功能
    • 进入成熟期
  • 2006年集成NSE
    • 从单一的网络扫描工具,转变为可扩展的全功能漏洞评估引擎
0x02 默认扫描参数
  • 默认TCP syn扫描,利用TCP的三次握手机制,当发送syn包后,如果目标主机的那个端口是开着的,就会返回syn+ack数据包,同时nmap接收到之后不再返回ack的确认包,不会建立完成的TCP连接,节约扫描发起者机器的资源
  • 默认扫描1000个常用端口,包括10.0.2.11:8080 使用HTTP代理进行发包扫描 0x0b-6 --data <hex string> 在扫描包中数据段附加自定义的16进制数据 例子 含义 sudo nmap 192.168.123.1 --data "AABB02" 在扫描数据包附加16进制数据AABB02 sudo nmap 192.168.123.1 --data "\xAA\xBB\x02" 在扫描数据包附加16进制数据\xAA\xBB\x02 sudo nmap 192.168.123.1 --data "0xaabb02" 在扫描数据包附加16进制数据0xaabb02

    0x0b-7 --data-string <string> 在扫描数据包数据段中附加自定义的ASCII字符 例子 含义 sudo nmap 192.168.123.1 --data-string aabbccdd 在扫描数据包附加ASCII数据aabbccdd sudo nmap 192.168.123.1 --data-string "aa bb cc dd" 在扫描数据包附加ASCII数据aa bb cc dd

    0x0b-8 --ip-options <options> 指定IP OPTION数据(暂时不知道咋用) 0x0b-9 --ttl <val> 指定发送扫描包的TTL值 例子 含义 sudo nmap 192.168.123.1 --ttl 25 指定发送扫描包的TTL值为25

    0x0b-10 --spoof-mac <mac address/prefix/vendor name> 伪造扫描数据包中的MAC地址

    可能会造成收不到回包的情况

    例子 含义 sudo nmap 192.168.123.1 --spoof-mac AA:BB:CC:DD:EE:FF 伪造数据包中的MAC地址AA:BB:CC:DD:EE:FF

    0x0b-11 --badsum 使用错误的checksum

    IP包头中的checksum校验值故意写错,看看目标的安全检测机制会不会放弃这样的包,从而绕过安全机制

    例子 含义 sudo nmap 192.168.123.1 --badsum 故意使用错误的checksu 0x0c 输出格式 0x0c-1 -oA <basename> 将扫描结果保存为三种根式日志

    三种主要的根式日志,分别是xmlnmapgnmap

    例子 含义 sudo nmap 192.168.123.1 -oA a 将扫描结果保存为三种主要的根式日志,文件名为a

    a.nmap格式的内容就是屏幕输出的内容

    a.gnmap格式的内容是为了方便用grep命令筛选结果的

    比方说扫描了大量的IP后,现在想要提取所有开放80端口的IP地址

    可以这样执行命令:cat a.gnmap | grep 80

    a.xml格式就是xml格式喽

    0x0c-2 -oX <file> 将扫描结果保存为XML格式文件

    三种主要的根式日志,分别是xmlnmapgnmap

    例子 含义 sudo nmap 192.168.123.1 -oX a 将扫描结果保存为XML格式文件,文件名为a.xml 0x0c-3 显示详细信息 例子 含义 sudo nmap 192.168.123.1 -v 显示详细信息 sudo nmap 192.168.123.1 -vv 显示更详细信息 sudo nmap 192.168.123.1 -vvv 显示更更详细信息 sudo nmap 192.168.123.1 -v3 等同于-vvv 0x0c-4 -d 显示debug信息 例子 含义 sudo nmap 192.168.123.1 -d 显示debug信息 0x0c-5 --reason 显示判断端口状态的依据 例子 含义 sudo nmap 10.0.2.25 --reason 在结果中显示判断端口状态的依据

    0x07-6 --open 扫描结果中只显示开放的端口 例子 含义 sudo nmap 10.0.2.25 --open 只显示开放的端口

    0x07-7 --packet-trace 显示 nmap 都发了或收了什么包 例子 含义 sudo nmap 10.0.2.25 --packet-trace 显示nmap都发了和都收了什么包

    0x07-8 --script-trace 只显示脚本都发了和都收了什么包 例子 含义 sudo nmap 10.0.2.25 --script-trace 只显示脚本都发了和都收了什么包 0x07-9 --iflist 显示系统中都有哪些网卡 例子 含义 sudo nmap --iflist 显示系统中都有哪些网卡

    0x0d -6 开启 IPV6 扫描 例子 含义 sudo nmap fe80::a00:27ff:fe6a:30e3 -6 开启IPV6扫描 0x0e NSE 脚本引擎(Nmap Scripting Engine) 0x0e-1 简介
    • 2006年发布4.21 ALPHA1版本时加入的

    • 在第二届Google summer code大会上创造的

    • 由于具有NSE脚本引擎,所以nmap成为了全功能的扫描工具套件

    • 基于lua语言特殊标记的脚本框架,脚本由NSE执行

      lua是非常快速的解释性语言,很多waf上会使用lua

    • 升级脚本文件:nmap --script-updatedb

      如何高效运用nmap进行网络扫描?

    • 脚本文件保存在:/usr/share/nmap/scripts

    • 脚本的描述和使用方法:nmap.org/nsedoc/ 或者 在脚本中查看description部分

    • 目前默认包含600多个脚本(14大类)

      类型 中文 Auth 身份认证 Broadcast 广播 Brute 暴力 Default 默认 Discovery 发现类 Dos 拒绝服务 Exploit 漏洞利用 External 外部类(查询第三方接口获取信息,比方说有的网站会公布这个IP是否已经中招了、遭泄露了等等) Fuzzer 模糊测试 Intrusive 入侵性探测 Malware 恶意软件类 Safe 安全 Version 获取版本信息类 Vuln 漏洞类

      一般在企业中建议使用DefaultSafe类型的脚本进行扫描,尽量避免使用IntrusiveDosExploit类型的脚本,尽量对自己家的服务器温柔一点

    0x0e-2 脚本使用 例子 含义 sudo nmap 192.168.123.1 --script=technet.microsoft.com/en-us/library/security/ms17-010.aspx * blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/ * msdn.microsoft.com/en-us/library/ee441489.aspx * github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/smb/smb_ms17_010.rb * github.com/cldrn/nmap-nse-scripts/wiki/Notes-about-smb-vuln-ms17-010 ]] --- -- 告诉你这个脚本怎么用,怎么样执行命令 -- @usage nmap -p445 --script smb-vuln-ms17-010 <target> -- @usage nmap -p445 --script vuln <target> -- -- @see smb-double-pulsar-backdoor.nse -- -- @output -- Host script results: -- | smb-vuln-ms17-010: -- | VULNERABLE: -- | Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010) -- | State: VULNERABLE -- | IDs: CVE:CVE-2017-0143 -- | Risk factor: HIGH -- | A critical remote code execution vulnerability exists in Microsoft SMBv1 -- | servers (ms17-010). -- | -- | Disclosure date: 2017-03-14 -- | References: -- | cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143 -- | technet.microsoft.com/en-us/library/security/ms17-010.aspx -- |_ blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/ -- -- @xmloutput -- <table key="CVE-2017-0143"> -- <elem key="title">Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)</elem> -- <elem key="state">VULNERABLE</elem> -- <table key="ids"> -- <elem>CVE:CVE-2017-0143</elem> -- </table> -- <table key="description"> -- <elem>A critical remote code execution vulnerability exists in Microsoft SMBv1&#xa; servers (ms17-010).&#xa;</elem> -- </table> -- <table key="dates"> -- <table key="disclosure"> -- <elem key="month">03</elem> -- <elem key="year">2017</elem> -- <elem key="day">14</elem> -- </table> -- </table> -- <elem key="disclosure">2017-03-14</elem> -- <table key="refs"> -- <elem>technet.microsoft.com/en-us/library/security/ms17-010.aspx</elem> -- <elem>cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143</elem> -- <elem>blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/</elem> -- </table> -- </table> -- -- @args smb-vuln-ms17-010.sharename Share name to connect. Default: IPC$ --- -- 作者是谁 author = "Paulino Calderon <paulino()calderonpale.com>" -- 这个脚本遵循的许可 license = "Same as Nmap--See nmap.org/book/man-legal.html" -- 这个脚本属于哪些类 categories = {"vuln", "safe"} ----------------------------------------------------------- 规则 ----------------------------------------------------------- ----------------------------------------------------------- 规则 ----------------------------------------------------------- ----------------------------------------------------------- 规则 ----------------------------------------------------------- [[ Rule:决定在什么情况下运行后续的Action,满足设置的条件才运行后续的Action 有Prerule、Postrule、Portrule、Hostrule 比如 Portrule 通常用于检测服务匹配的特征字符串 ]] hostrule = function(host) return smb.get_port(host) ~= nil end local function check_ms17010(host, port, sharename) local status, smbstate = smb.start_ex(host, true, true, "\\\\".. host.ip .. "\\" .. sharename, nil, nil, nil) if not status then stdnse.debug1("Could not connect to '%s'", sharename) return false, string.format("Could not connect to '%s'", sharename) else local overrides = {} local smb_header, smb_params, smb_cmd stdnse.debug1("Connected to share '%s'", sharename) overrides['parameters_length'] = 0x10 --SMB_COM_TRANSACTION opcode is 0x25 smb_header = smb.smb_encode_header(smbstate, 0x25, overrides) smb_params = string.pack(">I2 I2 I2 I2 B B I2 I4 I2 I2 I2 I2 I2 B B I2 I2 I2 I2 I2 I2", 0x0, -- Total Parameter count (2 bytes) 0x0, -- Total Data count (2 bytes) 0xFFFF, -- Max Parameter count (2 bytes) 0xFFFF, -- Max Data count (2 bytes) 0x0, -- Max setup Count (1 byte) 0x0, -- Reserved (1 byte) 0x0, -- Flags (2 bytes) 0x0, -- Timeout (4 bytes) 0x0, -- Reserved (2 bytes) 0x0, -- ParameterCount (2 bytes) 0x4a00, -- ParameterOffset (2 bytes) 0x0, -- DataCount (2 bytes) 0x4a00, -- DataOffset (2 bytes) 0x02, -- SetupCount (1 byte) 0x0, -- Reserved (1 byte) 0x2300, -- PeekNamedPipe opcode 0x0, -- 0x0700, -- BCC (Length of "\PIPE\") 0x5c50, -- \P 0x4950, -- IP 0x455c -- E\ ) stdnse.debug2("SMB: Sending SMB_COM_TRANSACTION") local result, err = smb.smb_send(smbstate, smb_header, smb_params, '', overrides) if(result == false) then stdnse.debug1("There was an error in the SMB_COM_TRANSACTION request") return false, err end local result, smb_header, _, _ = smb.smb_read(smbstate) if not result then stdnse.debug1("Error reading SMB response: %s", smb_header) -- error can happen if an (H)IPS resets the connection return false, smb_header end local _ , smb_cmd, err = string.unpack("<c4 B I4", smb_header) if smb_cmd == 37 then -- SMB command for Trans is 0x25 stdnse.debug1("Valid SMB_COM_TRANSACTION response received") --STATUS_INSUFF_SERVER_RESOURCES indicate that the machine is not patched if err == 0xc0000205 then stdnse.debug1("STATUS_INSUFF_SERVER_RESOURCES response received") return true elseif err == 0xc0000022 then stdnse.debug1("STATUS_ACCESS_DENIED response received. This system is likely patched.") return false, "This system is patched." elseif err == 0xc0000008 then stdnse.debug1("STATUS_INVALID_HANDLE response received. This system is likely patched.") return false, "This system is patched." end stdnse.debug1("Error code received:%s", stdnse.tohex(err)) else stdnse.debug1("Received invalid command id.") return false, string.format("Unexpected SMB response:%s", stdnse.tohex(err)) end end end ----------------------------------------------------------- Action ----------------------------------------------------------- ----------------------------------------------------------- Action ----------------------------------------------------------- ----------------------------------------------------------- Action ----------------------------------------------------------- action = function(host,port) local vuln_status, err local vuln = { title = "Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)", IDS = {CVE = 'CVE-2017-0143'}, risk_factor = "HIGH", description = [[ A critical remote code execution vulnerability exists in Microsoft SMBv1 servers (ms17-010). ]], references = { 'technet.microsoft.com/en-us/library/security/ms17-010.aspx', 'blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/' }, dates = { disclosure = {year = '2017', month = '03', day = '14'}, } } local sharename = stdnse.get_script_args(SCRIPT_NAME .. ".sharename") or "IPC$" local report = vulns.Report:new(SCRIPT_NAME, host, port) vuln.state = vulns.STATE.NOT_VULN vuln_status, err = check_ms17010(host, port, sharename) if vuln_status then stdnse.debug1("This host is missing the patch for ms17-010!") vuln.state = vulns.STATE.VULN else vuln.state = vulns.STATE.NOT_VULN vuln.check_results = err end return report:make_output(vuln) end

    编写自己的脚本,内容如下

    ----------------------------------------------------------- Header ----------------------------------------------------------- ----------------------------------------------------------- Header ----------------------------------------------------------- ----------------------------------------------------------- Header ----------------------------------------------------------- local nmap.org/book/man-legal.html" categories = {"default", "discovery", "safe"} ----------------------------------------------------------- Rules ----------------------------------------------------------- ----------------------------------------------------------- Rules ----------------------------------------------------------- ----------------------------------------------------------- Rules ----------------------------------------------------------- -- 规则是 判断端口是否开放,开放则返回True portrule = function(host, port) return port.state == "open" end ----------------------------------------------------------- Action ----------------------------------------------------------- ----------------------------------------------------------- Action ----------------------------------------------------------- ----------------------------------------------------------- Action ----------------------------------------------------------- -- 如果规则函数返回的是True,做下面的Action action = function(host, port) -- 请求目标主机目标端口下的 robots.txt 文件 local robots = http.get(host, port, "/robots.txt") -- 如果返回的http状态码是200则表明文件存在 if robots.status == 200 then return "robots.txt status 200" else return "robots.txt status: " .. robots.status end end

    执行自己编写的脚本

    0x0f -A 综合参数,相当于 -O、-sV、-sC、traceroute 参数结合体 例子 含义 sudo nmap 10.0.2.25 -A -A综合参数,相当于-O-sV-sCtraceroute 参数结合体
    • 对应的视频链接:点击查看

本文共计3331个文字,预计阅读时间需要14分钟。

如何高效运用nmap进行网络扫描?

0x00+简介:nmap依然有用吗?搞安全的还有不知道或不会用nmap的吗?据我观察,能全面灵活运用nmap的人其实并不多见。其实,nmap早已不再是你眼中那个简单的网络层扫描软件了。早在……

0x00 简介

nmap还用介绍吗?搞安全的人还有不知道或者不会用nmap的吗?据我观察,能够全面灵活运用nmap的人其实并不多见。其实nmap早已经不再是你眼中那个网络层的扫描器软件了,早在十年前它就已经进化成为一个全功能的安全评估框架。今天,利用nmap强大的脚本功能,你可以轻松开发出任何漏洞检测和利用的功能,甚至完全不需要掌握那些常见的编程语言。本课我向你介绍了nmap几乎全部参数功能,同时演示了如何自己开发一个脚本的过程。

本文使用的nmap版本是7.92

0x01 历史进程
  • 诞生于1997年
    • 最早的版本只有2000行代码,没有版本号
    • 只作为端口扫描工具
    • 6个月后成为黑客社区中网路扫描的事实标准
  • 2003年发布3.45版本
    • Fyodor开始全职维护nmap
    • 增加了服务检测、OS检测、时间控制等功能
    • 进入成熟期
  • 2006年集成NSE
    • 从单一的网络扫描工具,转变为可扩展的全功能漏洞评估引擎
0x02 默认扫描参数
  • 默认TCP syn扫描,利用TCP的三次握手机制,当发送syn包后,如果目标主机的那个端口是开着的,就会返回syn+ack数据包,同时nmap接收到之后不再返回ack的确认包,不会建立完成的TCP连接,节约扫描发起者机器的资源
  • 默认扫描1000个常用端口,包括10.0.2.11:8080 使用HTTP代理进行发包扫描 0x0b-6 --data <hex string> 在扫描包中数据段附加自定义的16进制数据 例子 含义 sudo nmap 192.168.123.1 --data "AABB02" 在扫描数据包附加16进制数据AABB02 sudo nmap 192.168.123.1 --data "\xAA\xBB\x02" 在扫描数据包附加16进制数据\xAA\xBB\x02 sudo nmap 192.168.123.1 --data "0xaabb02" 在扫描数据包附加16进制数据0xaabb02

    0x0b-7 --data-string <string> 在扫描数据包数据段中附加自定义的ASCII字符 例子 含义 sudo nmap 192.168.123.1 --data-string aabbccdd 在扫描数据包附加ASCII数据aabbccdd sudo nmap 192.168.123.1 --data-string "aa bb cc dd" 在扫描数据包附加ASCII数据aa bb cc dd

    0x0b-8 --ip-options <options> 指定IP OPTION数据(暂时不知道咋用) 0x0b-9 --ttl <val> 指定发送扫描包的TTL值 例子 含义 sudo nmap 192.168.123.1 --ttl 25 指定发送扫描包的TTL值为25

    0x0b-10 --spoof-mac <mac address/prefix/vendor name> 伪造扫描数据包中的MAC地址

    可能会造成收不到回包的情况

    例子 含义 sudo nmap 192.168.123.1 --spoof-mac AA:BB:CC:DD:EE:FF 伪造数据包中的MAC地址AA:BB:CC:DD:EE:FF

    0x0b-11 --badsum 使用错误的checksum

    IP包头中的checksum校验值故意写错,看看目标的安全检测机制会不会放弃这样的包,从而绕过安全机制

    例子 含义 sudo nmap 192.168.123.1 --badsum 故意使用错误的checksu 0x0c 输出格式 0x0c-1 -oA <basename> 将扫描结果保存为三种根式日志

    三种主要的根式日志,分别是xmlnmapgnmap

    例子 含义 sudo nmap 192.168.123.1 -oA a 将扫描结果保存为三种主要的根式日志,文件名为a

    a.nmap格式的内容就是屏幕输出的内容

    a.gnmap格式的内容是为了方便用grep命令筛选结果的

    比方说扫描了大量的IP后,现在想要提取所有开放80端口的IP地址

    可以这样执行命令:cat a.gnmap | grep 80

    a.xml格式就是xml格式喽

    0x0c-2 -oX <file> 将扫描结果保存为XML格式文件

    三种主要的根式日志,分别是xmlnmapgnmap

    例子 含义 sudo nmap 192.168.123.1 -oX a 将扫描结果保存为XML格式文件,文件名为a.xml 0x0c-3 显示详细信息 例子 含义 sudo nmap 192.168.123.1 -v 显示详细信息 sudo nmap 192.168.123.1 -vv 显示更详细信息 sudo nmap 192.168.123.1 -vvv 显示更更详细信息 sudo nmap 192.168.123.1 -v3 等同于-vvv 0x0c-4 -d 显示debug信息 例子 含义 sudo nmap 192.168.123.1 -d 显示debug信息 0x0c-5 --reason 显示判断端口状态的依据 例子 含义 sudo nmap 10.0.2.25 --reason 在结果中显示判断端口状态的依据

    0x07-6 --open 扫描结果中只显示开放的端口 例子 含义 sudo nmap 10.0.2.25 --open 只显示开放的端口

    0x07-7 --packet-trace 显示 nmap 都发了或收了什么包 例子 含义 sudo nmap 10.0.2.25 --packet-trace 显示nmap都发了和都收了什么包

    0x07-8 --script-trace 只显示脚本都发了和都收了什么包 例子 含义 sudo nmap 10.0.2.25 --script-trace 只显示脚本都发了和都收了什么包 0x07-9 --iflist 显示系统中都有哪些网卡 例子 含义 sudo nmap --iflist 显示系统中都有哪些网卡

    0x0d -6 开启 IPV6 扫描 例子 含义 sudo nmap fe80::a00:27ff:fe6a:30e3 -6 开启IPV6扫描 0x0e NSE 脚本引擎(Nmap Scripting Engine) 0x0e-1 简介
    • 2006年发布4.21 ALPHA1版本时加入的

    • 在第二届Google summer code大会上创造的

    • 由于具有NSE脚本引擎,所以nmap成为了全功能的扫描工具套件

    • 基于lua语言特殊标记的脚本框架,脚本由NSE执行

      lua是非常快速的解释性语言,很多waf上会使用lua

    • 升级脚本文件:nmap --script-updatedb

      如何高效运用nmap进行网络扫描?

    • 脚本文件保存在:/usr/share/nmap/scripts

    • 脚本的描述和使用方法:nmap.org/nsedoc/ 或者 在脚本中查看description部分

    • 目前默认包含600多个脚本(14大类)

      类型 中文 Auth 身份认证 Broadcast 广播 Brute 暴力 Default 默认 Discovery 发现类 Dos 拒绝服务 Exploit 漏洞利用 External 外部类(查询第三方接口获取信息,比方说有的网站会公布这个IP是否已经中招了、遭泄露了等等) Fuzzer 模糊测试 Intrusive 入侵性探测 Malware 恶意软件类 Safe 安全 Version 获取版本信息类 Vuln 漏洞类

      一般在企业中建议使用DefaultSafe类型的脚本进行扫描,尽量避免使用IntrusiveDosExploit类型的脚本,尽量对自己家的服务器温柔一点

    0x0e-2 脚本使用 例子 含义 sudo nmap 192.168.123.1 --script=technet.microsoft.com/en-us/library/security/ms17-010.aspx * blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/ * msdn.microsoft.com/en-us/library/ee441489.aspx * github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/smb/smb_ms17_010.rb * github.com/cldrn/nmap-nse-scripts/wiki/Notes-about-smb-vuln-ms17-010 ]] --- -- 告诉你这个脚本怎么用,怎么样执行命令 -- @usage nmap -p445 --script smb-vuln-ms17-010 <target> -- @usage nmap -p445 --script vuln <target> -- -- @see smb-double-pulsar-backdoor.nse -- -- @output -- Host script results: -- | smb-vuln-ms17-010: -- | VULNERABLE: -- | Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010) -- | State: VULNERABLE -- | IDs: CVE:CVE-2017-0143 -- | Risk factor: HIGH -- | A critical remote code execution vulnerability exists in Microsoft SMBv1 -- | servers (ms17-010). -- | -- | Disclosure date: 2017-03-14 -- | References: -- | cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143 -- | technet.microsoft.com/en-us/library/security/ms17-010.aspx -- |_ blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/ -- -- @xmloutput -- <table key="CVE-2017-0143"> -- <elem key="title">Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)</elem> -- <elem key="state">VULNERABLE</elem> -- <table key="ids"> -- <elem>CVE:CVE-2017-0143</elem> -- </table> -- <table key="description"> -- <elem>A critical remote code execution vulnerability exists in Microsoft SMBv1&#xa; servers (ms17-010).&#xa;</elem> -- </table> -- <table key="dates"> -- <table key="disclosure"> -- <elem key="month">03</elem> -- <elem key="year">2017</elem> -- <elem key="day">14</elem> -- </table> -- </table> -- <elem key="disclosure">2017-03-14</elem> -- <table key="refs"> -- <elem>technet.microsoft.com/en-us/library/security/ms17-010.aspx</elem> -- <elem>cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143</elem> -- <elem>blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/</elem> -- </table> -- </table> -- -- @args smb-vuln-ms17-010.sharename Share name to connect. Default: IPC$ --- -- 作者是谁 author = "Paulino Calderon <paulino()calderonpale.com>" -- 这个脚本遵循的许可 license = "Same as Nmap--See nmap.org/book/man-legal.html" -- 这个脚本属于哪些类 categories = {"vuln", "safe"} ----------------------------------------------------------- 规则 ----------------------------------------------------------- ----------------------------------------------------------- 规则 ----------------------------------------------------------- ----------------------------------------------------------- 规则 ----------------------------------------------------------- [[ Rule:决定在什么情况下运行后续的Action,满足设置的条件才运行后续的Action 有Prerule、Postrule、Portrule、Hostrule 比如 Portrule 通常用于检测服务匹配的特征字符串 ]] hostrule = function(host) return smb.get_port(host) ~= nil end local function check_ms17010(host, port, sharename) local status, smbstate = smb.start_ex(host, true, true, "\\\\".. host.ip .. "\\" .. sharename, nil, nil, nil) if not status then stdnse.debug1("Could not connect to '%s'", sharename) return false, string.format("Could not connect to '%s'", sharename) else local overrides = {} local smb_header, smb_params, smb_cmd stdnse.debug1("Connected to share '%s'", sharename) overrides['parameters_length'] = 0x10 --SMB_COM_TRANSACTION opcode is 0x25 smb_header = smb.smb_encode_header(smbstate, 0x25, overrides) smb_params = string.pack(">I2 I2 I2 I2 B B I2 I4 I2 I2 I2 I2 I2 B B I2 I2 I2 I2 I2 I2", 0x0, -- Total Parameter count (2 bytes) 0x0, -- Total Data count (2 bytes) 0xFFFF, -- Max Parameter count (2 bytes) 0xFFFF, -- Max Data count (2 bytes) 0x0, -- Max setup Count (1 byte) 0x0, -- Reserved (1 byte) 0x0, -- Flags (2 bytes) 0x0, -- Timeout (4 bytes) 0x0, -- Reserved (2 bytes) 0x0, -- ParameterCount (2 bytes) 0x4a00, -- ParameterOffset (2 bytes) 0x0, -- DataCount (2 bytes) 0x4a00, -- DataOffset (2 bytes) 0x02, -- SetupCount (1 byte) 0x0, -- Reserved (1 byte) 0x2300, -- PeekNamedPipe opcode 0x0, -- 0x0700, -- BCC (Length of "\PIPE\") 0x5c50, -- \P 0x4950, -- IP 0x455c -- E\ ) stdnse.debug2("SMB: Sending SMB_COM_TRANSACTION") local result, err = smb.smb_send(smbstate, smb_header, smb_params, '', overrides) if(result == false) then stdnse.debug1("There was an error in the SMB_COM_TRANSACTION request") return false, err end local result, smb_header, _, _ = smb.smb_read(smbstate) if not result then stdnse.debug1("Error reading SMB response: %s", smb_header) -- error can happen if an (H)IPS resets the connection return false, smb_header end local _ , smb_cmd, err = string.unpack("<c4 B I4", smb_header) if smb_cmd == 37 then -- SMB command for Trans is 0x25 stdnse.debug1("Valid SMB_COM_TRANSACTION response received") --STATUS_INSUFF_SERVER_RESOURCES indicate that the machine is not patched if err == 0xc0000205 then stdnse.debug1("STATUS_INSUFF_SERVER_RESOURCES response received") return true elseif err == 0xc0000022 then stdnse.debug1("STATUS_ACCESS_DENIED response received. This system is likely patched.") return false, "This system is patched." elseif err == 0xc0000008 then stdnse.debug1("STATUS_INVALID_HANDLE response received. This system is likely patched.") return false, "This system is patched." end stdnse.debug1("Error code received:%s", stdnse.tohex(err)) else stdnse.debug1("Received invalid command id.") return false, string.format("Unexpected SMB response:%s", stdnse.tohex(err)) end end end ----------------------------------------------------------- Action ----------------------------------------------------------- ----------------------------------------------------------- Action ----------------------------------------------------------- ----------------------------------------------------------- Action ----------------------------------------------------------- action = function(host,port) local vuln_status, err local vuln = { title = "Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)", IDS = {CVE = 'CVE-2017-0143'}, risk_factor = "HIGH", description = [[ A critical remote code execution vulnerability exists in Microsoft SMBv1 servers (ms17-010). ]], references = { 'technet.microsoft.com/en-us/library/security/ms17-010.aspx', 'blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/' }, dates = { disclosure = {year = '2017', month = '03', day = '14'}, } } local sharename = stdnse.get_script_args(SCRIPT_NAME .. ".sharename") or "IPC$" local report = vulns.Report:new(SCRIPT_NAME, host, port) vuln.state = vulns.STATE.NOT_VULN vuln_status, err = check_ms17010(host, port, sharename) if vuln_status then stdnse.debug1("This host is missing the patch for ms17-010!") vuln.state = vulns.STATE.VULN else vuln.state = vulns.STATE.NOT_VULN vuln.check_results = err end return report:make_output(vuln) end

    编写自己的脚本,内容如下

    ----------------------------------------------------------- Header ----------------------------------------------------------- ----------------------------------------------------------- Header ----------------------------------------------------------- ----------------------------------------------------------- Header ----------------------------------------------------------- local nmap.org/book/man-legal.html" categories = {"default", "discovery", "safe"} ----------------------------------------------------------- Rules ----------------------------------------------------------- ----------------------------------------------------------- Rules ----------------------------------------------------------- ----------------------------------------------------------- Rules ----------------------------------------------------------- -- 规则是 判断端口是否开放,开放则返回True portrule = function(host, port) return port.state == "open" end ----------------------------------------------------------- Action ----------------------------------------------------------- ----------------------------------------------------------- Action ----------------------------------------------------------- ----------------------------------------------------------- Action ----------------------------------------------------------- -- 如果规则函数返回的是True,做下面的Action action = function(host, port) -- 请求目标主机目标端口下的 robots.txt 文件 local robots = http.get(host, port, "/robots.txt") -- 如果返回的http状态码是200则表明文件存在 if robots.status == 200 then return "robots.txt status 200" else return "robots.txt status: " .. robots.status end end

    执行自己编写的脚本

    0x0f -A 综合参数,相当于 -O、-sV、-sC、traceroute 参数结合体 例子 含义 sudo nmap 10.0.2.25 -A -A综合参数,相当于-O-sV-sCtraceroute 参数结合体
    • 对应的视频链接:点击查看