基于网络启动和系统服务劫持的渗透技术研究 – 作者:gaearrow

笔者受光盘启动WinPE系统修复主机原系统启发,设计并开展了以网络启动传输定制操作系统,实施自动化文件替换,劫持关键系统服务的渗透技术方案研究,实现了在内网环境下预置攻击程序的自主启动。

引言

服务程序具有权限高、自启动和隐蔽性强等多项特点,恶意工具经常劫持服务程序,但是采用服务函数或注册表函数修改服务注册表项的劫持方法,不仅对权限要求高,同时还会触发安全防护软件报警。本文设计的利用网络启动定制操作系统实施对原系统关键服务文件进行自动化替换的渗透方案,不仅不会触发任何报警,同时在攻击过程中,不会在操作系统上留下任何攻击痕迹。图1所示为关键技术攻击示意图。

图 1  关键技术攻击关系示意图

网络启动服务

网络启动服务主要由提供地址分配服务的DHCP服务和提供文件传输服务的TFTP服务两部分组成。为降低开发代价,网络启动服务基于成熟开源工具TFTPD32源代码修改定制实现。

2.1 预启动执行环境

PXE(Preboot Execute Environment,预启动执行环境)是由Intel公司开发的技术,工作于Client/Server的网络模式,支持主机通过网络从远端服务器下载系统映像并启动。因其简便的安装方式和架构,很快得到了业内人士的认可和广泛应用。

图 2 PXE网络启动过程时序图

PXE网络启动过程时序图如图 2所示。具体介绍如下:

(1)PXE Client利用DHCP协议向PXE Server请求分配IP地址和pxelinux启动程序的位置;

(2)PXE Client利用TFTP协议向PXE Server请求pxelinux.0启动程序;

(3)PXE Client执行pxelinux.0启动程序,并请求对应配置文件;

(4)PXE Client请求Linux内核(vmlinuz)和镜像(initrd.img);

(5)PXE Client启动linux系统。

从以上网络启动过程中可以看到,PXE Server不仅需要提供IP地址分配的DHCP服务器和提供文件传输服务的TFTP服务器,还需要提供网络启动程序(pxelinux.0)及相应配置文件(pxelinux.cfg)、Linux内核(vmlinuz)和镜像(initrd.img,不同配置支持不同的格式)。其中Linux内核定制编译和系统镜像定制封装将放在3定制操作系统中进行介绍。

2.2 DHCP和TFTP服务实现

DHCP的前身是同样基于C/S模式的BOOTP,它主要用于向客户主机动态指定IP并配置相关参数。TFTP(Trivial File Transfer Protocal),又称简单文件传输协议,是TCP/IP协议族中用于在客户机与服务器之间进行简单文件传输的应用层协议,主要提供基于UDP的不复杂、开销小的文件传输服务,端口号为69。

DHCP报文主要由如表 1所示四种类型组成。TFTP协议共定义了五种类型的报文,不同类型由“操作码”字段指示。五种报文功能如表 2所示,报文格式如图 3所示。DHCP和TFTP服务实现活动图如图 4和图 5所示。由于此部分非本文实现,因此不再做更详细介绍。

表 1 DHCP报文主要类型

类 型  功 能 源地址 方 式
DHCPDISCOVER 全网段搜索DHCP服务器 DHCP Client 广播
DHCPOFFER 响应搜索,回复分配IP DHCP Client 广播
DHCPREQUEST 全网段声明分配的IP DHCP Client 广播
DHCPACK 确认分配IP成功 DHCP Client 广播

表 2 TFTP报文类型

类 型 功 能  操作码
读文件请求报文
(Read Request,RRQ)
用于建立客户端到服务器读数据的连接  1
写文件请求报文
(Write Request,WRQ)
用于建立客户端到服务器写数据的连接 2
文件数据报文
(Data,DATA)
用于客户端和服务器间传递数据块 3
回应报文
(Acknowledgement,ACK)
用于确认已收到的数据块 4
错误报文
(Error,ERROR)
用于RRQ、WRQ的错误响应  5
选项确认报文
(Option Acknowledge,OACK)
用于服务器超时通知客户端 6

