服務器被黑給我上了一課

轉自:http://www.jianshu.com/p/97b9dc47b88c


當你作爲一個獨立開發者的時候總要面臨這樣那樣的問題,以前認爲的小概率事件也總是某個時間點蜂擁而至考驗你的耐心,前一陣陣剛剛經歷了一次木馬驚魂 (參見文章獵豹清理大師值得我們信任麼? ),這次又遇到了服務器被黑。

部署服務器及一般的服務配置管理對於一個寫代碼的人自然不在話下,但是相對專業的運維人員程序員確少的卻是一個安全意識,總以爲服務器被攻擊是一個小概率的事件。以前是這麼考慮的“互聯網上的主機那麼多偏偏你的主機被駭客盯上? 這不跟重大獎一樣麼,我有那麼幸運麼?”雖然前一段時間自己的產品被當成木馬已經是中了一次大獎了。所以心存僥倖心理,能省事就省事,先把服務部署起來能用就行,這也倒是符合我的極簡主義行事風格。只有經歷才能成長,這句話說的一點沒錯,感謝這個不太聰明的駭客給我上了一課,從此在做任何服務器部署和管理的時候我的腦袋裏也多了一根弦兒“安全意識"。 事情是這樣的 。。。

前幾日像往常一樣,訪問我的產品網站 http://xbrowser.me , 突然頁面出現了404頁面未找到。奇怪,怎麼會這樣?我有檢查了一下輸入的域名,沒錯確實是自己的網站。這時我心理突然一驚,倒吸一口冷氣,莫非是因爲前幾天發佈了一篇文章紀念我要廢棄的產品功能-一鍵翻牆 這麼快就被GFW注意到了? 給我來了一個DNS劫持? 爲了驗證這一想法我馬上打開了電腦的VPN程序,通過VPN再次訪問我的網站(這樣可以避免GFW的DNS劫持) 。網頁呈現出來的依然是“404頁面未找到”,這說明不是DNS劫持的問題,GFW並沒有注意到我。這時候我不知道是喜還是憂,但是這究竟是什麼原因造成的呢?爲了查找真相我立刻登錄了自己的服務器。

首先我進入到了webserver根目錄查看,果然看到網站文件被刪掉了。還好我的程序有備份,這點損失我還是能夠承受的,關鍵駭客的意圖是什麼呢?篡改主頁?沒有道理啊,對於我這個一沒有知名度二沒有影響力的小站點沒有意義啊。好吧,不猜測原因了,這個哥們動作那麼大我反而要慶幸,否則就憑我那點兒安全意識被當成肉雞肯定毫無察覺。這時候我趕緊看看都有誰登錄了服務器

$ last | more 
chengkai pts/0        111.199.208.96   Mon May 18 14:41   still logged in   
chengkai pts/4        192.154.200.61   Mon May 18 12:39   still logged in   
chengkai pts/4        111.199.208.96   Sun May 10 02:40 - 14:39 (1+11:59)   
chengkai pts/4        111.199.208.96   Sat May  9 14:02 - 14:03  (00:00)    
chengkai pts/9        111.199.208.96   Sat May  9 00:15 - 02:31  (02:15)

從日誌上看,都是我自己的用戶名,但是很明顯有一個不一樣的IP地址來源,我趕緊查了一下ip地址來源, 處理了北京網通的IP另外一個不同的IP來着臺灣。很顯然駭客已經攻破了我的root密碼然後爲了掩人耳目使用我的用戶名進行線上操作,但是更讓人驚愕的是此時這哥們竟然正在線上。

chengkai pts/4        192.154.200.61   Mon May 18 12:39   still logged in

尼瑪這真是大姑娘出嫁頭一遭啊,這是要現場對決啊。第一閃念我要先把這下傢伙給踢下去,可是又一想不行,這傢伙已經拿到了我的root權限,被我踢下去很可能會氣急敗壞的重新登錄破壞系統,還是先修改root密碼及看看有沒有留下什麼後門再說,先看看對方有沒有啓動什麼特殊的服務進程。

$ netstat -nl

