该文也是参考了网上好几篇文章自己亲自动手又做了一遍,亲自实现的时候也是遇到各种各样的坑,总结了以下这些内容,收获很多。
提醒:在修改完配置文件之后一定要重启服务!!!!
0x00 思维导图
Apache-security-config-0.png0x01 错误详情页banner隐藏
黑客在渗透的过程中,收集服务器的信息是至关重要的,这对于他在后期漏洞的利用上有很大的帮助。
错误详情页
测试方法:
在访问站点时,随便访问一个不存在的页面,如果站点没做404重定向的话,就会泄露一些敏感信息。详情如下图:
Apache-security-config-1.png查看响应头信息:
$curl -I http://114.115.214.203/zk/shell.php
HTTP/1.1 200 OK
Date: Tue, 05 Dec 2017 07:47:46 GMT
Server: Apache/2.4.7 (Ubuntu) #中间件版本及操作系统
X-Powered-By: PHP/5.5.9-1ubuntu4.22 # 显示服务端脚本语言及版本号
Content-Type: text/html; charset=UTF-8
修复方法:
1)修改配置文件:/etc/apache2/apache2.conf
或者/etc/httpd/conf/httpd.conf
隐藏中间件信息。修改或者添加以下配置:
ServerTokens Prod
ServerSignature Off
2)修改配置文件:/etc/php5/apache2/php.ini
第367行隐藏PHP信息,将expose_php = On修改为Off
376 expose_php = Off
3)保存退出之后,重启apache服务。
root@ubuntu:~# service apache2 restart
* Restarting web server apache2 [ OK ]
4)再次访问不存在的页面,已经没有banner信息了。
Apache-security-config-2.jpg$curl -I http://114.115.214.203/zk/shell.php
HTTP/1.1 200 OK
Date: Tue, 05 Dec 2017 07:51:41 GMT
Server: Apache
Content-Type: text/html; charset=UTF-8
0x02 重定向404页面
什么是404页面
当用户请求一个网站不存在的资源的时候服务器会返回一个404的错误页面。如下图所示:
Apache-security-config-3.png为什么要自定义404页面
1)通过上图可以看出,默认的404页面是非常不友好的。当一个用户访问到一些不存在的页面或者错误的链接时,如果我们没有制作一个页面去引导用户访问该站点的其它页面时,会损失大量的用户。
2)自定义404页面会告诉百度、谷歌、bing等搜索引擎的爬虫,这条记录本站已经删除,请搜索放弃收录,利于seo优化。
加固步骤
1) 在网站根目录新建一个.htaccess文件
ErrorDocument 404 /404.html
2) 在同目录下新建404.html,文件名与上一步指定的文件名相同。
<!DOCTYPE html>
<html>
<head>
<title>404页面</title>
</head>
<body>
Hello,This is 404 page!!
</body>
</html>
3) 此时我们自定义的页面已经生效,如下图所示:
Apache-security-config-4.png真实的404页面是需要设计的,没有这样简陋。符合网站自身的设计风格,最好能加入网站导航和底部。
注意事项
1、不要将404错误直接转向到网站首页,这将导致首页不被收录;
2、/404.html 前面不要带主域名,否则返回的状态码是302或200状态码;
3、自定义的404页面必须是大于512B,如果小于这个大小,浏览器就不会执行;
0x03 列目录问题
什么是列目录
当Web服务器配置不当的时候,如果当前目录不存在默认文件(比如index.html),Apache会列出当前目录下所有文件,造成敏感信息泄露。如下图所示:
Apache-security-config-5.png修复方法
修改配置文件/etc/apache2/apache2.conf
或者/etc/httpd/conf/httpd.conf
164 <Directory /var/www/> #这边必须是网站根路径
165 Options Indexes FollowSymLinks
166 AllowOverride All
167 Require all granted
168 </Directory>
Options Indexes FollowSymLinks
这里的indexes 是指在目录中要存在index文件,如果不存在把文件列出来,如果存在index文件可以直接显示index文件,因此每个目录都必须存在index文件,如果不存在有可能此目录把文件全部列出来。
删除Indexes这个参数,然后重启apache服务。service apache2 restart
164 <Directory /var/www/> #这边必须是网站根路径
165 Options FollowSymLinks
166 AllowOverride All
167 Require all granted
168 </Directory>
再次访问就出现403 Forbidden页面
Apache-security-config-6.png0x04 文件权限问题
控制文件权限的意义
现在大部分站点都存在文件上传,比如说头像上传,附件上传等等。如果在代码层对上传的文件限制的不够严格,很容易被上传Webshell。一旦被上传Webshell对服务器造成十分大的威胁。如下图所示:
[图片上传中...(Apache-security-config-7.png-bc7db5-1512700791341-0)]
加固方法
如果我们对存放上传文件的目录限制脚本执行的权限的话,上传的脚本文件就无法执行,在一定程度上能够减轻黑客攻击造成的危害,并且还不影响正常的业务,上穿的图片不需要执行权限,也能正常打开。
修改配置文件/etc/apache2/apache2.conf
或者/etc/httpd/conf/httpd.conf
170 <Directory /var/www/html/zk/> #这里文件夹设置想要限制的
171 php_flag engine off
172 </Directory>
此时上传的小马已经无法执行
Apache-security-config-8.pngApache-security-config-9.png
0x05 服务器运行权限问题
查看Apache的进程:lsof -i:80
root@ubuntu:~# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apache2 11302 root 4u IPv6 28205389 0t0 TCP *:http (LISTEN)
apache2 11304 www-data 4u IPv6 28205389 0t0 TCP *:http (LISTEN)
apache2 11305 www-data 4u IPv6 28205389 0t0 TCP *:http (LISTEN)
apache2 11306 www-data 4u IPv6 28205389 0t0 TCP *:http (LISTEN)
apache2 11307 www-data 4u IPv6 28205389 0t0 TCP *:http (LISTEN)
apache2 11308 www-data 4u IPv6 28205389 0t0 TCP *:http (LISTEN)
apache2 13248 www-data 4u IPv6 28205389 0t0 TCP *:http (LISTEN)
apache2 14885 www-data 4u IPv6 28205389 0t0 TCP *:http (LISTEN)
或者ps aux|gerp apache|grep -v grep
root@ubuntu:~# ps -aux | grep apache |grep -v grep
root 11302 0.0 0.2 71104 2340 ? Ss Dec04 0:03 /usr/sbin/apache2 -k start
www-data 11304 0.0 0.2 71176 2252 ? S Dec04 0:00 /usr/sbin/apache2 -k start
www-data 11305 0.0 0.2 71176 2256 ? S Dec04 0:00 /usr/sbin/apache2 -k start
www-data 11306 0.0 0.2 71200 2284 ? S Dec04 0:00 /usr/sbin/apache2 -k start
www-data 11307 0.0 0.2 71184 2252 ? S Dec04 0:00 /usr/sbin/apache2 -k start
www-data 11308 0.0 0.2 71176 2276 ? S Dec04 0:00 /usr/sbin/apache2 -k start
www-data 13248 0.0 0.2 71176 2352 ? S Dec04 0:00 /usr/sbin/apache2 -k start
www-data 14885 0.0 0.2 71176 2368 ? S Dec04 0:00 /usr/sbin/apache2 -k start
第一行是Apache的主进程,是以root运行的。因为Apache的Web开放的端口是80或者443,小于1024的端口需要有root权限,因此主进程必须是root.从第二行开始为Apache的子进程。用户为www-data,是Ubuntu中运行服务的默认用户,权限较低。
如果用户为www-data用户的话,此时就算黑客拿到一个webshell,权限也是比较底的。如下图所示:
Apache-security-config-10.png
如果管理配置不当(默认安装为www-data),这里是高权限用户的话,需要更高为低权限用户。
配置文件路径为:/var/apache2/envvars文件中16、17行进行配置:
15 # /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
16 export APACHE_RUN_USER=www-data
17 export APACHE_RUN_GROUP=www-data
0x06 Apache日志文件格式
Apache会生成两个主要的日志文件,一个是Web访问日志access.log
,一个是记录服务器运行时出错的日志error.log
。
配置文件/etc/apache2/apache2.conf
或者/etc/httpd/conf/httpd.conf
中定义了日志格式
212 LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
213 LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
214 LogFormat "%h %l %u %t \"%r\" %>s %O" common
215 LogFormat "%{Referer}i -> %U" referer
216 LogFormat "%{User-agent}i" agent
217
218
219 CustomLog ${APACHE_LOG_DIR}/access.log common
212行是虚拟主机的日志格式
213行是组合日志格式
213行是通用的日志格式
219行自定义设置日志使用那个格式的日志
/var/log/apache2/access.log
日志格式如下:
111.196.209.199 - - [05/Dec/2017:22:40:02 +0800] "GET /zk/shell.php HTTP/1.1" 304 164 "http://114.115.214.203/zk/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
远端主机:111.196.209.199
远端登录名:-
远程用户名:-
访问时间:[05/Dec/2017:22:40:02 +0800]
HTTP请求:GET /zk/shell.php HTTP/1.1
HTTP状态码:304
发送的字节数:164
Referer:http://114.115.214.203/zk/
User-Agent:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
/var/log/apache2/error.log
日志格式如下:
[Tue Dec 05 22:39:10.798632 2017] [core:notice] [pid 2970] AH00094: Command line: '/usr/sbin/apache2'
[日期和时间] [错误等级] 错误消息
网友评论