图 3  TFTP报文格式

图 4  DHCP服务器实现活动图

图 5  TFTP服务器实现活动图

2.3 启动程序编译配置

SYSLINUX是一个功能强大的主引导记录启动程序套装,它包含几个独立的系统,比如用来从CD-ROM ISO 9660文件系统启动的ISOLINUX,用来从搭建了PXE预启动执行环境的网络服务器启动的PXELINUX,用来从Linux的ext2/ext3/ext4或Btrfs文件系统启动的EXTLINUX等。PXELINUX系统编译生成的pxelinux.0启动程序是网络启动过程所需的必备文件。

(1)编译启动程序:本文采用SYSLINUX 4.04版本编译生成pxelinux.0启动程序,通过阅读说明文件,在CentOS 6.4系统基础上安装了NASM(v2.07)工具,使用make指令,完成了pxelinux.0启动程序(./core/pxelinux.0)的编译过程。

(2)配置启动程序:通过分析SYSLINUX源代码,跟踪定位屏蔽了pxelinux.0在执行过程中的输出代码,实现了较好的隐蔽执行,同时修改配置文件的默认路径和名称,提高了该系统的隐蔽性。其中涉及到的关键文件包括pxe.c、pxelinux.asm和RunKernel.inc。

2.4 启动程序配置文件

启动程序配置文件是pxelinux.0启动程序执行时所需的重要文件。参考配置介绍,通过反复测试精简,确定如下配置内容(假设将Linux内核命名为update,Linux系统封装文件命名为pxe.bin)。

默认启动LABEL为update中标记的内容:
Default update
配置名称为update的启动选项:
LABEL update
启动内核名称为update:
KERNEL update
追加给内核的参数:
APPEND initrd=pxe.bin

定制操作系统

定制操作系统是实施文件替换的关键,定制过程需要解决的主要问题:一是屏蔽启动过程中的屏幕提示信息;二是提供对磁盘的读写访问支持;三是自动化完成关键服务文件替换。

3.1 屏蔽提示信息

在网络启动过程中屏幕显示的内容有:PXE客户端提示信息(PXE客户端代码嵌入在主机芯片,无法控制修改),pxelinux.0启动程序提示信息(屏蔽方法已经在2.3节介绍)和定制操作系统启动运行信息。其中定制操作系统启动运行信息可以通过重新定制编译Linux内核实现。

(1)编译内核:内核编译过程在CentOS 6.4系统上完成,所需要的内容包括内核源代码(linux-3.8.13-patched.txz)和编译选项配置文件(config-3.8.13-tinycore),两者都可以从TinyCore官方网站(www.tinycorelinux.net)下载。通过查阅官方资料和源代码说明文件,按如图 6所示步骤完成编译过程。

图 6  内核编译过程活动图

(2)定制内核:定制操作系统在启动过程中的屏幕显示又可以划分成两个阶段,一是内核启动的提示信息,二是内核启动后操作系统的提示信息。针对不同的阶段需要采取不同的措施进行修改定制。对于内核启动的提示信息,采用跟踪定位删除内核源代码输出代码(./compressed /misc.c)进行屏蔽;对于内核启动后的系统提示信息,采用禁用Linux内核中显示驱动进行屏蔽。

3.2 磁盘读写支持

NTFS(New Technology File System,新技术文件系统)是Windows NT以及之后操作系统的标准文件系统。NTFS取代了文件分配表(FAT)文件系统,对FAT和高性能文件系统(HPFS)作了若干改进,例如,支持元数据,使用高级数据结构改善性能、可靠性和磁盘空间利用率等。NTFS的详细定义属于商业秘密,且Microsoft已经将其注册为知识产权产品,因此Linux系统无法对NTFS直接提供良好的读写支持。

文件替换攻击需要对目标主机原操作系统中的关键文件进行替换,这就要求实施攻击的Linux系统必须提供对NTFS的读写支持。采用第三方提供的ntfs-3g驱动软件可以满足该需求。为了整合ntfs-3g驱动程序,还必须了解Tinycore Linux系统基本情况和解压封装方法。

(1)系统解压封装

