我需要记录 ssh 密码尝试。我在某处读到,您可以通过修补 openssh 来完成此操作,但我不知道这是否是完成此操作的正确方法。
我正在使用阿奇。
编辑:
我想获取人们试图猜测的密码来访问我的系统。它可以与journalctl一起使用或者堆积在文本文件中。如果这个人输入 1234 并尝试获取访问权限,我想要类似的内容
“ssh 登录尝试失败,尝试使用用户“admin”和密码“1234”
答案1
我认为更好的答案是下载 LongTail SSH 蜜罐,它是 openssh 的黑客版本,用于记录用户名、密码、源 IP 和端口以及客户端软件和版本。
安装脚本位于https://github.com/wedaa/LongTail-Log-Analysis/blob/master/install_openssh.sh
答案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 交互。例子:
- https://github.com/desaster/kippo
- https://github.com/cowrie/cowrie
- https://github.com/madirish/kojoney2
- https://github.com/droberson/ssh-honeypot
- https://github.com/aabed/dockpot
- https://github.com/tnich/honssh
- https://github.com/jaksi/sshesame
- https://github.com/magisterquis/sshhipot
不过,我对这些都没有经验。