暴力破解 SSH 密码

本文主要讲解 SSH 的安全知识,让大家认识到 SSH 不要用密码登录。

准备工具

  • masscan
  • hydra
  • 词典

安装

sudo apt-get install masscan hydra

masscan 的使用请参考:文章

第一步,找到目标主机的 SSH 端口

root@ubuntu:~# masscan -p0-65535 59.111.95.153/32 --rate 10000

Starting masscan 1.0.3 (http://bit.ly/14GZzcT) at 2017-12-28 07:37:16 GMT
 -- forced options: -sS -Pn -n --randomize-hosts -v --send-eth
Initiating SYN Stealth Scan
Scanning 1 hosts [65536 ports/host]
Discovered open port 22/tcp on 59.111.95.153

可以看到该服务器默认使用了 22 端口。

我们准备一个词典文件,pass.txt,假设里面包含了真实密码

执行

root@ubuntu:~# hydra -s 22 -v -l root -P pass.txt 59.111.95.153 ssh

参数解释:

-s 指定远程主机端口
-v 显示详细信息
-l 指定登录的用户
-P 指定词典文件

可以看到,当确认可以登录后,会显示对应的密码。

我们尝试登录,发现可以登录的。

root@ubuntu:~# ssh [email protected]
[email protected]'s password:
Last failed login: Thu Dec 28 15:39:11 CST 2017 from 59.111.94.46 on ssh:notty
There were 4 failed login attempts since the last successful login.
Last login: Thu Dec 28 15:30:28 2017 from 59.111.94.46
[root@cetnos ~]#

以上只是简单的演示,其实只要机器的运算速度足够快,词典足够强大,破解一些密码是没问题的,而且大部分人设置密码都是一些生日啊、纪念日还有一些弱密码。现在很多人都注册很多大大小小网站,有些小网站本身安全方面就欠缺,如果你在很多网站设置了同样的密码,那么很容易撞库,黑客通过分析你的密码习惯,也可以很容易猜到你的密码是什么?不要觉得不可思议,一些黑产拥有你的信息可能比你亲妈还了解你在网上一天干些啥。比如你什么时间买了什么东西、在哪里买的,寄到哪里去了,电话号码,信用卡卡号等等信息。不信,你可以想象一下你每天接到的那些垃圾骚扰短信和电话,你的信息是怎么被卖出去的,一方面是一些企业非法出售个人信息,另一方面黑产会不断在网上扫各个网站的服务器漏洞窃取数据库的数据。

如何加防 SSH

我们可以从以下几个方面加防 SSH。

1.首先,千万不要开启 root,应当使用普通的三无权限用户登录,配置文件修复配置如下:

PermitRootLogin no

2.禁止密码登录,采用 ssh 密钥的方式登录,配置文件修复配置如下:

PasswordAuthentication yes

然后创建普通用户和密钥

      [root@cetnos ~]# useradd test
[root@cetnos ~]# passwd test
Changing password for user test.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@cetnos ~]# su test
[test@cetnos root]$ cd ~
[test@cetnos ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa):
Created directory '/home/test/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/test/.ssh/id_rsa.
Your public key has been saved in /home/test/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:nbcN9rAJflXZkbQrf82wzGzvLaECrg3pCfzhbnuL6Nc [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|              .o.|
|               .=|
|               oo|
|         . .   ..|
|        S + =.o. |
|   .   ... + &++.|
|    o +o .. =.Oo+|
|     *o*E ......o|
|   .o+X+o. .   o+|
+----[SHA256]-----+    

首次登录使用如下命令将自己的公钥拷贝到服务器,然后关闭密码登录

ssh-copy-id username@ip

3.重要业务,请使用跳板机登录,并只允许某个 IP 或 IP 段登录 SSH 服务

4.修改默认端口,配置文件修复配置如下,例如将 22 改成 63332

Port 63332

5.限制重试次数

#MaxAuthTries 6
#MaxSessions 10

7.给ssh文件赋予特殊权限位,避免被黑之后往 SSH目录写入内容

[root@cetnos test]# chattr +i /home/test/.ssh/
[root@cetnos test]# chattr +i /home/test/.ssh/id_rsa.pub
[root@cetnos test]# chattr +i /home/test/.ssh/id_rsa

8.如必须使用密码登录,请安装一些第三方的软件限制频繁输入错误的 IP 登录,比如 fail2ban

sudo apt-get install fail2ban

新建配置文件

root@ubuntu1:~# cat /etc/fail2ban/jail.local
[DEFAULT]
bantime = 86400
maxretry = 3
findtime = 600

[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
maxretry = 3

启动

/etc/init.d/fail2ban restart

查看日志

root@ubuntu1:~# tail -f /var/log/fail2ban.log
2017-12-28 17:19:09,115 fail2ban.jail           [2490]: INFO    Jail 'sshd' started
2017-12-28 17:19:09,122 fail2ban.jail           [2490]: INFO    Jail 'ssh-iptables' started
2017-12-28 17:22:07,855 fail2ban.filter         [2490]: INFO    [sshd] Found 59.111.94.46
2017-12-28 17:22:09,675 fail2ban.filter         [2490]: INFO    [sshd] Found 59.111.94.46
2017-12-28 17:22:18,676 fail2ban.filter         [2490]: INFO    [sshd] Found 59.111.94.46
2017-12-28 17:22:19,434 fail2ban.actions        [2490]: NOTICE  [sshd] Ban 59.111.94.46

查看防火墙

root@ubuntu1:~# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
f2b-SSH    tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
f2b-sshd   tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain f2b-SSH (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain f2b-sshd (1 references)
target     prot opt source               destination
REJECT     all  --  59.111.94.46         0.0.0.0/0            reject-with icmp-port-unreachable
RETURN     all  --  0.0.0.0/0            0.0.0.0/0