前言:
在防火墙专区,我经常看见朋友们讨论,“某某防火墙的性能如何”,亦或是,“某某防火墙的防御能力如何”。实际上,一个防火墙所履行的基本职责便是“网络访问控制”,即放行我们允许的通信,阻止我们未允许的通信,能满足这一要求,就圆满的履行了防火墙的职责。所谓的“好用”、“性能”、“方便”,不如用“智能”和“人性化”这两个词来描述。这源于普通用户并不清楚,哪些通信是自己想要的,是可以允许的,需要防火墙代替他们判断。智能会带来隐患,但是这总比一个允许任何访问都必须手动添加规则的防火墙好,因为普通用户会毫不犹豫的关闭后者。

有人说,对普通用户来说,Windows防火墙就足够了。有人说,Windonws防火墙就是一张纸,现代的木马一捅就破。我并不想去讨论这个防火墙好不好,是否适合普通用户使用。我只会简单的说说,这个防火墙能做什么,不能做什么。如果你选择了这个防火墙,你可以怎样配置,来让自己更安全,以及启用这些配置,会带来哪些不便。安全与方便是对立的,但开发人员可以在达到自己心目中安全标准的同时,让软件的操作再方便一些。至于用不用,还得让大家自己来决定。

1.1 用户——“Windows防火墙已开启,您的系统很安全”
Windows防火墙是随系统同时安装的。如果没有开启任何防火墙,可爱又人性化的Windows便会弹出窗口警告用户,没有开启杀毒软件也一样。从这里可以看出,微软主观认为,确保Windows系统安全,需要防火墙、杀毒软件的协同工作。这也是目前许多人的共同看法。
<ignore_js_op> 
(图a1: 微软的提示)

如果我们按照提示,打开了Windows防火墙,微软便不会提醒了。这时防火墙使用的是默认配置,也是大多数Windows防火墙用户的配置。在这种配置下的Windows防火墙能对我们的安全起到怎样的帮助呢?
答案是:控制入站连接。

什么是入站连接呢?TCP建立连接有一个规则,就是通讯双方一边负责监听,一边负责连接。负责连接的一边会发送讯号给监听的,如果监听者接受了这个连接,就会发出回应。这时,两边都会产生一个名叫“通讯套接字”的东西,你可以把它想象成一根管道,信息就在这根管道中流入流出。<ignore_js_op> 
(图a2:TCP连接的建立)

默认设置下,Windows防火墙会管制那些进行“监听”操作的程序,它会弹出窗口,要求用户确认后才放行。许多早期的木马安装后,都会担任通讯双方中“监听者”的一方,这样,Windows防火墙就让它们露出了马脚。下面就演示了一个后门程序在监听的时候被Windows阻止的一幕。
<ignore_js_op> 
(图4:Windows防火墙阻止入站连接)

如果不对这种操作进行阻止,黑客便可以连接到这台计算机并控制它。
<ignore_js_op> 
(图5:监听型后门)

控制入站连接还有个好处。由于Windows开启了诸如管道共享、远程过程调用、远程桌面等服务,这些服务在远程通讯过程中也是扮演了“监听者”的角色。在没有防火墙的情况下,这些端口是可以被Internet上任何一台计算机访问的,其他人可以访问你的共享文件,如果知道你的用户名和密码,他们还可以在你的计算机上执行任何命令,甚至登录到你的计算机。输入netstat -an命令就可以看到它们使用的监听端口。
<ignore_js_op> 
(图a3:RPC服务监听端口)
Windows防火墙禁止了入站连接,阻止了黑客从Internet直接连接到这些端口。

那么,默认设置下的Windows防火墙不能做到的事情又有哪些呢?

1.2 黑客——迎客难,会客容易:反向连接
默认设置下的Windows防火墙不能管理出站连接。
出站连接又是啥?跟刚才的“入站连接”进行对比,显然出站连接就是扮演TCP通讯中连接者的角色,向监听者“打招呼”。
出站连接在我们的日常生活中可是屡见不鲜。使用浏览器上网,杀毒软件更新,HTTP下载文件,玩网络游戏,都需要进行出站连接。
下图就可以看到浏览网页时,Chrome建立的多个出站连接。其中,左边的192.168.1.100是本机的IP,右边的是监听者的IP。假如是入站连接,左边IP和右边IP会反过来。
<ignore_js_op> 
(图a4: 谷歌浏览器的出站连接)