80、22、1723 這些端口是我知道的webserver,ssh和vpn。剩下的幾個大端口號尤其值得懷疑.

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:1723            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:48988         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:52732         0.0.0.0:*               LISTEN

那麼接下來我用"lsof" 命令來看看這幾個大的端口號是什麼進程啓動的?

lsof -i :48988
ruby    13727 chengkai    9u  IPv4 98307068      0t0  TCP localhost:58185 (LISTEN)
lsof -i  :52732
ruby    18258 chengkai    9u  IPv4 97802878      0t0  TCP localhost:52732 (LISTEN)

還好都是ruby進程,我猜想應該是passenger 轉發http請求到rails的監聽端口,爲了證明我的猜想我停掉了nginx服務,果然ruby進程佔用的端口號沒有了。

排除了駭客監聽端口的嫌疑後,接下來看看會不會拿我的服務器當"肉雞"使用,檢測這一問題的最好辦法就是查看外面的流量出口,這時候我想到了iftop命令。

$ sudo iftop -np 

                                   195kb                               391kb                              586kb                               781kb                          977kb
└──────────────────────────────────┴───────────────────────────────────┴──────────────────────────────────┴───────────────────────────────────┴───────────────────────────────────
96.126.127.11:7000                                                          => 101.219.21.98:50726                                                         30.1kb  6.03kb  1.51kb
                                                                            <=                                                                             1.12kb   230b     57b
96.126.127.11:ssh                                                           => 111.199.216.183:63446                                                       5.09kb  5.91kb  6.13kb
                                                                            <=                                                                              416b    291b    250b
96.126.127.11:7000                                                          => 101.219.21.98:54488                                                         25.3kb  5.06kb  1.27kb
                                                                            <=                                                                             1.12kb   230b     58b
96.126.127.11:7000                                                          => 101.219.21.98:36312                                                         24.3kb  4.87kb  1.22kb
                                                                            <=                                                                             1.12kb   230b     58b
96.126.127.11:ssh                                                           => 222.186.21.250:56628                                                        5.20kb  2.61kb   668b
                                                                            <=                                                                             3.14kb  1.44kb   368b
96.126.127.11                                                               => 187.184.246.118                                                             8.39kb  3.65kb  3.65kb
                                                                            <=                                                                                0b      0b      0b
96.126.127.11:7000                                                          => 101.219.21.98:34993                                                         15.8kb  3.17kb   811b
                                                                            <=                                                                             1.13kb   231b     58b
96.126.127.11:7000                                                          => 103.254.203.177:58825                                                       8.54kb  1.71kb   437b

在這裏面,並沒有發現什麼異常的流量和往外的出口連接,又進行了一些常規檢查,也沒有發現特別異常的問題。

# 查看有無異常進程
$ ps aux 
......
# 查看系統資源佔用有無異常
$ top
......
# 有沒有新增異常用戶
$ cat /etc/passwd
......
#查看了root用戶的命令歷史記錄,當然這個對稍有經驗傢伙是沒有意義的,拿到了root權限後可以清理任何痕跡
# history
......

我知道接下來需呀做的兩件事情,修改root及我當前用戶的用戶名密碼及把入侵者踢下去。在修改了服務器的密碼後,我在終端上輸入了下面兩個命令.

 $ write chengkai pts/4
what are you fucking about
#結束消息
ctrl+d
# 踢掉在線終端
 $ pkill -kill -t pts/4

第一個命令是向入侵者發送一條信息“what are you fucking about”,而第二條命令緊接着把入侵者踢了下去。這時候不免有了一絲滿足感,可以想象對方收到消息並被我踢下終端時的表情,當然我想他可能不會這麼容易善罷甘休。(其實我知道這種挑釁是蠻危險的,對方曾經拿到了root用戶權限,如果在某個地方設置了一些後門會非常難以發現,系統很容易會被再次攻破)。 我打開了認證日誌靜靜等待對方的再次破解登錄,果然對方很快就來了,而且是發動了不同的主機進行ssh暴力破解。

$ sudo tail -f /var/log/auth.log

