開源EDR(OSSEC)基礎篇-01-設計定位與能力輸出

orright發表於2018-12-28

前言

介紹OSSEC之前,不得不提到當前比較熱門的技術EDR,近幾年隨著大資料SIEM系統的發展,EDR(端點威脅檢測與響應)技術成為了安全界萬眾寵愛的驕子,廣泛用於威脅檢測、攻擊溯源和響應處理的安全場景。

而OSSEC是一款開源的跨平臺的準EDR入侵檢測響應系統,可以實現商業EDR 大部分的功能,可以說OSSEC是所有EDR商業產品的原型,發展至今已經有10幾年的歷史。

在這篇文章中,我們將討論OSSEC這款開源產品的安全能力,儘可能完整的展現OSSEC在各種安全場景中的應用,瞭解這些有助於幫助企業安全管理者更好的使用這款開源安全工具來應對日趨嚴峻的安全問題。

1. 設計定位

1.1 主機監控

OSSEC通過檔案完整性監控,日誌監控,rootcheck和流程監控,全面監控企業資產系統活動的各個方面,對於安全管理提供了依據。

1.2 安全告警

當發生攻擊時,OSSEC會通過傳送告警日誌和郵件警報讓系統管理員及時感知威脅,並在短時間內進行應急處理,最大程度的避免企業遭受損失。OSSEC還可以通過syslog將告警資訊匯出到任何SIEM系統,譬如OSSIM進行關聯安全分析。

1.3 全平臺支援

最難能可貴的是,OSSEC提供了全平臺系統的支援,包括Linux,Solaris,AIX,HP-UX,BSD,Windows,Mac和VMware ESX,突破性的實現了主機入侵態勢感知的全覆蓋。

1.4 功能擴充套件

OSSEC得到了第三方安全團隊的支援,其中Wazuh就是基於OSSEC開發的一個高階版本,在OSSEC的自身功能的基礎上進行擴充套件和優化。

2. 主要能力

對於一款開源工具或者是商業產品,對於使用者最先關心的就是她到底能幹些什麼?
以下通過迷你案例來分別展示OSSEC的主要能力,讓我們暫時不關心如何配置,只關心她能實現什麼價值!!

2.1 日誌監控 異常行為檢測

日誌的監控可分為兩種,一種是被動的採集,通過採集需要的日誌,讀取日誌資訊,標準化輸出適應安全規則使用的內容,當匹配到內建或者自定義的規則,隨後輸出實時告警,從而發現異常;另一種是主動的查詢,通過週期下發命令查詢系統狀態資訊,然後進行新舊資訊比對,從而發現異常。

日誌監控例項

Web日誌識別惡意訪問

從這批日誌裡我們可以看到在一分鐘之內,同一個來源IP地址(207.44.184.96),頻繁的訪問不存在的頁面,出現了大量404的狀態碼,這意味著Web站點正在遭受掃描攻擊

[root@localhost ~]# tail -n 10 /var/log/httpd/access_log
 207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /b2/xmlsrv/xmlrpc.php HTTP/1.0" 404 297 "-" "-"
 207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /blogtest/xmlsrv/xmlrpc.php HTTP/1.0" 404 303 "-" "-"
 207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /blog/xmlsrv/xmlrpc.php HTTP/1.0" 404 299 "-" "-"
 207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /blogs/xmlsrv/xmlrpc.php HTTP/1.0" 404 300 "-" "-"
 207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /blogs/xmlrpc.php HTTP/1.0" 404 293 "-" "-"
 207.44.185.96 - - [23/Mar/2018:19:57:36 -0300] "GET /community/xmlrpc.php HTTP/1.0" 404 297 "-" "-"
 207.44.185.96 - - [23/Mar/2018:19:57:33 -0300] "GET /drupal/xmlrpc.php HTTP/1.0" 404 294 "-" "-"
 207.44.185.96 - - [23/Mar/2018:19:57:30 -0300] "GET /blog/xmlrpc.php HTTP/1.0" 404 292 "-" "-"
 207.44.185.96 - - [23/Mar/2018:19:57:30 -0300] "GET /xmlsrv/xmlrpc.php HTTP/1.0" 404 294 "-" "-"
 207.44.185.96 - - [23/Mar/2018:19:57:30 -0300] "GET /xmlrpc/xmlrpc.php HTTP/1.0" 404 294 "-" "-"
  • 日誌監控告警
Rule: 31151 fired (level 10) -> "Mutiple web server 400 error codes from same source ip."
使用者日誌識別登入異常

