通过IPS我们发现,每天都有针对互联网网站扫描的事件出现,大部分是都是工具的自动化探测行为。安全人员想从这些安全事件发现真正的恶意攻击行为,是比较困难的。有没有办法能精确的发现有人在恶意攻击? 一种方法是提取各扫描器的特征指纹,然后进行过滤,另一种方法就是我下面要讲的,用“蜜罐”的思路来诱捕黑客。在开始前我们先分析一段真实的入侵案例。 真实攻击案例日志分析 有一天我们部署在某互联网DMZ区域的IPS告警,值班同事看到SOC事件后启动安全事件响应流程,很快就定位了漏洞原因并阻断了该攻击者,但这次入侵事件具有典型的代表性,我们来简单分析一下。 1)春节前的踩点 64.62.X.Y--[01/Feb/2015:16:29:19+0800]GET/HTTP/1.13023 64.62.X.Y--[01/Feb/2015:16:29:19+0800]GET/index.php?m=indexa=login HTTP/1.12001345 64.62.X.Y - - [01/Feb/2015:16:29:20 +0800] +0800] +0800] +0800] +0800] GET GET GET GET GET /static/css/admin/assets/logo.pngHTTP/1.120021144 64.62.X.Y - - [01/Feb/2015:16:29:20 /static/css/admin/login/login.cssHTTP/1.12001979 64.62.X.Y - - [01/Feb/2015:16:29:20 /static/css/admin/assets/loginbg.pngHTTP/1.12002831 64.62.X.Y - - [01/Feb/2015:16:29:21 /static/css/admin/assets/input.pngHTTP/1.12002817 64.62.X.Y - - [01/Feb/2015:16:29:21 /static/css/admin/assets/rep1.pngHTTP/1.12002825 64.62.X.Y--[01/Feb/2015:16:29:21+0800]GET/favicon.icoHTTP/1.14041075 23.236.79.30--[02/Feb/2015:03:23:22+0800]GET/HTTP/1.03023 64.62.X.Y--[02/Feb/2015:10:05:16+0800]GET/HTTP/1.13023 64.62.X.Y--[02/Feb/2015:10:05:16+0800]GET/index.php?m=indexa=login HTTP/1.12001345 64.62.X.Y--[02/Feb/2015:10:31:20+0800]GET/index.php?m=indexa=login HTTP/1.12001345 64.62.X.Y--[02/Feb/2015:10:31:38+0800]GET/phpssoHTTP/1.14041075 64.62.X.Y--[02/Feb/2015:10:31:48+0800]GET/phpmyadminHTTP/1.14031222 64.62.X.Y--[02/Feb/2015:10:31:53+0800]GET/PhpmyadminHTTP/1.14031222 64.62.X.Y--[02/Feb/2015:10:31:56+0800]GET/HTTP/1.13023 64.62.X.Y--[02/Feb/2015:10:31:57+0800]GET/index.php?m=indexa=login HTTP/1.12001345 从上面的日志可以看出,2015.2.1号这个黑客就发现了这个8081端口,尝试访问了一次,发现是个登录入口;2015.2.2号尝试手工登录了几次,失败,尝试手工访问/phpsso/phpmyadmin,失败,后面就暂时放弃了。一直到春节上班后,又继续来搞了,这次就不是手工了。基于这个时间点,我们有理由认为这个IP背后肯定是个中国黑客。 2)扫描工具导致大量404请求 64.62.X.Y - - [26/Feb/2015:14:38:37 +0800] GET GET GET GET /wp-content/plugins/wpstorecart/php/upload.phpHTTP/1.14041075 64.62.X.Y - - [26/Feb/2015:14:38:37 +0800] /wp-content/plugins/rbxgallery/uploader.phpHTTP/1.14041075 64.62.X.Y - - [26/Feb/2015:14:38:37 +0800] /wp-content/plugins/front-end-upload/upload.phpHTTP/1.14041075 64.62.X.Y - - [26/Feb/2015:14:38:37 +0800] /wp-content/plugins/allwebmenus-wordpress-menu-plugin/actions.phpHTTP/1.1404 1075 64.62.X.Y - - [26/Feb/2015:14:38:37 +0800] GET /wp-content/plugins/wp-symposium/uploadify/upload_admin_avatar.phpHTTP/1.1404 1075 64.62.X.Y - - [26/Feb/2015:14:38:37 +0800] GET /wp-content/plugins/wp-symposium/uploadify/upload_profile_avatar.phpHTTP/1.1 4041075 64.62.X.Y - - [26/Feb/2015:14:38:37 +0800] GET GET GET GET GET GET GET GET /wp-content/plugins/mailz/lists/dl.phpHTTP/1.14041075 64.62.X.Y - - [26/Feb/2015:14:38:37 +0800] /wp-content/plugins/website-faq/website-faq-widget.phpHTTP/1.14041075 64.62.X.Y - - [26/Feb/2015:14:38:37 +0800] /wp-content/plugins/wp-automatic/inc/csv.phpHTTP/1.14041075 64.62.X.Y - - [26/Feb/2015:14:38:38 +0800] /wp-content/plugins/mailz/lists/config/config.phpHTTP/1.14041075 64.62.X.Y - - [26/Feb/2015:14:38:38 +0800] /wp-content/plugins/zingiri-web-shop/HTTP/1.14041075 64.62.X.Y - - [26/Feb/2015:14:38:38 +0800] /wp-content/plugins/jetpack/modules/sharedaddy.phpHTTP/1.14041075 64.62.X.Y - - [26/Feb/2015:14:38:38 +0800] /wp-content/plugins/adrotate/adrotate-out.phpHTTP/1.14041075 64.62.X.Y - - [26/Feb/2015:14:38:38 +0800] /wp-content/plugins/wp-glossary/ajax.phpHTTP/1.14041075 64.62.X.Y--[26/Feb/2015:14:38:38+0800]GET/VIPLogin.phpHTTP/1.1404 1075 64.62.X.Y--[26/Feb/2015:14:38:39+0800]GET/uctools.phpHTTP/1.14041075 64.62.X.Y--[26/Feb/2015:14:38:39+0800]GET/feedback_list.phpHTTP/1.1 4041075 由于扫描工具产生的事件非常多,就不一一列举了,扫描工具所用的文件库还是有些效果的,猜到了一些目录。 3)扫描工具猜解到部分目录及文件 64.62.X.Y--[26/Feb/2015:14:41:15+0800]GET/tmp/HTTP/1.1200980 64.62.X.Y--[26/Feb/2015:14:44:43+0800]GET/data/HTTP/1.12001192 64.62.X.Y--[26/Feb/2015:15:21:33+0800]GET/ttt/HTTP/1.1200989 64.62.X.Y--[26/Feb/2015:14:42:23+0800]GET/tmp/HTTP/1.1200982 64.62.X.Y--[26/Feb/2015:14:42:25+0800]GET/tmp/runpool/HTTP/1.1200999 64.62.X.Y--[26/Feb/2015:14:42:26+0800]GET/tmp/runpool/nbwx/HTTP/1.1 2001642 64.62.X.Y--[26/Feb/2015:14:42:28+0800]GET/tmp/runpool/nbwx/Cache/ HTTP/1.12001035 注意上面tmp目录,由于存在目录浏览漏洞,自动扫描工具也会进行请求。 4)手工请求文件获得敏感信息 从这里开始,黑客开始基于扫描的结果进行手工操作了,我们将关键日志逐条分析,会发现是件很有意思的事情: 64.62.X.Y - - [26/Feb/2015:15:05:23 +0800] GET /tmp/runpool/nbwx/Logs/1421895886-15_01_22.logHTTP/1.12002103549 我们访问/tmp/runpool/nbwx/Logs/1421895886-15_01_22.log 结果这个日志文件第一:[2015-01-22T10:52:19+08:00]119.130.86.152行内容就是index.php?m=sysFeedbacka=indexmenuid=347这也就不难理解,下面这条日志了,而且注意还多了一个/,是黑客手工复制到浏览器的。 64.62.X.Y - - [26/Feb/2015:15:05:52 +0800] GET //index.php?m=sysFeedbacka=indexmenuid=347%27HTTP/1.13023 结果来了个302跳转,跳到登录首页了。 64.62.X.Y--[26/Feb/2015:15:05:54+0800]GET/index.php?m=indexa=login HTTP/1.12001345 黑客继续看日志。 64.62.X.Y - - [26/Feb/2015:15:06:04 +0800] GET /tmp/runpool/nbwx/Logs/1421895139-15_01_22.logHTTP/1.12002149193 黑客看到日志中包含了账号密码信息: SQL:SELECT`id`,`app_id`,`username`,`name`,`email`,`role_id`,`status`FROM `ndsns_wx_admin`WHERE(`username`=zhang3)AND(`password`= 69591f2c70dfe6679533d42459802eaf)LIMIT1[RunTime:0.001000s] 黑客这会估计在反查MD5密码,然后继续尝试登录 64.62.X.Y--[26/Feb/2015:15:06:36+0800]POST/index.php?m=indexa=login HTTP/1.12001864 64.62.X.Y--[26/Feb/2015:15:06:40+0800]GET/index.php?m=indexa=login HTTP/1.12001345 上面登录没成功,黑客于是又翻看了16号的日志。 64.62.X.Y - - [26/Feb/2015:15:06:43 +0800] GET /tmp/runpool/nbwx/Logs/1421392766-15_01_16.logHTTP/1.12002140738 果然有所收获,16号的日志里又看到另一个账号密码。 SQL:SELECT`id`,`app_id`,`username`,`name`,`email`,`role_id`,`status`FROM `ndsns_wx_admin`WHERE(`username`=li4)AND(`password`= fb7560f09566200e9da8a6dc74bd2080)LIMIT1[RunTime:0.000000s] 这回的MD5一下就反查出来了,再来请求登录。 64.62.X.Y--[26/Feb/2015:15:07:16+0800]POST/index.php?m=indexa=login HTTP/1.12001864 登录成功,进入后台。 64.62.X.Y--[26/Feb/2015:15:08:07+0800]GET/index.php?m=indexa=panel HTTP/1.12005456 接下来的故事就不再说了,后台上传漏洞得到webshell,执行了一些系统命令查看权限、用户等信息,再然后就被我们在应急处置过程中断开了。 5)入侵事件的反思 反思整个入侵过程,黑客并没用多少NB的技术,而我们则有些大意了。一个不重要的DMZ区,管理员私自开启非80端口的业务,我们没有引起重视,导致各种安全管控手段没有覆盖到,比如扫描器、WAF防护等。事后我们进行了一些调整,但在调整完之后我还在思考,如何有效的从海量的扫描事件中真正找到那些真正在搞我们的人,或者我们主动点,利用“蜜罐”思路搞点陷阱? 用modsecurity搭建蜜罐诱捕黑客 Modsecurity是个开源的WAF,关于其介绍请自行网上搜索。因为开源而且规则可以自己定制,所以选择它来实现我们的想法。 1)针对不常见端口的尝试攻击 选择一个没有对外公布的IP(即没有DNS解析到此IP),开启一个或多个非80的端口,是这项工作的第一步。注意这个端口的选择也是有讲究的,仔细看一下nmap默认扫描的端口中包含哪些,你是希望通过常规的端口扫描能让黑客发现这个端口,还是希望黑客通过全端口扫描才能发现,完全取决于你。在涉及到的防火墙(如iptables)、负载均衡(如F5、LVS)上发布此IP与相应的端口,在apache上配置监听相关端口并设置好虚拟站点,即添加一个/etc/httpd/conf.d/hyweb.conf,关键内容参考如下: Listen8081