Web中間件學習篇
本篇主要從IIS、Apache、Nginx、Tomcat四種常見中間件的Tomcat入手,介紹相關安全知識,遵循“中間件簡介→如何搭建網站→安全配置分析→安全日志分析”的順序進行學習,旨在梳理常見Web中間件的知識點,為Web安全學習打好基礎。
Tomcat篇
作者:古月藍旻@安全之光
Tomcat簡介
Tomcat(Apache Tomcat)是Apache 軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun和其他公司及個人共同開發而成。
Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬於輕量級應用服務器,在中小型系統和並發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選。
對於一個初學者來說,可以這樣認為,當在一台機器上配置好Apache 服務器,可利用它響應HTML(標准通用標記語言下的一個應用)頁面的訪問請求。
實際上Tomcat是Apache 服務器的擴展,但運行時它是獨立運行的,所以當你運行tomcat 時,它實際上作為一個與Apache 獨立的進程單獨運行的。
當配置正確時,Apache 為HTML頁面服務,而Tomcat 實際上運行JSP 頁面和Servlet。另外,Tomcat和IIS等Web服務器一樣,具有處理HTML頁面的功能。
另外它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式。不過,Tomcat處理靜態HTML的能力不如Apache服務器。
Tomcat站點搭建
Tomcat雖全稱為Apache Tomcat但是配置方法和Apache差別還是不小的,首先它和很多java應用類似,其重點在於環境變量的配置。既包括java環境變量的配置,也包括tomcat環境變量的配置。本次我們直接使用tomcat的軟件包進行配置,搭建Linux+Tomcat+Mysql+Jsp的站點,分為以下幾步:
- 安裝並配置Java環境
- 安裝並配置Tomcat環境
- 安裝並配置Mysql
- 部署Jsp站點
本篇介紹的Tomcat環境搭建,主要參考的文章是linux公社的一篇:CentOS 6.6下安裝配置Tomcat環境,對於其中的部分細節略作修改。下面開始詳細介紹如何搭建一個完整的Tomcat站點
環境介紹
操作系統:CentOS release 6.5 (Final) Java版本:jdk1.8.0_60 Tomcat版本: apache-tomcat-8.0.45 站點類型:Jsp
搭建站點
安裝並配置Java環境
這一步還是非常簡單的,概括一下就是:
下載並安裝jdk,同時修改環境變量
wget http://download.Oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.tar.gz //官網下載jdk1.8 tar -xvzf jdk-8u60-linux-x64.tar.gz -C /usr/local/ //將其解壓至/usr/local目錄下,此時的文件夾名應為jdk1.8.0_60 cd /usr/local/ ln -sv jdk1.8.0_60 jdk //在/usr/local目錄下建立一個軟鏈接,為方便將jdk1.8.0_60建立一個叫jdk的軟鏈接(重命名亦可mv jdk1.8.0_60 jdk)
然后在/etc/profile.d/目錄下創建一個腳本jdk.sh,修改環境變量
vim /etc/profile.d/jdk.sh
--------------------------------------------------->
JAVA_HOME=/usr/local/jdk PATH=$JAVA_HOME/bin:$PATH export JAVA_HOME PATH <--------------------------------------------------- . /etc/profile.d/jdk.sh //重讀此文件,讓變量生效 ,注意.號后有空格
其實這種寫腳本的方式修改環境變量的方法相對於直接敲命令,更加實用便捷。
此時執行
java -version
安裝並配置Tomcat環境
和配置Java環境非常類似,步驟也大致相同
下載並安裝tomcat,同時修改環境變量
wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.45/bin/apache-tomcat-8.0.45.tar.gz tar xf apache-tomcat-8.0.45.tar.gz -C /usr/local/ cd /usr/local/ ln -sv apache-tomcat-8.0.45 tomcat //亦可使用mv apache-tomcat-8.0.45 tomcat
然后在/etc/profile.d/目錄下創建一個腳本tomcat.sh,修改環境變量
vim /etc/profile.d/tomcat.sh
--------------------------------------------------->
CATALINA_BASE=/usr/local/tomcat PATH=$CATALINA_BASE/bin:$PATH export PATH CATALINA_BASE <--------------------------------------------------- . /etc/profile.d/tomcat.sh
此時執行
catalina.sh version
可以看到,tomcat的根路徑就是/usr/local/tomcat
接下來就是配置Tomcat
配置默認端口為80端口(修改server.xml)
vim /usr/local/tomcat/conf/server.xml ----------------------------------------------------------> <Connector port="80" protocol="HTTP/1.1" //默認端口為8080,改為80 connectionTimeout="20000" redirectPort="8443" />
配置manager-gui管理頁面(配置tomcat-users.xml)
vim /usr/local/tomcat/conf/tomcat-users.xml
------------------------------------------------------------------------------->
<role rolename="manager-gui"/> //倒數第二行添加,指定用戶可以使用的接口為manager-gui <user username="tomcat" password="tomcat" roles="manager-gui"/> //用戶名和密碼為tomcat,在manager-gui接口使用
開始第一個網頁
類似於apache之於/var/www/html/,nginx之於/usr/share/nginx/html/,tomcat同樣有自己對應的網頁目錄,一般就是根目錄+webapps/,在本機上就是/usr/local/tomcat/webapps/
假如我們要創建一個叫test的項目,我們需要同時在test目錄下建立WEB-INF/classes和WEB-INF/lib文件夾
mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib} //-v參數是顯示創建目錄是否成功
ok,可以在test目錄下寫下第一個Jsp網頁了(注:和apache和nginx不同,tomcat默認支持Jsp,因此無需再安裝Jsp)
vim /usr/local/tomcat/webapps/test/index.jsp ---------------------------------------------------------------> <%@ page language="java" %> <%@ page import="java.util.*" %> <html> <head> <title>test</title> </head> <body> <% out.println("Hello qingteng!"); //嵌入java語言 %> </body> </html>
運行一下好了
catalina.sh start
非常nice,本機直接訪問127.0.0.1或者本機IP
而我們創建的test項目下的index.jsp文件,可通過訪問ip/test/index.jsp打開
此時其他主機還是無法通過ip的方式訪問該主機的,和apache類似,需要開啟80端口的訪問規則
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT //添加開啟80端口規則 /etc/rc.d/init.d/iptables save //保存配置 /etc/rc.d/init.d/iptables restart //重啟iptables /etc/init.d/iptables status //查看開放的端口,出現80
此時其它主機已經可以正常訪問
還有另外一種訪問方式,既然我們已經配置了tomcat-users.xml中的賬號密碼,我們可以通過點擊右上角Manager App,並輸入我們配置的賬號密碼對web應用進行管理
可以看見我們創建的項目test,單擊進去就是/test/index.jsp
安裝並配置Mysql
yum -y install mysql mysql-server mysql-devel //安裝mysql和其相關拓展 chkconfig mysqld on //設置其開機啟動 service mysqld start //啟動mysqld服務 /usr/bin/mysql_secure_installation //設置mysql的一些安全配置 這一步還是很重要的,主要是設置mysql的root密碼,是否需要刪除匿名賬號等等,根據實際需要設置
此時我們可以登錄一下mysql
部署Jsp站點
這里用JEECMS做演示,首先放入程序文件,程序可從http://www.jeecms.com下載,下載安裝包即可:
unzip jeecmsv8.1.zip
cd jeemsv8.1 mv ROOT/ /usr/local/tomcat/webapps/cms catalina.sh stop catalina.sh start
然后訪問ip/cms頁面即可
安裝過程非常簡單,在安裝好mysql的情況下,只需要填寫一下數據庫的密碼,僅十幾秒即可完成
重啟完成后訪問http://192.168.248.141/cms/jeeadmin/jeecms/login.do,使用admin/password登錄即可,至此站點搭建完畢
Tomcat日志分析
相對於apache和nginx,tomcat的日志不僅數量更多而且配置和理解起來也更加復雜,下面詳細梳理一下tomcat日志的知識點
首先看一下tomcat的位置,不同於其它web中間件,它的日志並不在/var/log目錄下,而在tomcat安裝路徑之下的logs文件夾,比如我的本機的路徑就是/usr/local/tomcat/logs/,看一下里面有什么吧
感覺還是挺多的,去個重分別解釋一下吧
日志種類說明
序號 名稱 說明
1 catalina.date.log Catalina引擎的日志文件 2 catalina.out Catalina控制台輸出,包括標准輸出和錯誤輸出 3 host-manager.date.log 主機管理日志 4 localhost.date.log Tomcat下內部代碼丟出的日志 5 locahost_access_log.date.txt 網頁訪問日志 6 manager.date.log 應用管理日志
關於以上日志的內容如果展開了說非常多,而且很多都要閱讀官方英文文檔才能了解其大致用途,下面挑一些重點日志,詳細展開,較為冷門的就一筆帶過了。
首先關於以上日志文件的配置
1、2、3、4、6均在tomcat根目錄/conf/logging.properties下 5在tomcat根目錄/conf/server.xml下
logging.properties
一般日志文件定義是3行
1. 首行決定什么級別及以上的信息輸出 每類日志的級別分為如下 7 種: SEVERE (highest value) > WARNING > INFO > CONFIG > FINE > FINER > FINEST (lowest value) OFF為禁用輸出;ALL為全部輸出 2. 第二行決定輸出日志文件的路徑 3. 第三行決定日志文件的前綴
此外catalina.out由於是輸出控制台(console)信息,該信息源於Linux輸出的重定向,因此與其它日志不同
順便一提,manager和host-manager分別對應tomcat后台頁面的Manager App和Host Manager,想要生成這兩類日志,需要在tomcat-users.xml里分別配置manager-gui和admin-gui角色的賬號密碼,並訪問相應頁面,否則這兩個日志都會是空的
Tomcat默認使用JULI日志系統(可以參考官網文檔修改成使用log4j),它是對默認的JDK日志java.util.logging進行一定的封裝,和標准JDK日志支持相同的配置。最大的不同是針對不同的classloader,可以使用不同的配置文件,使得tomcat下不同的Web應用程序可以使用各自獨立的日志文件。也就是說,Tomcat下的默認日志有如下2個層次:
- 全局配置文件.
That is usually done in the ${catalina.base}/conf/logging.properties file. The file is specified by the java.util.logging.config.file System property which is set by the startup scripts. If it is not readable or is not configured, the default is to use the ${java.home}/lib/logging.properties file in the JRE.
- Web應用程序中使用WEB-INF/classes/logging.properties
默認的JRE中的logging.properties會把日志輸出到System.err(ConsoleHandler)中,而默認的Tomcat下的配置文件conf/logging.properties會增加多個FileHandlers把日志輸出到不同的文件。
關於Juli日志系統的更多內容,或者想把Juli改成Log4j的,推薦這篇文章:Tomcat日志機制
server.xml
前面提到5類的日志可歸納為運行日志,一般用於排查服務端console、catalina、tomcat、web應用管理遇到的錯誤,而且其中詳細的配置應該查閱的是對應版本tomcat的官方文檔:Apache Tomcat 8 Docs Home
接下來要介紹的就是訪問日志,即訪問網頁的記錄,類似於apache和nginx中的access.log,首先看一下它在server.xml是如何配置的
關注點主要就是紅框標注處
className 開啟訪問日志必用類 directory 日志存放目錄 prefix 日志名前綴 suffix 日志文件后綴 pattern 日志記錄的格式
除了第一個className不允許修改外,其它字段值可以根據實際需要修改,最重要的就是pattern,我們結合實際的一例日志文件解釋一下
192.168.248.1 – - [14/Aug/2017:19:39:20 -0700] “GET /cms/jeeadmin/jeecms/index.do HTTP/1.1″ 200 555
而與之對應的pattern是這樣,和apache的access.log確實比較類似
pattern=”%h %l %u %t “%r” %s %b”
%h 為遠程主機名(若無法獲取主機名亦可為遠程主機IP)對應192.168.248.1 %l 為遠端登錄名(由identd而來),除非IdentityCheck設為"On",否則將得到一個"-" %u 為遠程用戶名(根據驗證信息而來),若不存在得到一個"-" %t 為時間,用普通日志時間格式(標准英語格式) 對應[14/Aug/2017:19:39:20 -0700] " 為雙引號"的實體編碼 %r 為請求頭第一行(包括HTTP方法和請求的URI),對應GET /cms/jeeadmin/jeecms/index.do HTTP/1.1 %s 為HTTP響應狀態碼 %b 為發送信息的字節數,不包括HTTP頭,如果字節數為0的話,顯示為-
關於這個的字段的詳細配置說明,查閱官方英文文檔最為准確:Tomcat8訪問日志字段說明
Tomcat日志分析Web攻擊行為
和之前不同,此次我們使用IBM的AppScan進行深度掃描,相對於手工拿burp suite、sqlmap測試,測試時間更加漫長,甚至比AWVS的時間還長,掃描了約1個半小時才掃描了21%,為了不耽誤時間直接暫停了,去看結果。
掃描完成后,localhost_access_log
增加至13M左右
sql注入攻擊
在日志文件中搜索關鍵字”SELECT”
可以看見AppScan采用的payload確實比較特別,除了普通的參數注入外,還會嘗試url注入,並添加一些不可見字符
xss攻擊
在日志中搜索關鍵字”script”
xss的payload相對而言比較簡單,大多數是做了url編碼后直接測試
目錄遍歷
在日志中搜索關鍵字”../”或者”..%2F”或者”%uff0e%uff0e/”或者”%2e%2e/”或者”%252e%252e/”等等,這些均是各種編碼后的../
命令執行
在日志中搜索關鍵字”system”或者”exec”
一般在命令執行攻擊中,system和exec出現的頻率還是比較高的
任意文件讀取
在日志中搜索關鍵字”/etc/passwd”
/etc/passwd可以說是攻擊者最喜歡讀取的文件了,將其作為參數值傳遞看回顯結果來判斷是否存在該類型漏洞。
關於AppScan探測的漏洞還有很多,此處就不一一解釋了,有興趣可以自行探索一下
補充知識點
1. 如何修改Tomcat默認端口號?
這個問題其實上面已經給出答案了,修改server.xml中的port
<Connector port=”80″ protocol=”HTTP/1.1″
測試時在本機瀏覽器輸入http://127.0.0.1:新端口號 即可
注:外網主機此時可能無法通過http://IP:新端口號 方式訪問,記得修改iptables,添加新端口號規則。
2. 以root身份啟動Tomcat,該服務以什么用戶運行?
使用ps aux|grep tomcat|grep -v grep查看一下
只有一個root啊,沒有tomcat這個用戶嗎?從/etc/passwd中確實可以看出,安裝tomcat不會在系統中新建tomcat用戶,以root身份啟動tomcat,那么該服務就是以root身份運行的。
結語
到這里Web中間件學習篇就告一段落,雖然說的內容不少,但是還是過於基礎,深入的內容沒有詳細展開,關於中間件的學習自己還遠遠不夠,今后如果掌握地更多的時候,會考慮再寫對應的Web中間件學習進階篇。同時也可能會增加JBoss(WildFly)、WebLogic、WebSphere等中間件的內容。
今后分享的內容將會是一個知名CTF網站HackingLab(http://hackinglab.cn/)的全部關卡攻略,雖然網上有很多其它大牛也寫過它的攻略,但是還是想出一個相對完整一些的,也算給自己留個備忘。這也是我第一次正式寫CTF題目的writeup,由於工作原因,時間不是很多,打算根據不同關卡分成五期進行更新,每周一期,希望各位多多支持,謝謝~~
http://www.freebuf.com/column/146169.html