我们浏览网页时,Windows防火墙并没有弹窗,可见它是不管出站连接的。
当然,黑客也高兴了,木马监听不成,就主动连接我吧,反正你Windows防火墙不管。我还省得去记IP,只要自己监听一会,肉鸡就乖乖上线了。
下图就展示了一个中木马后,乖乖上线的肉鸡,肉鸡的地址是192.168.1.101,黑客的地址是192.168.1.100。可以看到木马创建的连接。
<ignore_js_op> 
(图7: 反向连接木马)

另外,聪明的黑客还想出了利用出站连接来访问管道共享、远程过程调用、远程桌面服务的办法。这种方法被称为“端口转发”,把原本处于“监听者”状态的服务,当成“连接者”。这使穿过Windows防火墙连接远程网络端口,就像访问本地的端口一样简单。目前最容易找到的端口转发工具是lcx,下图简单的描述了端口转发工具的工作流程。
<ignore_js_op> 
(图a6:把他的3389转出来!)

一旦登录了远程桌面,再牛的杀毒软件、防火墙软件、HIPS软件都成了纸老虎,黑客只需要把它们关闭或卸载掉就行了。

2.1 用户——阻止出站连接的第二堵墙
有些人看到这里可能就急了,Windows防火墙连这么基本的木马都阻止不了,岂不是摆设?堂堂微软,怎能拿用户的安全当儿戏?
感到着急,是因为我们终于看清了事实,开始不满于自己所处的安全现状,这是难能可贵的。不过在我看来,更加难能可贵的是认识到安全是一个相对的状态,认识到安全与方便之间的冲突。假如微软强行让Windows防火墙控制出站连接,普通用户可能会整天面对“是否允许XXX访问网络”的弹窗而不知所措,最终,他们会关闭Windows防火墙。如果是这种结果的话,还真不如保持现状好。
不过,我们是卡饭的坛友,很大一部分人来到这里,正是为了寻找更安全的解决方案。当然,我们也有办法让Windows防火墙变得更安全。
<ignore_js_op> 
(图8:阻止出站连接)

打开控制面板中“防火墙”选项,选择“高级设置”,选择“本地计算机上的高级安全Windows防火墙”,选择“Windows防火墙属性”,选择“公用配置文件”选项卡(藏得还真深囧)。
出站连接,选择“阻止”,然后确定。

好了,这样就安全多了。不过等等,我好像看不了网页了,QQ也登不上了,下载也没速度了,杀软也更新不动了,怎么连百度都ping不通?卧齤槽,我的网断了?
<ignore_js_op> 
(图a7:卧齤了个槽)

安全也是有代价的,其代价一般是牺牲方便,至于牺牲多少方便,往往得看这软件设计得好不好。微软并没有丧心病狂,要上网还是可以的,只不过设置起来比较烦人。所以我的个人意见是,Windows防火墙设计得很差。
<ignore_js_op> 
(图9:允许出站连接特例)

还是按照老办法打开防火墙的“高级设置”,在“出站规则”上点右键,选择“新建规则”,“程序”,选择程序的路径,选择“允许连接”,然后一路下一步就OK了。上面的图展示了将IE浏览器添加为出站特例,这样,我们就可以使用IE浏览器访问网站了。

每次我们安装了需要访问网络的新程序,都要如下设置一番,程序才能正常工作。更加人性化的防火墙软件则会在程序出站时弹窗提示,并记住用户的选择。

2.2 黑客——微软留下的小小开关:netsh
我们花了那么大的功夫,忍受了如此种种不便来设置、使用Windows防火墙,现在应该很安全了吧。
如果我说,只需要一个小小的cmd命令,就能在防火墙上打个洞出来,你会不会大跌眼镜?实际上,这个命令是存在的。
<ignore_js_op> 
(图11:netsh)

netsh advfirewall firewall add rule name = "test" dir=in program="C:\xxx.exe" action=allow
其中,test是规则名称,C:\xxx.exe是放行程序名称。
你再用老办法打开“防火墙高级设置”看看,就会发现“入站规则”里面多了一条名叫test的项目。

我们会添加防火墙规则,木马、脚本病毒未必就不会,而且只用一条命令就搞定,比图形界面方便多了。看来微软还挺“照顾”木马的嘛。

