1.中间件安全基础(一)
0x00 前言
这是一个关于中间件安全的系列文章,主要分成三篇:第一篇介绍Apache、IIS和Tomcat的安全配置和日志格式;第二篇介绍WebLogic、WebSphere和Jboss三款Java中间件的安全配置和日志格式;第三篇介绍以上六种中间件中常见的漏洞和修复方法。
0x01 Apache
Apache起初由伊利诺伊大学香槟分校的国家超级电脑应用中心(NCSA)开发,此后,Apache Httpd被开放源代码团体的成员不断的发展和加强,从上个世纪90年代开始它的市场占有率就超过了50%。如今虽然它的使用率有些下降但是仍是世界使用排名第一的 Web 服务器软件,它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的 Web服务器端软件之一。Apache自身的安全性是很高的,但是人为的错误设置会导致Apache产生安全问题 。
Apache 服务器安全设置
服务器运行权限
Linux中默认给予Apache的是一个www-data账户,执行命令:lsof -i:80
或者:ps aux|grep apache|grep -v grep
可以看到第一行是Apache主进程,以root权限运行的,因为Apache的Web端口是80或443,而在Linux中开启小于1024的端口需要root权限,所以主进程必须以root权限运行。第二行起为Apache子进程,其执行用户为www-data,www-data是Ubuntu中运行Web服务的默认用户,权限较低。比如当我们使用一个shell.php去执行添加文件测操作就会由于权限问题而失败
如果是一个高权限用户,可以尝试更改为低权限用户,Apache的运行用户的配置信息可以在/etc/apache2/apache2.conf文件中看到,提示用户和用户组设置在/etc/apache2/envvars文件
然后在到/etc/apache2/envvars文件中设置即可
Windows中Apache安装完成后默认是administrator权限,如果使用此权限运行Web服务一旦攻击者拿下webshell就很容易控制整个服务器。比如在在windows server 2003中使用phpStudy设置测试环境,使用菜刀连接小马,直接就是administrator权限。
可以随意添加账户
那么就应该给Apache降权,或者说设置一个安全的执行账户。首先按以下步骤创建一个普通用户。
然后将Apache的用户组改为Guests,注意要将Apache目录下的日志的可写权限赋给Guests账户。
然后打开Apache服务属性中的登录选项卡,点选此账户,写入刚才添加的用户名和密码。
最后重启服务,这是windows下的Apache权限就设置完毕了,再在菜刀里看下命令执行结果
可以看到由于权限问题已经无法执行高危的系统命令,这样就增加了攻击者的攻击成本。
目录及文件权限
Linux在默认情况下如果当前目录不存在默认文件(比如index.html),Apache会列出当前目录。
其权限设置位置在Apache配置文件httpd.conf中
Options后面的两个参数决定了/var/www可以进行的操作
Indexes:可以在该目录中使用符号连接。
FollowSymLinks:允许目录浏览,当客户仅指定要访问的目录,但没有指定要访问目录下的哪个文件,而且目录下不存在默认文档时,Apache以超文本形式返回目录中的文件和子目录列表(虚拟目录不会出现在目录列表中)。
Indexes决定目录可以被列出,从漏洞角度上讲也就是目录遍历漏洞,操作这个参数即可进行权限控制。修改配置文件如下
再次进行访问时
另外也Linux中可以通过Linux自带的chmod命令进行权限控制
比如使用chmod o-r flag.txt命令将www-data的读权限去掉
在Windows中同样可以使用这两种方法进行权限控制,修改httpd.conf配置文件的方法与Linux下是一样的就不再重复。这里说下windows自带的权限控制,还是以访问flag.txt文件为例,默认情况下
想要设置对其的访问:右键==>属性==>安全(前面已经将Apache添加Guests用户组)
同理可以设置文件或目录的写权限、执行权限等,尤其是一些文件上传目录一定要设置为不可执行,防止webshell的上传。
错误重定向
错误重定向是指通过在Web程序出错令其跳转到指定的显示界面,首先可以通过设置.htaccess文件达到目的,但是windows中正常情况下无法直接创建.xxx的文件,所以要是使用DOS命令,比如
然后在用其他编辑器编辑.htaccess文件即可,比如设置404错误重定向,在.htaccess文件中添加:ErrorDocument 404 /404.html
然后在同目录下创建404.html文件
然后随机访问一个不存在的文件,则会自动跳转到404.html
通过配置httpd.conf文件也可以达到跳转的目的,还是在刚才添加设置目录权限的地方
RewriteEngine On:开启跳转
RewriteRule "tttt\.html$" "404.html":第一个参数是一个正则,第二个参数使要跳转到的相对地址;也就是说当符合正则时进行跳转。比如对于本条正则当访问tttt.html时会跳转到404.html界面。
Apache日志格式
这里以ubuntu下的Apache日志为例,我的日志路径为/var/log/apache2/,不同的Linux版本可能位置不一样
其中的压缩文件为Apache自动压缩以节省空间,other_vhosts_access.log是虚拟主机日志,重点看下access.log和error.log文件
access.log
日志文件的格式在httpd.conf中有定义
第一行是虚拟主机日志格式,第二个和第三个分别为组合日志格式(Combined Log Format)和通用日志格式(Common Log Format),本系统中由于Combined在Common之前,因此access_log日志按照Combined Log Format方式记录,解释下各个字段的含义,以下面一行为例:
192.168.228.1 - - [22/Sep/2017:05:26:41 -0700] "GET /flag.txt HTTP/1.1" 403 515 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0"
远端主机:192.168.228.1
远端登录名:-
远程用户名:-
访问时间:[22/Sep/2017:05:26:41 -0700]
HTTP请求:GET /flag.txt HTTP/1.1
HTTP状态码:403
发送的字节数:515
Referer:-
User-Agent:"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0"
error.log
httpd.conf中定义了error.log的路径和日志级别,路径和access.log为同一路径,级别是指日志记录的最低级别,如图是指在发生warn及以上事件时会记录。
以下有日志级别的详细分类。
看一下日志的详细内容
可以看到里面有notice、error等级别的消息,那么为什么会用notice级别的信息呢?当错误日志是一个单独分开的正式文件的时候(如本例中就是单独的/var/log/apache2/error.log文件),notice级别的消息总是会被记录下来,而不能被屏蔽。Error.log的一般格式为
[日期和时间] [错误等级] 错误消息
0x02 IIS
IIS 全称为 Internet Information Service(Internet 信息服务),它的功能是供信息服务,如架设 http、 ftp 服务器等,是WindowsNT内核的系统自带的,不需要下载。
IIS 服务器安全设置
身份验证
身份验证是验证客户端身份的行为,并控制客户端对资源的访问能力。一般情况下,客户端必须提供某些证据,一般称为凭据,来证明其身份。通常,凭据指用户名和密码。IIS有多种身份验证方式,主要有:
-
匿名访问
如果启用了匿名访问,访问站点时,不要求提供经过身份验证的用户凭据。当需要让大家公开访问那些没有安全要求的信息时,使用此选项最合适。用户尝试连接您的网站时,IIS 会将该连接分配给 IUSER_ComputerName 帐户,其中 ComputerName 是运行 IIS 的服务器的名称。默认情况下,IUSER_ComputerName 帐户为 Guests 组的成员,密码为空。设置方法如下:
注:如果启用匿名访问,IIS 会始终先使用匿名身份验证来尝试验证用户身份,即使启用其他身份验证方法也是如此,也就是说启用匿名身份验证后其他验证方式也会失效。
2.集成Windows身份验证
以前称为 NTLM 或 Windows NT 质询/响应身份验证,此方法以 Kerberos 票证的形式通过网络向用户发送身份验证信息,并提供较高的安全级别。Windows 集成身份验证使用 Kerberos 版本 5 和 NTLM 身份验证。要使用此方法,客户端必须使用 Microsoft Internet Explorer 2.0 或更高版本。另外,不支持通过 HTTP 代理连接进行 Windows 集成身份验证。如果某个 Intranet(Intranet称为企业内部网,属于内网环境,是一个使用与因特网同样技术的计算机网络,它通常建立在一个企业或组织的内部并为其成员提供信息的共享和交流等服务,可以说Intranet是Internet技术在企业内部的应用)中的用户和 Web 服务器计算机在同一个域中,并且管理员可以确保每个用户都使用 Internet Explorer 2.0 或更高版本,那么对于这个 Intranet,使用此选项是最合适的(NTLM都是身份认证协议)。
简单来说使用这个验证方法在访问网页时需要输入用户名和密码,用户名和密码是windows服务器的账户和密码
在浏览器的声明周期内只需输入一次密码
注:如果选择了多个身份验证选项,IIS 会首先尝试协商最安全的方法,然后它按可用身份验证协议的列表向下逐个试用其他协议,直到找到客户端和服务器都支持的某种共有的身份验证协议。
3. Windows域服务器的摘要式身份验证
摘要式身份验证需要用户 ID 和密码,可提供中等的安全级别,如果要允许从公共网络访问安全信息,则可以使用这种方法。这种方法与基本身份验证提供的功能相同。但是,此方法会将用户凭据作为 MD5 哈希或消息摘要在网络中进行传输,这样就无法根据哈希对原始用户名和密码进行解码。要使用此方法,客户端必须使用 Microsoft Internet Explorer 5.0 或更高版本,Web 客户端和 Web 服务器必须是相同域的成员或者被相同域信任。由于这里并不是一个域的环境,所以次身份验证不好复现。
注:如果启用摘要式身份验证,需要在领域框中键入领域名称。
4. 基本身份验证(以明文形式发送密码)
基本身份验证需要用户 ID 和密码,提供的安全级别较低。用户凭据以明文形式在网络中发送。这种形式提供的安全级别很低,因为几乎所有协议分析程序都能读取密码。但是,它与大多数 Web 客户端兼容。如果允许用户访问的信息没有什么隐私性或不需要保护,使用此选项最为合适。
注:如果启用基本身份验证,需要在“默认域”框中键入要使用的域名,还可以选择在领域框中输入一个值。
5. NET Passport 身份验证
.NET Passport 身份验证提供了单一登录安全性,为用户提供对 Internet 上各种服务的访问权限。如果选择此选项,对 IIS 的请求必须在查询字符串或 Cookie 中包含有效的 .NET Passport 凭据。如果 IIS 不检测 .NET Passport 凭据,请求就会被重定向到 .NET Passport 登录页。由于只有ASP.NET应用程序才能使用此验证方式所以不再演示。
注:如果选择此选项,所有其他身份验证方法都将不可用(显示为灰色)。
权限控制
权限控制可以通过文件权限进行设置,由于IIS账户隶属于Guests账户,可以设置整个Guests账户或只设置IIS账户,对于上传目录一定要禁止执行权限,仅赋予读写权限。
应用程序池
应用程序池是将一个或多个应用程序链接到一个或多个工作进程集合的配置。因为应用程序池中的应用程序与其他应用程序被工作进程边界分隔,所以某个应用程序池中的应用程序不会受到其他应用程序池中应用程序所产生的问题的影响。工作进程隔离模式防止一个应用程序或站点停止了而影响另一个应用程序或站点,大大增强了IIS的可靠性。应用程序池的建立比较简单,打开IIS管理器,只在“应用程序池”上右键选择新建“应用程序池”即可。
新建完成后就可以为不同的网站选择不同的应用程序池。
IIS 日志格式
在IIS管理器找到对应的网站==>右键==>属性,可以看到日志启用选项
点击属性按钮就可以对日志计划和格式进行设置了,也可以点击下拉按钮选择默认的几种的格式
以这样一条日志为例
2017-09-28 03:45:30 W3SVC1 192.168.228.131 GET /test.php - 80 - 192.168.228.1 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+rv:55.0)+Gecko/20100101+Firefox/55.0 200 0 0
在日志格式中的对应关系为
日期:2017-09-28
时间:03:45:30
服务名:W3SVC1
用户名:-
服务器IP:192.168.228.131
服务器端口:80
客户端IP:192.168.228.1
方法:GET
URI资源:/test.php
用户代理:
Mozilla/5.0+(Windows+NT+10.0;+WOW64;+rv:55.0)+Gecko/20100101+Firefox/55.0
协议状态:200
协议子状态:0
Win32状态:0
0x03 Tomcat
Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选, 默认端口8080。
Tomcat 服务器安全设置
服务器运行权限
Linux中Tomcat的运行权限与Tomcat的启动账户有关,比如以root用户启动
那么获取shell后其权限也直接就是root
当使用普通用户启动的时候也只是普通用户
所以安全起见要是使用一个低权限的普通账户启动Tomcat。Windows权限控制需要进行账户配置,新建一个Tomcat用户,并归属于Guests组
在将账户设置为服务登录账户
再给Tomcat目录设置相应的权限
webapps为Web站点目录,将其中文件上传的文件夹设置为不可执行。然后运行bin文件夹下的service.bat将Tomcat设置为系统服务
然后在服务管理的地方将tomcat账户设置为Tomcat的启动账户,这样Tomcat服务就只拥有Guests用户组的权限了。
服务器后台管理
在Tomcat主页有三个按钮,分别表示进入服务器状态,管理服务器上部署的应用,管理主机界面。
默认情况下是无法进入的,点击其中任何一个按钮都会提示用户名和密码的输入框,但实际上Tomcat默认又没有配置任何用户名密码。
在conf目录下tomcat-users.xml文件中设置管理用户名和密码(默认都是注释掉的)
在其中加入如下设置就可以使用tomcat账户访问了,“manager-gui”拥有访问前两个按钮的权限,“admin-gui”拥有访问前第三个按钮的权限
服务器访问控制
-
隐藏 Tomcat 版本信息
默认情况下Tomcat出错会爆出服务器的版本信息,这本身也是一种信息泄露,所以要尽可能将其隐藏。
进入tomcat的lib目录找到catalina.jar文件,将其解压然后进入org/apache/catalina/util 编辑配置文件ServerInfo.properties,如图所示
将版本信息去除,保存
然后再使用命令
jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties
将ServerInfo.properties文件压回jar包。
然后Tomcat的版本信息就不会泄露了。
-
禁止目录列表
为防止Web的目录遍历漏洞要禁止Web上显示目录列表,设置方法在Tomcat的conf文件夹中编辑web.xml文件,找到如下内容,如果标记的位置为true就会出现目录遍历,默认为false。
Tomcat 日志格式
Tomcat的日志文件存放于logs文件夹,里面包含了多种类型的日志,主要分为两类:
一是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息。
二是访问日志信息,它记录的访问的时间,IP,访问的资料等相关信息。
以本图为例各个日志的作用如下
localhost.2017-09-29.log:程序异常没有被捕获的时候抛出的地方
catalina.2017-09-29.log:程序的输出,tomcat的运行日志
manager.2017-09-29.log:manager项目专有的
host-manager.2017-09-29.log:manager项目专有的
localhost_access_log.2017-09-29.txt:访问日志记录
Tomcat的运行日志日志服务端程序的运行日志记录,如果以命令行的形式打开Tomcat就可直接看到运行日志的输出。
Tomcat的运行日志有以下7个级别:
SEVERE > WARNING > INFO > CONFIG > FINE > FINER > FINEST
在conf/logging.properties文件中可以设置日志级别
访问日志则是记录浏览器对Web程序的访问过程,其格式可以在/conf/server.xml中配置
以下面这条日志为例,每个字段的含义为
192.168.228.1 - - [29/Sep/2017:11:26:10 +0800] "GET / HTTP/1.1" 200 11418
%h:远程主机名或IP地址:192.168.228.1
%l:远程用户名,始终为“-”
%u:已验证的远程用户,如果没有则为“-”
%t:访问日期和时间:[29/Sep/2017:11:26:10 +0800]
%r:http请求中的第一行:GET / HTTP/1.1
%s:http状态码:200
%b:发送的字节数:11418