SQLMap
SQLMap是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB。SQLMap采用了以下5种独特的SQL注入技术。● 基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入。
● 基于时间的盲注,即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已执行(即页面返回时间是否增加)来判断。
● 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中。
● 联合查询注入,在可以使用Union的情况下的注入。
● 堆查询注入,可以同时执行多条语句时的注入。
SQLMap的强大的功能包括数据库指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时实行任意命令。SQLMap的功能强大到让人惊叹,当常规的注入工具不能利用SQL注入漏洞进行注入时,使用SQLMap会有意想不到的效果。
SQLMap的安装需要Python环境(不支持Python 3),目前使用的是Python 2.7.3,可在官网下载安装包并一键安装,安装完成后,复制Python的安装目录,添加到环境变量值中,如下图所示:
然后在SQLMap的官网(http://www.sqlmap.org)下载最新版的SQLMap,下载到Python的安装目录下,并把SQLMap目录加到环境变量中。打开cmd,输入sqlmap.py命令后工具即可正常运行,如下图所示:
1.判断是否存在注入
假设目标注入点是http://192.168.1.104/sql1/Less-1/? id=11,判断其是否存在注入的命令如下所示:
sqlmap.py -u http://192.168.1.104/sql1/Less-1/? id=1
结果显示存在注入,如下图所示:
还有一种情况,当注入点后面的参数大于等于两个时,需要加双引号,如下所示。
sqlmap.py -u "http://192.168.1.104/sql1/Less-1/? id=1&uid=2 "
可以看到,运行完判断是否存在注入的语句后,“爆出”一大段代码,下面来分析代码反馈给我们的信息。这里有三处需要选择的地方:第一处的意思为检测到数据库可能是MySQL,是否需要跳过检测其他数据库;第二处的意思是在“level1、risk1”的情况下,是否使用MySQL对应的所有Payload进行检测;第三处的意思是参数ID存在漏洞,是否要继续检测其他参数,一般默认按回车键即可,如下图所示:
2.判断文本中的请求是否存在注入
从文件中加载HTTP请求,SQLMap可以从一个文本文件中获取HTTP请求,这样就可以不设置其他参数(如cookie、POST数据等), txt文件中的内容为Web数据包,如下图所示:
判断是否存在注入的命令如下所示,运行后的结果如下图所示,-r一般在存在cookie注入时使用。
3.查询当前用户下的所有数据库
该命令是确定网站存在注入后,用于查询当前用户下的所有数据库,如下所示。如果当前用户有权限读取包含所有数据库列表信息的表,使用该命令就可以列出所有数据库,如下所示:
sqlmap.py -u http://192.168.1.104/sql1/Less-1/? id=1 --dbssqlmap.py -u http://192.168.1.104/sql1/Less-1/? id=1 --dbs
从下图中可以看到,查询出了17个数据库及所有数据库的库名。当继续注入时,–dbs缩写成-D xxx,其意思是在xxx数据库中继续查询其他数据。
4.获取数据库中的表名
该命令的作用是查询完数据库后,查询指定数据库中所有的表名,如下所示。如果在该命令中不加入-D参数来指定某一个具体的数据库,那么SQLMap会列出数据库中所有库的表,如下所示:
sqlmap.py -u "http://192.168.1.7/sql/union.php? id=1" -D dkeye --tables
从上图中可以看到dkeye数据库中拥有的3个表名。当继续注入时,–tables缩写成-T,意思是在某表中继续查询。
5.获取表中的字段名
该命令的作用是查询完表名后,查询该表中所有的字段名,如下所示。运行该命令的结果如下所示:
sqlmap.py -u "http://192.168.1.7/sql/union.php? id=1"-D dkeye -T user\_info --columns
从上图中可以看到在dkeye数据库中的user_info表中一共有4个字段。在后续的注入中,–columns缩写成-C。
6.获取字段内容
该命令是查询完字段名之后,获取该字段中具体的数据信息,如下所示:
sqlmap.py -u "http://192.168.1.7/sql/union.php? id=1" -D dkeye -T user\_info -C username, password --dump
这里需要下载的数据是dkeye数据库里user_info表中username和password的值,如下图所示:
7.获取数据库的所有用户
该命令的作用是列出数据库的所有用户,如下所示。在当前用户有权限读取包含所有用户的表的权限时,使用该命令就可以列出所有管理用户。
sqlmap.py -u "http://192.168.1.7/sql/union.php? id=1" --userssqlmap.py -u "http://192.168.1.7/sql/union.php? id=1" --users
可以看到,当前用户账号是root,如下图所示:
8.获取数据库用户的密码
该命令的作用是列出数据库用户的密码,如下所示。如果当前用户有读取包含用户密码的权限,SQLMap会先列举出用户,然后列出Hash,并尝试破解。
sqlmap.py -u "http://192.168.1.7/sql/union.php? id=1" --passwords
从下图中可以看到,密码使用MySQL5加密,可以在www.cmd5.com中自行解密。
9.获取当前网站数据库的名称
使用该命令可以列出当前网站使用的数据库,如下所示。
sqlmap.py -u "http://192.168.1.7/sql/union.php? id=1" --current-db
从下图中可以看到数据库是’sql’。
10.获取当前网站数据库的用户名称
使用该命令可以列出当前网站使用的数据库用户,如下所示。
sqlmap.py -u "http://192.168.1.7/sql/union.php? id=1" --current-user
从下图中可以看到,用户是root。
1.–level 5:探测等级
参数–level 5指需要执行的测试等级,一共有5个等级(1~5),可不加level,默认是1。SQLMap使用的Payload可以在xml/payloads.xml中看到,也可以根据相应的格式添加自己的Payload,其中5级包含的Payload最多,会自动破解出cookie、XFF等头部注入。当然,level 5的运行速度也比较慢。这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie在level为2时就会测试,HTTP User-Agent/Referer头在level为3时就会测试。总之,在不确定哪个Payload或参数为注入点时,为了保证全面性,建议使用高的level值。
2.–is-dba:当前用户是否为管理权限
该命令用于查看当前账户是否为数据库管理员账户,如下所示,在本案例中输入该命令,会返回Ture,如下所示:
sqlmap.py -u "http://192.168.1.7/sql/union.php? id=1" --is-dba
3.–roles:列出数据库管理员角色
该命令用于查看数据库用户的角色。如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,也可以用-U参数指定想看哪个用户的角色。该命令仅适用于当前数据库是Oracle的时候。在本案例中输入该命令的结果如下图所示:
4.–referer:HTTP Referer头
SQLMap可以在请求中伪造HTTP中的referer,当–level参数设定为3或3以上时,会尝试对referer注入。可以使用referer命令来欺骗,如–refererhttp://www.baidu.com。
5.–sql-shell:运行自定义SQL语句
该命令用于执行指定的SQL语句,如@下所示,假设执行select*from users limit 0,1语句,结果如下图所示:
sqlmap.py -u "http://192.168.1.7/sql/union.php? id=1" --sql-shell
6.–os-cmd, --os-shell:运行任意操作系统命令
在数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,如果数据库为MySQL、PostgreSQL, SQLMap上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval(),那么创建的这两个函数就可以执行系统命令。在Microsoft SQL Server中,SQLMap将使用xp_cmdshell存储过程,如果被禁用(在Microsoft SQL Server 2005及以上版本默认被禁制),则SQLMap会重新启用它;如果不存在,会自动创建。用–os-shell参数可以模拟一个真实的Shell,输入想执行的命令。当不能执行多语句时(比如PHP或ASP的后端数据库为MySQL),仍然可以使用INTO OUTFILE写进可写目录,创建一个Web后门。–os-shell支持ASP、ASP.NET、JSP和PHP四种语言(要想执行改参数,需要有数据库管理员权限,也就是–is-dba的值要为True)。
Burp Suite是一款集成化的渗透测试工具,包含了很多功能,可以帮助我们高效地完成对Web应用程序的渗透测试和攻击。
Burp Suite由Java语言编写,基于Java自身的跨平台性,使这款软件学习和使用起来更方便。Burp Suite不像其他自动化测试工具,它需要手工配置一些参数,触发一些自动化流程,然后才会开始工作。
Burp Suite可执行程序是Java文件类型的jar文件,免费版可以从官网下载。免费版的Burp Suite会有许多限制,无法使用很多高级工具,如果想使用更多的高级功能,需要付费购买专业版。专业版与免费版的主要区别有以下三点:
● Burp Scanner。
● 工作空间的保存和恢复。
● 拓展工具,如Target Analyzer、Content Discovery和Task Scheduler。
Burp Suite是用Java语言开发的,运行时依赖JRE,需要安装Java环境才可以运行。用百度搜索JDK,选择安装包然后下载即可,打开安装包后单击“下一步”按钮进行安装(安装路径可以自己更改或者采用默认路径)。提示安装完成后,打开cmd,输入java-version进行查看,若返回版本信息则说明已经正确安装,如下图所示:
接下来配置环境变量,右击“计算机”,接着单击“属性”→“高级系统设置”→“环境变量”,然后新建系统变量,在弹出框的“变量名”处输入“JAVA_HOME”,在“变量值”处输入JDK的安装路径,如“C:\Program Files(x86)\Java\jdk1.8.0_112”,然后单击“确定”按钮。
在“系统变量”中找到PATH变量,在“变量值”的最前面加上“%JAVA_HOME%\bin; ”,然后单击“确定”按钮。
在“系统变量”中找到CLASSPATH变量,若不存在则新建这个变量,在“变量值”的最前面加上“.; %JAVA_HOME%\lib\dt.jar; %JAVA_HOME%\lib\tools.jar;”,然后单击“确定”按钮。
打开cmd,输入javac,若返回帮助信息,如下图所示,说明已经正确配置了环境变量。
下载好的Burp无须安装,直接双击BurpLoader.jar文件即可运行,如下图所示:
Burp Suite代理工具是以拦截代理的方式,拦截所有通过代理的网络流量,如客户端的请求数据、服务器端的返回信息等。Burp Suite主要拦截HTTP和HTTPS协议的流量,通过拦截,Burp Suite以中间人的方式对客户端的请求数据、服务端的返回信息做各种处理,以达到安全测试的目的。
在日常工作中,最常用的Web客户端就是Web浏览器,我们可以通过设置代理信息,拦截Web浏览器的流量,并对经过Burp Suite代理的流量数据进行处理。BurpSuite运行后,Burp Proxy默认本地代理端口为8080,如下图所示:
这里以Firefox浏览器为例,单击浏览器右上角“打开菜单”,依次单击“选项”→“常规”→“网络代理”→“设置”→“手动配置代理”,如下图所示,设置HTTP代理为127.0.0.1,端口为8080,与Burp Proxy中的代理一致。
2.1 Proxy
Burp Proxy是利用Burp开展测试流程的核心,通过代理模式,可以让我们拦截、查看、修改所有在客户端与服务端之间传输的数据。
Burp Proxy的拦截功能主要由Intercept选项卡中的Forward、Drop、Interception is on/off和Action构成,它们的功能如下所示:
● Forward表示将拦截的数据包或修改后的数据包发送至服务器端。
● Drop表示丢弃当前拦截的数据包。
● Interception is on表示开启拦截功能,单击后变为Interception is off,表示关闭拦截功能。
● 单击Action按钮,可以将数据包进一步发送到Spider、Scanner、Repeater、 Intruder等功能组件做进一步的测试,同时也包含改变数据包请求方式及其body的编码等功能。
打开浏览器,输入需要访问的URL并按回车键,这时将看到数据流量经过Burp Proxy并暂停,直到单击Forward按钮,才会继续传输下去。如果单击了Drop按钮,这次通过的数据将丢失,不再继续处理。
当Burp Suite拦截的客户端和服务器交互之后,我们可以在Burp Suite的消息分析选项中查看这次请求的实体内容、消息头、请求参数等信息。Burp有四种消息类型显示数据包:Raw、Params、Headers和Hex。
● Raw主要显示Web请求的raw格式,以纯文本的形式显示数据包,包含请求地址、HTTP协议版本、主机头、浏览器信息、Accept可接受的内容类型、字符集、编码方式、cookie等,可以通过手动修改这些信息,对服务器端进行渗透测试。
● Params主要显示客户端请求的参数信息,包括GET或者POST请求的参数、cookie参数。可以通过修改这些请求参数完成对服务器端的渗透测试。
● Headers中显示的是数据包中的头信息,以名称、值的形式显示数据包。
● Hex对应的是Raw中信息的二进制内容,可以通过Hex编辑器对请求的内容进行修改,在进行00截断时非常好用,如下图所示:
2.2 Spider
Spider的蜘蛛爬行功能可以帮助我们了解系统的结构,其中Spider爬取到的内容将在Target中展示,如下图所示,界面左侧为一个主机和目录树,选择具体某一个分支即可查看对应的请求与响应。
2.3 Decoder
Decoder的功能比较简单,它是Burp中自带的编码解码及散列转换的工具,能对原始数据进行各种编码格式和散列的转换。
Decoder的界面如下图所示。输入域显示的是需要编码/解码的原始数据,此处可以直接填写或粘贴,也可以通过其他Burp工具上下文菜单中的“Send toDecoder”选项发送过来;输出域显示的是对输入域中原始数据进行编码/解码的结果。无论是输入域还是输出域都支持文本和Hex这两种格式,编码解码选项由解码选项(Decode as)、编码选项(Encode as)、散列(Hash)构成。在实际使用时,可以根据场景的需要进行设置。
对编码解码选项而言,目前支持URL、HTML、Base64、ASCII、十六进制、八进制、二进制和GZIP共八种形式的格式转换,Hash散列支持SHA、SHA-224、SHA-256、SHA-384、SHA-512、MD2、MD5格式的转换。更重要的是,对同一个数据,我们可以在Decoder界面进行多次编码、解码的转换。
3.1 Scanner
Burp Scanner主要用于自动检测Web系统的各种漏洞。本小节介绍Burp Scanner的基本使用方法,在实际使用中可能会有所改变,但大体环节如下。
首先,确认Burp Suite正常启动并完成浏览器代理的配置。然后进入Burp Proxy,关闭代理拦截功能,快速浏览需要扫描的域或URL模块,此时在默认情况下,Burp Scanner会扫描通过代理服务的请求,并对请求的消息进行分析来辨别是否存在系统漏洞。而且当我们打开Burp Target时,也会在站点地图中显示请求的URL树。
我们随便找一个网站进行测试,选择Burp Target的站点地图选项下的链接,在其链接URL上右击选择“Actively scan this host”,此时会弹出过滤设置,保持默认选项即可扫描整个域,如下图所示:
也可以在Proxy下的HTTP history中,选择某个节点上的链接URL并右击选择Do an active scan进行扫描,如下图所示:
这时,Burp Scanner开始扫描,在Scanner界面下双击即可看到扫描结果,如下图所示:
我们也可以在扫描结果中选中需要进行分析的部分,将其发送到repeater模块中进行模拟提交分析和验证,如下图所示:
当scanner扫描完成后,可以右击Burp Target站点地图选项下的链接,依次选择“issues”→“Report issues”选项,然后导出漏洞报告,如下图所示:
然后将漏洞报告以html文件格式保存,结果如下图所示:
通过以上操作步骤我们可以学习到:Burp Scanner主要有主动扫描和被动扫描两种扫描方式。
1.主动扫描(Active Scanning)
当使用主动扫描模式时,Burp会向应用发送新的请求并通过Payload验证漏洞。这种模式下的操作会产生大量的请求和应答数据,直接影响服务端的性能,通常用于非生产环境。主动扫描适用于以下这两类漏洞。
● 客户端的漏洞,如XSS、HTTP头注入、操作重定向。
● 服务端的漏洞,如SQL注入、命令行注入、文件遍历。
对第一类漏洞,Burp在检测时会提交input域,然后根据应答的数据进行解析。在检测过程中,Burp会对基础的请求信息进行修改,即根据漏洞的特征对参数进行修改,模拟人的行为,以达到检测漏洞的目的;对第二类漏洞,以SQL注入为例,服务端有可能返回数据库错误提示信息,也有可能什么都不反馈。Burp在检测过程中会采用各个技术验证漏洞是否存在,例如诱导时间延迟、强制修改Boolean值、与模糊测试的结果进行比较,以提高漏洞扫描报告的准确性。
2.被动扫描(Passive Scanning)
当使用被动扫描模式时,Burp不会重新发送新的请求,只是对已经存在的请求和应答进行分析,对服务端的检测来说,这比较安全,通常适用于生产环境的检测。一般来说,下列漏洞在被动模式中容易被检测出来。
● 提交的密码为未加密的明文。
● 不安全的cookie的属性,例如缺少HttpOnly和安全标志。
● cookie的范围缺失。
● 跨域脚本包含和站点引用泄露。
● 表单值自动填充,尤其是密码。
● SSL保护的内容缓存。
● 目录列表。
● 提交密码后应答延迟。
● session令牌的不安全传输。
● 敏感信息泄露,例如内部IP地址、电子邮件地址、堆栈跟踪等信息泄露。
● 不安全的ViewState的配置。
● 错误或不规范的Content-Type指令。
虽然被动扫描模式相比主动模式有很多不足,但同时也具有主动模式不具备的优点。除了对服务端的检测比较安全,当某种业务场景的测试每次都会破坏业务场景的某方面功能时,可以使用被动扫描模式验证是否存在漏洞,以减少测试的风险。
3.2 Intruder
Intruder是一个定制的高度可配置的工具,可以对Web应用程序进行自动化攻击,如通过标识符枚举用户名、ID和账户号码,模糊测试,SQL注入,跨站,目录遍历等。
它的工作原理是Intruder在原始请求数据的基础上,通过修改各种请求参数获取不同的请求应答。在每一次请求中,Intruder通常会携带一个或多个有效攻击载荷(Payload),在不同的位置进行攻击重放,通过应答数据的比对分析获得需要的特征数据。Burp Intruder通常被应用于以下场景。
● 标识符枚举。Web应用程序经常使用标识符引用用户、账户、资产等数据信息。例如,用户名、文件ID和账户号码。
● 提取有用的数据。在某些场景下,不是简单地识别有效标识符,而是通过简单标识符提取其他数据。例如,通过用户的个人空间ID获取所有用户在其个人空间的名字和年龄。
● 模糊测试。很多输入型的漏洞(如SQL注入、跨站点脚本和文件路径遍历)可以通过请求参数提交各种测试字符串,并分析错误消息和其他异常情况,来对应用程序进行检测。受限于应用程序的大小和复杂性,手动执行这个测试是一个耗时且烦琐的过程,因此可以设置Payload,通过Burp Intruder自动化地对Web应用程序进行模糊测试。
下面将演示利用Intruder模块爆破无验证码和次数限制的网站的方法,如下图所示,这里使用方法只是为了实验,读者不要将其用于其他非法用途。前提是你得有比较好的字典,我们准备好的字典如下图所示。需要注意的是,Burp Suite的文件不要放在中文的路径下。
首先将数据包发送到intruder模块
Burp会自动对某些参数进行标记,这里先清除所有标记
然后选择要进行暴力破解的参数值,将pass参数选中,单击“Add$”按钮,这里只对一个参数进行暴力破解,所以攻击类型使用sniper即可,如下图所示。这里要注意的是,如果要同时对用户名和密码进行破解,可以同时选中user和pass参数,并且选择交叉式cluster bomb模式进行暴力破解。
● Sniper模式使用单一的Payload组。它会针对每个位置设置Payload。这种攻击类型适用于对常见漏洞中的请求参数单独进行Fuzzing测试的情景。攻击中的请求总数应该是position数量和Payload数量的乘积。
● Battering ram模式使用单一的Payload组。它会重复Payload并一次性把所有相同的Payload放入指定的位置中。这种攻击适用于需要在请求中把相同的输入放到多个位置的情景。请求的总数是Payload组中Payload的总数。
● Pitchfork模式使用多个Payload组。攻击会同步迭代所有的Payload组,把Payload放入每个定义的位置中。这种攻击类型非常适合在不同位置中需要插入不同但相似输入的情况。请求的数量应该是最小的Payload组中的Payload数量。
● Cluster bomb模式会使用多个Payload组。每个定义的位置中有不同的Payload组。攻击会迭代每个Payload组,每种Payload组合都会被测试一遍。这种攻击适用于在位置中需要不同且不相关或者未知输入攻击的情景。攻击请求的总数是各Payload组中Payload数量的乘积。
下面选择要添加的字典
然后开始爆破并等待爆破结束
这里对Status或Length的返回值进行排序,查看是否有不同之处。如果有,查看返回包是否显示为登录成功,如果返回的数据包中有明显的登录成功的信息,则说明已经破解成功,如下图所示:
3.3 Repeater
Burp Repeater是一个手动修改、补发个别HTTP请求,并分析它们的响应的工具。它最大的用途就是能和其他Burp Suite工具结合起来使用。可以将目标站点地图、Burp Proxy浏览记录、Burp Intruder的攻击结果,发送到Repeater上,并手动调整这个请求来对漏洞的探测或攻击进行微调。
Repeater分析选项有4种:Raw、Params、Headers和Hex。
● Raw:显示纯文本格式的消息。在文本面板的底部有一个搜索和加亮的功能,可以用来快速定位需要寻找的字符串,如出错消息。利用搜索栏左边的弹出项,能控制状况的灵敏度,以及是否使用简单文本或十六进制进行搜索。
● Params:对于包含参数(URL查询字符串、cookie头或者消息体)的请求, Params选项会把这些参数显示为名字/值的格式,这样就可以简单地对它们进行查看和修改了。
● Headers:将以名字/值的格式显示HTTP的消息头,并且以原始格式显示消息体。
● Hex:允许直接编辑由原始二进制数据组成的消息。在渗透测试过程中,我们经常使用Repeater进行请求与响应的消息验证分析,例如修改请求参数、验证输入的漏洞;修改请求参数、验证逻辑越权;从拦截历史记录中,捕获特征性的请求消息进行请求重放。本节将抓包发送到Repeater,如下图所示:
在Repeater的操作界面中,左边的Request为请求消息区,右边的Response为应答消息区,请求消息区显示的是客户端发送的请求消息的详细信息。当我们编辑完请求消息后,单击“Go”按钮即可发送请求给服务端,如下图所示:
应答消息区显示的是对对应的请求消息单击“GO”按钮后,服务端的反馈消息。通过修改请求消息的参数来比对分析每次应答消息之间的差异,能更好地帮助我们分析系统可能存在的漏洞,如下图所示:
3.4 Comparer
Burp Comparer在Burp Suite中主要提供一个可视化的差异比对功能,来对比分析两次数据之间的区别,使用到的场合有:
● 枚举用户名的过程中,对比分析登录成功和失败时,服务端反馈结果的区别。
● 使用Intruder进行攻击时,对于不同的服务端响应,可以很快分析出两次响应的区别在哪里。
● 进行SQL注入的盲注测试时,比较两次响应消息的差异,判断响应结果与注入条件的关联关系。使用Comparer时有两个步骤,先是数据加载:
然后是差异分析:
Comparer数据加载的常用方式如下所示。
● 从其他Burp工具通过上下文菜单转发过来。
● 直接粘贴。
● 从文件里加载。加载完毕后,如果选择两次不同的请求或应答消息,则下发的比较按钮将被激活,此时可以选择文本比较或字节比较。
3.5 Sequencer
Burp Sequencer是一种用于分析数据样本随机性质量的工具。可以用它测试应用程序的会话令牌(Session token)、密码重置令牌是否可预测等场景,通Sequencer的数据样本分析,能很好地降低这些关键数据被伪造的风险。
Burp Sequencer主要由信息截取(Live Capture)、手动加载(Manual Load)和选项分析(Analysis Options)三个模块组成。
在截取信息后,单击Load按钮加载信息,然后单击“Analyze now”按钮进行分析,如下图所示:
Nmap(Network Mapper,网络映射器)是一款开放源代码的网络探测和安全审核工具。它被设计用来快速扫描大型网络,包括主机探测与发现、开放的端口情况、操作系统与应用服务指纹识别、WAF识别及常见安全漏洞。它的图形化界面是Zenmap,分布式框架为DNmap。
Nmap的特点如下所示:
● 主机探测:探测网络上的主机,如列出响应TCP和ICMP请求、ICMP请求、开放特别端口的主机。
● 端口扫描:探测目标主机所开放的端口。
● 版本检测:探测目标主机的网络服务,判断其服务名称及版本号。
● 系统检测:探测目标主机的操作系统及网络设备的硬件特性。
● 支持探测脚本的编写:使用Nmap的脚本引擎(NSE)和Lua编程语言。
Nmap的下载地址为https://nmap.org/download.html,本节下载的版本是7.40。读者在安装的过程中按照提示一步步安装即可,如下图所示:
3.1 扫描参数
进入安装目录后,在命令行直接执行Nmap或查看帮助文档(输入nmap–help)将显示Namp的用法及其功能,如下图所示:
在讲解具体的使用方法前,先介绍一下Nmap的相关参数的含义与用法。首先介绍设置扫描目标时用到的相关参数,如下所示:
● -iL:从文件中导入目标主机或目标网段。
● -iR:随机选择目标主机。
● --exclude:后面跟的主机或网段将不在扫描范围内。
● --excludefile:导入文件中的主机或网段将不在扫描范围中。
与主机发现方法相关的参数如下。
● -sL:List Scan(列表扫描),仅列举指定目标的IP,不进行主机发现。
● -sn:Ping Scan,只进行主机发现,不进行端口扫描。
● -Pn:将所有指定的主机视作已开启,跳过主机发现的过程。
● -PS/PA/PU/PY\[portlist\]:使用TCP SYN/ACK或SCTP INIT/ECHO方式来发现。
● -PE/PP/PM:使用ICMP echo、timestamp、netmask请求包发现主机。
● -PO\[protocollist\]:使用IP协议包探测对方主机是否开启。
● -n/-R:-n表示不进行DNS解析;-R表示总是进行DNS解析。
● --dns-servers<serv1\[, serv2\], ...>:指定DNS服务器。
● --system-dns:指定使用系统的DNS服务器。
● --traceroute:追踪每个路由节点。
与常见的端口扫描方法相关的参数如下。
● -sS/sT/sA/sW/sM:指定使用TCP SYN/Connect()/ACK/Window/Maimon scans的方式对目标主机进行扫描。
● -sU:指定使用UDP扫描的方式确定目标主机的UDP端口状况。
● -sN/sF/sX:指定使用TCP Null/FIN/Xmas scans秘密扫描的方式协助探测对方的TCP端口状态。
● --scanflags<flags>:定制TCP包的flags。
● -sI<zombie host\[:probeport\]>:指定使用Idle scan的方式扫描目标主机(前提是需要找到合适的zombie host)。
● -sY/sZ:使用SCTP INIT/COOKIE-ECHO扫描SCTP协议端口的开放情况。
● -sO:使用IP protocol扫描确定目标机支持的协议类型。
● -b<FTP relay host>:使用FTP bounce scan扫描方式。
跟端口参数与扫描顺序的设置相关的参数如下。
● -p<port ranges>:扫描指定的端口。
● -F:Fast mode(快速模式),仅扫描TOP 100的端口。
● -r:不进行端口随机打乱的操作(如无该参数,Nmap会将要扫描的端口以随机顺序的方式进行扫描,让Nmap的扫描不易被对方防火墙检测到)。
● --top-ports<number>:扫描开放概率最高的number个端口(Nmap的作者曾做过大规模的互联网扫描,以此统计网络上各种端口可能开放的概率,并排列出最有可能开放端口的列表,具体可以参见nmap-services文件。默认情况下,Nmap会扫描最有可能的1000个TCP端口)。
● --port-ratio<ratio>:扫描指定频率以上的端口。与上述--top-ports类似,这里以概率作为参数,概率大于--port-ratio的端口才被扫描。显然参数必须在0~1之间,想了解具体的概率范围可以查看nmap-services文件。
与版本侦测相关的参数如下所示。
● -sV:指定让Nmap进行版本侦测。
● --version-intensity<level>:指定版本侦测的强度(0~9),默认为7。数值越高,探测出的服务越准确,但是运行时间会比较长。
● --version-light:指定使用轻量级侦测方式(intensity 2)。
● --version-all:尝试使用所有的probes进行侦测(intensity 9)。
● --version-trace:显示出详细的版本侦测过程信息。
在了解以上参数及其含义后,再来看用法会更好理解,扫描命令格式:Nmap+扫描参数+目标地址或网段。比如一次完整的Nmap扫描命令如下:
nmap -T4 -A -v ip
其中-A表示使用进攻性(Aggressive)方式扫描;-T4表示指定扫描过程使用的时序(Timing),共有6个级别(0~5),级别越高,扫描速度越快,但也容易被防火墙或IDS检测并屏蔽掉,在网络通信状况良好的情况下推荐使用T4。-v表示显示冗余(verbosity)信息,在扫描过程中显示扫描的细节,有助于让用户了解当前的扫描状态。
3.2 常用方法
Nmap的参数较多,但是通常用不了那么多,以下是在渗透测试过程中比较常见的命令。
1.扫描单个目标地址
在Nmap后面直接添加目标地址即可扫描,如下图所示:
nmap 192.168.0.100
2.扫描多个目标地址
如果目标地址不在同一网段,或在同一网段但不连续且数量不多,可以使用该方法进行扫描,如下图所示:
nmap 192.168.0.100 192.168.0.105
3.扫描一个范围内的目标地址
可以指定扫描一个连续的网段,中间使用“-”连接,例如,下列命令表示扫描范围为192.168.0.100~192.168.0.110,如下图所示:
nmap 192.168.0.100-110
4.扫描目标地址所在的某个网段
以C段为例,如果目标是一个网段,则可以通过添加子网掩码的方式扫描,下列命令表示扫描范围为192.168.0.1~192.168.0.255,如下图所示:
nmap 192.168.0.100/24
5.扫描主机列表targets.txt中的所有目标地址
扫描targets.txt中的地址或者网段,此处导入的是绝对路径,如果targets.txt文件与 nmap.exe在同一个目录下,则直接引用文件名即可,如下图所示:
nmap -iL C:\\Users\\Aerfa\\Desktop\\targets.txt
6.扫描除某一个目标地址之外的所有目标地址
下列命令表示扫描除192.168.0.105之外的其他192.168.0.x地址,从扫描结果来看确实没有对192.168.0.105进行扫描,如下图所示:
nmap 192.168.0.100/24 -exclude 192.168.0.105
7.扫描除某一文件中的目标地址之外的目标地址
下列命令表示扫描除了target.txt文件夹中涉及的地址或网段之外的目标地址。还是以扫描192.168.0.x网段为例,在targets.txt中添加192.168.0.100和192.168.0.105,从扫描结果来看已经证实该方法有效可用,如下图所示:
nmap 192.168.0.100/24 -excludefile C:\\Users\\Aerfa\\Desktop\\targets.txt
8.扫描某一目标地址的21、22、23、80端口
如果不需要对目标主机进行全端口扫描,只想探测它是否开放了某一端口,那么使用-p参数指定端口号,将大大提升扫描速度,如下图所示:
nmap 192.168.0.100 -p 21,22,23,80
9.对目标地址进行路由跟踪
下列命令表示对目标地址进行路由跟踪,如图下所示:
nmap --traceroute 192.168.0.105
10.扫描目标地址所在C段的在线状况
下列命令表示扫描目标地址所在C段的在线状况,如下图所示:
nmap -sP 192.168.0.100/24
11.目标地址的操作系统指纹识别
下列命令表示通过指纹识别技术识别目标地址的操作系统的版本,如下图所示:
nmap -O 192.168.0.105
12.目标地址提供的服务版本检测
下列命令表示检测目标地址开放的端口对应的服务版本信息,如下图所示:
nmap -sV 192.168.0.105
13.探测防火墙状态
在实战中,可以利用FIN扫描的方式探测防火墙的状态。FIN扫描用于识别端口是否关闭,收到RST回复说明该端口关闭,否则就是open或filtered状态,如下图所示:
nmap -sF -T4 192.168.0.105
3.3 状态识别
Nmap输出的是扫描列表,包括端口号、端口状态、服务名称、服务版本及协议。通常有如下表所示的6种状态。
了解了以上状态,在渗透测试过程中,将有利于我们确定下一步应该采取什么方法或攻击手段。
3.4 脚本介绍
Nmap的脚本默认存在/xx/nmap/scripts文件夹下,如下图所示:
Nmap的脚本主要分为以下几类:
● Auth:负责处理鉴权证书(绕过鉴权)的脚本。
● Broadcast:在局域网内探查更多服务的开启情况,如DHCP/DNS/SQLServer等。
● Brute:针对常见的应用提供暴力破解方式,如HTTP/SMTP等。
● Default:使用-sC或-A选项扫描时默认的脚本,提供基本的脚本扫描能力。
● Discovery:对网络进行更多信息的搜集,如SMB枚举、SNMP查询等。
● Dos:用于进行拒绝服务攻击。
● Exploit:利用已知的漏洞入侵系统。
● External:利用第三方的数据库或资源。例如,进行Whois解析。
● Fuzzer:模糊测试脚本,发送异常的包到目标机,探测出潜在漏洞。
● Intrusive:入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽。
● Malware:探测目标机是否感染了病毒、开启后门等信息。
● Safe:此类与Intrusive相反,属于安全性脚本。
● Version:负责增强服务与版本扫描功能的脚本。
● Vuln:负责检查目标机是否有常见漏洞,如MS08-067。
用户还可根据需要设置–script=类别进行扫描,常用参数如下所示:
● -sC/--script=default:使用默认的脚本进行扫描。
● --script=<Lua scripts>:使用某个脚本进行扫描。
● --script-args=key1=value1, key2=value2······:该参数用于传递脚本里的参数, key1是参数名,该参数对应value1这个值。如有更多的参数,使用逗号连接。
● -script-args-file=filename:使用文件为脚本提供参数。
● --script-trace:如果设置该参数,则显示脚本执行过程中发送与接收的数据。
● --script-updatedb:在Nmap的scripts目录里有一个script.db文件,该文件保存了当前Nmap可用的脚本,类似于一个小型数据库,如果我们开启Nmap并调用了此参数,则Nmap会自行扫描scripts目录中的扩展脚本,进行数据库更新。
● --script-help:调用该参数后,Nmap会输出该脚本对应的脚本使用参数,以及详细的介绍信息。
3.5 实例
1.鉴权扫描
使用–script=auth可以对目标主机或目标主机所在的网段进行应用弱口令检测,如下图所示:
nmap --script=auth 192.168.0.105
2.暴力破解攻击
Nmap具有暴力破解的功能,可对数据库、SMB、SNMP等进行简单密码的暴力猜解,如下图所示:
nmap --script=brute 192.168.0.105
3.扫描常见的漏洞
Nmap具备漏洞扫描的功能,可以检查目标主机或网段是否存在常见的漏洞,如下图所示:
nmap --script=vuln 192.168.0.105
4.应用服务扫描
Nmap具备很多常见应用服务的扫描脚本,例如VNC服务、MySQL服务、Telnet服务、Rsync服务等,此处以VNC服务为例,如下图所示:
nmap --script=realvnc-auth-bypass 192.168.0.105
5.探测局域网内更多服务开启的情况
输入以下命令即可探测局域网内更多服务开启的情况,如下图所示:
nmap -n -p 445 --script=broadcast 192.168.0.105
6.Whois解析
利用第三方的数据库或资源查询目标地址的信息,例如进行Whois解析,如下图所示:
nmap -script external baidu.com
_我为大家整理了一份从入门到进阶的网络安全学习资料包,包含网安书籍、网安导图、网安工具等等