如图所示,添加了规则的木马成功的开始了监听,Windows防火墙也没有弹窗提示。我们还可以用netstat -an看到木马监听的端口和创建的连接。

3.1 用户——UAC:防止特权泛滥的壁垒
从Windows Vista起,微软在桌面版操作系统中新增了一个功能,用户账户控制,简称UAC。这个系统是为了强制用户的进程运行在普通特权下而设计的,如果需要使用完整特权,必须得到管理员用户的确认。
普通特权能干什么呢?实际上以木马的视角来看,能干的事情还是很多的。添加开机自启动,访问网络,键盘记录,屏幕录像等等都可以,还好一切都只对“当前用户”有效。很遗憾,UAC相当于HIPS这种说法并不正确。
不过,普通特权下的进程是不能添加防火墙例外的,所以启用UAC,并配合Windows防火墙出站控制策略,可以对木马起到较好的防御作用。
<ignore_js_op> 
(图12:打开你的UAC)
UAC在默认状况下是打开的,但你有可能嫌它太烦人而将其关闭。如果你希望自己更安全一些,那就重新将它打开吧。

从下图中我们可以看到,处于普通特权模式下的cmd在执行netsh命令添加防火墙例外时,被拒绝了,而完整特权的cmd就可以。
<ignore_js_op> 
(图14:普通特权与完整特权)

如果你需要一个程序运行在完整特权下,可以右键选择“以管理员身份运行”,确认后即可。看到这里,可能有人会想,病毒木马会不会如法炮制,模拟用户的操作,将自己以完整特权模式启动呢?
放心,这种情况是一般是不会发生的。确认窗口显示在“安全桌面”上,以当前用户会话层的程序视角来看,是看不到这个窗口的,因此无法对其发送模拟鼠标键盘指令。

启用UAC,当然也意味着忍受它带来的不便。比方说,我们在添加防火墙出站例外的时候,也需要通过UAC确认。

什么?你说UAC并没有弹出确认窗口?
这很危险,相信我,快去把UAC的安全等级调至最高!在默认的UAC设置下,Windows资源管理器(exploere.exe)相当于平民中的贵族,它身为普通特权下的进程,却拥有一些本不该有的权利,微软的网开一面,使得普通特权下不经用户确认便操作系统敏齤感设置成为可能。方便再次战胜了安全,木马可以给exploere洗脑,让它去帮木马执行某些原本被禁止的操作,使我们之前的努力,都功亏一篑。

3.2 黑客——将勤劳的同志改造成自己人:远程线程注入
OK,我打开出站控制和UAC,并把UAC的安全等级调至最高,这下总安全了吧?
如果到现在,你还这么想,那只能说明你对安全的看法还不够成熟。safe这个词常常被叫做safer,反映了只有相对的安全,没有绝对的安全。同样,即使这样设置,木马还是能进行网络通讯。只不过,目前能做到这点的木马要少得多了。

我们就来谈谈之前说过的“洗脑”。在程序员的眼中,这叫“远程线程注入”。Windows提供一种方法,可以让某个进程在其他的进程中写入一段代码,并创建一个线程运行这段代码。这好比一个平时辛勤工作,被大家认可的人,实际上“受人指使”,修炼“邪教”,暗地里“从事危害国家稳定的活动”。

“洗脑”不能对特权等级比自己高的进程使用。这意味着“普通特权”的木马,只能操纵普通特权或者是低特权的进程,但这不碍事。还记得我们之前认可的一个勤劳的同志吗?它叫IE浏览器,iexplore.exe,我们曾经赋予了它访问网络的权利。这位人民公仆可是运行在低特权模式下的。
<ignore_js_op> 
(图15:被洗脑的IE浏览器)

上图包含了很丰富的信息。我将之前的木马改为了动态连接库版本,并使用dllinject注入到iexplore.exe中,IE的进程PID是1304,用tasklist可以看到含有异常模块的IE进程,使用netstat可以看到,这个异常的IE进程成功的连接到了黑客的电脑。同时,用DbgView,可以看到在IE进程内活动的木马打印出了调试信息。而且,注入了异常模块的IE进程依然可以浏览网页。真是“工作与间谍活动两不误”。

这里要注意的是,动态链接库注入只是远程线程注入的一种,是因为编写方便才获得广泛使用的。不含有异常动态连接库的进程,依然可能是被注入过的。