Received disconnect from 222.186.21.243: 11:  [preauth]
May 18 14:36:52 localhost sshd[16428]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243  user=root
May 18 14:36:54 localhost sshd[16432]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243  user=root
May 18 14:36:56 localhost sshd[16432]: Failed password for root from 222.186.21.243 port 56722 ssh2
May 18 14:37:01 localhost sshd[16432]: message repeated 2 times: [ Failed password for root from 222.186.21.243 port 56722 ssh2]
May 18 14:37:01 localhost sshd[16432]: Received disconnect from 222.186.21.243: 11:  [preauth]
May 18 14:37:01 localhost sshd[16432]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243  user=root
May 18 14:37:03 localhost sshd[16438]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243  user=root
May 18 14:37:05 localhost sshd[16438]: Failed password for root from 222.186.21.243 port 45780 ssh2
May 18 14::42:26 localhost sshd[18573]: Received disconnect from 222.186.21.244: 11:  [preauth]
May 18 14::42:26 localhost sshd[18573]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244  user=root
May 18 14::42:29 localhost sshd[18579]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244  user=root
May 18 14::42:30 localhost sshd[18579]: Failed password for root from 222.186.21.244 port 38062 ssh2
May 18 14::42:35 localhost sshd[18579]: message repeated 2 times: [ Failed password for root from 222.186.21.244 port 38062 ssh2]
May 18 14::42:35 localhost sshd[18579]: Received disconnect from 222.186.21.244: 11:  [preauth]
May 18 14::42:35 localhost sshd[18579]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244  user=root
May 18 14::42:39 localhost sshd[18585]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244  user=root
May 18 14::42:41 localhost sshd[18585]: Failed password for root from 222.186.21.244 port 50864 ssh2
May 18 14::42:47 localhost sshd[18585]

某種意義上來講這是好事,因爲這說明對方並還沒有來得及安置後門程序,只能採取暴力破解的方式。那麼接下來我要做的事情就是把對方IP加入到 "hosts.deny"

$ sudo vi /etc/hosts.deny

ALL:110.164.67.47
ALL:222.89.166.12
ALL:221.229.166.30
ALL:58.218.205.69    
ALL:58.218.204.239    
ALL:58.218.211.155    
ALL:222.186.21.236    
ALL:58.218.204.225    
ALL:58.218.204.241    
.......

由於暴力破解駭客首先會嘗試root 用戶,所以還要禁止root ssh登錄,修改sshd_conf文件。

$ sudo vi /etc/ssh/sshd_config
#把PermitRootLogin 屬性 yes 改爲 no
PermitRootLogin no

到此,我能想到的檢測及阻止對方的手段已經差不多了,是時候對一個最起碼的安全意識做個總結了。

  • 設置用戶名密碼一定要大小寫字母數字及一些特殊符號的組合,增加暴力破解的難度,有可能的話可以定期更換密碼。
  • 禁止ssh root 登錄
  • 定期維護hosts.deny文件,可以選擇安裝一些第三方的工具自動根據一些規則維護hosts.deny 比如 "DenyHosts"
  • 爲了避免駭客掃描已知服務器程序端口漏洞,修改服務程序的默認端口好,比如ssh服務不使用22端口
  • 設置 iptables 開啓一些通用的防火牆規則,ubuntu系統可以使用 ufw

以下爲一些網友建議及補充:

  • 禁止密碼登陸,同樣修改 sshd_config 設置屬性“PasswordAuthentication no” ,然後公鑰和私鑰的方式進行登陸。
  • 使用fail2ban ,fail2ban可以監視你的系統日誌,然後匹配日誌的錯誤信息(正則式匹配)執行相應的屏蔽動作(一般情況下是調用防火牆屏蔽),如:當有人在試探你的SSH、SMTP、FTP密碼,只要達到你預設的次數,fail2ban就會調用防火牆屏蔽這個IP,而且可以發送e-mail通知系統管理員,是一款很實用、很強大的軟件!

還好這次事件也沒有給我造成太大的影響和損失,反而讓我加強了一些安全意識,對於菜鳥級的駭客還是能夠抵擋一陣子的。歡迎跟帖討論,你瞭解的一些入侵監測手段和防範方法,謝謝。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章