如何高效运用nmap进行网络扫描?
- 内容介绍
- 文章标签
- 相关推荐
本文共计3331个文字,预计阅读时间需要14分钟。
0x00+简介:nmap依然有用吗?搞安全的还有不知道或不会用nmap的吗?据我观察,能全面灵活运用nmap的人其实并不多见。其实,nmap早已不再是你眼中那个简单的网络层扫描软件了。早在……
0x00 简介nmap还用介绍吗?搞安全的人还有不知道或者不会用nmap的吗?据我观察,能够全面灵活运用nmap的人其实并不多见。其实nmap早已经不再是你眼中那个网络层的扫描器软件了,早在十年前它就已经进化成为一个全功能的安全评估框架。今天,利用nmap强大的脚本功能,你可以轻松开发出任何漏洞检测和利用的功能,甚至完全不需要掌握那些常见的编程语言。本课我向你介绍了nmap几乎全部参数功能,同时演示了如何自己开发一个脚本的过程。
本文使用的nmap版本是7.92
- 诞生于1997年
- 最早的版本只有2000行代码,没有版本号
- 只作为端口扫描工具
- 6个月后成为黑客社区中网路扫描的事实标准
- 2003年发布3.45版本
- Fyodor开始全职维护nmap
- 增加了服务检测、OS检测、时间控制等功能
- 进入成熟期
- 2006年集成NSE
- 从单一的网络扫描工具,转变为可扩展的全功能漏洞评估引擎
- 默认
TCPsyn扫描,利用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进制数据AABB02sudo nmap 192.168.123.1 --data "\xAA\xBB\x02"在扫描数据包附加16进制数据\xAA\xBB\x02sudo nmap 192.168.123.1 --data "0xaabb02"在扫描数据包附加16进制数据0xaabb020x0b-7 --data-string <string> 在扫描数据包数据段中附加自定义的ASCII字符例子 含义 sudo nmap 192.168.123.1 --data-string aabbccdd在扫描数据包附加ASCII数据aabbccddsudo nmap 192.168.123.1 --data-string "aa bb cc dd"在扫描数据包附加ASCII数据aa bb cc dd0x0b-8 --ip-options <options> 指定IP OPTION数据(暂时不知道咋用) 0x0b-9 --ttl <val> 指定发送扫描包的TTL值例子 含义 sudo nmap 192.168.123.1 --ttl 25指定发送扫描包的TTL值为250x0b-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:FF0x0b-11 --badsum 使用错误的checksum将
IP包头中的checksum校验值故意写错,看看目标的安全检测机制会不会放弃这样的包,从而绕过安全机制例子 含义 sudo nmap 192.168.123.1 --badsum故意使用错误的checksu0x0c 输出格式 0x0c-1 -oA <basename> 将扫描结果保存为三种根式日志三种主要的根式日志,分别是
xml、nmap、gnmap例子 含义 sudo nmap 192.168.123.1 -oA a将扫描结果保存为三种主要的根式日志,文件名为aa.nmap格式的内容就是屏幕输出的内容a.gnmap格式的内容是为了方便用grep命令筛选结果的比方说扫描了大量的
IP后,现在想要提取所有开放80端口的IP地址可以这样执行命令:
cat a.gnmap | grep 80
0x0c-2 -oX <file> 将扫描结果保存为XML格式文件a.xml格式就是xml格式喽三种主要的根式日志,分别是
xml、nmap、gnmap例子 含义 sudo nmap 192.168.123.1 -oX a将扫描结果保存为XML格式文件,文件名为a.xml0x0c-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等同于-vvv0x0c-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 -
脚本文件保存在:
/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 漏洞类一般在企业中建议使用
Default,Safe类型的脚本进行扫描,尽量避免使用Intrusive、Dos、Exploit类型的脚本,尽量对自己家的服务器温柔一点
例子 含义 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
 servers (ms17-010).
