地址扫描探测是指利用ARP、ICMP请求目标网段,如果目标网段没有过滤规则,则可以通过回应消息获取目标网段中存活机器的IP地址和MAC地址,进而掌握拓扑结构。
TCP扫描
全连接扫描调用操作系统提供的connect()函数,通过完整的三次TCP连接来尝试目标端口是否开启。全连接扫描是一次完整的TCP连接。
端口开放状态
端口关闭状态
问题:找到攻击者扫描过的端口有哪些?
利用过滤器过滤ip和包类型从而判断攻击机扫描了那些端口,且端口开放。
tcp扫描主要过滤 RST 包,即攻击机在成功连接后请求关闭的端口。
ip.src_host==攻击机IP and ip.dst_host==靶机IP and tcp.flags.reset==1
tcp.flags.reset 表示 tcp标志为rst的包
SYN 扫描
半连接使用不完整的TCP连接,而是使用半连接状态判断端口是否开放,半连接扫描会减少端口连接开销,提高端口扫描速度。
端口开放状态
端口不开放状态
攻击机扫描了22端口,靶机回复syn ack,按理论攻击机收到靶机回复的 syn ack 就代表靶机此端口大概率开放,应发送RST断开连接,但是我的nmap并没有,可能需要多等一会儿。
攻击机扫描了3306端口,靶机直接回复了RST,说明靶机明确不开放此端口
过滤 syn包说明攻击机扫描了 22,3306端口
半开放扫描主要过滤 syn 包
ip.dst_host == 192.168.1.80 and ip.src_host ==192.168.1.199 and tcp.flags.syn==1
FIN扫描
fin包表示会话结束,发送fin包,如果回复rst包则表示端口可能关闭,如果没有相应表示端口可能开放,fin跟null包一样,具有不确定性,但是fin扫描在内网中因为没有完整的tcp连接可用避开ids,ips的检测。但我在实验中,不管是linux还是windows,准确性都很差。
攻击者发送 TCPFIN ,靶机没有响应就是开放,如果端口没有开放返回 RST ACK
端口开放状态
端口不开放状态
FIN 扫描 过滤 FIN 包
ip.addr == 攻击机ip and ip.addr ==靶机ip and !ssh and tcp.flags.fin==1
通过过滤发现攻击机扫描了 22端口与3306端口
但是靶机只开放了22端口,3306并没有开放,所有只返回了3306端口的RST包
ACK扫描
tcp ack通常用于防火墙配置规则扫描
tcpack利用标志位 ack,ack在tcp协议中表示确认序号有效,确认连接,但因为tcpack并没有完整的tcp连接,所以靶机都会返回 RST,所以无法用于端口扫描,但可用用于检测防火墙拦截了那些端口与放开了那些端口。
端口被防火墙拦截情况
端口未被防火墙拦截情况
nmap状态为unfiltered 未被过滤的,但是不能代表此端口开放。
采用 UDP ICMP 进行端口扫描,只能扫描udp协议的服务,不准确
端口开放状态
端口不开放状态
nmap 使用tcp/ip 协议栈识别操作系统,nmap保存了众多操作系统指纹特征,根据返回的特征与之匹配,如果无法匹配,则会以概率形式列举可能的系统。
首先通过ping arp 扫描,然后进行端口扫描,然后通过协议栈识别操作系统。
如果攻击者通过某种连接方式回显了操作系统版本比如执行了uname -a之类的命令,就可以通过通过正则识别
tcp matches "(.*linux)"
eq,== 等于
ne,!= 不等于
gt,> 比…大
lt,< 比…小 ge,>= 大于等于
le,<= 小于等于 and,|| 且 or,&& 或 not,! 取反
tcp.port == 80
tcp.dstport == 80 // 只显tcp协议的目标端口80
过滤端口范围
tcp.port >= 1 and tcp.port <= 80
常见服务协议
tcp
udp
arp
icmp
http
smtp
ftp
dns
msnms
ip
ssl
oicq
bootp
contains 过滤包含指定字符串的数据包
matches 匹配过滤条件中给定的正则表达式
http.host contains magentonotes.com //过滤经过指定域名的http数据包,这里的host值不一定是请求中的域名
http.response.code==302 //过滤http响应状态码为302的数据包
http.response==1 //过滤所有的http响应包
http.request==1 //过滤所有的http请求
http.request.method==POST //过滤所有请求方式为POST的http请求包,其它 方法也可以 比如 put,get等
http.cookie contains guid //过滤含有指定cookie的http数据包
http.server contains “nginx” //过滤http头中server字段含有nginx字符的数据包
http.content_type == "text/html" //过滤content_type是text/html的http响应、post包,即根据文件类型过滤http数据包
http.content_encoding == “gzip”//过滤content_encoding是gzip的http包
http.transfer_encoding == “chunked”//根据transfer_encoding过滤
http.content_length == 279 //根据content_length的数值过滤
http.content_length_header == “279″ //根据content_length的数值过滤头大小
http.server //过滤所有含有http头中含有server字段的数据包
http.request.version == “HTTP/1.1″ //过滤HTTP/1.1版本的http包,包括请求和响应
找到目标 CMS 信息
利用 matches 正则快速过滤包括 powered by 的字符
http matches "(.*?)powered by"
找到黑客通过SQL注入攻击时的软件名称
通过 正则匹配 sql,and 只有 request 的包
http matches "sql.*" and http.request==1
找到黑客登陆网站后台所用的账号密码
http.request.method==POST and http.request==1 and http matches "username"