從這批日誌裡我們可以看到,同一個來源IP不斷的使用通過同一個賬戶admin嘗試SSH登入,結果都失敗了,不斷的失敗達到一定數量,那就意味著是暴力破解行為

[root@localhost ~]# tail -n 10 /var/log/secure
Jun 26 17:40:27 xx sshd[7629]: Failed password for invalid user admin from 61.146.178.13 port 42107 ssh2
Jun 26 17:40:25 xx sshd[7629]: Invalid user admin from 61.146.178.13
Jun 26 17:40:23 xx sshd[7625]: Failed password for invalid user admin from 61.146.178.13 port 41983 ssh2
Jun 26 17:40:20 xx sshd[7625]: Invalid user admin from 61.146.178.13
Jun 26 17:40:18 xx sshd[7621]: Failed password for invalid user guest from 61.146.178.13 port 41889 ssh2
Jun 26 17:40:15 xx sshd[7621]: Invalid user guest from 61.146.178.13
Jun 26 17:40:14 xx sshd[7617]: Failed password for invalid user test from 61.146.178.13 port 41797 ssh2
  • 日誌監控告警
Rule: 5712 fired (level 10) -> "SSHD brute force trying to get access to the system."
系統狀態變更異常

作業系統有很多系統資訊,比如賬號密碼變更,啟動項變更,服務監聽變更,都是通過命令查詢獲知,而通過OSSEC的Command方法,可以週期下發查詢命令,並對輸出結果進行比對,及時感知狀態變化

  • 測試方法

使用nc工具,臨時監聽TCP埠

[root@localhost ~]# nc -l 8443
  • 日誌監控告警

我們從告警的輸出,就可以知道服務監聽的狀態發生的變更,告警分別列印了,狀態變更前後查詢命令輸出

** Alert 1499397975.7591: mail  - ossec,

2018 Jul 21 12:23:15 (192.168.1.137) any->netstat -tan |grep LISTEN |egrep -v `(127.0.0.1| \1)` | sort

Rule: 531 (level 7) -> `Listened ports status (netstat) changed (new port opened or closed).`

ossec: output: `netstat -tan |grep LISTEN |egrep -v `(127.0.0.1| \1)` | sort`:

tcp        0      0 0.0.0.0:111                 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:8443                0.0.0.0:*                   LISTEN     

tcp        0      0 0.0.0.0:37498               0.0.0.0:*                   LISTEN     

tcp        0      0 :::111                      :::*                        LISTEN     

tcp        0      0 :::22                       :::*                        LISTEN     

tcp        0      0 :::62229                    :::*                        LISTEN     

Previous output:

ossec: output: `netstat -tan |grep LISTEN |egrep -v `(127.0.0.1| \1)` | sort`:

tcp        0      0 0.0.0.0:111                 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:37498               0.0.0.0:*                   LISTEN     

tcp        0      0 :::111                      :::*                        LISTEN     

tcp        0      0 :::22                       :::*                        LISTEN     

tcp        0      0 :::62229                    :::*                        LISTEN

更多檢測功能

  • FTP賬戶密碼暴力破解檢測
  • SQL隱碼攻擊嘗試檢測
  • E-mail賬戶密碼暴力破解檢測
  • 檔案系統狀態檢測
  • 應用安裝解除安裝檢測
  • 虛擬主機開關狀態檢測

當然OSSEC的異常行為檢測功能,不會僅限於上述例子,更多的功能還藏匿於內建規則,等待挖掘,最後隨著不斷深入理解日誌本身,你能利用OSSEC創造出更多更好用的功能。

關於OSSEC的規則部分內容會在後面的章節做詳細的介紹。

2.2 Syscheck檔案完整性檢測 篡改行為檢測

無論攻擊手段有多麼高明,最終的目的是以某種方式改變系統,從修改檔案的病毒到改變核心的後門程式,系統的完整性總會有一些變化,Syscheck完整性檢查是終端檢測的重要組成部分,通過查詢系統和Windows登錄檔中金鑰檔案的MD5/SHA1校驗和的更改來檢測系統完整性的變化,該功能的設計目的是監控作業系統中關鍵檔案的修改情況,及時發現篡改行為。

檔案完整性檢測例項

命令檔案替換監控

瞭解Linux的都知道Linux的一切皆檔案,Linux 中的各種事物比如像文件、目錄、鍵盤、監視器、硬碟、可移動媒體裝置、印表機、調變解調器、虛擬終端,等等一切都可看作是檔案,這就給了攻擊者一個很好的攻擊思路,那就是替換檔案,保留原來檔案的基本功能,同時嵌入後門程式,比較常見被替換的命令檔案有psnetstatsslsof 等等

  • 測試方法

