大多数网络(信息)安全工程师对系统65535个端口中常见的各种系统服务、应用服务烂熟于心,也很了解针对这些端口的测试,很多人对于web服务端口着重关注,因为web服务所运行的网站应用往往是一个优质的突破点。
在现实生产环境中,多数目标,特别是一些所谓的“智能设备”、“智能家居”,除了对外开放web服务端口,还会开放一些nmap也没办法识别的端口,这些端口跑着厂商自家定义的一些服务,很多人因为没办法测试这些服务,就放弃针对这些端口进行测试,这也就放弃了很多突破目标的可能性。
本文主要针对这些nmap无法识别出来的端口服务介绍一些测试经验,仅供参考。
一、端口状态
当我们使用nmap针对目标进行端口扫描后,结果中基本会包含以下示例中的三种端口状态:
PORT STATE SERVICE
22/tcp closed ssh
23/tcp filtered telnet
80/tcp open http
状态解释
closed:
关闭状态,意味着防火墙、iptable允许该端口对外使用,但是没有被使用
如果想在目标上开监听端口,可以选择closed状态的端口
filtered:
可能正在使用,但防火墙、iptable不允许该端口对外开放
open:
端口正在对外开放使用,测试时基本只需关注open状态的端口
二、端口服务的识别与测试方法
大部分情况下,使用nmap –A –T4 –p 1-65535 Target_ip 命令即可识别出大部分端口对应运行的服务,对于可以识别出来的端口服务,可以到exploit-db中查找是否有可以使用的exp,也可以直接在msf里使用search命令搜索对应的服务名,查看是否有exp可用。
如果nmap无法识别端口运行的服务,会显示如下示例结果:
PORT STATE SERVICE
23502/tcp open unknown
针对此类无法识别出服务的端口,本人的测试经验如下:
1.使用http/https打开该端口
很多厂商自定义的服务,nmap识别不出来,但其实使用的是HTTP+JSON,此时跟常规的web安全测试没有太多差别
2.使用nc(netcat)/telnet连接该端口
此法在测试“智能设备”、“智能家居”类的设备时往往有奇效,因为设备厂商如果没有处理好固件,就可能留下一些测试用的调试端口,可以直接获取目标敏感信息甚至管理权限
3.fuzz测试
fuzz该端口,使它返回错误信息进而判断属于什么服务。
一个简单的fuzz脚本如下,可以根据需要修改发送的内容,也可改为高并发:
#!/usr/bin/env python # -*- coding:utf-8 -*- import socket,sys if len(sys.argv) != 4: print "Usage: python fuzz.py number target port" exit() shellcode = 'A' * int(sys.argv[1]) #生成N个A fuzz = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建一个socket对象 fuzz.connect((str(sys.argv[2]), int(sys.argv[3]))) #连接到ip/Domain,端口 fuzz.send(shellcode) #发送数据(N个A) fuzz.close #关闭
4.抓包分析
如果可以物理接触或者完全控制目标网络,可以通过wireshark抓包查看那些未识别出服务的端口所收发的数据包,再针对性进行测试
5.分析固件
“智能设备”、“智能家居”类的设备在官网或者更新时可以下载固件包,直接分析固件查看对应端口用途
6.社会工程学
直接联系厂商技术支持人员,可以通过内部安全审计为由要求对方解释所开端口的作用
题外话:
在windows系统下,有些人喜欢通过修改注册表将一些服务端口,如远程桌面3389端口修改为超过65535的端口,如73389,其实没什么用,因为最终win系统对外开放的端口会是73389-65536=7853 ,并不会对扫描结果产生影响,nmap依然能够识别出7853端口为远程桌面服务。
因为tcp header 明确定义了 tcpport 为 16 bit,那即便某些应用程序使用了 32 bit 的数据类型,最终结果也是被强制转换。