2024年5月

选项

-i 直接写入
-e 拼接指令
-n 只打印经过编辑的行
-u 禁用输出缓冲,即实时输出结果

替换标记

/g global全局替换
/p print将经过替换的行打印输出
## 需要注意的是,如果只使用 /p 标记而不使用 -n 选项,sed 命令将会打印所有经过编辑的行,包括未匹配到的行。
## 而只使用 -n 选项而不使用 /p 标记,则不会打印任何行。因此,两者结合使用时可以过滤并打印出符合条件的行。
/i 忽略大小写替换标记

地址范围选项

n:行号选项,表示只对指定行号的行进行操作。例如,5s/pattern/replacement/ 表示只对第 5 行进行替换操作。
start:起始行选项,表示从指定行开始应用编辑命令。例如,/pattern/s/replacement/ 表示从匹配到 pattern 的行开始进行替换操作。
start,end:起始行和结束行选项,表示在指定的行范围内应用编辑命令。例如,/start/,/end/s/pattern/replacement/ 表示在匹配到 start 行和 end 行之间进行替换操作。
$:最后一行选项,表示对最后一行进行操作。例如,$s/pattern/replacement/ 表示对最后一行进行替换操作。
!:否定行选项,表示对选定行之外的行应用编辑命令。例如,1,3!s/pattern/replacement/ 表示对除了第 1 行到第 3 行之外的所有行进行替换操作。

ssh免密登录

例子:机器A免密登录机器B

# 在A上执行
## 生成密钥对,保存在~/.ssh中,一般有两个文件id_rsa和id_rsa.pub对应私钥和公钥;
## 如果要实现免密登录,在输入passphrase时直接回车,不要输入内容
ssh-keygen -t rsa
scp ~/.ssh/id_rsa.pub username@B_ipAddress:/path/to/temporary_location

# 在B上执行
## 若有多台机器希望免密登录B,在B上的authorized_keys后面追加写入公钥即可
cat /path/to/temporary_location >> ~/.ssh/authorized_keys

passphrase作用是解密私钥


PAM(Pluggable Authentication Modules)可插拔身份认证模块

在/etc/pam.d/文件夹中,每个文件对应一个应用程序或服务。这些文件的命名通常与相应的应用程序或服务的名称相对应。例如sshd文件对应 SSH 服务的身份验证和授权规则,login文件对应本地登录过程的身份验证和授权规则。
提权之后,一种持久化方法是修改PAM。

# 在/etc/pam.d/下文件内容主要依据四个规则:

auth:身份验证规则
    auth required pam_unix.so:使用标准的UNIX身份验证方法进行验证。
    auth required pam_google_authenticator.so nullok:使用Google Authenticator进行两步验证,允许用户在没有启用Google Authenticator的情况下进行身份验证。

account:授权规则
    account required pam_unix.so:使用标准的UNIX账户管理来控制用户的访问权限。
    account required pam_access.so:使用/etc/security/access.conf文件中的规则来控制用户的访问控制。

password:密码管理规则
    password required pam_cracklib.so:使用CrackLib库来检查和强制密码策略。
    password required pam_unix.so sha512 shadow:使用UNIX密码管理和shadow密码文件来存储用户密码。

session:会话管理规则
    session required pam_limits.so:设置用户会话的资源限制,如最大打开文件数和最大进程数。
    session optional pam_systemd.so:与systemd集成,以管理用户会话的生命周期。

举个例子:

# 编辑 /etc/pam.d/login
# 添加或修改以下行
auth required pam_tally2.so deny=5 unlock_time=600
auth required pam_unix.so
account required pam_tally2.so
account required pam_unix.so

此例中,
认证阶段(auth):
pam_tally2.so会首先执行,它会检查登录尝试次数是否超过限制。如果登录尝试次数超过设置的限制(如 deny=5),它将导致认证失败,并且用户账户会被锁定指定时间(如 unlock_time=600)。
即使 pam_tally2.so 失败,pam_unix.so 还是会继续执行。这意味着系统会继续检查用户的用户名和密码是否正确。如果用户名和密码正确,但 pam_tally2.so 失败,整体认证仍然会失败。

账户管理阶段(account):
pam_tally2.so会再次执行,用于更新和检查账户状态,例如解锁被锁定的账户。
然后pam_unix.so会执行,进行标准的账户管理操作,例如检查账户是否已过期。

总结
在PAM配置文件中,每个required模块必须成功,否则整个认证过程将失败。然而,它们会按照配置文件中的顺序依次执行,即使前面的模块失败了,后面的模块也会继续执行,但最终认证结果将取决于所有required模块的结果。


那么是否可以重写pam_unix.so?可以。
只要模块路径正确且模块本身编写和安装正确,PAM 配置文件就能够识别并调用它。
如何编写正确的PAM模块可以参考Linux-PAM GNU
攻击样例可以参考Linux 攻擊場域:SSH 登入攻擊手法初探,文中利用

account sufficient bad_pam.so

指定该模块(bad_pam.so)返回成功(Success)状态,那么就无需再继续执行后面的账户授权规则,即可立即授权通过。而在bad_pam.so中可以操作很多事,比如任意密码登录,登录不被记录,非指定密码(后门账号)登录之后键盘被记录等等。

检测方法

观察/usr/lib/x86_64-linux-gnu/security/和/etc/pam.d/中文件的修改时间hash值是否可疑。