通過vim編輯器做個刪除部分內容的操作,修改之前一定記得備份

[root@localhost ~]# vim /bin/netstat
  • Syscheck告警

對於netstat命令,做了/bin/netstat檔案變化的監控,收到了下面的告警資訊,檔案大小正常大小為155000,告警顯示檔案大小從155000改變為129238,這樣就能有效的監控命令檔案是否被替換,第一時間感知到這個危險操作

** Alert 1544237296.12315: mail  - ossec,syscheck,
2018 Dec 07 21:48:16 bogon->syscheck
Rule: 550 (level 7) -> `Integrity checksum changed.`
Integrity checksum changed for: `/bin/netstat`
Size changed from `155000` to `129238`
Old md5sum was: `60523518c81d85c7d761bd6e6e9a1007`
New md5sum is : `8d07cb216d0f6cab7a9de4881f25244b`
Old sha1sum was: `428980466a122420885d6885b74b8054500367e2`
New sha1sum is : `e9ee23fc6888b2adb7b052670c17fc9dc9281a2c`

2.3 Rootcheck後門檢測 後門行為檢測

Rootkit是一種特殊的惡意軟體,它通過載入特殊的驅動,修改系統核心,進而達到隱藏資訊的目的。Rootkit的基本功能包括提供root後門,控制核心模組的載入、隱藏檔案、隱藏程式、隱藏網路埠,隱藏核心模組等,主要目的在於隱藏自己並且不被安全軟體發現,Rootkit幾乎可以隱藏任何軟體,包括檔案伺服器、鍵盤記錄器、Botnet 和 Remailer,而Rootcheck就是OSSEC提供的專門用於檢測作業系統rootkit的引擎

Rootcheck For Linux

  1. 使用rootkit_files檔案中包含的已知後門程式檔案或目錄特徵進行掃描識別異常
  2. 使用rootkit_trojans檔案中包含的已知被感染木馬檔案的簽名進行掃描識別異常
  3. 對裝置檔案目錄(/dev)、檔案系統、隱藏程式、隱藏埠,混雜模式介面的異常檢測

Rootcheck For Windows

  1. 通過使用win_applications_rcl檔案中包含的應用特徵進行掃描識別軟體應用
  2. 通過win_audit_rcl檔案中包含登錄檔進行掃描識別特殊登錄檔項的變動
  3. 通過win_malware_rcl檔案中包含的惡意軟體特徵進行掃描識別惡意軟體
  4. 通過system_audit_rcl檔案中包含的服務配置專案進行配置核查以及Web類威脅靜態特徵進行掃描識別異常
  5. 通過system_audit_ssh檔案中包含的SSH增強檢測功能特徵進行掃描識別異常

後門行為檢測例項

裝置目錄(/dev)建立隱藏檔案
  • 測試方法

在/dev下建立隱藏檔案

[root@localhost dev]# touch .ssh
[root@localhost dev]# chmod 777 .ssh
[root@localhost dev]# ls -a /dev | grep `^.`
.
..
.ssh
  • Rootcheck告警

rootcheck功能檢測到/dev目錄下存在隱藏檔案,隨後進行了提權操作

[root@localhost ossec]# tailf /var/ossec/logs/alerts/alerts.log
** Alert 1544791226.3893: mail  - ossec,rootcheck,
2018 Dec 14 07:40:26 localhost->rootcheck
Rule: 510 (level 7) -> `Host-based anomaly detection event (rootcheck).`
File `/dev/.ssh` present on /dev. Possible hidden file.

** Alert 1544791227.4116: mail  - ossec,rootcheck,
2018 Dec 14 07:40:27 localhost->rootcheck
Rule: 510 (level 7) -> `Host-based anomaly detection event (rootcheck).`
File `/dev/.ssh` is owned by root and has write permissions to anyone.

2.4 實時告警

通過 ossec.conf 檔案配置指定規則組、指定規則ID、指定伺服器(agent)觸發的實時告警發給專門負責的管理員郵箱,實現職責歸屬明確,故障類的告警發給運維管理員、安全類的告警發給安全管理員,特別關注的告警事件發給問題處理專員等

實時告警輸出例項

告警事件通過E-mail實時提醒

根據規則功能分組來確定告警傳送給誰處理

<email_alerts>
  <email_to>249994395@qq.com</email_to>
  <email_to>75016025@qq.com</email_to>
  <level>12</level>
  <group>sshd,</group>
  <do_not_delay/>
