開源EDR(OSSEC)基礎篇- 01 -設計定位與能力輸出
前言
介紹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 中的各種事物比如像文檔、目錄、鍵盤、監視器、硬盤、可移動媒體設備、打印機、調制解調器、虛擬終端,等等一切都可看作是文件,這就給了攻擊者一個很好的攻擊思路,那就是替換文件,保留原來文件的基本功能,同時嵌入后門程序,比較常見被替換的命令文件有ps、netstat、ss、lsof 等等
- 測試方法
通過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
- 使用rootkit_files文件中包含的已知后門程序文件或目錄特征進行掃描識別異常
- 使用rootkit_trojans文件中包含的已知被感染木馬文件的簽名進行掃描識別異常
- 對設備文件目錄(/dev)、文件系統、隱藏進程、隱藏端口,混雜模式接口的異常檢測
Rootcheck For Windows
- 通過使用win_applications_rcl文件中包含的應用特征進行掃描識別軟件應用
- 通過win_audit_rcl文件中包含注冊表進行掃描識別特殊注冊表項的變動
- 通過win_malware_rcl文件中包含的惡意軟件特征進行掃描識別惡意軟件
- 通過system_audit_rcl文件中包含的服務配置項目進行配置核查以及Web類威脅靜態特征進行掃描識別異常
- 通過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 分為command與active-response兩個部分, 且一個能夠被執行的Active Responses規則必須同時包含command與active-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工具,進行展現告警。