Tiny Core Linux系统主要由Linux内核和使用CPIO(CPIO是UNIX操作系统的一个文件备份程序及文件格式)归档的系统文件构成。通过参考Tiny Core Linux官方文档,使用如图 7所示过程可以对CPIO归档文件进行解压和重新封装。

图 7  解压和封装CPIO活动图

(2)驱动程序加载

驱动程序加载的基础是对Tiny Core Linux系统文件启动脚本进行修改。该启动脚本名称为bootlocal.sh,位于系统文件根目录的opt目录下。该启动脚本是Tiny Core Linux系统为用户灵活扩展系统功能而设计的,系统启动后会自动调用该脚本执行。通过该脚本不仅可以直接安装驱动,同时可以自动化运行预定的命令。

通过将ntfs-3g驱动文件添加进操作系统中指定目录,配合以下命令可以完成驱动程序自动加载。

su -C “tce-load -i /tmp/ntfs-3g.tcz” tc
su -C “tce-load -i /tmp/samba-client.tcz” tc

3.3 文件替换实现

文件替换的基本原理与3.2中的驱动程序加载相同,只需将待替换的任意程序添加进操作系统中指定目录,配合以下命令(以Windows7为例)可以完成文件替换操作和自动关机。

# 提权加载磁盘
sudo mount /dev/sda1
# 删除目标文件,被劫持服务后文有介绍
rm -rf /mnt/sda1/Windows/System32/spoolsv.exe
# 实现文件替换
cp /tmp/spoolsv.exe /mnt/sda1/Windows/System32/spoolsv.exe
# 植入木马服务程序
cp /tmp/svchost.exe /mnt/sda1/Windows/svchost.exe
# 系统自动关机
sudo poweroff -d 5

劫持服务程序

Microsoft Windows服务(以前的NT服务)是由系统管理的在后**成任务的应用程序。与一般应用程序最大的区别是它们都是在“后台”运行的,且一般具有更高(甚至最高)的系统权限,因此恶意程序经常将自己写成一个服务安装在系统中,对操作系统进行更持久的控制。

典型的服务程序由三部分组成,第一部分是Service Control Manager(SCM)。SCM存在于Service.exe中,在Windows启动的时候会自动运行。SCM包含一个储存着已安装的服务和驱动程序信息的数据库,通过SCM可以统一地、安全地管理这些信息,因此一个服务程序的安装过程就是将自身的信息写入这个数据库。第二部分是服务本身。一个服务拥有能从SCM收到信号和命令所必须的特殊代码,并且能够在处理后将它的状态回传给SCM。第三部分是Service Control Dispatcher(SCP)。它是一个拥有用户界面,允许用户开始、停止、暂停、继续,并且控制一个或多个安装在计算机服务的Win32应用程序。

4.1 服务劫持基本原理

服务安装的本质是将服务信息记录在注册表指定路径下,在该路径下还保存了若干个子键,每个子键对应一个服务。子键名就是服务名,该子键下存在很多键值,不同键值表示服务的类型、启动方式、关联程序等信息,在Windows 7 32位系统上打印后台处理服务的键值信息如图 8所示。

图 8  打印后台处理服务注册表键值信息

注册表中的一个服务通常包含如表 3所示键值。其中比较重要的是ImagePath、Start和Type三项。Start指定的服务启动方式通常有四个值。值为1表示由系统加载器启动,通常用于启动内核驱动服务;值为2表示伴随系统启动由SCM自动启动;值为3表示手动启动,通常需要人工使用服务管理器启动;值为4表示服务被禁用。Type指定了服务的类型,用户层独立进程的服务该值为16,用户层共享进程的服务该值为32,内核驱动服务该值为1,文件过滤驱动服务该值为2。

表 3 服务关键键值信息

键值名称 信  息
DisplayName 服务管理器中显示的名字
Description  描述信息
ImagePath  对应的应用程序路径
Start  启动方式
Type  服务类型

