服务扫描获取 banner 信息的方法有哪些

版权声明: https://blog.csdn.net/fageweiketang/article/details/84433194

0x00:简介

banner 信息来表示欢迎语,其中会包含一些敏感信息,所以获取 banner 也属于信息搜集的范畴。在渗透测试中,典型的 4xx、5xx 信息泄露就属于 banner 泄露的一种。在 banner 信息中,可以获取到软件开发商、软件名称、服务类型、版本号等。而版本号有时候就会存在公开的 CVE 问题,可以直接进行利用。

banner 信息获取的基础是在和目标建立链接后的,只有建立的链接,才可以获取到相应的 banner 信息,当目标对 banner 信息进行隐藏或者配置了禁止读取时,这时的 banner 则获取不到。

0x01:nc

nc 在建立链接后会返回相应端口的 banner,命令格式为 nc -nv 1.1.1.1 xx,ip 直接跟端口即可,示例如下:

请输入图片描述

上图中,21,22,23,25 端口都是开放的,并返回了 banner 信息,包括使用的服务和版本号。24 端口是没有开放的,直接返回了拒绝链接。

0x02:scapy

除了 nc 外,python 中的 socket 模块也可以用来获取 banner 信息,之前在主机发现、端口扫描时经常用到 scapy,而在这里 scapy 不合适。scapy 可以理解为是用来构造数据包、发送数据包、修改数据包以及接收数据包的。而 socket 可以理解为是用来建立链接发送数据和接收数据的,用于网络服务,网络编程。进入 python 环境,简单的利用 socket 进行链接目标并返回 banner 信息的示例如下:

请输入图片描述

以上过程可写为 python 脚本,脚本示例如下:

#!/usr/bin/python
import socket
import select
import sys

if len(sys.argv)!=4:
    print"error:./banner.py 1.1.1.1 1 100"
    sys.exit()

ip = sys.argv[1]
start = int(sys.argv[2])
end = int(sys.argv[3])

for port in range(start,end):
    try:
        banner = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        banner.connect((ip,port))
        ready = select.select([banner],[],[],1)
        if ready[0]:
            print"TCP port "+str(port)+"-"+banner.recv(1024)
            banner.close()
    except:
        pass

先说一下上面脚本的总体流程,首先是需要四个参数,一个是 ip 地址,一个是起始端口号,一个是结束端口号,在 sys 系统模块的 argv 参数这里,作用是从外部获取输入的内容作为参数,文件名也属于参数,所以是四个。然后分别分别分配给变量 ip、start、end,循环端口号给到 socket,最后获取 banner 信息。

再说一下细节,首先是 socket.socket 的参数,第一个参数是输入地址类型,第二个是输入套接字类型。socket.AF_INET 是用于服务之间的网络通信。socket.SOCK_STREAM 是用于 TCP,这两个参数的选择项如下:

第一个地址类型:
socket.AF_UNIX:用于 Unix 系统进程间的通信。
socket.AF_INET:服务器之间的网络通信。
socket.AF_INET6:使用 IPv6 进行通信。

第二个套接字类型:
socket.SOCK_STREAM:流式的 socket,用于 TCP。
socket.SOCK_DGRAM:数据包式的 socket,用于 UDP。

而经常组合用到的有两种,一种是 TCP 的 socket,一种是 UDP 的 socket,他们分别如下:

TCP:socket.socket(socket.AF_INET,socket.SOCK_STREAM)
UDP:socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

脚本中的 connect 用来链接目标。select 作用在于获取链接状态,经常和 socket 一起使用,四个参数分别是链接状态,写入状态,错误状态和超时时间,脚本中只指定了第一个参数链接状态,写入和错误留的空,最后超时为 1 秒,即每过 1 秒 select 就会获取一下 banner 的链接状态。

脚本中 select 的作用在于,recv 获取字符的时候如果没有返回就会挂起,这样会影响后续的其他端口 banner 信息获取,所以用 select 指定链接状态和超时时间。连接后会返回 banner 信息,用 recv 读取然后打印,如果没有内容返回则不做任何处理。执行结果如下:

请输入图片描述

结果显示获取到了 21 和 22 的 banner 信息,看下 wireshark 的抓包过程:

请输入图片描述

通过 wireshark 抓包可以发现,如果端口是没开放的,则是返回的 RST/ACK 包,则没有 banner 信息,如果端口是开放状态,则进行了整个 tcp 的三次握手。

0x03:dmitry

除了 nc 和 scapy 外,dmitry 也有此功能,dmitry 也属于端口发现中全链接扫描方式的一种,使用简单,参数如下:

请输入图片描述

参数不多,很简单的一个工具,p 参数用来做 tcp 扫描,b 参数用来获取 banner 信息,dmitry 默认扫描 150 个端口,执行如下:

请输入图片描述

获取 banner 信息如下:

请输入图片描述

0x04:nmap

强大的 nmap 肯定也有获取 banner 的方法,只不过是通过脚本实现的,因为 banner 获取是建立在连接的基础上的,所以需要用到 sT 参数,sT 用来连接目标,其命令和结果如下:

请输入图片描述

这里就体现出了 nmap 的强大,业界把 nmap 称为神器,电影也有 nmap 的身影,是有理由的。单从 banner 这块就获取到了其他命令没有获取到的一些结果,例如 23,25,53,80 这些,其 nmap 使用的 banner 脚本写的也很好,感兴趣可以看一下。

0x05:amap

还有一个工具是 amap,这个命令是用来发现端口后面跑的是什么服务,其中 B 参数是专门用来获取 banner 信息的,参数说明如下:

请输入图片描述

执行结果如下:

请输入图片描述

0x06:总结

这边博客记录了在服务扫描时获取 banner 的一些方法,其中有 nc、scapy、nmap、dmitry、amap,通过上面介绍,可以发现 nmap 相对来说是更全面的。

公众号回复数字“8”领取CIS加固全套手册。

微 信:fageweiketang,朋友圈不定期干货分享,欢迎讨论。

公众号:发哥微课堂,专注于代码审计、WEB渗透、网络安全。

                     

猜你喜欢

转载自blog.csdn.net/fageweiketang/article/details/84433194