跳到主要内容

3、实战:rhel6.4源码编译升级sudo软件包-2024.4.29(测试成功)

实战:rhel6.4源码编译升级sudo软件包-2024.4.29(测试成功)

image-20240429123713838

目录

[toc]

问题背景

Sudo是一套用于类Unix操作系统下并允许用户通过安全的方式使用特殊的权限执行命令的程序。

Sudo存在缓存区溢出漏洞,该漏洞由于Sudo错误地在参数中转义了反斜杠导致堆缓冲区溢出,允许攻击者通过sudoedit -s和以单个反斜杠字符结尾的命令行参数将权限提升为root。并非所有存在漏洞的Sudo版本都能利用成功,glibc>=2.27只能说明漏洞利用难度较小,低版本的glibc也能利用成功,只是漏洞利用难度增加。

修复方法

1.Sudo系统软件包安装的参照以下修复命令进行升级:
CentOS/RHEL/Oracle Linux : sudo yum update -y sudo
SUSE : sudo zypper update -y sudo
Ubuntu/Debian : sudo apt-get update && sudo apt-get install --only-upgrade -y sudo


2.Sudo源码编译安装的将 Sudo 升级到 1.9.5p2 及以上版本,下载地址:https://www.sudo.ws/

实验环境

rhel6.4
sudo-1.9.15p5.tar.gz

实验软件

链接:https://pan.baidu.com/s/1XJZe1j62mxek86y6fjMD2A?pwd=g3h6 提取码:g3h6 2024.4.29-实战:rhel6.4源码编译升级sudo软件包-2024.4.29(测试成功)

image-20240429123923364

1、下载源码包

https://www.sudo.ws/

https://www.sudo.ws/getting/download/

  • 源码包

https://www.sudo.ws/dist/sudo-1.9.15p5.tar.gz

image-20240428154500761

  • 二进制包

image-20240428154524814

image-20240428154546653

2、源码编译安装

tar -xzf sudo-1.9.15p5.tar.gz
cd sudo-1.9.15p5
./configure
make && make install

3、配置PATH路径

[!NOTE]

根据实际情况进行配置,如果默认就是新版本sudo了,就不需要再配置以下步骤,如果默认不是新版本sudo,请按如下方法配置。

  • 自己用本地rhel6.4 ios创建的测试虚机,按上述源码编译后,就不需要再配置PATH了:

测试sudo(符合预期,测试成功)

[root@localhost ~]# sudo --version
Sudo version 1.9.15p5
Configure options:
Sudoers policy plugin version 1.9.15p5
Sudoers file grammar version 50

Sudoers path: /etc/sudoers
Authentication methods: 'passwd'
Syslog facility if syslog is being used for logging: authpriv
Syslog priority to use when user authenticates successfully: notice
Syslog priority to use when user authenticates unsuccessfully: alert
Send mail if the user is not in sudoers
Lecture user the first time they run sudo
Require users to authenticate by default
Root may run sudo
Always set $HOME to the target user's home directory
Allow some information gathering to give useful error messages
Only allow the user to run sudo if they have a tty
Visudo will honor the EDITOR environment variable
Set the LOGNAME and USER environment variables
Length at which to wrap log file lines (0 for no wrap): 80
Authentication timestamp timeout: 5.0 minutes
Password prompt timeout: 5.0 minutes
Number of tries to enter a password: 3
Umask to use or 0777 to use user's: 022
Path to mail program: /usr/sbin/sendmail
Flags for mail program: -t
Address to send mail to: root
Subject line for mail messages: *** SECURITY information for %h ***
Incorrect password message: Sorry, try again.
Path to lecture status dir: /var/db/sudo/lectured
Path to authentication timestamp dir: /var/run/sudo/ts
Default password prompt: Password:
Default user to run commands as: root
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
Path to the editor for use by visudo: /bin/vi
When to require a password for 'list' pseudocommand: any
When to require a password for 'verify' pseudocommand: all
File descriptors >= 3 will be closed before executing a command
Reset the environment to a default set of variables
Environment variables to check for safety:
TZ
TERM
LINGUAS
LC_*
LANGUAGE
LANG
COLORTERM
Environment variables to remove:
*=()*
RUBYOPT
RUBYLIB
PYTHONUSERBASE
PYTHONINSPECT
PYTHONPATH
PYTHONHOME
TMPPREFIX
ZDOTDIR
READNULLCMD
NULLCMD
FPATH
PERL5DB
PERL5OPT
PERL5LIB
PERLLIB
PERLIO_DEBUG
JAVA_TOOL_OPTIONS
SHELLOPTS
BASHOPTS
GLOBIGNORE
PS4
BASH_ENV
ENV
TERMCAP
TERMPATH
TERMINFO_DIRS
TERMINFO
_RLD*
LD_*
PATH_LOCALE
NLSPATH
HOSTALIASES
RES_OPTIONS
LOCALDOMAIN
CDPATH
IFS
Environment variables to preserve:
XAUTHORITY
_XKB_CHARSET
LINGUAS
LANGUAGE
LC_ALL
LC_TIME
LC_TELEPHONE
LC_PAPER
LC_NUMERIC
LC_NAME
LC_MONETARY
LC_MESSAGES
LC_MEASUREMENT
LC_IDENTIFICATION
LC_COLLATE
LC_CTYPE
LC_ADDRESS
LANG
USERNAME
QTDIR
PS2
PS1
MAIL
LS_COLORS
KDEDIR
INPUTRC
HISTSIZE
HOSTNAME
DISPLAY
COLORS
Locale to use while parsing sudoers: C
Always run commands in a pseudo-tty
Directory in which to store input/output logs: /var/log/sudo-io
File in which to store the input/output log: %{seq}
Add an entry to the utmp/utmpx file when allocating a pty
PAM service name to use: sudo
PAM service name to use for login shells: sudo
Attempt to establish PAM credentials for the target user
Create a new PAM session for the command to run in
Perform PAM account validation management
Enable sudoers netgroup support
Check parent directories for writability when editing files with sudoedit
Allow commands to be run even if sudo cannot write to the audit log
Allow commands to be run even if sudo cannot write to the log file
Log entries larger than this value will be split into multiple syslog messages: 960
File mode to use for the I/O log files: 0600
Execute commands by file descriptor instead of by path: digest_only
Type of authentication timestamp record: tty
Ignore case when matching user names
Ignore case when matching group names
Log when a command is allowed by sudoers
Log when a command is denied by sudoers
Sudo log server timeout in seconds: 30
Enable SO_KEEPALIVE socket option on the socket connected to the logserver
Verify that the log server's certificate is valid
Set the pam remote user to the user running sudo
The format of logs to produce: sudo
The largest size core dump file that may be created (in bytes): 0,0
Store plaintext passwords in I/O log input
List of regular expressions to use when matching a password prompt
[Pp]assword[: ]*
The mechanism used by the intercept and log_subcmds options: dso
Attempt to verify the command and arguments after execution

