Linux 利用hosts.deny 防止暴力破解ssh


一、ssh暴力破解

  利用專業的破解程序,配合密碼字典、登陸用戶名,嘗試登陸服務器,來進行破解密碼,此方法,雖慢,但卻很有效果。

二、暴力破解演示

2.1.基礎環境:2台linux主機(centos 7系統)、Development Tools.

  主機ip:192.168.30.64 (服務器端)、192.168.30.63(客戶端+ 暴力破解【Hydra】)

  在30.63上進行暴力破解30.64

2.2 客戶端上安裝 破解程序 hydra。關於該程序的詳情請去官網.

安裝該軟件的依賴環境:

[root@ceph-osd1 ~]# yum install openssl-devel pcre-devel ncpfs-devel postgresql-devel libssh-devel subversion-devel libncurses-devel -y

下載hydra 軟件(如果在linux 中無法直接wget下載的話,可以在瀏覽器(windows)中直接輸入該鏈接去下載該軟件)

[root@ceph-osd1 ~]# wget https://www.thc.org/download.php?t=r&f=hydra-8.1.tar.gz

解壓、編譯、安裝(注意: 編譯安裝時需要注意看下有沒有error類的錯誤,不然可能會導致hydra程序無法使用)

[root@ceph-osd1 ~]# tar zxvf hydra-8.1.tar.gz
[root@ceph-osd1 ~]# cd hydra-8.1
[root@ceph-osd1 hydra-8.1]# ./configure
[root@ceph-osd1 hydra-8.1]# make && make install

正常安裝的話,就可以使用了。

2.3 hydra 常用命令詳解

[root@ceph-osd1 ~]# hydra
Hydra v8.1 (c) 2014 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.

