管理 LINUX 内核和可加载内核模块
MANAGING THE LINUX KERNEL AND LOADABLE KERNEL MODULES
所有操作系统至少由两个主要组件组成。其中第一个也是最重要的是内核。 内核位于操作系统的中心,控制着操作系统所做的一切,包括管理内存,控制 CPU,甚至控制用户在屏幕上看到的内容。操作系统的第二个元素通常被称为用户区域,几乎包括其他所有元素。
内核被设计成一个受保护或特权的区域,只能由 root 帐户或其他特权帐户访问。这是有充分理由的,因为对内核的访问几乎可以提供对操作系统的自由访问。因此,大多数操作系统只向用户和服务提供对用户区域内的访问,用户可以在不控制操作系统的情况下访问几乎任何他们需要的内容。
访问内核允许用户更改操作系统的工作方式,外观和感觉。它还允许它们使操作系统崩溃,使其无法工作。 尽管存在这种风险,但在某些情况下,出于操作和安全原因,系统管理员必须非常谨慎地访问内核。
在本章中,我们将研究如何改变内核的工作方式并将新模块添加到内核中。不言而喻,如果黑客可以改变目标的内核,他们就可以控制系统。此外,攻击者可能需要改变内核对某些攻击的作用,例如中间人(MITM)攻击,黑客将自己置于客户端和服务器之间,并且可以窃听或改变通信。首先,我们将仔细研究内核结构及其模块。
什么是内核模块?
内核是操作系统的中枢神经系统,控制着它所做的一切,包括管理硬件组件之间的交互和启动必要的服务。内核在你看到的用户应用程序和运行所有东西的硬件(如 CPU,内存和硬盘驱动器)之间运行。
Linux 是一个单片内核,可以添加内核模块。因此,可以在内核中添加和删除模块。内核有时需要更新,这可能需要安装新的设备驱动程序(如视频卡,蓝牙设备或 USB 设备),文件系统驱动程序,甚至系统扩展。 必须将这些驱动程序嵌入到内核中才能完全正常运行。在某些系统中,要添加驱动程序,您必须重建、编译和重新引导整个内核,但 Linux 能够在不经过整个过程的情况下向内核添加一些模块。这些模块称为可加载内核模块或 LKM。
LKM 必须能够访问内核的最低级别,这使得它们成为黑客极易攻击的目标。一种称为 rootkit 的特殊类型的恶意软件通常通过这些 LKM 嵌入到操作系统的内核中。如果恶意软件嵌入内核,黑客就可以完全控制操作系统。
如果黑客可以让 Linux 管理员将新模块加载到内核,那么黑客不仅可以获得对目标系统的控制权,而且因为他们在操作系统的内核级别运行,可以控制目标系统正在运行的进程,端口,服务,硬盘空间以及您能想到的几乎任何其他内容。
因此,如果黑客可以成功诱使 Linux 管理员安装其中嵌入了 rootkit 的视频或其他设备驱动程序,则黑客可以完全控制系统和内核。这是一些最阴险的 rootkit 利用 Linux 和其他操作系统的方式。
了解 LKM 绝对是成为一名有效的 Linux 管理员并成为一名非常有效和隐秘的黑客的关键。
让我们来看看如何管理内核的好与坏。
检查内核版本
了解内核的第一步是检查系统正在运行的内核。至少有两种方法可以做到这一点。首先,我们可以输入以下内容:
kali >uname -a
Linux Kali 4.6.0kalilamd64 #1 SMP Debian 4.6.4lkalil (20160721) x86_64
内核通过告诉我们,我们的操作系统正在运行的发行版是 linux kali,内核版本是 4.6.4,它构建的架构是 x86_64 架构。它还告诉我们它具有对称多处理(SMP)功能(意味着它可以在具有多个核心或处理器的机器上运行),并于 2016 年 7 月 21 日在 Debian 4.6.4 上构建。根据构建中使用的内核和系统中的 CPU,您的输出可能会有所不同。安装或加载内核驱动程序时可能需要这些信息,因此了解如何获取这些信息非常有用。
获取这些信息以及其他一些有用信息的另一种方法是对/proc/version 文件使用cat命令,如下所示:
kali >cat /proc/version
Linux version 4.6.0kalilamd64 (devel\@kali.org) (gcc version 5.4.0 20160909 (Debian 5.4.06) ) #1 SMP Debian 4.6.4lkalil (20160721)
在这里,你可以看到/proc/version 文件返回了相同的信息。
使用 sysctl 进行内核优化
使用正确的命令,你可以优化你的内核,意味着你可以更改内存分配,开启网络功能,甚至可以加固你的内核以抵御外部攻击。
现代 Linux 内核使用sysctl命令来优化内核选项。使用 sysctl 所做的所有更改仅在重新启动系统之前有效。要使任何更改永久化,必须直接在/etc/sysctl.conf 编辑 sysctl 的配置文件。
一句警告:在使用 sysctl 时需要小心,因为如果没有相匹配的知识和经验,你很容易使系统无法运行和崩溃。在做任何永久性的改变之前,确保你已经仔细考虑清楚了你正在做的事情。
现在让我们来看一下 sysctl 的内容。到目前为止,你应该通过此处显示的命令识别我们提供的选项:
kali >sysctl -a | less
dev.cdrom.autoclose = 1
dev.cdrom.autoeject = 0
dev.cdrom.check_media = 0
dev.cdrom.debug = 0
snip
在输出中,你应该看到数百行参数,Linux 管理员可以编辑这些参数来优化内核。这里有些内容对你作为黑客十分有用。作为如何使用 sysctl 的示例,我们将介绍如何启用数据包转发功能。
在中间人(MITM)攻击中,黑客将自己置于通信主机之间,以截获信息。流量会经过黑客系统,因此他们可以查看并可能更改通信。实现这种路由的一种方法是启用包转发。
如果向下滚动查询输出中的几页或过滤“ipv4”(sysctl -a | less | grep ipv4),你应该能看到以下内容:
net.ipv4.ip_dynaddr = 0
net.ipv4.ip_early_demux = 0
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_use_pmtu = 0
snip
net.ipv4.ip_forward = 0 该行是内核参数,它使内核能够转发它接收的数据包。换而言之,它接收的数据包将被发送出去。默认设置为 0,这意味着禁用了数据包转发。
要启用 IP 转发,请按照这样输入——将 0 更改为 1:
kali >sysctl -w net.ipv4.ip_forward=1
请记住,sysctl 更改发生在系统运行时,但在系统重新启动时消失。要对 sysctl 进行永久性更改,你需要编辑配置文件/etc/sysctl.conf。下面让我们来更改内核处理 MITM 攻击的 IP 转发的方式,并使此更改永久化。
要启用 IP 转发,请先在任何文本编辑器中打开/etc/sysctl.conf 文件,并取消对 IP 转发行的注释。让我们用任何文本编辑器打开/etc/sycstl.conf 并查看:
#/etc/sysctl.conf Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables.
# See sysctl.conf (5) for information.
#
#kernel.domainname = example.com
# Uncomment the following to stop lowlevel messages on console.
#kernel.printk = 3 4 1 3
##############################################################3
# Functions previously found in netbase #
# Uncomment the next two lines to enable Spoof protection (reversepath
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks.
#net.ipv4.conf.default.rp_filter=1
#net.ipv4.conf.all.rp_filter=1
# Uncomment the next line to enable TCP/IP SYN cookies
#
# Note: This may impact IPv6 TCP sessions too
#net.ipv4.tcp_syncookies=1
See http://lwn.net/Articles/277146/
# Uncomment the next line to enable packet forwarding for IPv4
➊ #net.ipv4.ip_forward=1
在相关行只需删除注释(#)➊,即可启用 IP 转发。
从操作系统加固的角度来看,你可以通过给此文件添加行 net.ipv4.icmp_echo_ignore_all=1 来禁用 icmp echo 请求,以使黑客更难找到你的系统,但这并非完全没可能找到你的系统。添加该行后,您需要运行命令sysctl -p。
管理内核模块
Linux 至少有两种方法来管理内核模块。较旧的方法是使用围绕 insmod suite-insmod 构建的一组命令代表插入模块,用于处理模块。第二种方法,使用modprobe命令,我们将在本章稍后使用。在这里,我们使用 insmod 套件中的lsmod命令列出内核中已安装的模块:
kali >lsmod
Module Size Used by
nfnetlink_queue 20480 0
nfnetlink_log 201480 0
nfnetlink 16384 2 nfnetlink_log, nfnetlink_queue
bluetooth 516096 0
rfkill 0 2 bluetooth
snip
如你所见,lsmod 命令列出了所有内核模块,以及有关它们的大小和其他模块可能使用它们的信息。因此,举个简单的例子——nf netlink 模块(一种用于内核和用户空间之间通信的基于消息的协议)是 16384 字节且由 nf netlink日志模块和 nf_netlink队列模块使用。
从 insmod 套件中,我们可以使用 insmod 加载或插入模块,并使用 rmmod 删除模块,该模块代表 remove 模块。这些命令并不完美,可能没有考虑模块依赖性,因此使用它们会使内核不稳定或无法使用。因此,Linux 的现代发行版现在添加了 modprobe 命令,该命令自动加载依赖项并使加载和删除内核模块的风险降低。我们马上就会介绍 modprobe。首先,让我们看看如何获得有关我们模块的更多信息。
使用 modinfo 查找更多信息
要进一步了解任何内核模块,我们可以使用modinfo命令。这个命令的语法很简单:modinfo 后加入你想要了解的模块的名称。举个例子,如果要检索先前运行 lsmod 命令时看到的蓝牙内核模块的基本信息,可以输入以下内容:
kali >modinfo bluetooth
filename: /lib/modules/4.6.0kaliamd64/kernel/net/bluetooth/bluetooth.ko
alias: netpf31
license: GPL
version: 2.21
description: Bluetooth Core ver 2.21
author: Marcel Holtman \marcel\@holtmann.org\
srcversion: FCFDE98577FEA911A3DAFA9
depends: rfkill, crc16
intree: Y
vermagic: 4.6.0kali1amd64 SMP mod_unload modversions
parm: disable_esco: Disable eSCO connection creation (bool)
parm: disable_ertm: Disable enhanced retransmission mode (bool)
如你所见,modinfo 命令显示有关此内核模块的重要信息,这是在系统上使用蓝牙所必需的。 请注意,在许多其他事情中,它列出了模块依赖项:rfkill 和 crc16。 依赖项是必须安装的模块才能使蓝牙模块正常运行。
通常,在排除特定硬件设备无法正常工作的原因时,这是有用的信息。除了注意依赖项之外,还可以获取有关模块版本和模块开发内核版本的信息,然后确保它们与您运行的版本相匹配。
使用 modprobe 添加和删除模块
Linux 的大多数新版本,包括 Kali Linux,都包含用于 LKM 管理的 modprobe 命令。要将模块添加到内核,可以将 modprobe 命令加-a(add)选项一起使用,如下所示:
kali >modprobe -a \
要删除模块,请使用 modprobe 的-r(remove)选项,并在其后加入模块名称:
kali >modprobe -r \
使用 modprobe 而不是 insmod 的一个主要优点是 modprobe 了解依赖项,选项以及安装和删除过程,并且在进行更改之前会考虑所有这些因素。因此,使用 modprobe 添加和删除内核模块更容易,更安全。
插入和删除内核模块
让我们尝试插入和移除测试模块,以帮助你熟悉此过程。让我们设想一下,你刚刚安装了一个新的显卡,并且需要为它安装驱动程序。记住,设备的驱动程序通常直接安装在内核中,以便为它们提供正确运行所需的访问权限。这也为恶意黑客安装 rootkit 或其他监听设备提供了肥沃的土壤。
让我们假设出于演示目的(不要实际运行这些命令),我们要添加一个名为 HackersAriseNewVideo 的新视频驱动程序。你可以通过输入以下内容将其添加到内核中:
kali >modprobe -a HackersAriseNewVideo
要测试新模块是否正确加载,你可以通过运行 dmesg 命令来知道,该命令从内核打印出消息缓冲区,然后过滤“video”内容,并查找任何指示问题的警报:
kali >dmesg | grep video
如果有任何内核信息中包含“video”一词,它们将显示在这里。如果没有显示任何内容,则没有包含该关键字的信息。
然后,要删除相同的模块,可以输入相同的命令,但使用-r(remove)选项:
kali >modprobe -r HackersAriseNewVideo
请记住,可加载的内核模块对 Linux 用户/管理员来说是一种便利,但它们也是一个主要的安全漏洞,也是专业黑客应该熟悉的漏洞。 正如我之前所说,LKM 可以成为让你的 rootkit 进入内核并造成严重破坏的完美工具!
总结
内核对于操作系统的整体操作至关重要,因此,它是一个受保护的区域。 任何无意中添加到内核中的东西都可能破坏操作系统甚至控制它。
LKM 使系统管理员能够将模块直接添加到内核中,而不必每次添加模块时都重新构建整个内核。
如果黑客可以诱使系统管理员添加恶意 LKM,则黑客可以完全控制系统,通常这不会让系统管理员意识到。