Local IP address and netmask pairs:
192.168.247.129/255.255.255.0
fe80::20c:29ff:fef4:7d0d/ffff:ffff:ffff:ffff::

Sudoers I/O plugin version 1.9.15p5
Sudoers audit plugin version 1.9.15p5
[root@localhost ~]#
[root@localhost ~]# rpm -qa|grep sudo
sudo-1.8.6p3-7.el6.x86_64

[root@localhost ~]# which sudo
/usr/local/bin/sudo
[root@localhost ~]# ll /usr/local/bin/sudo
-rwsr-xr-x. 1 root root 782865 Apr 28 17:06 /usr/local/bin/sudo
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]#
[root@localhost ~]# su - one
[one@localhost ~]$ sudo ls /root
anaconda-ks.cfg install.log.syslog sudo-1.9.15p5
install.log sudo-1.9.15-6.el6.x86_64.rpm sudo-1.9.15p5.tar.gz
[one@localhost ~]$

image-20240428171036753

  • 但是,现网机器rhel6.4,按上述源码编译后,PATH有问题,使用sudo发现还是原来老的版本,因此需要按如下方式配置:

image-20240429124628906

[root@vcdb sudo-1.9.15p5]# ll /usr/local/bin/sudo
-rwsr-xr-x 1 root root 782865 Apr 28 20:31 /usr/local/bin/sudo
[root@vcdb sudo-1.9.15p5]# ll /usr/bin/sudo
---s--x--x. 1 root root 123832 Jan 24 2013 /usr/bin/sudo
[root@vcdb sudo-1.9.15p5]#


