设备非常规端口测试经验

大多数网络(信息)安全工程师对系统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 的数据类型,最终结果也是被强制转换。

 

发表评论

电子邮件地址不会被公开。


*