如何记录 ssh 登录密码尝试?

如何记录 ssh 登录密码尝试?

我需要记录 ssh 密码尝试。我在某处读到,您可以通过修补 openssh 来完成此操作,但我不知道这是否是完成此操作的正确方法。

我正在使用阿奇。

编辑:

我想获取人们试图猜测的密码来访问我的系统。它可以与journalctl一起使用或者堆积在文本文件中。如果这个人输入 1234 并尝试获取访问权限,我想要类似的内容

“ssh 登录尝试失败,尝试使用用户“admin”和密码“1234”

答案1

我认为更好的答案是下载 LongTail SSH 蜜罐,它是 openssh 的黑客版本,用于记录用户名、密码、源 IP 和端口以及客户端软件和版本。

安装脚本位于https://github.com/wedaa/LongTail-Log-Analysis/blob/master/install_openssh.sh

我也在做分析http://longtail.it.marist.edu

答案2

如果您这样做,(1) 登录到 authpriv,(2) 确保 authpriv 只能由 root 读取。有关详细信息,请参阅 syslog.conf 或 rsyslog.conf。接下来,您必须破解源代码。在某些时候,密码将被发送到图书馆呼叫crypt。在此之前,使用日志记录代码来记录输入字符串。除了破解 ssh 代码之外,您还可以使用 LD_PRELOAD 来拦截crypt调用;那么您必须启动sshd守护程序,并将 LD_PRELOAD 环境变量设置为新库(一或两个调用)。

为了提高安全性,请考虑使用对称密钥加密输出字符串。这不是很好的安全性,但它可以防止意外暴露好的密码(在这种情况下,sshd 捕获您自己的密码,当您在屏幕上看到 authpriv 的内容时,有人走过)。

有关使用 LD_PRELOAD 拦截 lib 调用的更多信息,请参阅https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/

如何在 C 中执行系统日志: http://www.gnu.org/software/libc/manual/html_node/Syslog-Example.html。如果你破解了ssh代码,已经有日志功能了;只需复制并根据需要修改即可。

答案3

我在尝试恢复 SFTP 密码时偶然发现了这个问题。

我为未来面临同样挑战的人们准备了2个完整的工作示例。

变体 0:修补 OpenSSH

创建修补的 OpenSSH docker 映像来记录所有密码很简单。基本上,您必须在相关位置添加一行以进行密码检查:

sed -e 's/^\([ \t]*\)\(struct passwd \*pw = authctxt->pw;\)/\1logit("Login attempt by username '\''%s'\'', password '\''%s'\''", authctxt->user, password);\n\1\2/' -i auth-passwd.c

这只会转换

    struct passwd \*pw = authctxt->pw;

    logit("Login attempt by username '\''%s'\'', password '\''%s'\''", authctxt->user, password);
    struct passwd \*pw = authctxt->pw;

包含补丁的 Dockerfile了解有关完整构建过程的更多信息。

变体 1:创建您自己的 SSH 服务器

不确定 OpenSSH 是否是您的固定要求,或者替代的 SSH 实现是否也适合您。如果 OpenSSH 不是严格要求,您可以例如使用 Java 上的 Apache Mina 创建一个记录所有密码的 SFTP 服务器

将密码日志记录插入 Apache Mina 的关键部分是实现接口PasswordAuthenticator

package de.metamorphant.examples.chattysshd;

import org.apache.sshd.server.auth.AsyncAuthException;
import org.apache.sshd.server.auth.password.PasswordAuthenticator;
import org.apache.sshd.server.auth.password.PasswordChangeRequiredException;
import org.apache.sshd.server.session.ServerSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggingPasswordAuthenticator implements PasswordAuthenticator {
    private static Logger logger = LoggerFactory.getLogger(LoggingPasswordAuthenticator.class);

    @Override
    public boolean authenticate(String username, String password, ServerSession session)
            throws PasswordChangeRequiredException, AsyncAuthException {
        logger.debug(String.format("Login attempt by user '%s' with password '%s'\n", username, password));
        return false; // Authentication with our dummy server always fails
    }
}

然后,您仍然需要将其注入到您的服务器中:

...
    SshServer sshd = SshServer.setUpDefaultServer();
...
    sshd.setPasswordAuthenticator(new LoggingPasswordAuthenticator());
...

看看使用 Apache Mina 实现的密码记录 SFTP 服务器的完整工作示例了解更多。

变体 2:使用预配置的蜜罐工具

根据您的使用案例,您可能还需要考虑成熟的 SSH 蜜罐。通常,这些工具不仅仅包括记录密码,例如记录攻击者的完整 shell 交互。例子:

不过,我对这些都没有经验。

相关内容