[root@vcdb ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/root/bin
[root@vcdb ~]#

配置方法:

vim /etc/profile
……
export PATH=/usr/local/bin:$PATH

source /etc/profile

which sudo
ll `which sudo`
echo $PATH

sudo --version

4、验证

##1、创建测试用户
useradd one

passwd one
Hg@2024ffcs #one密码

root/1233456



##2、配置sudo免密
visudo

one ALL=(ALL) NOPASSWD:ALL


##3、测试
su - one
ls /root
sudo ls /root

image-20240429123529439

image-20240428210315264

符合预期,升级成功。

FAQ

参考

https://blog.csdn.net/ccboy2009/article/details/113742325

image-20240428155023900

rhel6.4 rpm方式安装sudo新软件包时会报错的

缺少libcrypto.so.10(libcrypto.so.10)(64bit)

[root@localhost ~]# ll -h sudo-1.9.15-6.el6.x86_64.rpm 
-rw-r--r--. 1 root root 3.4M Apr 28 15:47 sudo-1.9.15-6.el6.x86_64.rpm
[root@localhost ~]# rpm -ivh sudo-1.9.15-6.el6.x86_64.rpm
error: Failed dependencies:
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by sudo-1.9.15-6.el6.x86_64
libssl.so.10(libssl.so.10)(64bit) is needed by sudo-1.9.15-6.el6.x86_64
[root@localhost ~]#

范例:gpt redhat6.4如何源码编译安装sudo-1.9.15p5.tar.gz?

要从源代码编译安装 sudo(例如版本 sudo-1.9.15p5.tar.gz)在 Red Hat Enterprise Linux 6.4 或类似的系统上,你需要遵循以下基本步骤。请注意,编译源代码通常需要安装编译器和相关的开发工具。

以下是从源码编译安装 sudo 的大致步骤:

  1. 安装编译依赖: 首先,确保你已经安装了编译软件包所需的依赖项,包括 gccmake 和可能的库文件。对于 RHEL 系统,你通常可以通过 yum 安装这些:

    sudo yum groupinstall "Development Tools"
    sudo yum install gcc make
  2. 下载源码包: 如果你已经有了 sudo-1.9.15p5.tar.gz 文件,确保它在你可以访问的目录中。如果没有,你需要下载它。由于 RHEL 6.4 较旧,可能不会有 wgetcurl,如果没有的话,你可能需要在另外的机器上下载然后传输到目标机器。

  3. 解压源码包: 使用 tar 命令解压源码包:

    tar -xzf sudo-1.9.15p5.tar.gz
  4. 编译和安装: 切换到解压后的目录中,并编译安装:

    cd sudo-1.9.15p5
    ./configure
    make && make install

    这些命令会先配置编译环境,然后编译源码,最后安装编译后的 sudo。默认情况下,sudo 会被安装到 /usr/local 目录。

  5. 验证安装结果: 安装完成后,运行以下命令来验证 sudo 是否安装成功:

    /usr/local/bin/sudo -V

    记得检查你的 PATH 环境变量是否包含 /usr/local/bin,否则你可能需要使用全路径来运行 sudo

  6. 配置: 根据需要编辑 /usr/local/etc/sudoers 文件。可以使用 visudo 工具来安全地编辑这个文件。

请记住,编译源代码意味着你将不会通过 yum 管理 sudo 的后续更新。因此,你需要手动跟踪安全更新,并在新版本发布时重复此过程以保持系统安全。

另外,由于 RHEL 6.4 是一个比较老的版本,可能会遇到一些库文件版本不兼容的情况,你需要解决这些依赖问题才能成功编译 sudo

范例:gpt 源码编译后,存在2个版本

redhat系统默认的sudo路径为/usr/bin/sudo,我通过源码编译安装sudo-1.9.15p5.tar.gz后,其sudo路径为/usr/local/bin/sudo。然后通过which sudo查看,输出依然为老版本程序/usr/bin/sudo,我该如何配置,让机器使用新版本sudo呢?

如果您已经通过源码编译安装了新版本的 sudo 并且它被安装到了 /usr/local/bin/sudo,但是 which sudo 命令仍然指向旧版本的 /usr/bin/sudo,==那么您需要调整系统的 PATH 环境变量,以确保 /usr/local/bin 的优先级高于 /usr/bin。==

通常,PATH 环境变量是在用户的 shell 配置文件中设置的,例如 ~/.bashrc~/.bash_profile/etc/profile(对于所有用户)或者 /etc/environment以下是调整 PATH 环境变量的一些基本步骤:

  1. 打开您的 shell 配置文件。如果您想对当前用户做出更改,可以编辑 ~/.bashrc~/.bash_profile。如果您想对所有用户做出更改,可以编辑 /etc/profile/etc/environment。以下是编辑 ~/.bashrc 文件的例子:

    nano ~/.bashrc
  2. 调整 PATH 变量。在打开的配置文件中,找到设置 PATH 的行,并确保 /usr/local/bin/usr/bin 之前。例如:

    export PATH=/usr/local/bin:$PATH
  3. 保存文件并重新加载配置。保存对配置文件的更改,并通过以下命令使其生效:

    source ~/.bashrc

    如果您修改的是全局配置文件,如 /etc/profile,则可能需要重新登录或重启系统。

  4. 验证新 sudo 的位置。使用 which sudo 验证 sudo 命令现在指向新位置:

    which sudo

    它应该输出 /usr/local/bin/sudo

请记住,直接替换 /usr/bin/sudo 可能会影响系统上的其他用户和脚本,因为它们可能期望 sudo 在标准位置。如果您选择替换,请确保做好了充分的测试,以确保系统的其他部分不会受到影响。

此外,在企业环境中,这种变更可能需要通过更正式的变更管理流程来执行,并确保所有利益相关者都了解这一点。

追加

自己按上面方法源码升级了sudo,但是没卸载老版本版,安全部分再次漏扫后,发现sudo漏洞依然存在……

因此,我这里直接删除了老版本sudo。

rpm -qa sudo
rpm -e --nodeps `rpm -qa sudo`

但是删除软件后,发现新版本sudo也没法用了哎……

image-20240430150608229

裂开了,这可咋办……

发现/etc/sudoers配置文件也没了的……🤣

image-20240430150835517

看了下之前克隆的机器的sudo配置:

image-20240430150700803

image-20240430150725012

image-20240430150738421

发现里面也是空的。

幸好之前的sudoers配置文件里没啥配置,也没影响业务。

后续升级软件包时,一定要慎重!!!

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号

《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

https://onedayxyy.cn/

🍀 语雀

https://www.yuque.com/xyy-onlyone

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!