來自公眾號:Bypass
文章來源:https://www.acunetix.com/blog/articles/using-logs-to-investigate-a-web-Application-attack/
日志文件是服務(wù)器提供的非常有價值的信息,幾乎所有的服務(wù)器、服務(wù)和應(yīng)用程序都提供某種類型的日志記錄,用來記錄服務(wù)或應(yīng)用程序運(yùn)行時發(fā)生的事件和操作。
日志文件為我們提供了服務(wù)器行為的精確視圖以及關(guān)鍵信息,例如何時、如何以及由誰訪問了服務(wù)器。這類信息可以幫助我們監(jiān)視性能、排除故障和調(diào)試應(yīng)用程序,并幫助調(diào)查取證人員展開可能導(dǎo)致惡意活動的攻擊鏈。
以web服務(wù)為例,訪問日志access.log記錄了所有對Web服務(wù)器的訪問活動。假設(shè)訪問者訪問 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頁面,并且請求成功,該怎么辦?如果沒有該日志文件,我們可能永遠(yuǎn)不會知道有人發(fā)現(xiàn)并運(yùn)行了網(wǎng)站上的受限腳本,從而轉(zhuǎn)儲數(shù)據(jù)庫。
在確定了日志文件是一項關(guān)鍵資產(chǎn)之后,讓我們通過一個攻擊案例來進(jìn)行web日志安全分析,還原攻擊路徑。
攻擊案例
假設(shè)我們管理的wordPress/ target=_blank class=infotextkey>WordPress網(wǎng)站遭到篡改:
發(fā)現(xiàn)網(wǎng)站被攻擊之后,運(yùn)維團(tuán)隊將服務(wù)器斷網(wǎng)下線處理,保持系統(tǒng)及其日志的當(dāng)前狀態(tài),以便能夠進(jìn)一步分析調(diào)查。
通常我們需要創(chuàng)建一個服務(wù)器硬盤鏡像備份,然后在鏡像虛擬機(jī)做一些操作去溯源。但是,由于僅用于進(jìn)行演示,在這種情況下,調(diào)查取證小組可以處理原始數(shù)據(jù)。
調(diào)查取證
為了開始調(diào)查,我們需要確定要尋找的證據(jù)。通常,攻擊證據(jù)包括攻擊者直接訪問隱藏或異常文件,對管理員權(quán)限區(qū)域內(nèi)的非授權(quán)訪問,遠(yuǎn)程執(zhí)行代碼,SQL注入,文件包含,跨站點(diǎn)腳本(XSS)以及其他可能表明異常的行為漏洞掃描或偵察活動。
比如,我們的Web服務(wù)器 access.log 可以有效記錄訪問來源。
root@secureserver :/var/log/Apache2# less access.log
access.log 可以按天生成保存,一般來說,如果網(wǎng)站在某一天遭受漏洞掃描,那么這一天它的日志文件會比平常大很多。
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"
每個日志文件包含幾千條請求紀(jì)錄,檢查每一行明顯是不切實(shí)際的,因此我們需要過濾掉一些可能無關(guān)的數(shù)據(jù),包括圖像和css、JS等資源文件。
由于網(wǎng)站正在運(yùn)行WordPress,在這種情況下,我們可以通過關(guān)鍵字過濾 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等關(guān)鍵字的記錄。其中,wp-admin 是WordPress的管理后臺,wp-login 是WordPress的登錄頁面,POST表示使用POST方法將HTTP請求發(fā)送到服務(wù)器,一般來說主要是登錄表單和數(shù)據(jù)提交。
在篩選之后的結(jié)果中,我們會注意到這樣一個訪問請求:
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
發(fā)現(xiàn)以下有趣的記錄:
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 "
我們來進(jìn)一步分析這些記錄。
攻擊者訪問了WordPress網(wǎng)站的登錄頁面:
84.55.41.57- GET/wordpress/wp-login.php 200
攻擊者提交了登錄表單(使用POST方法),并被重定向(302 HTTP狀態(tài)代碼)。
84.55.41.57 - POST /wordpress/wp-login.php 302
攻擊者被重定向到wp-admin(WordPress管理后臺),這意味著攻擊者已成功通過了身份驗證。
84.55.41.57- GET /wordpress/wp-admin/200
攻擊者訪問了網(wǎng)站的主題編輯器:
84.55.41.57- GET/wordpress/wp-admin/theme-editor.php 200
攻擊者試圖編輯404.php文件,攻擊者經(jīng)常使用這種方式將惡意代碼寫入文件,但由于缺少文件寫入權(quán)限,所有并沒有成功。
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表明攻擊者通過腳本代碼進(jìn)行操作,但并未發(fā)現(xiàn)任何有趣的東西。
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插件編輯主題的索引文件,并將其內(nèi)容替換為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
根據(jù)上述信息,我們可以看到攻擊者的行為時間表,但是,目前還有一個問題沒有弄清楚,攻擊者是如何獲得登錄憑據(jù)的?
假設(shè)管理員密碼沒有泄漏也沒有被暴力破解,讓我們回頭看看我們是不是忽略了什么信息。
在當(dāng)前的access.log中并未發(fā)現(xiàn)任何有關(guān)管理員密碼泄露的線索,但我們可以查看所有存檔的access.log文件,來拼湊出攻擊者的行為軌跡。
首先,我們可以過濾日志出包含IP地址:84.55.41.57的日志記錄。我們發(fā)現(xiàn),其中有一條日志疑似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)要
假設(shè)這個插件是系統(tǒng)管理員從網(wǎng)上直接下載并拷貝到網(wǎng)站之中的,腳本安裝路徑:
/wordpress/wp-content/plugins/custom_plugin/check_user.php
通過分析check_user.php文件,發(fā)現(xiàn)存在SQL語句拼接,導(dǎo)致網(wǎng)站存在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注入自動化工具來查找數(shù)據(jù)庫名稱,表名稱和列,日志中的記錄將類似于以下內(nèi)容:
/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數(shù)據(jù)庫已被盜用,并且該SQL數(shù)據(jù)庫中的所有敏感信息都有可能被泄露。
分析
通過這次調(diào)查,我們還原了攻擊事件鏈:
不過仍然存在一些疑問,比如說攻擊者到底是誰?從目前來說,我們只知道攻擊者的IP地址,而且攻擊者一般都會使用代理服務(wù)器或匿名網(wǎng)絡(luò)(例如Tor)來掩蓋其真實(shí)的IP地址。除非攻擊者留下了與他真實(shí)身份有關(guān)的證據(jù),否則我們很難得知攻擊者的真實(shí)身份。
通過日志分析,我們發(fā)現(xiàn)了攻擊者的攻擊路徑和安全事件的根本原因:管理員所使用的那款自定義WordPress插件中存在SQL注入漏洞,導(dǎo)致攻擊者通過SQL注入漏洞獲取管理員賬號密碼,從而登錄管理后臺進(jìn)行網(wǎng)頁篡改。修復(fù)SQL注入漏洞并清除webshell,從備份文件中恢復(fù)被篡改的文件,使網(wǎng)站恢復(fù)正常。
在上述虛構(gòu)的示例中,攻擊者入侵后的處理其實(shí)是非常草率的,留下了大量攻擊痕跡和取證證據(jù),而這些信息將給調(diào)查人員提供很大的幫助。但在真實(shí)的攻擊場景中,攻擊者往往會清除很多關(guān)鍵信息,這勢必會加大調(diào)查人員的取證難度。
●編號1055,輸入編號直達(dá)本文