服务劫持的基本原理就是将服务对应的应用程序替换成恶意程序,将启动方式设置为自启动,再修正服务类型,即可实现每次系统启动,恶意程序随之启动。由于操作系统对运行中的服务程序,尤其是系统关键服务程序保护的十分严格,通常意义的服务劫持只能采用修改注册表中的键值信息来实现。而修改注册表又有两种具体实现方法:一是利用注册表操作函数(RegSetValueEx函数),二是利用服务API(ChangeServiceConfig函数)。两种方法的执行不仅需要管理员权限,同时还会触发常见安全防护软件报警。

笔者利用发送到目标主机的Tiny Core Linux实施对原系统关键服务程序的直接替换劫持,由于原操作系统始终未启动,被劫持的服务程序默认启动方式为自启动,因此劫持过程不会触发任何报警、留下任何痕迹,劫持服务程序可以随系统启动而启动。通过精心构造劫持服务程序的服务信息,文件大小可以进一步提高劫持过程的隐蔽性。

4.2 被劫持服务选择

基于功能性和隐蔽性的双重考虑,被劫持服务的选择依据包括以下三个方面:一是该服务默认启动方式为自启动;二是该服务使用率非常低或几乎不会被使用;三是该服务是系统安装服务,不是用户安装服务; 

打印后台处理服务(Print Spooler)位于C:\Windows\System32\目录下,进程名为spoolsv.exe。该服务用于管理所有本地和网络打印队列及控制所有的打印工作,是Windows XP和Windows 7系统默认安装服务,且启动方式为自启动。当主机不使用打印机进行打印作业时,该服务将不会被调用。因此打印后台处理服务可以较好的满足新型服务劫持要求,笔者选择打印后台处理服务为被劫持服务。

4.3 劫持服务实现

服务程序一般包含最基本的三个重要函数:服务程序入口函数、服务入口回调函数和服务控制回调函数。服务程序入口函数的作用主要是负责初始化整个过程,通知SCM在可执行文件中包含几个服务,并且给出每一个服务入口回调函数的地址。服务入口回调函数就是入口函数通知给SCM的每个服务启动的函数。服务控制回调函数的作用是配合SCM改变服务状态。劫持服务程序实现活动图如图 9所示。

图 9  劫持服务程序实现活动图

会话隔离机制

在Windows XP,Windows Server 2003或者更早期的Windows操作系统中,所有的服务和应用程序都是运行在与第一个登录到控制台的用户会话(Session)中。在Windows Vista以后,服务的运行从用户会话中独立出来,由会话0统一管理运行,而用户登录系统创建的会话位于会话0之后(如会话1、会话2等),会话之间的资源访问处于隔离状态,所以服务与其他用户应用程序将无法实现直接通信(如图 10所示)。当该内网渗透系统攻击Windows Vista以后的操作系统时,由于劫持服务启动的木马服务端也处于会话0上,这将导致木马服务端无法正常访问部分用户资源。通过查阅资料,笔者确定采用查找用户会话ID、获取用户令牌,在用户环境注入应用程序等方案解决上述问题。会话隔离机制穿透实现活动图如图 11所示。  

图 10  会话结构示意图

图 11  会话隔离机制穿透实现活动图

存在不足

本文设计的方法绕过了操作系统和安全防护机制对系统关键服务的层层保护,但是也存在诸多限制:

网络启动顺序由BIOS设置,一般品牌主机默认情况下,光盘启动和磁盘启动优先,网络启动只有在出现启动错误时才会优先启动,而IBM和联想品牌主机BIOS配置在主要启动顺序之外,增加了自动启动顺序和出错启动顺序,在自动和出错启动顺序中,默认配置网络启动优先。这种情况下配合局域网远程唤醒(会触发自动启动顺序)可以实现对IBM和联想品牌主机的网络启动劫持,进而实现内网渗透,对于其他品牌主机默认的不支持情况,目前还没有很好的应对策略。另外攻击过程需要运行一个DNS服务器,当网内已经存在DNS服务器时,很可能导致攻击失败。由此可见,以上方法还有很多不足,需要配合其他技术予以弥补。

应对措施建议

关闭远程唤醒,同时降低PXE网络启动的优先级,从源头上控制该攻击的后续利用。

*本文原创作者:gaearrow,本文属于FreeBuf原创奖励计划,未经许可禁止转载

来源:freebuf.com 2019-10-06 08:00:57 by: gaearrow

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论