附:黑客——静悄悄的回声:ICMP Shell
之前曾经介绍了一个命令,netstat。通过该命令我们可以查看计算机中所有的连接,并揪出异常连接。为此,狡猾的木马通过用户态或内核态的挂钩,来隐藏自己创建的连接。可是,ARK工具的问世,使得这些木马的日子也不那么好过了。
有没有一种更隐蔽的方法呢?当然有。
如果大家的防火墙是打开的,可以试着ping一下百度,如果能ping通的话,那么木马也多半可以在你的计算机上用这种方法通讯。
<ignore_js_op> 
(图17:ICMP协议)

实际上,在Windows中还可以使用一种协议——ICMP。与传输层的TCP和UDP不同,ICMP工作于网络层,它可以用于ping、时间同步等。使用ICMP协议时,不管是监听还是发送,都是完全看不到状态的,因此木马也格外喜欢这种协议。
我们现在就用一个小工具来测试一下,Windows防火墙对ICMP包的过滤策略是怎样的。ICMP包有很多种类型编号,其中PING请求包的类型是8,PING回应包的类型是0。
<ignore_js_op> 
(图18:ICMP包穿过Windows防火墙)

可以看出,在默认设置下,黑客向肉鸡发包时,只有4号包能入站。肉鸡向黑客发包时,0、1、2、4、6、7、11、12、14、15号包都可以出站。聪明的人,可能已经发现了一个问题:既然肉鸡能使用ping命令,说明它肯定可以接收0号的ping reply,可以发送8号的ping request,为啥测试结果里面没有呢?
首先,0号肯定是可以接收的。这里收不到,应该是程序的bug。说8号无法发出也是错误的,肉鸡发出了8号包,黑客的Windows也收到了这个包,只是Windows自行回应了这个包,没有转交给原始套接字而已。没有网络编程基础的人听到这里可能会一头雾水,因此不再详述。

至少从上图可以看出,对付Windows防火墙,使用4号包入站,0号包出站,是没问题的。下面就实现了一个简陋的ICMP后门:
<ignore_js_op> 
(图20:ICMP后门)

右边两个窗口,一个用于发送命令,一个用于显示结果。肉鸡使用netstat -an是完全看不到连接的,事实上,你就算用内核级ARK工具,也看不到,因为根本就没有连接。

需要说明的是,这种后门只能穿过默认设置的Windows防火墙。能ping通百度也不一定表示你的防火墙不能抵抗这种攻击,因为它可能使用了特殊的过滤技术,既能阻止异常的ICMP通信,又能放行正常的ICMP包。

后记:
仔细回想起来,我原是一个对防火墙不甚了解,也不甚重视的人,原本使用ESET杀毒时附带安装的防火墙被我视作累赘。直到不久前,课题项目ICMP后门发出的数据包被它阻止时,我才开始去了解它。我一方面因为辛苦写出的后门难以突破它而烦恼,一方面又为厂家周到的思虑感到佩服。原来,我一直被这堵看不见的墙保护着。
这么一个小小的契机,也使我开始对防火墙这一安全体系中的一部分感兴趣,开始站在了用户的角度,和木马的角度,来思考这堵墙的意义。也许我那不灵光的头脑,远远不及安全专家看得深远,但也算是思有所获吧。感慨之余,便拿最熟悉的Windows防火墙开刀,写了这么一篇文章。
我在几年前也曾是“杀软综合症”患者,一有风吹草动便杯弓蛇影。换做以前的我看完这篇文章,大概会立刻弃用Windows防火墙。如果是现在的话,我会说那句老话:“适合自己的,才是最好的”。
本人水平有限,文中难免有错误和不足之处,欢迎交流和指正。如果本文能给你带来知识上的收获或是新的想法,我将十分高兴。
最后,预祝大家新年快乐。

from:https://bbs.kafan.cn/thread-1456448-1-1.html

