來自公眾號:Bypass
文章來源:https://www.acunetix.com/blog/articles/using-logs-to-investigate-a-web-Application-attack/
日志文件是服務器提供的非常有價值的信息,幾乎所有的服務器、服務和應用程序都提供某種類型的日志記錄,用來記錄服務或應用程序運行時發生的事件和操作。
日志文件為我們提供了服務器行為的精確視圖以及關鍵信息,例如何時、如何以及由誰訪問了服務器。這類信息可以幫助我們監視性能、排除故障和調試應用程序,并幫助調查取證人員展開可能導致惡意活動的攻擊鏈。
以web服務為例,訪問日志access.log記錄了所有對Web服務器的訪問活動。假設訪問者訪問 www.example.com/main.php,將在日志文件中添加以下記錄:
88.54.124.17 - - [16/Apr/2019:07:44:08 +0100] "GET /main.php HTTP/1.1"200 203 "-""Mozilla/5.0 (windows NT 6.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0"
上述日志顯示,IP地址為88.54.124.178的訪問者于2019年4月16日07:44訪問了main.php頁面,并且訪問成功。
這個信息可能不太重要,但如果日志文件顯示IP為88.54.124.178的訪問者在2019年4月16日07:44訪問dump_database.php頁面,并且請求成功,該怎么辦?如果沒有該日志文件,我們可能永遠不會知道有人發現并運行了網站上的受限腳本,從而轉儲數據庫。
在確定了日志文件是一項關鍵資產之后,讓我們通過一個攻擊案例來進行web日志安全分析,還原攻擊路徑。
攻擊案例
假設我們管理的wordPress/ target=_blank class=infotextkey>WordPress網站遭到篡改:
發現網站被攻擊之后,運維團隊將服務器斷網下線處理,保持系統及其日志的當前狀態,以便能夠進一步分析調查。
通常我們需要創建一個服務器硬盤鏡像備份,然后在鏡像虛擬機做一些操作去溯源。但是,由于僅用于進行演示,在這種情況下,調查取證小組可以處理原始數據。
調查取證
為了開始調查,我們需要確定要尋找的證據。通常,攻擊證據包括攻擊者直接訪問隱藏或異常文件,對管理員權限區域內的非授權訪問,遠程執行代碼,SQL注入,文件包含,跨站點腳本(XSS)以及其他可能表明異常的行為漏洞掃描或偵察活動。
比如,我們的Web服務器 access.log 可以有效記錄訪問來源。
root@secureserver :/var/log/Apache2# less access.log
access.log 可以按天生成保存,一般來說,如果網站在某一天遭受漏洞掃描,那么這一天它的日志文件會比平常大很多。
84.55.41.57 - - [16/Apr/2019:20:21:56 +0100] "GET /john/index.php HTTP/1.1"200 3804 "-""Mozilla/5.0 (Windows NT 6.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0"
84.55.41.57 - - [16/Apr/2019:20:21:56 +0100] "GET /john/assets/js/skel.min.js HTTP/1.1"200 3532 "http://www.example.com/john/index.php""Mozilla/5.0 (Windows NT 6.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0"
84.55.41.57 - - [16/Apr/2019:20:21:56 +0100] "GET /john/images/pic01.jpg HTTP/1.1"200 9501 "http://www.example.com/john/index.php""Mozilla/5.0 (Windows NT 6.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0"
84.55.41.57 - - [16/Apr/2019:20:21:56 +0100] "GET /john/images/pic03.jpg HTTP/1.1"200 5593 "http://www.example.com/john/index.php""Mozilla/5.0 (Windows NT 6.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0"
每個日志文件包含幾千條請求紀錄,檢查每一行明顯是不切實際的,因此我們需要過濾掉一些可能無關的數據,包括圖像和css、JS等資源文件。
由于網站正在運行WordPress,在這種情況下,我們可以通過關鍵字過濾 access.log來獲取滿足WordPress特定特征的訪問請求。
root@secureserver :~#cat /var/log/apache2/access.log | grep -E "wp-admin|wp-login|POST /"
通過上面這行命令會篩選access.log,僅顯示包含wp-admin、wp-login以及POST等關鍵字的記錄。其中,wp-admin 是WordPress的管理后臺,wp-login 是WordPress的登錄頁面,POST表示使用POST方法將HTTP請求發送到服務器,一般來說主要是登錄表單和數據提交。
在篩選之后的結果中,我們會注意到這樣一個訪問請求:
84.55.41.57 - - [17/Apr/2019:06:52:07 +0100] "GET /wordpress/wp-admin/ HTTP/1.1"200 12349 "http://www.example.com/wordpress/wp-login.php""Mozilla/5.0 (Windows NT 6.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0"
我們看到IP:84.55.41.57成功訪問了WordPress管理界面。
讓我們看看這個IP地址的用戶還做了什么,我們再次使用grep命令來篩選。
root@secureserver :~#cat /var/log/apache2/access.log | grep 84.55.41.57
發現以下有趣的記錄:
84.55.41.57 - - [17/Apr/2019:06:57:24 +0100] "GET /wordpress/wp-login.php HTTP/1.1" 200 1568 "-"
84.55.41.57 - - [17/Apr/2019:06:57:31 +0100] "POST /wordpress/wp-login.php HTTP/1.1" 302 1150 "http://www.example.com/wordpress/wp-login.php"
84.55.41.57 - - [17/Apr/2019:06:57:31 +0100] "GET /wordpress/wp-admin/ HTTP/1.1" 200 12905 "http://www.example.com/wordpress/wp-login.php"
84.55.41.57 - - [17/Apr/2019:07:00:32 +0100] "POST /wordpress/wp-admin/admin-ajax.php HTTP/1.1" 200 454 "http://www.example.com/wordpress/wp-admin/"
84.55.41.57 - - [17/Apr/2019:07:00:58 +0100] "GET /wordpress/wp-admin/theme-editor.php HTTP/1.1" 200 20795 "http://www.example.com/wordpress/wp-admin/"
84.55.41.57 - - [17/Apr/2019:07:03:17 +0100] "GET /wordpress/wp-admin/theme-editor.php?file=404.php&theme=twentysixteen HTTP/1.1" 200 8092 "http://www.example.com/wordpress/wp-admin/theme-editor.php"
84.55.41.57 - - [17/Apr/2019:07:11:48 +0100] "GET /wordpress/wp-admin/plugin-install.php HTTP/ 1.1" 200 12459 "http://www.example.com/wordpress/wp- admin/ plugin-install.php?tab=upload "
84.55.41.57 - - [17/Apr/2019:07:16:06 +0100] " GET/wordpress/wp- admin/update.php? action= install- plugin& plugin= file-manager&_wpnonce= 3c6c8a7fca HTTP/ 1.1" 200 5698 "http://www.example.com/wordpress/wp- admin/ plugin-install.php?tab= search&s= file+permission "
84.55.41.57 - - [17/Apr/2019:07:18:19 +0100] " GET/wordpress/wp- admin/plugins.php? action= activate& plugin= file-manager% 2Ffile-manager.php&_wpnonce=bf932ee530 HTTP/ 1.1" 302 451 "http://www.example.com/wordpress/wp- admin/update.php? action= install- plugin& plugin= file-manager&_wpnonce= 3c6c8a7fca "
84.55.41.57 - - [17/Apr/2019:07:21:46 +0100] " GET/wordpress/wp- admin/ admin-ajax.php? action=connector&cmd=upload&target=l1_d3AtY29udGVudA& name% 5B% 5D=r57.php&FILES=&_= 1460873968131HTTP/ 1.1" 200 731 "http://www.example.com/wordpress/wp- admin/admin.php?page= file-manager_settings "
84.55.41.57 - - [17/Apr/2019:07:22:53 +0100] " GET/wordpress/wp- content/r57.php HTTP/ 1.1" 200 9036 "- "
84.55.41.57 - - [17/Apr/2019:07:32:24 +0100] " POST /wordpress/wp- content/r57.php? 14HTTP/ 1.1" 200 8030 "http://www.example.com/wordpress/wp- content/r57.php? 14"
84.55.41.57 - - [17/Apr/2019:07:29:21 +0100] " GET/wordpress/wp- content/r57.php? 29HTTP/ 1.1" 200 8391 "http://www.example.com/wordpress/wp- content/r57.php? 28"
84.55.41.57 - - [17/Apr/2019:07:57:31 +0100] " POST /wordpress/wp- admin/ admin-ajax.php HTTP/ 1.1" 200 949 "http://www.myw ebsite.com/wordpre ss/wp- admin/admin.php?page= file-manager_settings "
我們來進一步分析這些記錄。
攻擊者訪問了WordPress網站的登錄頁面:
84.55.41.57- GET/wordpress/wp-login.php 200
攻擊者提交了登錄表單(使用POST方法),并被重定向(302 HTTP狀態代碼)。
84.55.41.57 - POST /wordpress/wp-login.php 302
攻擊者被重定向到wp-admin(WordPress管理后臺),這意味著攻擊者已成功通過了身份驗證。
84.55.41.57- GET /wordpress/wp-admin/200
攻擊者訪問了網站的主題編輯器:
84.55.41.57- GET/wordpress/wp-admin/theme-editor.php 200
攻擊者試圖編輯404.php文件,攻擊者經常使用這種方式將惡意代碼寫入文件,但由于缺少文件寫入權限,所有并沒有成功。
84.55. 41.57- GET /wordpress/wp-admin/theme-editor.php? file= 404.php&theme= twentysixteen 200
攻擊者訪問了插件安裝程序。
84.55.41.57- GET/wordpress/wp-admin/plugin-install.php 200
攻擊者安裝并激活了file-manager插件。
84.55.41.57 - GET /wordpress/wp-admin/update.php? action= install- plugin& plugin= file-manager &_wpnonce= 3c6c8a7fca 200
84.55.41.57- GET/wordpress/wp- admin/plugins.php? action= activate& plugin= file-manager% 2Ffile-manager.php&_wpnonce=bf932ee530 200
攻擊者使用file-manager插件上傳了r57.php,這很可能是一個PHP Web Shell腳本。
84.55.41.57 - GET /wordpress/wp-admin/admin-ajax.php?action=connector& cmd= upload&target=l1_d3AtY29udGVudA&name %5B %5D=r57.php&FILES=&_=1460873968131 200
日志表明,攻擊者訪問了r57.php,查詢字符串?1和?28表明攻擊者通過腳本代碼進行操作,但并未發現任何有趣的東西。
84.55.41.57- GET/wordpress/wp-content/r57.php 200
84.55.41.57- POST /wordpress/wp-content/r57.php? 1200
84.55.41.57- GET/wordpress/wp-content/r57.php? 28200
攻擊者的最后一個動作是通過file-manager插件編輯主題的索引文件,并將其內容替換為HACKED!。
84.55. 41.57- POST /wordpress/wp-admin/admin-ajax.php 200- http:/ /www.example.com/wordpress/wp-admin/admin.php?page=file-manager_settings
根據上述信息,我們可以看到攻擊者的行為時間表,但是,目前還有一個問題沒有弄清楚,攻擊者是如何獲得登錄憑據的?
假設管理員密碼沒有泄漏也沒有被暴力破解,讓我們回頭看看我們是不是忽略了什么信息。
在當前的access.log中并未發現任何有關管理員密碼泄露的線索,但我們可以查看所有存檔的access.log文件,來拼湊出攻擊者的行為軌跡。
首先,我們可以過濾日志出包含IP地址:84.55.41.57的日志記錄。我們發現,其中有一條日志疑似SQL注入攻擊的記錄:
84.55.41.57- - [14/Apr/2019:08:22:13 0100] "GET /wordpress/wp-content/plugins/custom_plugin/check_user.php?userid=1 AND ( SELECT6810FROM( SELECTCOUNT(*), CONCAT( 0x7171787671,( SELECT( ELT( 6810= 6810, 1))), 0x71707a7871, FLOOR( RAND( 0)* 2))x FROMINFORMATION_SCHEMA.CHARACTER_SETS GROUPBYx)a) HTTP/ 1.1" 200 166 "- " "Mozilla/ 5.0(Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)"
84.55.41.57- - [14/Apr/2019:08:22:13 0100] "GET /wordpress/wp-content/plugins/custom_plugin/check_user.php?userid=( SELECT7505FROM( SELECTCOUNT(*), CONCAT( 0x7171787671,( SELECT( ELT( 7505= 7505, 1))), 0x71707a7871, FLOOR( RAND( 0)* 2))x FROMINFORMATION_SCHEMA.CHARACTER_SETS GROUPBYx)a) HTTP/ 1.1" 200 166 "- " "Mozilla/ 5.0(Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)"
84.55.41.57- - [14/Apr/2019:08:22:13 0100] "GET /wordpress/wp-content/plugins/custom_plugin/check_user.php?userid=( SELECTCONCAT( 0x7171787671,( SELECT( ELT( 1399= 1399, 1))), 0x71707a7871)) HTTP/ 1.1" 200 166 "- " "Mozilla/ 5.0(Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)"
84.55.41.57- - [14/Apr/2019:08:22:27 0100] "GET /wordpress/wp-content/plugins/custom_plugin/check_user.php?userid=1 UNION ALL SELECTCONCAT( 0x7171787671, 0x537653544175467a724f, 0x71707a7871), NULL, NULL-- HTTP/1.1" 200 182 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)要
假設這個插件是系統管理員從網上直接下載并拷貝到網站之中的,腳本安裝路徑:
/wordpress/wp-content/plugins/custom_plugin/check_user.php
通過分析check_user.php文件,發現存在SQL語句拼接,導致網站存在SQL注入漏洞。
<?php
//Include the WordPress header
include( '/wordpress/wp-header.php');
global$wpdb;
// Use the GET parameter ‘userid’ as user input
$id=$_GET[ 'userid'];
// Make a query to the database with the value the user supplied in the SQL statement
$users = $wpdb->get_results( "SELECT * FROM users WHERE user_id=$id");
?>
access.log記錄表明,攻擊者使用了SQL注入自動化工具來查找數據庫名稱,表名稱和列,日志中的記錄將類似于以下內容:
/wordpress/wp-content/plugins/my_custom_plugin/check_user.php?userid=-6859 UNION ALL SELECT( SELECTCONCAT( 0x7171787671, IFNULL( CAST( IDASCHAR), 0x20), 0x616474686c76, IFNULL( CAST(display_name ASCHAR), 0x20), 0x616474686c76, IFNULL( CAST(user_activation_key ASCHAR), 0x20), 0x616474686c76, IFNULL( CAST(user_email ASCHAR), 0x20), 0x616474686c76, IFNULL( CAST(user_login ASCHAR), 0x20), 0x616474686c76, IFNULL( CAST(user_nicename ASCHAR), 0x20), 0x616474686c76, IFNULL( CAST(user_pass ASCHAR), 0x20), 0x616474686c76, IFNULL( CAST(user_registered ASCHAR), 0x20), 0x616474686c76, IFNULL( CAST(user_status ASCHAR), 0x20), 0x616474686c76, IFNULL( CAST(user_url ASCHAR), 0x20), 0x71707a7871) FROMwp.wp_users LIMIT0, 1), NULL, NULL--
上面的SQL代碼非常有力地表明WordPress數據庫已被盜用,并且該SQL數據庫中的所有敏感信息都有可能被泄露。
分析
通過這次調查,我們還原了攻擊事件鏈:
不過仍然存在一些疑問,比如說攻擊者到底是誰?從目前來說,我們只知道攻擊者的IP地址,而且攻擊者一般都會使用代理服務器或匿名網絡(例如Tor)來掩蓋其真實的IP地址。除非攻擊者留下了與他真實身份有關的證據,否則我們很難得知攻擊者的真實身份。
通過日志分析,我們發現了攻擊者的攻擊路徑和安全事件的根本原因:管理員所使用的那款自定義WordPress插件中存在SQL注入漏洞,導致攻擊者通過SQL注入漏洞獲取管理員賬號密碼,從而登錄管理后臺進行網頁篡改。修復SQL注入漏洞并清除webshell,從備份文件中恢復被篡改的文件,使網站恢復正常。
在上述虛構的示例中,攻擊者入侵后的處理其實是非常草率的,留下了大量攻擊痕跡和取證證據,而這些信息將給調查人員提供很大的幫助。但在真實的攻擊場景中,攻擊者往往會清除很多關鍵信息,這勢必會加大調查人員的取證難度。
●編號1055,輸入編號直達本文