0x01 SSH和SFTP是什么
SSH是一种安全的远程shell协议,用于通过不安全的网络安全地运行网络服务。默认的SSH端口是22,通常会在Internet或Intranet上的服务器上看到它的打开状态。
SFTP是SSH文件传输协议,该协议用于通过SSH连接传输文件,大多数SSH实现也支持SFTP。
0x02 SSH服务器/库
最著名和最常见的SSH服务器和客户端是openSSH(OpenBSD安全shell)。它是一个功能强大的实现,维护良好,于1999年首次发布。因此,这是自Windows 10以来在Windows中附带的BSD,Linux的软件中Windows上最常看到的实现。
但是openSSH并不是唯一的实现,这里还有其他软件实现:
SSH服务器:
· openSSH – OpenBSD SSH,自Windows 10起在BSD,Linux发行版和Windows中提供
· Dropbear – OpenWrt附带的用于内存和处理器资源较少的环境的SSH实现
· PuTTY – Windows的SSH实现,通常使用客户端,很少使用服务器
· CopSSH – Windows版OpenSSH的实现
SSH库(在服务器端实现):
· libssh -多平台C库实现与在绑定SSHv2的协议的Python,Perl的和ropensci ; 它由KDE用于sftp,由GitHub用于git SSH基础结构
· wolfSSH –用ANSI C编写的SSHv2服务器库,面向嵌入式,奇热RTOS和资源受限的环境
· Apache MINA SSHD – Apache SSHD Java库基于Apache MINA
· paramiko – Python SSHv2协议库
0x03 常见配置错误
root账号登录
默认情况下,大多数SSH服务器实现将允许root登录,建议禁用它,因为如果该帐户的凭据泄漏,攻击者将直接获得管理特权,这也将允许攻击者对该帐户进行暴力攻击。
如何禁用openSSH的root登录:
1. 编辑SSH服务器配置 sudoedit /etc/ssh/sshd_config
2. 更改#PermitRootLogin yes成PermitRootLogin no
3. 进行配置更改: sudo systemctl daemon-reload
4. 重启SSH服务器 sudo systemctl restart sshd
SFTP命令执行
另一个常见的SSH错误配置通常出现在SFTP配置中。在大多数情况下,创建SFTP服务器时,管理员希望用户具有SFTP访问权限来共享文件,而不希望在计算机上获得远程Shell。因此,他们认为创建用户,为用户分配占位符shell(如/usr/bin/nologin或/usr/bin/false)并将其chroot足以避免shell访问或滥用整个文件系统。但这是错误的,用户可以在身份验证后立即要求执行命令,然后再执行其默认命令或shell程序。因此,要绕过将拒绝shell访问的占位符shell,只需执行以下操作即可要求执行一条命令(例如/bin/bash):
$ ssh -v noraj@192.168.1.94 id ... Password: debug1: Authentication succeeded (keyboard-interactive). Authenticated to 192.168.1.94 ([192.168.1.94]:22). debug1: channel 0: new [client-session] debug1: Requesting no-more-sessions@openssh.com debug1: Entering interactive session. debug1: pledge: network debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0 debug1: Sending command: id debug1: client_input_channel_req: channel 0 rtype exit-status reply 0 debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0 uid=1000(noraj) gid=100(users) groups=100(users) debug1: channel 0: free: client-session, nchannels 1 Transferred: sent 2412, received 2480 bytes, in 0.1 seconds Bytes per second: sent 43133.4, received 44349.5 debug1: Exit status 0 $ ssh noraj@192.168.1.94 /bin/bash
这是用户的安全SFTP配置(/etc/ssh/sshd_config– openSSH)的noraj示例:
Match User noraj ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no PermitTunnel no X11Forwarding no PermitTTY no
此配置将仅允许SFTP:通过强制启动命令并禁用TTY访问来禁用shell程序访问,还可以禁用所有类型的端口转发或隧道。
认证方式
在高安全性环境中,通常的做法是仅启用基于密钥或两因素的身份验证,而不是基于简单因素密码的身份验证。但是通常启用更强的身份验证方法而不会禁用较弱的身份验证方法。一种常见的情况是启用publickeyopenSSH配置并将其设置为默认方法,而不是禁用password。因此,通过使用SSH客户端的详细模式,攻击者可以启用了一种较弱登录的方法:
$ ssh -v 192.168.1.94 OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019 ... debug1: Authentications that can continue: publickey,password,keyboard-interactive
例如,如果设置了身份验证失败限