【转】玩玩你的Windows防火墙——穿透与防御的更多相关文章

  1. 如何配置Windows 防火墙,允许SQL Server的远程连接

    一.如何找到SQL Server正在侦听的TCP端口,可以按一下步骤: 1.打开 SQL Server 配置管理器中,从开始->所有程序-> Microsoft SQL Server 20 ...

  2. 解决windows防火墙无法启动的问题

    windows防火墙突然无法开启,找个各种方法,最后还是通过微软自动的修复工具修复的: 网址如下: https://support.microsoft.com/zh-cn/mats/windows_f ...

  3. 利用ftp端口设置,浅谈windows防火墙之应用+ftp直接资源管理器登陆

    win服务器的版本是不错的.防火墙也比较能用.server-u 6.4则是比较稳定.兼容性好的的版本,所以很多人在用 1.服务器为了安全,一般开启windows高级防火墙,在网络连接处右键鼠标,有弹出 ...

  4. windows防火墙打不开的处理办法

    一.防火墙配置出错 开始-->运行-->gpedit.msc 这时,打开了组策略 在左面分级展开 计算机配置-->管理模板-->网络-->网络连接-->Window ...

  5. 针对 SQL Server 2008 在Windows Server 2008上的访问配置 Windows 防火墙

    现在Windows Server 2008 服务器用的越来越多,2008的防火墙比2003的有了很大的增强,安全性有了更大的提高. 甚至80端口的出站默认都是被关闭的.所以如果在2008Server上 ...

  6. windows防火墙添加规则

    #include <windows.h> #include <crtdbg.h> #include <netfw.h> #include <objbase.h ...

  7. windows防火墙无法启动,服务不存在

    系统的防火墙无法启动,系统服务里面也没有防火墙的服务,用下面第一种方法,导 入注册表,重启服务器,在服务里面有防火墙的服务了,然后启动就好了,需要重新配置防火墙 在控制面板中启动防火墙的时候提示无法识 ...

  8. 通过配置Windows 防火墙允许使用TCP/IP协议远程访问数据库

    原文:通过配置Windows 防火墙允许使用TCP/IP协议远程访问数据库 本文适用于:2005.2008.2008R2所有版本 为了可以通过TCP/IP协议远程访问SQLServer数据库,需要做以 ...

  9. SQLServer2008开放windows防火墙配置

    为了可以通过TCP/IP协议远程访问SQLServer数据库,需要做以下几点: 在SQLServer所运行的服务器上,我们必须找到SQLServer所侦听的端口然后添加到WIndows防火墙的[允许入 ...

随机推荐

  1. 子shell以及什么时候进入子shell

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 子shell的概念贯穿整个shell,写shell脚本时更是不 ...

  2. 分布式版本控制系统GIT的使用

    一.什么是Git Git是一个分布式版本控制系统,Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异(如CVS.Subver ...

  3. T-SQL:谓词和运算符(六)

    谓词一般有 where和having,check  谓词只计算 TRUE ,FALSE或者UNKNOWN  逻辑表达式  如 AND 和OR 1.IN 谓词的用法 SELECT orderid, em ...

  4. c#实战开发:以太坊钱包对接私链 (二)

    上一篇讲了 以太坊私链搭建 首先下载Ethereum Wallet 钱包 可以直接百度 下载如果直接打开它会默认连接公链 所以我们要通过命令打开 "F:\Program Files\Ethe ...

  5. Java事件处理机制(深入理解)

    本文是关于Java事件处理机制的梳理,以及有重点的介绍一些注意点,至于基础的概念啥的不多赘述. 一.Java事件处理机制初步介绍(看图理解) 根据下图,结合生活实际,可以得知监护人可以有多个,坏人对小 ...

  6. Mybatis 与hibernate

    共同点 (1)Hibernate与MyBatis都是通过SessionFactoryBuider由XML配置文件生成SessionFactory,由SessionFactory 生成Session,由 ...

  7. Is the “*apply” family really not vectorized?

    Question: So we are used to say to every R new user that "apply isn't vectorized, check out the ...

  8. Python 简单的文件上传功能

    简单地在程序当前目录下上传一张图片: 1.png 到程序的 yuan 文件夹下.这里使用的是固定参数 post,如果后期有需求,可以增加判断来更加完善程序. # server 端 import soc ...

  9. linux定时任务调度定系统——opencron

    linux定时任务调度定系统——opencron https://gitee.com/terrytan/opencron/#%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83 一 ...

  10. 听说你还不会用Dagger2?Dagger2 For Android最佳实践教程

    前言 Dagger2是现在非常火的一个依赖注入框架,目前由Google维护,在Github上面已经有12K star了.Dagger2的入门门槛其实是比较高的,据了解,目前有很多Android工程师对 ...