目录
前言:
基础知识:
状态码:
2XX:
3XX:
4XX:
5XX:
消息头:
请求头:
响应头:
目录扫描:
接口扫描:
主机存活扫描:
ICMP:
编辑
NetBIOS:
ARP:
SNMP:
端口扫描:
NMAP漏洞扫描:
前言:
渗透测试中什么最重要,如果手里没有0day,那前期的信息收集算是很重要的了,可以说直接占了80%,漏洞就那些,大同小异,但是能不能比别人多找到几个暴露点就不一样了,所以有时候渗透有时候还是要有耐心,心细。扫描分为目录扫描,接口扫描和参数扫描,针对不同的架构需要指定不同的扫描方案。
基础知识:
扫描最需要关注的就是返回的状态码和大小,先列出常见的状态码;
状态码:
2XX:
2开头(请求成功) | |
---|---|
200[成功] | 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 |
201[已创建] | 请求成功并且服务器创建了新的资源。 |
202[已接受] | 服务器已接受请求,但尚未处理。 |
203[非授权信息] | 服务器已成功处理了请求,但返回的信息可能来自另一来源。 |
204[无内容] | 服务器成功处理了请求,但没有返回任何内容。 |
205[重置内容] | 服务器成功处理了请求,但没有返回任何内容。 |
206[部分内容] | 服务器成功处理了部分 GET 请求。 |
3XX:
3开头(请求被重定向) | |
---|---|
300[多种选择] | 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。 |
301[永久重定向] | 超级蜘蛛池之301重定向设置技巧,请求的网页已永久重定向到新位置。 服务器返回此响应[对 GET 或 HEAD 请求的响应]时,会自动将请求者转到新位置 |
302[临时重定向] | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 |
303[查看其他位置] | 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。 |
304[未修改] | 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 |
305[使用代理] | 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。 |
307[临时重定向] | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 |
4XX:
4开头(请求错误) | |
---|---|
400[错误请求] | 服务器不理解请求的语法。 |
401[未授权] | 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。 |
403[禁止] | 服务器拒绝请求。 |
404[未找到] | 404 not found,服务器找不到请求的网页,网站404页面对SEO优化的影响及作用 |
405[方法禁用] | 禁用请求中指定的方法。 |
406[不接受] | 无法使用请求的内容特性响应请求的网页。 |
407[需要代理授权] | 此状态代码与 401[未授权]类似,但指定请求者应当授权使用代理。 |
408[请求超时] | 服务器等候请求时发生超时。 |
409[冲突] | 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。 |
410[已删除] | 如果请求的资源已永久删除,服务器就会返回此响应。 |
411[需要有效长度] | 服务器不接受不含有效内容长度标头字段的请求。 |
412[未满足前提条件] | 服务器未满足请求者在请求中设置的其中一个前提条件。 |
413[请求实体过大] | 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 |
414[请求的 URI 过长] | 请求的 URI[通常为网址]过长,服务器无法处理。 |
415[不支持的媒体类型] | 请求的格式不受请求页面的支持。 |
416[请求范围不符合要求] | 如果页面无法提供请求的范围,则服务器会返回此状态代码。 |
417[未满足期望值] | 服务器未满足"期望"请求标头字段的要求。 |
5XX:
5开头(服务器错误) | |
---|---|
500[服务器内部错误] | 服务器遇到错误,无法完成请求。 |
501[尚未实施] | 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 |
502[错误网关] | 服务器作为网关或代理,从上游服务器收到无效响应。 |
503[服务不可用] | 服务器目前无法使用[由于超载或停机维护]。 通常,这只是暂时状态 |
504[网关超时] | 服务器作为网关或代理,但是没有及时从上游服务器收到请求。 |
505[HTTP 版本不受支持] | 服务器不支持请求中所用的 HTTP 协议版本。 |
消息头:
请求头:
Accept:定义客户端可接受的响应内容类型;
Accept-charset:定义客户端可接受的字符集;
Accept-Encoding:定义客户端可接受的编码方式,比如打包方式--gzip 等;
cookie:由服务器通过 set-cookie 设置的 cookie;
Content-Length:请求体的长度;
Content-Type:请求体的数据类型:Content-Type: application/x-www-form-urlencoded;
Date:发送该请求的日期和时间;
Host:所请求的服务器地址;
Referrer:表示页面是从哪个地链接过来的,可以用来统计网页上的链接访问量;
User-Agent:显示客户端的身份标识;
If-Modified-Since:用于协商缓存,取自 Response haders 中的 Last-Modified 字段。服务器通过对比这两个字段判断缓存是否有效;
If-None-Match:用于协商缓存,取自 Response Headers 中的 E-tag 字段。服务器通过对比这两个字段判断缓存是否有效;
响应头:
Access-Control-Allow-Origin:指定哪些网站以跨域资源共享(CORS);
Content-Encoding:响应资源的编码方式;
Content-Language:响应资源所使用的语言;
Content-Length:响应资源的长度;
Content-type:响应内容的数据类型;
Date:消息被发送时的日期和时间;
Location:用于重定向;
Set-Cookie:用于设置客户端的 cookie ;
Status:用来说明当前 Http 连接的状态;
Last-Modified:服务器返回给客户端,下次请求通过在 Resquest Headers 中的 If-Modified-Since 字段携带过来。
E-tag:服务器返回给客户端,下次请求通过在 Resquest Headers 中的 If-None-Matched 字段携带过来。
Cache-Control:
max-age:缓存有效期,浏览器自己通过计时判断缓存是否过期。如果未过期则命中强制缓存。
no-cache:不使用强制缓存,直接进入协商缓存。
no-store:不使用缓存,每次请求都会进行 http 请求。
目录扫描:
目录扫描我比较常用的是dirsearch和DirBuster两个工具:
DirBuster没什么好说的,java编写的有可视化界面,可以递归扫描可以在扫描中调整线程,简单方便,网上直接下载使用即可
dirsearch我觉的还是比较好用的,可以递归扫描,可定制的消息头等功能还是不错的,可以直接apt安装:
https://github.com/maurosoria/dirsearch
apt install dirsearch
pip install dirsearch
直接列出我常用的命令,并解释:
dirsearch -u http://127.0.0.1:8080 -w /home/password/dir.txt -f -e php,js
这里我的字典中不包含后缀,使用-f 自定义后缀,然后使用-e添加我们要扫描的后缀,扫描的时候会首先扫描字典中不加后缀如amdin,然后admin.php和admin.js
dirsearch -u http://127.0.0.1:8080 -w /home/password/dir.txt -r -t 10 --max-recursion-depth 3 --recursion-status 200-399
使用-r可以进行递归扫描,-t可以限制线程也就是发包数量,防止被封锁,--max-recursion-depth为最大递归目录层级,--recursion-status为过滤显示的状态码
其他的如果需要添加cookie可以参考帮助内容进行设置;
接口扫描:
接口扫描就不能使用目录扫描工具,我一般使用burp的Intruder功能:
接口扫描一半要配合目录扫描完成,当然如果服务器采用的是resturl也可以通过目录扫描的方式扫描接口,如果不是则可以使用burp有针对性的对接口进行扫描。
主机存活扫描:
针对主机存活扫描主要通过ICMP、NetBIOS、ARP、SNMP、SMB六种协议进行存活扫描,下面一一介绍:
ICMP:
ICMP协议全称为 Internet Control Message Protocol (Internet控制报文协议),主要就是我们常使用的ping命令:
for /l %i in (1,1,255) do @ ping 192.168.5.%i -w 1 -n 1|find /i "ttl="
nmap -sn -PE -T4 192.168.5.0/24
但是通过这种方式扫描很容易被检测到,只要中间存在流量检测设备很容易就发现存在大量异常的ICMP流量,不符合正常,并且主机可以设置关闭ICMP应答,会导致漏报。
这里需要注意使用nmap的参数为:
-PE/PP/PM : 对应为使用ICMP echo、 ICMP timestamp、ICMP netmask 请求包发现主机
-
ICMP Echo(回显请求和回显应答):
- 回显请求(Echo Request)是一种ICMP消息,通常由网络管理员或工具发送给目标主机,以测试目标主机的可达性和测量往返时间(Round-Trip Time,RTT)。
- 目标主机接收到回显请求后,会返回一个回显应答(Echo Reply)消息,其中包含与请求相对应的数据,以确认目标主机的可达性。
- Ping工具使用的就是ICMP Echo请求和应答消息。
-
ICMP Timestamp(时间戳请求和时间戳应答):
- 时间戳请求(Timestamp Request)是一种ICMP消息,用于获取目标主机的当前时间戳信息。
- 目标主机接收到时间戳请求后,会返回一个时间戳应答(Timestamp Reply)消息,其中包含与请求相对应的时间戳信息。
- 时间戳请求和应答消息可以用于同步网络中的时间,进行时间测量和故障排除等操作。
-
ICMP Netmask(掩码请求和掩码应答):
- 掩码请求(Address Mask Request)是一种ICMP消息,用于获取目标主机的子网掩码信息。
- 目标主机接收到掩码请求后,会返回一个掩码应答(Address Mask Reply)消息,其中包含与请求相对应的子网掩码信息。
- 掩码请求和应答消息可以用于获取目标主机所在网络的子网掩码,有助于进行网络配置和路由表的设置。
ICMP Echo用于测试主机的可达性和测量往返时间(Ping),ICMP Timestamp用于获取主机的时间信息,ICMP Netmask用于获取主机的子网掩码信息。这些消息在网络管理、故障排除和配置中发挥着不同的作用,所以在使用nmap扫描的时候可以根据实际情况选择使用哪个协议
NetBIOS:
NetBIOS(Network Basic Input/Output System)是一种面向会话的网络通信协议,最初由IBM开发,用于在局域网中的计算机之间进行通信。NetBIOS提供了一组用于命名、发现和管理网络上计算机资源的服务。
NetBIOS协议的主要功能包括:
-
命名服务:NetBIOS允许计算机在局域网中注册和识别自己的名称。每个计算机可以使用一个15个字符的NetBIOS名称来标识自己。这些名称可以用于标识计算机、打印机、共享文件夹等资源。
-
会话服务:NetBIOS提供了会话层的功能,允许计算机之间建立会话并进行数据传输。它支持可靠的、面向连接的会话,确保数据的可靠传输和错误处理。
-
数据报服务:NetBIOS还提供了无连接的数据报服务,允许计算机之间以无连接的方式发送和接收数据。这种方式类似于UDP协议。
-
名称解析服务:NetBIOS使用名称解析服务将NetBIOS名称转换为网络地址(如IP地址)。这使得计算机可以通过名称来寻找和访问其他计算机,而不需要直接使用IP地址。
NetBIOS协议在早期的局域网环境中广泛使用,特别是在Microsoft Windows操作系统中。然而,随着网络技术的发展和引入更先进的协议(如TCP/IP),NetBIOS的重要性逐渐下降。然而,NetBIOS仍然被用于一些特定的应用场景和遗留系统中。
需要注意的是,NetBIOS是一个协议,而NetBIOS名称服务(NBNS)是一种基于UDP的名称解析服务,用于将NetBIOS名称转换为IP地址。NBNS使用端口号137进行通信。
nmap -sn -PE -T4 192.168.5.0/24
可以看到扫描是基于UDP扫描137端口,所以要配合tcp扫描,进而得到比较全的暴露面
当然也可以使用nbtscan工具扫描,下载地址如下:
http://www.unixwiz.net/tools/nbtscan.html#download
ARP:
ARP(Address Resolution Protocol,地址解析协议)是在计算机网络中用于将IP地址转换为物理MAC地址的协议。它是在局域网(LAN)中工作的一种协议,用于解决网络层(IP层)和数据链路层(MAC层)之间的地址映射问题。
当主机在发送数据包时,需要知道目标主机的物理地址(MAC地址),以便将数据包正确地发送到目标主机。然而,主机通常只知道目标主机的IP地址,而不知道其MAC地址。这时候,ARP协议就发挥作用了。
ARP协议工作的基本原理如下:
-
主机A想要发送数据包给目标主机B,但只知道B的IP地址。
-
主机A首先检查本地的ARP缓存表(ARP Cache)中是否存在目标主机B的IP地址对应的MAC地址。如果存在,主机A可以直接使用缓存中的MAC地址。
-
如果ARP缓存表中没有目标主机B的IP地址对应的MAC地址,主机A将发送一个ARP请求广播消息到局域网上的所有主机。
-
ARP请求消息中包含了主机A自己的IP地址、MAC地址以及目标主机B的IP地址。其他主机收到ARP请求消息后,会检查自己的IP地址是否与请求中的目标IP地址相匹配。
-
目标主机B收到ARP请求后,会向主机A发送ARP响应消息,包含自己的IP地址和MAC地址。
-
主机A收到ARP响应消息后,将目标主机B的IP地址和MAC地址添加到ARP缓存表中,并使用该MAC地址发送数据包给目标主机B。
针对ARP的扫描,windows下可以使用arp-scan.exe,下载地址如下:
https://github.com/QbsuranAlang/arp-scan-windows-
linux下可以使用arp-scan,命令如下:
arp-scan --interface=eth0 192.168.5.0/24
arp-scan --localnet
也可以使用nmap:
nmap -sn -PR 192.168.0.*
SNMP:
SNMP(Simple Network Management Protocol,简单网络管理协议)是一种用于管理和监控网络设备的应用层协议。它提供了一种标准的方式,使得网络管理员可以远程监视和管理网络中的设备、收集性能数据、配置设备以及检测和解决故障。
SNMP的基本原理如下:
-
管理站点和代理:SNMP网络中通常包含一个或多个管理站点(Manager)和被管理的设备(Agent)。管理站点负责监控和管理网络设备,而代理则是网络设备上运行的软件模块,负责与管理站点进行通信。
-
MIB(Management Information Base):MIB是一种数据库,用于存储和组织网络设备的管理信息。MIB定义了一组对象(Object),每个对象都有一个唯一的标识符(OID,Object Identifier)和相关的属性。管理站点通过查询和设置这些对象来获取和修改设备的状态和配置。
-
SNMP消息:SNMP使用消息进行管理和监控操作。常见的SNMP消息类型包括Get(获取单个对象的值)、Set(设置单个对象的值)、Trap(设备主动发送的事件通知)等。
-
SNMP版本:SNMP有多个版本,包括SNMPv1、SNMPv2c、SNMPv3等。这些版本在安全性、功能和协议特性方面有所差异。
SNMP主要用于监控网络设备的状态和性能,例如路由器、交换机、服务器等。它可以提供有关设备的信息,如CPU利用率、内存使用情况、网络流量、接口状态等。通过SNMP,管理员可以实时监控设备的运行状况、识别潜在问题并采取相应的措施。
需要注意的是,SNMP是一种面向连接的协议,使用UDP作为传输层协议,运行在应用层。为了确保安全性,SNMPv3引入了加密和认证机制,以保护管理信息的机密性和完整性
我们可以使用nmap进行探测,但是这里需要主要设定-p端口,如果不设置会扫描默认端口,会非常慢,不建议在探测的时候进行扫描。
nmap -sU --script snmp-brute 192.168.139.0/24 -T4 -p 445
在扫描中首先是通过arp广播,有返回了才会对445端口测试
在探测中推荐arp探测主机存活,然后将没扫描到的通过ICMP检查是否有遗漏。
端口扫描:
端口扫描我们经常使用的是nmap,其参考文档地址如下:
https://nmap.org/book/man.html
先列出在端口扫描中常用的配置解释:
扫描类型:
-sT TCP connect()扫描,这种方式会在目标主机的日志中记录大批连接请求和错误信息。
-sS 半开扫描,很少有系统能把它记入系统日志。不过,需要Root权限
-sU UDP扫描,但UDP扫描是不可靠的
-sn 对目标进行ping检测,不进行端口扫描扫描参数:
-p 指定端口,如"1-65535、1433、135、22、80"等
--script=<脚本名称> 添加脚本扫描
-O 对目标主机的操作系统进行扫描
-sV 探测端口服务版本
-Pn 目标机禁用ping,绕过ping扫描扫描技术:
-sN 使用TCP Null扫描。在Null扫描中,发送的TCP报文没有设置任何标志位(即所有标志位均为0),用于测试目标主机对Null扫描的响应。如果目标主机返回RST响应,则表示该端口是关闭的。
-sF 使用TCP FIN扫描。在FIN扫描中,发送的TCP报文中只设置了FIN标志位,用于测试目标主机对FIN扫描的响应。如果目标主机返回RST响应,则表示该端口是关闭的。
-sX 使用TCP Xmas扫描。在Xmas扫描中,发送的TCP报文的FIN、URG和PSH标志位都被设置为1,用于测试目标主机对Xmas扫描的响应。如果目标主机返回RST响应,则表示该端口是关闭的。
-sA 使用TCP ACK扫描。在ACK扫描中,发送的TCP报文只设置了ACK标志位,用于测试目标主机对ACK扫描的响应。ACK扫描常用于确定防火墙规则和过滤器的存在、绕过防火墙的限制等。响应的不同情况可能有多种解释。
-sI <代理主机> <目标主机> 通过代理主机扫描目标配置参数:
--source-port 随机化端口号
--scan-delay 延迟数据包发送,减慢扫描速度
--max-parallelism 设置扫描线程
-T4: 指定扫描过程使用的时序,总有6个级别(0-5),级别越高,扫描速度越快,但也容易被防火墙或IDS检测并屏蔽掉
半开模式tcp扫描),使用-sT会产生大量的日志,不建议使用:
nmap -sS -sV -O -Pn 192.168.1.1 --source-port -p 1-65535 --max-parallelism 100
UDP扫描:
添加了--scan-delay扫描速度会极其的慢,在有防火墙的可以:
nmap -sU -Pn 192.168.1.1 --scan-delay 500ms --source-port -p 1-65535
快速扫描:
nmap -sU -Pn 192.168.5.99 --source-port -T3 -p 1-65535
NMAP漏洞扫描:
当我们使用nmap扫描目标的时候,当扫描出具体的服务指纹对应到对应的服务版本号,这个时候我们可以使用nmap脚本比对该版本是否存在cve漏洞,可以极大的减轻我们的工作负担:
有vulscan和nmap-vulners两个工具,链接如下,随便选一个就行,我这里用第一个:
https://github.com/scipag/vulscan
https://github.com/vulnersCom/nmap-vulners/tree/master
首先进入目录/usr/share/nmap/scripts/新建vulscan
cd /usr/share/nmap/scripts/vulscangit clone https://github.com/scipag/vulscan.git
定期更新内部cve库:
chmod 744 update.sh
./update.sh
使用命令如下:
完全扫描:
nmap --script=vulscan/vulscan.nse -sV -O 192.168.5.99
指定csv扫描:
nmap --script=vulscan/vulscan.nse --script-args vulscandb=exploitdb.csv -sV -O 192.168.5.99
其中我们可以指定vulscandb来指定使用哪个csv,全部都用会有大量无用数据,反而很难分析,指定一个就够了:
共有八个csv可以选择:
exploitdb.csv
osvdb.csv
securityfocus.csv
xforce.csv
securitytracker.csv
cve.csv
openvas.csv
scipvuldb.csv
总结:
主机扫描差不多就这些了,包括目录扫描,端口扫描,前期对目标的web服务进行目录扫描和主机服务的端口扫描加漏洞扫描基本用的就是上述方法和工具,当然还有很多其他很好用的工具,但是原理都差不多,用的顺手都差不多,针对内网主机的扫描使用的是另外一种方法和工具,这个后期再进行讲解