對日志發起的攻擊有三種:
有選擇性的刪除(修改)日志
我們知道Windows日志是以實體文件保存在磁盤上的,因此可以很容易的想到一個實現選擇性修改或者刪除日志的方式,既是通過修改文件內容來達到此目的。
要對日志文件進行修改,那么首先需要解決的問題是文件占坑,我們打開調試器之后可以很清楚的看到日志服務的對應的宿主進程為 Services.exe (NT6下為svchost.exe),所調用的動態鏈接庫文件為 eventlog.dll(NT6下為 wevtsvc.dll) ,于是很自然的我們可以通過注入進程的方式來遍歷打開的文件句柄,同時掛起動態鏈接庫文件的操作線程,解決占坑之后就可以對日志文件進行刪除與修改了。
介于NT5內核的系統已經退出歷史舞臺,這里也不再做過多討論,有了結構體說明之后可以很容易的像操作其他二進制文件那樣來操作日志文件。剛才說過NT6內核下直接有對應API來完成此日志的操作,所以通過查閱MSDN我們可以很方便的找到對應的API,或者通過讀寫XML文件的方式(自己解析結構稍微麻煩一點)來進行日志文件的修改。修改完成后保存即可,此后再恢復現場既實現了有選擇性的日志刪除或者修改。
阻止本地日志的產生
有很多情況下,攻陷了一臺Windows終端之后,為了方便我們在此終端上進行的一些猥瑣操作,我們不不希望被記錄到,除了在事后對先前產生的日志進行有選擇的篡改之外,我們還可以用更為粗暴的方式來阻止本地日志的產生。前面說過對于產生日志的主要服務是哪些,那么我們可以很容易的整理出如下思路來阻止本地日志的產生:
通過遍歷進程找到日志服務對應的宿主進程PID
通過甄別加載的動態鏈接庫文件找到對應的線程ID
非常暴力的干掉對應線程
至此,Windows Event Log 服務便失去了它原有的活力的,成為了啞巴。
對抗實時日志采集系統
現在越來越多的大型采用ELK架構(ElasticSearch + Logstash + Kibana),通常在Windows又會采用流行的nxlog作為日志采集的agent,那么一個常見的實時日志采集流程如下:
nxlog 使用模塊 im_file 收集日志文件,開啟位置記錄功能
nxlog 使用模塊tcp輸出日志
logstash 使用input/tcp ,收集日志,輸出至es
通過閱讀源碼可知 nxlog 的tcp通信 apr_socket_send 來發送數據,在Windows對應的動態鏈接庫文件為libapr-1-0.dll,知曉了對應的函數,我們可以很容易的通過注入進程后Hook apr_socket_send 的函數來修改想要傳送的數據包,從而達到欺騙實時日志采集系統的目的。
如果需要做得較為完美,可以通過 nxlog 的配置文件來獲取其使用何種通道及文件格式來傳輸日志,針對不同類型的方式,在傳輸過程中進行Hook(如以上例子中TCP模式),或者在產生日志信息時進行Hook(如大部分情況下會Json)。
回答所涉及的環境:聯想天逸510S、Windows 10。
對日志發起的攻擊有三種:
有選擇性的刪除(修改)日志
我們知道Windows日志是以實體文件保存在磁盤上的,因此可以很容易的想到一個實現選擇性修改或者刪除日志的方式,既是通過修改文件內容來達到此目的。
要對日志文件進行修改,那么首先需要解決的問題是文件占坑,我們打開調試器之后可以很清楚的看到日志服務的對應的宿主進程為 Services.exe (NT6下為svchost.exe),所調用的動態鏈接庫文件為 eventlog.dll(NT6下為 wevtsvc.dll) ,于是很自然的我們可以通過注入進程的方式來遍歷打開的文件句柄,同時掛起動態鏈接庫文件的操作線程,解決占坑之后就可以對日志文件進行刪除與修改了。
介于NT5內核的系統已經退出歷史舞臺,這里也不再做過多討論,有了結構體說明之后可以很容易的像操作其他二進制文件那樣來操作日志文件。剛才說過NT6內核下直接有對應API來完成此日志的操作,所以通過查閱MSDN我們可以很方便的找到對應的API,或者通過讀寫XML文件的方式(自己解析結構稍微麻煩一點)來進行日志文件的修改。修改完成后保存即可,此后再恢復現場既實現了有選擇性的日志刪除或者修改。
阻止本地日志的產生
有很多情況下,攻陷了一臺Windows終端之后,為了方便我們在此終端上進行的一些猥瑣操作,我們不不希望被記錄到,除了在事后對先前產生的日志進行有選擇的篡改之外,我們還可以用更為粗暴的方式來阻止本地日志的產生。前面說過對于產生日志的主要服務是哪些,那么我們可以很容易的整理出如下思路來阻止本地日志的產生:
通過遍歷進程找到日志服務對應的宿主進程PID
通過甄別加載的動態鏈接庫文件找到對應的線程ID
非常暴力的干掉對應線程
至此,Windows Event Log 服務便失去了它原有的活力的,成為了啞巴。
對抗實時日志采集系統
現在越來越多的大型采用ELK架構(ElasticSearch + Logstash + Kibana),通常在Windows又會采用流行的nxlog作為日志采集的agent,那么一個常見的實時日志采集流程如下:
nxlog 使用模塊 im_file 收集日志文件,開啟位置記錄功能
nxlog 使用模塊tcp輸出日志
logstash 使用input/tcp ,收集日志,輸出至es
通過閱讀源碼可知 nxlog 的tcp通信 apr_socket_send 來發送數據,在Windows對應的動態鏈接庫文件為libapr-1-0.dll,知曉了對應的函數,我們可以很容易的通過注入進程后Hook apr_socket_send 的函數來修改想要傳送的數據包,從而達到欺騙實時日志采集系統的目的。
如果需要做得較為完美,可以通過 nxlog 的配置文件來獲取其使用何種通道及文件格式來傳輸日志,針對不同類型的方式,在傳輸過程中進行Hook(如以上例子中TCP模式),或者在產生日志信息時進行Hook(如大部分情況下會Json)。
回答所涉及的環境:聯想天逸510S、Windows 10。