使用Nmap进行渗透测试
信息收集
脚本 | 解释 |
---|---|
–script ip-geolocation-* | IP信息搜集 |
whois | WHOIS查询 |
http-email-harvest | 搜集E-mail信息 |
hostmap-ip2hosts | IP反查 |
dns-brute | DNS信息搜集 |
membase-http-info | 检索系统信息 |
smb-security-mode.nse | 后台打印机服务漏洞 |
smb-check-vulns.nse | 系统漏洞扫描 |
http-stored-xss.nse | 扫描web漏洞 |
snmp-win32-services | 通过Snmp列举Windows服务/账户 |
dns-brute | 枚举DNS服务器的主机名 |
http-headers/http-sitemap-generator | HTTP信息收集 |
ssl-enum-ciphers | 枚举SSL秘钥 |
ssh-hostkey | SSH服务密钥信息探测 |
IP信息搜集
nmap --script ip-geolocation-* www.0day.co
可以获取目标域名的IP地址,并且还可以确定该IP地址为一个香港地区IP,这个IP的开放端口有80端口、443端口。如果目标域名使用了CDN,那么这个方法无效,我们获取的知识目标域名的CDN的相关情况,并不是目标域所对应的真正IP地址。
WHOIS查询
nmap --script whois www.0day.co
大部分的网站现在启用了whois保护,对于域名所有者的姓名、电话都会隐藏,我们可以查询该域名的历史whois,历史whois可能还没有启用whois保护。
nmap --script whois --script-args whois.whodb=nofollow www.0day.co
如果目标域名较多,可以使用列表的方式进行查询。
nmap -sn --script whois -v -iL host.txt
搜集E-mail信息
namp --script http-email-harvest www.0day.co
IP反查
IP反查可以将所有绑定到该IP的域名显示出来,这样我们就可以很清楚的知道有几个站点在同一个服务器上。
nmap -sn --script hostmap-ip2hosts www.0day.co
IP反查会查询绑定在这一个IP上的所有域名,如果是单一的Ip则不会有结果,如果目标使用的是虚拟主机则会显示结果;如果目标使用了CDN也会显示相关结果,但是这个结果是不准确的,此时查询的IP并不是真正的IP。
DNS信息搜集
nmap --script dns-brute www.xxxx.com 基于暴力破解
检索系统信息
nmap -p 445 192.168.126.131 --script membase-http-info
后台打印机服务漏洞
nmap --script smb-security-mode.nse -p 445 192.168.126.128
系统漏洞扫描
nmap --script smb-check-vulns.nse -p445 192.168.126.128
扫描web漏洞
nmap -p80 --script http-stored-xss.nse www.xxx.com
通过Snmp列举Windows服务/账户
nmap -sU -p 161 --script=snmp-win32-services 192.168.126.128
枚举DNS服务器的主机名
nmap --script dns-brute --script-args dns-brute.domain=baidu.com
HTTP信息搜集
使用-sV选项即可对HTTP版本进行探测
nmap -sV -p 80 www.0day.com
对目标地址进行HTTP头部信息探测
nmap -p 80 --script=http-headers baidu.com
web目录结构
nmap -p 80 --script=http-sitemap-generator www.baidu.com
枚举SSL秘钥
TSL与SSL在传输层对网络连接进行加密
nmap -p 443 --script=ssl-enum-ciphers www.baidu.com
SSH服务秘钥信息探测
查看SSH服务的密钥信息
nmap -p 22 --script ssh-hostkey --script-args ssh_hostkey=full 127.0.0.1
数据库渗透
脚本 | 解释 |
---|---|
mysql-databases | MySQL列举数据库 |
mysql-variables | 列举MySQL变量 |
mysql-empty-password | 检查MySQL密码 |
mysql-brute | 审计MySQL密码 |
mysql-audit | 审计MySQL安全配置 |
oracle-brute | 审计Oracle密码 |
ms-sql-brute | 审计msSQL密码 |
ms-sql-empty-password | 检查msSQL空密码 |
ms-sql-tables | 读取msSQL数据 |
ms-sql-xp-cmdshell | msSQL执行系统命令 |
pgsql-brute | 审计PgSQL密码 |
MySQL列举数据库
nmap -p3306 --script mysql-databases --script-args mysqluser=root,mysqlpass 192.168.84.1
如果我们已知目标MySQL的账号和密码,就可以轻易地夺取目标MySQL的所有数据库。如果目标数据库段端口更改了,我们也需要使用-p参数指定相应的数据库端口,使用mysqluser指定目标数据库账号,mysqlpass指定目标数据库密码,如果密码为空则不需要填写任何东西,最后指向目标IP
列举MySQL变量
nmap -p3306 --script=mysql --variables 192.168.84.1
如果仍无法确定可以使用-sV扫描端口
nmap -sV --script=mysql --variables 192.168.84.1
检查MySQL密码
nmap -p3306 --script=mysql-empty-password 192.168.84.1
如果无法确定目标开放的端口,可以用-sV选项扫描
nmap -sV --script=mysql-empty-password 192.168.84.1
审计MySQL密码
nmap --script=mysql-brute 192.168.84.1
该脚本用于MySQL弱口令,默认Nmap会扫描全部的端口用于查找MySQL端口,但是我们可以使用-p选项指定一个端口,也可以自定义账号密码字典。
nmap -p 3306 --script=mysql-brute userdb=/root/passdb.txt passdb=/root/pass.txt 192.168.0.110
审计MySQL安全配置
nmap -p 3306 --script mysql-audit --script-args “mysql-audit.username=’root’,\mysql-audit.password=’ ‘ , mysql-audit.filename=’nselib/data/mysql-cis.audit’” 192.168.84.1
审计Oracle密码
nmap --script oracle-brute -p 1521 --script-args oracle-brute.sid=test 192.168.126.131
使用字典
nmap --script oracle-brute -p 1521 --script-args oracle-brute.sid=test --script-args
userdb=/tmp/username.txt,passdb=/tmp/passwords.txt 192.168.126.131
审计msSQL密码
nmap -p 1433 --script ms-sql-brute --script-args userdb=name.txt,passdb=pass.txt
检查msSQL空密码
nmap -p 1433 --script ms-sql-empty-password 192.168.126.1
读取msSQL数据
nmap -p 1433 -script ms-sql-tables -script-args mssql.username=sa,mssql.password=sa 192.168.126.131
msSQL执行系统命令
nmap -p 1433 --script ms-sql-xp-cmdshell --script-args mssql.username=sa, mssql.password=sa, ms-sql-xp-cmdshell.cmd=”ipconfig” 192.168.126.1
审计PgSQL密码
nmap -p 5432 --script pgsql-brute 192.168.126.131
渗透测试
脚本 | 解释 |
---|---|
http-brute | 审计HTTP身份验证 |
ftp-brute | 审计FTP服务器 |
http-wordpress-brute | 审计Wordpress程序 |
http-joomla-brute | 审计Joomla程序 |
pop3-brute | 审计邮件服务器 |
smb-brute.nse | 审计SMB口令 |
vnc-brute | 审计VNC服务器 |
smtp-brute | 审计SMTP服务器 |
stuxnet-detect | 检测Stuxnet蠕虫 |
snmp-netstat | SNMP安全审计 |
snmp-processes | SNMP安全审计 |
snmp-win32-services | SNMP安全审计 |
snmp-brute | SNMP安全审计 |
审计HTTP身份验证
nmap --script http-brute -p 80 www.0day.com
审计FTP服务器
nmap --script ftp-burte -p 21 192.168.126.128
使用字典爆破
nmap --script ftp-burte --script-args userdb=user.txt,passdb=pass.txt -p 21 192.168.126.128
审计Wordpress程序
nmap -p80 --script http-wordpress-brute 192.168.126.131
使用字典
nmap -p80 --script http-wordpress-brute --script-args userdb=user.txt,passdb=passwd.txt 192.168.126.131
设置线程数
nmap -p80 --script http-wordpress-brute --script-args http-wordpress-brute.threads=10 192.168.126.131
审计Joomla程序
nmap -p80 --script http-joomla-brute 192.168.126.131
使用字典
nmap -p80 --script http-joomla-brute --script-args userdb=users.txt,passdb=passwds.txt 192.168.126.131
增加线程
nmap -p80 --script http-joomla-brute --script-args userdb=users.txt,passdb=passwds.txt, http-joomla-brute.threads=5 192.168.126.131
审计邮件服务器
nmap -p110 --script=pop3-brute 192.168.126.131
审计SMB口令
nmap --script smb-brute.nse -p445 192.168.126.128
使用字典
nmap --script smb-brute.nse --script-args passdb=pass.txt -p445 192.168.126.128
审计VNC服务器
nmap --script vnc-brute -p 5900 192.168.126.131
审计SMTP服务器
nmap -p 25 --script smtp-brute 192.168.126.131
枚举远程系统所有用户
namp -p 25 --script=smtp-enum-users.nse smtp.xx.com
检测Stuxnet蠕虫
nmap --script stuxnet-detect -p 445 192.168.126.131
SNMP安全审计
nmap -sU -p 161 --script=snmp-netstat 192.168.121.3
在nmap中snmp-processes脚本可以通过SNMP服务协议枚举运行的系统进程。
nmap -sU -p 161 --script=snmp-processes 192.168.131.1
获得windows服务器的服务
nmap -sU -p 161 --script=snmap-win32-services 192.168.121.1
对目标服务器snmp服务进行口令审计
nmap -sU -p 161 --script snmp-brute 192.168.121.1
Nmap脚本引擎原理
虽然Nmap内嵌的服务于版本探测已足够强大,但是在某些情况下我们需要多伦次的交互才能够探测到服务器的信息,这时候就需要自己编写NSE插件实现这个功能。NSE插件能够完成网络发现、复杂版本探测、脆弱性探测、简单漏洞利用等功能。
由上图可以看到四类脚本的运行阶段,以及他们的功能。
- 1)在nmap_main里面,调用init_main()进行详细的初始化过程,加载Lua标准库与Nmap扩展库,准备参数环境,加载并执行nse_main.lua文件;这个文件加载用户选择的脚本文件,执行完之后返回函数对象给init_main(),被保存到Lua注册表中。
- 2)在nse_main.lua中,定义两个核心的类,Script和Thread,Script用于管理NSE脚本,当新的脚本被加载时,调用 Script.new创建脚本对象,该对象被保存下来在后续的扫描过程中使用;Thread用于管理脚本的执行,该类中也包含对脚本健全性的检查。在脚本执行时,如果脚本之间存在依赖关系,那么会将基础的无依赖的脚本统一执行完毕,再执行依赖性的脚本。
- 3)执行脚本扫描时,从nmap_main()中调用script_scan()函数。在进入script_scan()后,会标记扫描阶段类型,然后进入到初始化阶段返回的main()函数(来自nse_main.lua脚本中的main)中,在函数中解析具体的扫描类型。
- 4)main()函数负责处理三种类型的脚本扫描:预扫描(SCRIPT_PRE_SCAN)、脚本扫描(SCRIPT_SCAN)、后扫描 (SCRIPT_POST_SCAN)。预扫描即在Nmap调用的最前面(没有进行主机发现、端口扫描等操作)执行的脚本扫描,通常该类扫描用于准备基本的信息,例如到第三服务器查询相关的DNS信息。而脚本扫描,是使用NSE脚本来扫描目标主机,这是最核心的扫描方式。后扫描,是整个扫描结束后,做一些善后处理的脚本,比如优化整理某些扫描。
- 5)在main()函数中核心操作由run函数负责。而run()函数的本身设计用于执行所有同一级别的脚本(根据依赖关系划分的级别),直到所有线程执行完毕才退出。run()函数中实现三个队列:执行队列(Running Queue)、等待队列(Waiting Queue)、挂起队列(Pending Queue),并管理三个队列中线程的切换,直到全部队列为空或出错而退出。
参考资料:
《nmap渗透测试指南》 商广明 编写
https://nmap.org/nsedoc/ nmap脚本说明文档
https://nmap.org/nmap-fingerprinting-article-cn.html 使用TCP/IP协议栈指纹进行远程操作系统辨识
https://www.jianshu.com/p/4978fb900de3 谈谈扫描器
http://www.cnblogs.com/st-leslie/p/5115280.html 端口扫描之王
http://www.bubuko.com/infodetail-368336.html 安全工具 nmap强悍的扫描工具
https://zhuanlan.zhihu.com/p/26676508 渗透神器nmap
http://www.cnblogs.com/liun1994/p/7041373.html Nmap脚本引擎原理
https://blog.csdn.net/whatday/article/details/73823959 nmap脚本使用总结