草船借箭:透過ssh蜜罐來獲取常用密碼本

Eslzzyl發表於2024-06-22

很早之前就看過類似的方法:由於具有公網 IP 的雲伺服器幾乎每一刻都會有人嘗試登入,將 TCP/22 埠背後的 SSH 服務端替換為 SSH 蜜罐,記錄所有登入嘗試,就可以收集大量的使用者名稱和密碼。前兩天在知乎看到一個實操:https://zhuanlan.zhihu.com/p/659197095 效仿了一下,效果不錯,於是記錄一下操作過程。

本文使用的作業系統是 Ubuntu 22.04,雲伺服器供應商是微軟 Azure。

遷移預設 sshd 監聽埠

SSH 協議的埠是 TCP/22,因為掃描都是走預設埠的,所以我們必須把原有的 sshd 服務換到別的埠。

編輯 /etc/ssh/sshd_config 檔案,找到 Port 22 這一行,預設情況下它可能是被註釋的。取消註釋,將 22 改成其他埠。1024-65535 均可,改之前最好搜尋一下,確保埠不是常用的。

然後在雲伺服器控制檯的安全組(或者防火牆,或者其他類似的地方)放通你剛剛修改的埠,規則是 TCP 入站。注意不要刪掉 SSH 預設的 22 埠,稍後會用到。

重啟伺服器,嘗試使用 SSH 連線伺服器,注意使用新埠,確保能夠正常建立連線。

安裝 fakessh 服務

https://github.com/fffaraz/fakessh

這是一個用 Go 寫的 SSH 蜜罐程式,能夠記錄所有的 SSH 登入嘗試,並記錄到日誌檔案。作者提供了兩種安裝方法:Go 和 Docker。我不會用 Docker,恰好伺服器上也安裝有 Go 工具鏈,所以用 Go 安裝。

安裝服務:

go install github.com/fffaraz/fakessh@latest

編譯好的 fakessh 可執行檔案位於 ~/go/bin/ 中。

然後執行

sudo setcap 'cap_net_bind_service=+ep' ~/go/bin/fakessh

然後使用 screen 或者 tmux 這樣的終端複用工具開一個新的 session,在裡面執行 fakessh

~/go/bin/fakessh .

傳入的引數是一個目錄,指示 fakessh 將日誌檔案輸出到何處。此處指定為當前目錄。

於是這個蜜罐就在 TCP/22 埠上跑起來了。

登入日誌的解析

fakessh 程式產生的日誌以 .log 作為字尾名,每次執行生成一個新檔案。其中的內容大致是這樣:

2024/06/17 09:55:45.473027 185.191.79.16:11216
2024/06/17 09:55:46.210441 185.191.79.16:11216 SSH-2.0-Go root Ab123456
2024/06/17 10:04:53.554819 194.169.175.35:63966
2024/06/17 10:04:55.812057 194.169.175.35:63966 SSH-2.0-libssh_0.10.5 sshd admin
2024/06/17 10:08:47.796645 167.94.146.56:59164
2024/06/17 10:09:14.218134 85.209.11.227:21208
2024/06/17 10:09:15.381395 85.209.11.227:21208 SSH-2.0-Go root broadguam1
2024/06/17 10:12:20.369670 185.191.79.16:6452
2024/06/17 10:12:21.095747 185.191.79.16:6452 SSH-2.0-Go root !QAZ2wsx
2024/06/17 10:14:08.683929 34.70.10.201:48278
2024/06/17 10:19:09.792239 170.187.181.93:44270
2024/06/17 10:19:10.629006 170.187.181.93:44270 SSH-2.0-libssh_0.9.6 ercico ercico
2024/06/17 10:20:03.410491 43.153.100.227:50694
2024/06/17 10:20:04.028143 43.153.100.227:50694 SSH-2.0-libssh_0.9.6 swlivart swlivart
2024/06/17 10:20:12.920081 43.134.104.206:40570
2024/06/17 10:20:13.362721 43.134.104.206:40570 SSH-2.0-libssh_0.9.6 liangdw liangdw
2024/06/17 10:20:33.221698 183.131.84.38:52628
2024/06/17 10:20:33.602245 183.131.84.38:52628 SSH-2.0-libssh_0.9.6 yanpeimin yanpeimin

可以看到使用者名稱和密碼已經記錄下來了。之後我們可以使用一些簡單的工具來提取使用者名稱和密碼。我這裡直接讓 LLM 寫了一段 Python,簡單改改得到:

import re
from glob import glob


input_file_paths = glob('fakessh-*.log')

pair_file_path = 'pair.txt'
account_file_path = 'account.txt'
password_file_path = 'password.txt'

string_pairs = []
account = []
password = []

pattern = re.compile(r'SSH-2\.0-\S+ (\S+) (\S+)')

for input_file_path in input_file_paths:
    with open(input_file_path, 'r') as input_file:
        for line in input_file:
            match = pattern.search(line)
            if match:
                string1, string2 = match.groups()
                string_pairs.append((string1, string2))
                account.append(string1)
                password.append(string2)

# 去除重複並按字典順序排序
unique_sorted_pairs = sorted(set(string_pairs))
unique_sorted_account = sorted(set(account))
unique_sorted_password = sorted(set(password))

with open(pair_file_path, 'w') as output_file:
    for pair in unique_sorted_pairs:
        output_file.write(f"{pair[0]} {pair[1]}\n")
with open(account_file_path, 'w') as output_file:
    for account in unique_sorted_account:
        output_file.write(f"{account}\n")
with open(password_file_path, 'w') as output_file:
    for password in unique_sorted_password:
        output_file.write(f"{password}\n")

執行一下,就可以得到去重並排序後的使用者名稱和密碼了。

密碼本效果如下:

!
!!^*$%^
!!admaxim!2015
!123$
!123qwe
!123qweasd
!1qazxsw2
!2#4%6&
!@
!@#$%67890
!@#$%^
!@#$%^&*()
!@#$1234
!@#$1234qwer
!@#$Qwer
!@#.abc
!@#123
!@#123.com
!@#123abc
!@#123admin
!@#123qwe
!@#123qweASD

效率

伺服器在日本東部,有一個 IPv4 公網地址,掛機大約兩天,收集到 7687 個密碼。

相關文章