</email_alerts>

根據規則ID來確定告警傳送給誰處理

<email_alerts>
    <email_to>249994395@qq.com</email_to>
    <rule_id>123, 124</rule_id>
    <do_not_delay />
    <do_not_group />
</email_alerts>

根據伺服器(agent-id)來確定告警傳送給誰處理

<email_alerts>
    <email_to>249994395@qq.com</email_to>
    <level>12</level>
    <event_location>agent01|agent02</event_location>
    <do_not_delay />
</email_alerts>

郵件告警內容

郵件主題:OSSEC Alert – localhost – Level 7 – Listened ports status (netstat) changed (new port opened or closed).

OSSEC HIDS Notification.
2018 Oct 09 11:21:37

Received From: localhost->netstat -tan |grep LISTEN |egrep -v `(127.0.0.1| \1)` | sort
Rule: 533 fired (level 7) -> "Listened ports status (netstat) changed (new port opened or closed)."
Portion of the log(s):

ossec: output: `netstat -tan |grep LISTEN |egrep -v `(127.0.0.1| \1)` | sort`:
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 172.16.100.213:25       0.0.0.0:*               LISTEN     
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN     
Previous output:
ossec: output: `netstat -tan |grep LISTEN |egrep -v `(127.0.0.1| \1)` | sort`:
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 172.16.100.213:25       0.0.0.0:*               LISTEN     
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN   

2.5 主動響應

本文之前提到OSSEC是一款準EDR產品,其中體現的‘R’技術,就是指的的這個主動響應,我們可以根據特定的伺服器或伺服器組(agent)、特定的規則ID等多個條件關聯觸發響應動作,響應的動作可以通過指令碼程式去實現個性化的需求,這些需求可以是郵件提醒,也是可以是指令下發邊界安全裝置或者安全元件進行訪問封堵或者恢復,或者更多的本地化需求(指令碼實現),當然OSSEC內建也包含一些常用的響應指令碼,只需在此基礎上稍加改變,就可以投入使用

Active Responses 分為commandactive-response兩個部分, 且一個能夠被執行的Active Responses規則必須同時包含commandactive-response兩個部分

主動響應處理例項

主機訪問控制列表(TCP Wrappers)指令碼聯動實現告警響應處理

建立呼叫響應指令碼命令

  • name:定義命令名稱
  • executable:呼叫的響應指令碼
  • expect:輸出指令碼需要的引數(srcip或username)
<command>
    <name>host-deny</name>
    <executable>host-deny.sh</executable>
    <expect>srcip</expect>
    <timeout_allowed>yes</timeout_allowed>
</command>

配置主動響應規則

  • command:呼叫響應指令碼命令(上面定義)
  • location:規則生效的主機範圍(本地主機、服務控制端或指定的Agent等)
  • rules_id:觸發響應動作的規則ID條件
  • timeout:響應動作的持續時間,此處動作為禁止,10s後超時允許放行
<active-response>
    <command>host-deny</command>
    <location>local</location>
    <rules_id>5551, 5712, 5720</rules_id>
    <timeout>10</timeout>
</active-response>

響應指令碼

顯示host.deny指令碼的前10行,第七行說明指令碼需要輸入srcip引數,才能正常執行

[root@bogon ~]# head -n 10 /var/ossec/active-response/bin/host-deny.sh
#!/bin/sh
# Adds an IP to the /etc/hosts.deny file
# Requirements: sshd and other binaries with tcp wrappers support
# Expect: srcip
# Author: Daniel B. Cid
# Last modified: Nov 09, 2005

ACTION=$1
USER=$2
IP=$3

測試方法

重啟OSSEC程式, 手動嘗試多次SSH登入並且輸入錯誤密碼

主動響應日誌輸出

[root@bogon ~]#tail -f /var/ossec/logs/active-responses.log
Wed Dec 12 17:57:58 CST 2018 /var/ossec/active-response/bin/host-deny.sh add - A.B.C.D 1544608678.285043 5720
Wed Dec 12 17:59:28 CST 2018 /var/ossec/active-response/bin/host-deny.sh delete - A.B.C.D 1544608678.285043 5720

總結

在對OSSEC有個整體上的瞭解之後,我們將系統性的介紹OSSEC在各種環境中的安裝與部署,包括單機部署、客戶端與伺服器分離部署,以及如何把告警日誌資料儲存到MySQL中,並通過自帶的UI工具,進行展現告警。


相關文章