</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、-sC、traceroute参数结合体- 对应的视频链接:点击查看
-
本文共计3331个文字,预计阅读时间需要14分钟。
0x00+简介:nmap依然有用吗?搞安全的还有不知道或不会用nmap的吗?据我观察,能全面灵活运用nmap的人其实并不多见。其实,nmap早已不再是你眼中那个简单的网络层扫描软件了。早在……
0x00 简介nmap还用介绍吗?搞安全的人还有不知道或者不会用nmap的吗?据我观察,能够全面灵活运用nmap的人其实并不多见。其实nmap早已经不再是你眼中那个网络层的扫描器软件了,早在十年前它就已经进化成为一个全功能的安全评估框架。今天,利用nmap强大的脚本功能,你可以轻松开发出任何漏洞检测和利用的功能,甚至完全不需要掌握那些常见的编程语言。本课我向你介绍了nmap几乎全部参数功能,同时演示了如何自己开发一个脚本的过程。
本文使用的nmap版本是7.92
- 诞生于1997年
- 最早的版本只有2000行代码,没有版本号
- 只作为端口扫描工具
- 6个月后成为黑客社区中网路扫描的事实标准
- 2003年发布3.45版本
- Fyodor开始全职维护nmap
- 增加了服务检测、OS检测、时间控制等功能
- 进入成熟期
- 2006年集成NSE
- 从单一的网络扫描工具,转变为可扩展的全功能漏洞评估引擎
- 默认
TCPsyn扫描,利用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进制数据AABB02sudo nmap 192.168.123.1 --data "\xAA\xBB\x02"在扫描数据包附加16进制数据\xAA\xBB\x02sudo nmap 192.168.123.1 --data "0xaabb02"在扫描数据包附加16进制数据0xaabb020x0b-7 --data-string <string> 在扫描数据包数据段中附加自定义的ASCII字符例子 含义 sudo nmap 192.168.123.1 --data-string aabbccdd在扫描数据包附加ASCII数据aabbccddsudo nmap 192.168.123.1 --data-string "aa bb cc dd"在扫描数据包附加ASCII数据aa bb cc dd0x0b-8 --ip-options <options> 指定IP OPTION数据(暂时不知道咋用) 0x0b-9 --ttl <val> 指定发送扫描包的TTL值例子 含义 sudo nmap 192.168.123.1 --ttl 25指定发送扫描包的TTL值为250x0b-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:FF0x0b-11 --badsum 使用错误的checksum将
IP包头中的checksum校验值故意写错,看看目标的安全检测机制会不会放弃这样的包,从而绕过安全机制例子 含义 sudo nmap 192.168.123.1 --badsum故意使用错误的checksu0x0c 输出格式 0x0c-1 -oA <basename> 将扫描结果保存为三种根式日志三种主要的根式日志,分别是
xml、nmap、gnmap例子 含义 sudo nmap 192.168.123.1 -oA a将扫描结果保存为三种主要的根式日志,文件名为aa.nmap格式的内容就是屏幕输出的内容a.gnmap格式的内容是为了方便用grep命令筛选结果的比方说扫描了大量的
IP后,现在想要提取所有开放80端口的IP地址可以这样执行命令:
cat a.gnmap | grep 80
0x0c-2 -oX <file> 将扫描结果保存为XML格式文件a.xml格式就是xml格式喽三种主要的根式日志,分别是
xml、nmap、gnmap例子 含义 sudo nmap 192.168.123.1 -oX a将扫描结果保存为XML格式文件,文件名为a.xml0x0c-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等同于-vvv0x0c-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 -
脚本文件保存在:
/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 漏洞类一般在企业中建议使用
Default,Safe类型的脚本进行扫描,尽量避免使用Intrusive、Dos、Exploit类型的脚本,尽量对自己家的服务器温柔一点
例子 含义 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
 servers (ms17-010).
</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、-sC、traceroute参数结合体- 对应的视频链接:点击查看
-