Syntax: hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e nsr] [-o FILE] [-t TASKS] [-M FILE [-T TASKS]] [-w TIME] [-W TIME] [-f] 
[-s PORT] [-x MIN:MAX:CHARSET] [-SuvVd46] [service://server[:PORT][/OPT]] Options: -l LOGIN or -L FILE login with LOGIN name, or load several logins from FILE
 # -l 登陸用戶名 或者 -L 登陸用戶名列表文件
-p PASS or -P FILE try password PASS, or load several passwords from FILE
 # -p 登陸密碼 或者 -P 密碼字典文件
-C FILE colon separated "login:pass" format, instead of -L/-P options
# 使用用戶名:密碼 組合的破解文件。
-M FILE list of servers to attack, one entry per line, ':' to specify port
# 指定目標列表文件一行一條記錄
-t TASKS run TASKS number of connects in parallel (per host, default: 16)
# 同時運行的線程數目,默認是16個
-U service module usage details
# 服務模塊使用詳情
-h more command line options (COMPLETE HELP)
# 更多命令選項
server the target: DNS, IP or
192.168.0.0/24 (this OR the -M option)
#支持掃描 域名、ip、以及網段
service the service to crack (see below
for supported protocols)
# 破解掃描的協議
OPT some service modules support additional input (
-U for module help)
# 更多擴展選項參看 -U 選項 Supported services: asterisk cisco cisco
-enable cvs ftp ftps http[s]-{head|get} http[s]-{get|post}-form http-proxy http-proxy-urlenum icq
imap[s] irc ldap2[s] ldap3[-{cram|digest}md5][s] mssql mysql(v4) nntp oracle-listener oracle-sid pcanywhere pcnfs pop3[s] postgres rdp redis
rexec rlogin rsh s7-300 sip smb smtp[s] smtp-enum snmp socks5 ssh sshkey svn teamspeak telnet[s] vmauthd vnc xmpp Hydra is a tool to guess/crack valid login/password pairs. Licensed under AGPL v3.0. The newest version is always available at http://www.thc.org/thc-hydra Don't use in military or secret service organizations, or for illegal purposes. Example: hydra -l user -P passlist.txt ftp://192.168.0.1
#示例: 用user 用戶,加上 passlist.txt密碼字典,嘗試破解 192.168.0.1 ftp服務器

2.4 測試破解 (在192.168.30.63上操作)

創建一個目錄,用來存放用戶文件以及密碼字典,並創建用users.txt、passwd.txt 文件

[root@ceph-osd1 ssh-test]# pwd
/root/ssh-test
[root@ceph-osd1 ssh-test]# cat users.txt 
root
mysql
ftp
apache
rsync
tt
admin
[root@ceph-osd1 ssh-test]# cat passwd.txt 
123456
123
admin
123456789
helloworld

運行一下命令進行破解,可以看到倒數第二行,提示已經找到1個有效的密碼。倒數第三行,便是有效的用戶名和密碼(如果在命令里加上-vV 選項的話,會輸出更詳細的破解運行的信息)

[root@ceph-osd1 ssh-test]# hydra -L users.txt -P passwd.txt ssh://192.168.30.64
Hydra v8.1 (c) 2014 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.

Hydra (http://www.thc.org/thc-hydra) starting at 2016-05-03 19:04:33
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 64 tasks, 35 login tries (l:7/p:5), ~0 tries per task
[DATA] attacking service ssh on port 22
[22][ssh] host: 192.168.30.64   login: root   password: 123456
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2016-05-03 19:04:39

運行-o 選項可以將得到的有效用戶名和密碼保存到文件中,如下:

[root@ceph-osd1 ssh-test]# hydra -L users.txt -P passwd.txt -vV ssh://192.168.30.64 -o valid-info.txt
[root@ceph-osd1 ssh-test]# cat valid-info.txt 
# Hydra v8.1 run at 2016-05-03 19:08:14 on 192.168.30.64 ssh (hydra -L users.txt -P passwd.txt -vV -o valid-info.txt ssh://192.168.30.64)
[22][ssh] host: 192.168.30.64   login: root   password: 123456

以上就是暴力破解的過程,另外hydra 程序支持更多的協議,如ftp、web用戶名登陸、cisco、pop3、rdp、telnet...... 等等等等。有興趣的可以谷歌搜索下用法。不要用來做壞事啊,防患於未然。

三、如何防止自己的服務器被ssh暴力破解呢?

3.1 這里利用到了linux 系統的日志,不知道大家發現沒,每次我們登陸服務器時,如果有登陸認證失敗的情況,會在服務器的/var/log/secure文件中記錄日志。錯誤日志如下:

[root@test deny]# tail -3f /var/log/secure
May  3 19:14:49 test sshd[23060]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.30.63  user=root
May  3 19:14:49 test sshd[23060]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
May  3 19:14:51 test sshd[23060]: Failed password for root from 192.168.30.63 port 50704 ssh2

通過上面的日志我們可以看出,是30.63這台主機ssh登陸失敗了,那假如它登陸失敗次數過多后,我們能否禁止它登陸呢?

3.2 這里用到了linux 的hosts.deny(利用tcp_wrappers)文件。參考文章:我本善良

hosts.deny介紹:一般來說linux的密碼我們會用shadow來保護。電子郵件大概有人也會說使用PGP,但是一般的網路連線呢?可能會有人舉手回答說防火牆,那防火牆跟tcp_wrappers有什麼關係呢?筆者個人認為,如果說Firewall是第一道防線的話,第二道防線大概就是tcp_wrappers了,我們可以利用不同的防護程式來增加防護的能力之外,並且還能增加被駭客破台的困難度。設計一個完善的防火牆規則本來就不是一件很容易的事情,但是我們能透過簡單的程式化困難為容易,讓新手更能快樂的接觸美麗的Linux新世界。

3.3 利用腳本配合任務計划去定時檢測 /var/log/secure 文件,當發現有大量失敗日志后,就將該ip追加到hosts.deny中,以達到防止暴力破解的目的。(在192.168.30.64 服務器上操作)

腳本內容:

[root@test deny]# pwd
/root/deny
[root@test deny]# vim autoDeny.sh
#!/bin/bash

LIST=""

#過濾出協議,嘗試連接主機的ip
LIST=$(cat /var/log/secure | grep "authentication failure" | awk '{print$14}' | sed -e 's/rhost=//g' -e 's/ /_/g' | uniq)

#Trusted Hosts
excludeList=( "192.168.30.55" )

function chkExcludeList()
{
for j in "${excludeList[@]}"; do
    if [[ "$1" == $j ]]; then
        return 10
    fi
done
return 11
}

#檢查並追加到hosts.deny文件中
for i in $LIST; do
    chkExcludeList "$i"
        if [ $? != "10" ]; then
            if [ "$(grep $i /etc/hosts.deny)" = "" ]; then
                echo "ALL: $i : DENY" >> /etc/hosts.deny
            fi
        fi
done
View Code

任務計划:(每分鍾運行下該程序)

[root@test deny]# crontab -l
*/1 * * * * /usr/bin/sh /root/deny/autoDeny.sh

重啟crond服務

[root@test deny]# systemctl restart crond

我們先查看下/etc/hosts.deny文件,默認里面的內容應該是空的,如下

[root@test deny]# tail -2f /etc/hosts.deny
#        See 'man tcpd' for information on tcp_wrappers
#

 

3.4 在客戶端上進行破解。(192.168.30.63上操作)

第一次運行破解命令

第二次在繼續操作時出現連接端口失敗的提示(已經被服務器加入deny拒絕了。)

可以去服務器上去檢查下hosts.deny文件內容。看下有沒有把客戶端的ip 追加到里面

 說明該腳本運行正常,可以拒絕那些想暴力破解我們服務器的ip。

 

四、下面講下如何利用DenyHosts 軟件更智能的保護linux 系統,官網

4.1 介紹:摘自wiki 

  DenyHosts是針對SSH服務器的一個基於日志的入侵預防安全工具,是用Python編寫的。其通過監測身份驗證登錄日志中失敗的登錄嘗試,屏蔽這些登錄者的IP地址,從而預防對SSH服務器的暴力破解。DenyHosts是由Phil Schwartz開發的,他也是Kodos正則表達式調試器的開發者。

  原理:DenyHosts通過監測身份驗證登錄日志的末尾,來獲取近期失敗的登錄嘗試信息。DenyHosts記錄了有關登錄者IP地址的信息,並將失敗的登錄嘗試次數與用戶指定的閾值進行比較。如果失敗的登錄嘗試次數太多,DenyHosts假定發生了字典式攻擊,並通過將IP地址添加到服務器上的/etc/hosts.deny,屏蔽相關IP,防止其進一步的攻擊。DenyHosts 2.0及以上的版本支持集中同步,從而可以阻止攻擊過多台電腦的慣犯。 從多台計算機,DenyHosts 2.0 及以上支持集中同步,所以重復的罪犯將被阻止。denyhosts.net網站從運行了該軟件的計算機上收集統計信息。

4.2 該程序依然安裝在服務器上,在192.168.30.64上操作

下載解壓安裝:由於是python 程序,需要使用python 安裝,並且有python 環境,現在的linux 系統默認有python環境,如果沒有的話,需要yum install -y python

[root@test ]# wget http://sourceforge.net/projects/denyhosts/files/denyhosts/2.6/DenyHosts-2.6.tar.gz
[root@test ]# tar -zxvf DenyHosts-2.6.tar.gz
[root@test DenyHosts-2.6]# cd DenyHosts-2.6
[root@test DenyHosts-2.6]# python setup.py install
[root@test DenyHosts-2.6]# cd /usr/share/denyhosts/

看下當前目錄中的文件

[root@test denyhosts]# ls
CHANGELOG.txt  daemon-control-dist  data  denyhosts.cfg-dist  LICENSE.txt  plugins  README.txt  scripts  setup.py

daemon-control-dist 文件就是 該程序的啟動停止腳本,是用python語言編寫的。我們把它加入到開機自啟。

[root@test denyhosts]# cp /usr/share/denyhosts/daemon-control-dist /etc/init.d/denyhosts
[root@test denyhosts]# chkconfig denyhosts on
將命令加入到系統命令里,方便使用
[root@test denyhosts]# cd /bin
[root@test bin]# ln -s /usr/share/denyhosts/daemon-control-dist denyhosts
[root@test bin]# cd ~
測試下:
[root@test ~]# denyhosts
Usage: /usr/bin/denyhosts {start [args...] | stop | restart [args...] | status | debug | condrestart [args...] }

For a list of valid 'args' refer to:
$ denyhosts.py --help

啟動命令搞定后,我們編輯下denyhosts的配置文件。文件存放在 /usr/share/denyhosts/denyhosts.cfg.內容如下:

[root@test ~]# vim /usr/share/denyhosts/denyhosts.cfg
#ssh的日志文件
SECURE_LOG = /var/log/secure
#把檢測到的ip寫到hosts.deny文件
HOSTS_DENY = /etc/hosts.deny
#多久清除已經禁止的ip,如1h 代表1小時;w周,d天,s秒,m分鍾
PURGE_DENY = 1h
#服務名稱
BLOCK_SERVICE  = sshd

#無效用戶名嘗試的次數
DENY_THRESHOLD_INVALID = 1
#有效的用戶名嘗試的次數 (不包括root)
DENY_THRESHOLD_VALID = 8
# 允許root 用戶嘗試的次數
DENY_THRESHOLD_ROOT = 3

DENY_THRESHOLD_RESTRICTED = 1
#記錄拒絕的host 到 該目錄中
WORK_DIR = /usr/share/denyhosts/data
#開啟可疑的主機報告
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES

#開啟域名解析
HOSTNAME_LOOKUP=YES
#軟件的lock文件
LOCK_FILE = /var/lock/subsys/denyhosts
#下面是設置郵局報警,郵件接收拒絕的主機
ADMIN_EMAIL = 
SMTP_HOST = localhost
SMTP_PORT = 25
SMTP_FROM = DenyHosts <nobody@localhost>
SMTP_SUBJECT = DenyHosts Report
#有效用戶登錄失敗計數歸零的時間
AGE_RESET_VALID=5d
#root用戶登錄失敗計數歸零的時間
AGE_RESET_ROOT=25d
#普通用戶的失敗登錄計數重置為0的時間
AGE_RESET_RESTRICTED=25d
#無效用戶登錄失敗計數歸零的時間
AGE_RESET_INVALID=10d

#denyhosts程序的日志文件
DAEMON_LOG = /var/log/denyhosts
 
DAEMON_SLEEP = 30s
DAEMON_PURGE = 1h
View Code

編輯配置完成后,就可以啟動服務器了,直接運行denyhosts start 或者停止denyhosts stop 等。或者直接輸入denyhosts查看幫助

[root@test ~]# denyhosts start
starting DenyHosts:    /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/usr/share/denyhosts/denyhosts.cfg

檢查下服務日志,程序進程pid 3704

[root@test ~]# tail -f /var/log/denyhosts 
2016-05-04 17:39:28,300 - denyhosts   : INFO     launching DenyHosts daemon (version 2.6)...
2016-05-04 17:39:28,305 - denyhosts   : INFO     DenyHosts daemon is now running, pid: 3704
2016-05-04 17:39:28,305 - denyhosts   : INFO     send daemon process a TERM signal to terminate cleanly
2016-05-04 17:39:28,305 - denyhosts   : INFO       eg.  kill -TERM 3704
2016-05-04 17:39:28,306 - denyhosts   : INFO     monitoring log: /var/log/secure
2016-05-04 17:39:28,306 - denyhosts   : INFO     sync_time: 3600
2016-05-04 17:39:28,306 - denyhosts   : INFO     daemon_purge:      3600
2016-05-04 17:39:28,306 - denyhosts   : INFO     daemon_sleep:      30
2016-05-04 17:39:28,306 - denyhosts   : INFO     purge_sleep_ratio: 120
2016-05-04 17:39:28,306 - denyhosts   : INFO     denyhosts synchronization disabled

為了下面的驗證,我們先停止服務,然后加上debug選項以調試模式啟動 denyhosts 服務,如下:

[root@test ~]# denyhosts start
starting DenyHosts:    /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/usr/share/denyhosts/denyhosts.cfg
[root@test ~]# denyhosts debug
sent DenyHosts SIGUSR1

 

4.3 驗證,在客戶端上進行操作(192.168.30.63上):

4.4 服務器上的denyhosts 日志文件,以及hosts.deny文件已經記錄了,如下


hosts.deny文件

4.5 另外我也嘗試了用無效的用戶名嘗試登陸,可以先另外找台客戶端,直接使用不存在的用戶去嘗試登陸,便會在第一次登陸后就會被加入到hosts.deny文件中。軟件還有其它功能待學習。如有疑問,可以隨時留言交流哈。下班了。\(•ω•`)o

 

五、注意事項

1.上述的實驗中,可能會存在很快的被掃描到賬號和密碼,沒有起到防止暴力的作用,那是因為我的密碼文件已經在里面了,而且用戶名及密碼就幾個。但是在真實環境中,黑客不可能那么快就掃描到,除非你的密碼弱爆了。。。

2.上述實驗中的軟件來自於互聯網。

 

本文章屬於原創,如有轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM