本文轉載於 SegmentFault 社區

社區專欄:我的專欄

作者:sxwxs


ssh 密碼暴力破解是很常見的一種攻擊。每個開啓了 ssh 密碼登錄公網服務器幾乎都會被攻擊。本文使用 linux 自帶的工具簡單分析了 auth 日誌,用非常簡單的方法查找了攻擊者的 ip、ip 地理位置、被攻擊的用戶名,被攻擊的次數等信息。

我們有一臺服務器在公網上,密碼比較弱,我記得一配好就關閉了 ssh 密碼登錄了,結果昨天偶然發現密碼登錄居然還開着。趕緊看了一下系統認證日誌,發現已有十幾萬次錯誤的密碼嘗試了。
記錄一下過程。
我這裏是 ubuntu 系統 auth 日誌默認在 /var/log/auth.log (有的系統默認在 /var/log/secure 但是格式可能不一樣,想確定具體位置看文末更多細節)
還有文章提到的一些命令的使用方法簡介也在文末更多細節中


o.1

簡單分析日誌內容

1. 日誌條數

**
**

    wc -l / var/log/auth.log

> 66915 /var/log/auth.log


這裏有 6 萬多條記錄。 

grep "Failed password" /var/log/auth.log | wc -l

19128

密碼驗證失敗有 19128 次

2. 查看所有密碼認證成功記錄

**
**

     grep "password" /var/log/auth.log | grep -v Failed | grep -v Invalid

> Feb 14 09:59:50 server sshd[19695]: Accepted password for xxx from 59.xx.xx.xx port 40932 ssh2  
> Feb 14 10:00:32 server sshd[19929]: Accepted password for xxx from 59.xx.xx.xx port 40934 ssh2  
> Feb 14 10:07:29 server sshd[20121]: Accepted password for xxx from 59.xx.xx.xx port 40948 ssh2


只有三條都是我自己的 ip,說明最近應該沒有別人登錄成功過。  



### **3\. 查看所有 auth 日誌文件**

**
**

ls /var/log/auth.log* -lht

>     -rw-r----- 1 syslog adm 7.5M Feb 15 09:40 /var/log/auth.log  
>     > -rw-r----- 1 syslog adm 7.6M Feb 10 14:25 /var/log/auth.log.1  
>     > -rw-r----- 1 syslog adm 1.1M Feb 2 14:25 /var/log/auth.log.2.gz

    > -rw-r----- 1 syslog adm 1.6M Jan 27 14:25 /var/log/auth.log.3.gz  
>     > -rw-r----- 1 syslog adm 927K Jan 19 14:25 /var/log/auth.log.4.gz  
>     > 

可以看到系統目前產生了 5 個日誌文件了。剛剛看的 auth.log 文件只是最近的日誌。

可以把這幾個文件放到一起分析所有日誌的內容。

4. 使用 awk 簡單彙總信息

**
**方法比較樸素,先看按空白分割每一列是什麼內容:
但是主要有兩種情況,一種是用戶不存在,一種是用戶存在。

    cat /var/log/auth.log| grep "Failed password"|head -1 | awk '{while($i){print i, $i;i++}}'

> Feb 10 06:25:02 server sshd[3792]: Failed password for root from 118.xx.xx.xx port 49074 ssh2  
> 1 Feb  
> 2 10  
> 3 06:25:02  
> 4 server  
> 5 sshd[3792]:  
> 6 Failed  
> 7 password  
> 8 for  
> 9 root  
> 10 from  
> 11 118.25.39.242  
> 12 port  
> 13 49074  
> 14 ssh2


第 11 列是 ip,第 9 列是攻擊者嘗試的用戶名。  

cat /var/log/auth.log| grep "Failed password"| grep invalid |head -1 | awk '{while($i){print i, $i;i++}}'

Feb 10 06:25:19 server sshd[3936]: Failed password for invalid user ubuntu from 118.xx.xx.xx port 49842 ssh2
1 Feb
2 10
3 06:25:19
4 server
5 sshd[3936]:
6 Failed
7 password
8 for
9 invalid
10 user
11 ubuntu
12 from
13 118.25.39.242
14 port
15 49842
16 ssh2

第 13 列是 ip,第 11 列是攻擊者嘗試的用戶名。

5. 把日誌文件放到一起並解壓

**
**

     mkdir authlog  
    cd authlog  
    cp /var/log/auth.log* .  
    gunzip auth.log.*.gz

### **6\. 統計攻擊者 ip**

awk '{ if($6=="Failed"&&$7=="password"){if($9=="invalid"){ips[$13]++;users[$11]++}else{users[$9]++;ips[$11]++}}}END{for(ip in ips){print ip, ips[ip]}}' auth.* | wc -l

3298

一共有 3298 個 ip 掃過這個服務器

1)按攻擊次數排序

**
**

    awk '{ if($6=="Failed"&&$7=="password"){if($9=="invalid"){ips[$13]++;users[$11]++}else{users[$9]++;ips[$11]++}}}END{for(ip in ips){print ip, ips[ip]}}' auth.* | sort -k2 -rn | head

> 118.201.74.xx 23755  
> 118.27.3.xx 11878  
> 118.25.41.xx 11878  
> 118.25.208.xx 11878  
> 118.25.20.xx 11878  
> 118.25.26.xx 11877  
> 118.89.16.xx 11876  
> 118.24.121.xx 10905  
> 111.13.139.xx 5702  
> 118.25.39.xx 5065


最多的一個 ip 攻擊了 23755 次  



#### **2)保存到文件**

awk '{ if($6=="Failed"&&$7=="password"){if($9=="invalid"){ips[$13]++;users[$11]++}else{users[$9]++;ips[$11]++}}}END{for(ip in ips){print ip, ips[ip]}}' auth.* | sort -k2 -rn > ip.log


####

**3)查看攻擊者 ip 地理位置   
**這裏我們使用了 ipip.net 的免費 api。ipip.net 很好用。 (這免費 api 有調用次數限制)  
看剛剛保存的 ip.log 文件裏前 10 條 

head -10 ip.log | awk '{print $1" ";system("curl http://freeapi.ipip.net/"$1);print("\n")}'

118.201.74.xxx
[" 新加坡 "," 新加坡 ","","","singtel.com"]118.27.3.xxx
[" 日本 "," 東京都 "," 東京 ","","gmo.jp"]118.25.41.xxx
[" 中國 "," 上海 "," 上海 ",""," 電信 / 聯通 / 移動 "]118.25.208.xxx
[" 中國 "," 四川 "," 成都 ",""," 電信 / 聯通 / 移動 "]118.25.20.xxx
[" 中國 "," 上海 "," 上海 ",""," 電信 / 聯通 / 移動 "]

118.25.26.xxx
[" 中國 "," 上海 "," 上海 ",""," 電信 / 聯通 / 移動 "]118.89.16.xxx
[" 中國 "," 廣東 "," 廣州 ",""," 電信 / 聯通 / 移動 "]118.24.121.xxx
[" 中國 "," 四川 "," 成都 ",""," 電信 / 聯通 / 移動 "]111.13.139.xxx
[" 中國 "," 北京 "," 北京 ",""," 移動 "]118.25.39.xxx
[" 中國 "," 上海 "," 上海 ",""," 電信 / 聯通 / 移動 "]

7. 攻擊者嘗試的用戶名

查看條數

    awk '{if($6=="Failed"&&$7=="password"){if($9=="invalid"){ips[$13]++;users[$11]++}else{users[$9]++;ips[$11]++}}}END{for(user in users){print user, users[user]}}' auth.* | sort -k2 -rn |wc -l

5627

它們試了 5000 多個用戶名 

awk '{if($6=="Failed"&&$7=="password"){if($9=="invalid"){ips[$13]++;users[$11]++}else{users[$9]++;ips[$11]++}}}END{for(user in users){print user, users[user]}}' auth.* | sort -k2 -rn | head

root 120711
admin 1443
test 426
user 397
postgres 245
oracle 241
ubuntu 221
guest 211
nagios 207
git 191

其中 root 試了 12 萬次。但是我的 root 是 ubuntu 默認的隨機密碼,我就沒有動過,我自己都不知道密碼是啥。

而 admin 和 test 這些用戶我的系統裏都不存在。所以他絕大多數努力都是無用功。

保存到文件

**
**

    awk '{ if($6=="Failed"&&$7=="password"){if($9=="invalid"){ips[$13]++;users[$11]++}else{users[$9]++;ips[$11]++}}}END{for(user in users){print user, users[user]}}' auth.* | sort -k2 -rn > username.log


關閉 ssh 密碼登錄

```

vi /etc/ssh/sshd_config
找到

PasswordAuthentication yes

改成
PasswordAuthentication no
然後重啓 sshd
service sshdrestart (systemd 的命令是 systemctl reload sshd)


更多細節

1. 查看日誌位置

**
**

一般來說 ubuntu 在 /var/log/auth.log centos 在 /var/log/secure 這兩者格式不一樣。
具體在什麼位置是在 rsyslog 的配置文件裏:/etc/rsyslog.conf 或者 /etc/rsyslog.d (當然你的系統必須是用 rsyslog 的才行,如果不是用這個就不在這裏,使用命令 ps aux | grep "rsyslog" | grep -v "grep" 看系統裏有沒有 rsyslog 進程可以判斷系統是否使用 rsyslog)

ubuntu 18.04

**
**

auth,authpriv.* /var/log/auth.log
具體位置是 /etc/rsyslog.d/50-default.conf

CentOS 7.6

**
**

The authpriv file has restricted access.

authpriv.* /var/log/secure
具體位置是 /etc/rsyslog.conf

2. 用到的命令簡介

awk

強大的流編輯工具,有自己的一套語言。(功能強大,比 python 更加簡潔)
system 函數用於在 awk 中執行 shell 命令。
我收集的一些常用的腳本:

awk 輸出兩個文件不同的行:https://codeplot.top/2019/10/23/awk%E8%BE%93%E5%87%BA%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%8D%E5%90%8C%E7%9A%84%E8%A1%8C/
awk 隨機抽樣文件:https://codeplot.top/2020/02/15/awk-%E9%9A%8F%E6%9C%BA%E6%8A%BD%E6%A0%B7%E6%96%87%E4%BB%B6/

sort

**
**

-n 作爲數字進行排序 -k 指定排序的列-r 參數倒序
另外還有
-t 指定分隔符,如果要指定 t 可用 sort -t $'\t' 或者 -t'\v\'-u 排序後去重


點擊左下角閱讀原文,歡迎到 SegmentFault 思否社區 和文章作者展開更多互動和交流。

- END -
查找 ssh 暴力攻擊:使用 awk、grep 等命令簡單分析服務器 auth 日誌

來源鏈接:mp.weixin.qq.com