安全開發教學 - 用docker製作一個高交互ssh蜜罐

安全開發教學 - 用docker製作一個高交互ssh蜜罐

來自專欄我的征途是星辰大海18 人贊了文章

概述

實現一個高交互的SSH蜜罐有方式有多種:

  • 可以使用現成的開源系統,如kippocowrie等,
  • 可以利用一些SSH庫做2次開發,如https://github.com/gliderlabs/ssh
  • 也可以用Docker定製

市面上已經有這麼多開源的SSH蜜罐了,我為什麼還要再造個輪子呢,理由如下:

  • 部署這些系統要安裝一堆的依賴,運維部署成本較高
  • 想要的功能沒法添加,不想要的功能也沒法刪減
  • 如果要支持多種高交互的服務,必須用一堆開源的系統拼湊出一堆服務來,每種系統的後端DB不同,數據結構也各不相同,無法統一處理
  • 自研的系統部署簡單,服務可自由擴展,數據格式可自由定製和統一,方便運維與運營

技術架構

筆者在之前的文章《自製攻擊欺騙防禦系統》中介紹過完整的架構,整個系統由以下幾個模塊組成:

  • Agent端,部署於伺服器中的Agent,用於實時獲取用戶的訪問日誌並傳遞到檢測端Server中,如果是惡意攻擊,則會將流量重定向到沙盒中。目前支持的服務有:

    • WEB
    • FTP
    • SSH
    • Rsync
    • Mysql
    • Redis
    • Mongodb
  • Server端,攻擊檢測伺服器,實時檢測Agent傳遞過來的日誌並判斷是否為攻擊者,並為Agent動態、實時地維護了一份攻擊者的來源IP策略
  • Mamager端,策略管理伺服器,有為Agent和server提供策略、攻擊log統計、查看的功能
  • 高交互蜜罐系統及守護進程,高交互蜜罐系統由docker封裝的一些服務組成,守護進程負責把模擬系統中產生的LOG的數據格式化後再傳給Server端進行攻擊檢測與入庫

本文只講SSH高交互蜜罐的實現。

SSH高交互蜜罐的Docker實現

docker中默認的openssh服務沒有記錄bash命令及ssh密碼的功能,需要修改bash及openssh的源碼並重新編譯到Docker中,以下為Dockerfile的內容:

FROM debian:jessieRUN export DEBIAN_FRONTEND=noninteractive && apt-get update -qq && apt-get install -qqy --no-install-recommends openssh-server rsyslog wget patch make gcc curl libc6-dev net-tools vim && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* && mkdir -p /softs/bash-4.3.30-active-syslog/ && mkdir -p /home/testCOPY softs/ /softs/RUN chmod +x /softs/bash-4.3.30-active-syslog/install-bash-syslog.shRUN chmod +x /softs/install_ssh.shWORKDIR /softs/bash-4.3.30-active-syslog/RUN ["/bin/bash", "./install-bash-syslog.sh"]WORKDIR /softs/RUN ["/bin/bash", "./install_ssh.sh"]EXPOSE 22/tcpCOPY entrypoint.sh /etc/systemd/system/COPY Shanghai /etc/localtimeRUN chmod +x /etc/systemd/system/entrypoint.shENTRYPOINT ["/etc/systemd/system/entrypoint.sh"]

  • install-bash-syslog.sh為記錄詳細執行命令記錄的bash安裝腳本;
  • /install_ssh.sh為記錄openssh密碼的安裝腳本。

完成後的Docker鏡像封裝腳本的地址為github.com/netxfly/dock

執行sh -x ./install.sh後經過一段時間的等待後,會直接封裝一個Openssh鏡像並啟動。

測試截圖

openssh的密碼破解記錄如下:

bash的命令執行記錄如下:

如果允許攻擊者登錄到蜜罐中,還需要修改蜜罐的IP地址和主機名,防止攻擊者一登錄成功就識別出來;其次要做好ACL,防止攻擊者通過蜜罐作為跳板攻擊內網中其他系統。

模擬系統的守護進程實現

模擬系統的守護進程的作用是實時監控Docker服務產生的數據,並格式化後發送到server端中進行檢測,通過插件的形式,可以支持多種服務的日誌格式化,然後將格式化的日誌通過http協議發送到server端。

func main() { logs := make(map[string]string) logs["vsftpd-server"] = settings.VsftpLog logs["openssh-server"] = settings.SshLog logs["history"] = settings.HistLog logs["rsync"] = settings.RsyncLog logs["mysql-server"] = settings.MysqlLog logs["redis-server"] = settings.RedisLog logs["mongodb-server"] = settings.MongodbLog // logger.Log.Infoln("Log config info:", settings.APIURL, settings.KEY, settings.MODE) for tag, fileName := range logs { logger.Log.Printf("Tag: %v, path: %v, Truncate: %v", tag, fileName, os.Truncate(fileName, 0)) if settings.MODE == "syslog" { // go util.MonitorLog(tag, fileName) } else { go util.CheckLog(tag, fileName) } } for { time.Sleep(3 * time.Second) }}

SSH密碼破解檢測插件的實現如下:

  1. 通過正則匹配中破解密碼的記錄並格式化
  2. 確定為破解行為的記錄,通過http介面傳到server中

package pluginsimport ( "regexp" "time" "os" "net/http" "net/url" "encoding/json" "cloud-honeypot/sandbox_log/models" "cloud-honeypot/sandbox_log/settings" "cloud-honeypot/sandbox_log/misc" "cloud-honeypot/sandbox_log/logger")var ( RegexpSSH *regexp.Regexp err error)func init() { RegexpSSH, err = regexp.Compile(`Honeypot: Username: (.+?) Password: (.+?), from: (.+?), result: (.+?)`)}func Check(tag, content string) (checkResult models.CheckResult, result bool) { switch tag { case "openssh-server": checkResult, result = CheckSSH(content, tag) } if result { logger.Log.Infof("from ip: %v, user: %v, password: %v, result: %v", checkResult.Ip, checkResult.Username, checkResult.Password, checkResult.Status) } return checkResult, result}func SaveResult(checkResult models.CheckResult, result bool) { if result { content, _ := json.Marshal(checkResult) t := time.Now().Format("2006-01-02 15:04:05") apiData := models.APIDATA{} apiData.Tag = checkResult.Tag apiData.Content = string(content) apiData.Hostname, _ = os.Hostname() data, err := json.Marshal(apiData) if err == nil { _, err = http.PostForm(settings.APIURL, url.Values{"timestamp": {t}, "secureKey": {misc.MakeSign(t, settings.KEY)}, "data": {string(data)}}) } }}

server端接到數據後做相應的處理後入庫,並在管理端中展示,例如:


推薦閱讀:

Nigelthorn惡意軟體濫用Chrome擴展,是怎麼做到的?
幹掉AlibabaProtect.exe的正確方式
量子密碼學介紹
生態令:黑客頻繁再現,如何才能有效防止智能合約漏洞?

TAG:信息安全 | 網路安全 | 黑客Hacker |