近期,我们邀请资深安全专家在“金融业企业安全建设实践”微信群、实践2群、读者群,进行在线直播分享系列。本期我们邀请到的嘉宾是陈然。如需查阅更多嘉宾分享,请关注本公众号。

【活动预告】内网安全攻击模拟和异常检测规则实战

【分享嘉宾】陈然

【嘉宾简介】陈然(b0b@c),任职于某安全公司网络安全部,负责内部安全异常检测规则,包括内网渗透、威胁情报、攻击模拟、攻击特征提取、检测规则工程化,目前致力于在安全运营框架下,构建基于ATT&CK模型的实战攻击模拟和检测能力。

【活动时间】5月15日周五晚上19:00-20:00,60分钟。

【活动形式】嘉宾通过文字形式,在“金融业企业安全建设实践”、“企业安全建设实践2群”微信群内就“内网安全攻击模拟和异常检测规则实战”话题直播分享(约四十分钟),之后是互动提问和回答(约二十分钟)。

请大家安排好时间,准备好问题,积极参与。


下是实录:

大家好,我是陈然,目前在公司网络安全部负责Threat hunting团队,很高兴有机会和大家分享

随着现在国家越来越重视信息安全,大型的“护碗”越来越多,也越来越逼近实战,企业或者相关的组织机构也对这种实战化的安全对抗越来越重视。

我们建立起内部安全的安全运营体系架构后,安全事件经历顶峰后再次跌落到一个低谷。原因也很简单,随着我们发现了一些基础的安全问题后,该补漏洞就补漏洞,该限制访问就限制访问,该处罚违规就处罚违规,基础的一些安全攻击已经被我们发现和拦截了。

但是我们真的安全了吗?

最近两年我们开始在内部进行常态化安全红蓝对抗,红队有我们专门承担攻击任务的安服团队,也有我们内部安全的模拟攻击队(虚拟红队),前者更多是全阶段攻击模拟:侦查范围、定位目标、设计攻击方案、实施攻击、达成目的;后者更多是分阶段攻击模拟:模拟某一个或者某几个具体的TTPs,比如测试T1075– Pass the Hash的横向移动在目标机器上正常执行。通过不断的真实对抗,我们还是发现了很多问题,我们的网络与信息系统依然面临着不少风险,也存在着一些问题。

不得不说,攻击队师傅们的手法非常精妙啊,例如代码审计出应用0day、权限维持框架工具重写、各类白利用内存执行绕安全工具等等,思路也是清奇:从地下车库或者角落里翻窗进入大楼啊,买一箱子零食绕保安进入公司、发邮件控终端耐心摸清上下游再脱域拿域管账户... 我们也是在一次次抵抗中不断复盘总结,吸取经验教训。

我们的安全运营的监控体系在提升了覆盖率和正常率之后,却遇到了发现能力瓶颈,有价值的安全事件越来越少,为什么?经过思考,我们得出答案:

我们的监控体系在对抗一些高水平的攻击手段上,现有的一些规则是不够的。

陈然

  • 我们安装了WAF,网站日志也接进来了,怎么进入内网的?

答:钓鱼进来的啊!

  • 我们在员工电脑上进来是普通用户,搞不了事情啊?

答:人家用白利用的提权方法!

  • 什么我们的EDR没有监控到对方提取凭据,为什么?

答:人家直接在内存DUMP的!

  • 安装了卡巴斯基,专治内存攻击手法的,没拦住?

答:底层DLL和驱动已经被替换了!

  • 怎么一条日志没有?

答:日志进程被Hook了啊!

当攻击技术能力超越你的防御检测设备检测能力的时候,整体安全能力就被限制了。所以需要提高我们对攻击的了解程度,研究攻击的原理,模拟攻击的进行,提炼出检测规则,去切实提高实战对抗的能力。

谈到攻击,首先我们想到的是啥?对,没错,就是ATT&CK这个矩阵图,但是这个东西真的太全了,太完整了,太复杂了。所以我们需要模仿ATT&CK建设一个自己的作战地图。根据我们自己的资产的现状,结合我们自己渗透的经验,加上和大家一起头脑风暴,我们构建了自己的作战地图。

我会发一下作战地图的图片,给大家一点点时间,看一下,可能比较长,后面有兴趣的可以慢慢看。(图片过大无法上传公众号,链接:https://pan.baidu.com/s/1YiKfuN-YiktMDaHAWUg3WA 密码:u71w)

从渗透的阶段来讲,大概可以分为一下几个阶段

由于现在网络边界的检测大家都很重视,WAF或者IPS/IDS一类的设备也很多,在缩小攻击面这件事上大家也都很努力的去做,所以边界攻击的检测相对是充足的,缺乏的是在突破边界后的检测能力,于是我们重点选取了以下几个阶段,进行攻坚。

初期我们做了这几个领域:

  • 权限提升

  • 权限维持

  • 凭据窃取

  • 横向移动

在这几个领域举几个例子:

1、权限提升

我们来看看MSF的Meterpreter中的GetSystem,我们知道这个命令可以用来提权,但是为什么呢,怎么检测呢?

  • 可以看到GetSystem的基本原理流程,GetSystem创建一个新的Windows服务,并将其设置为连接命名管道时以SYSTEM身份运行。

  • GetSystem生成一个进程,该进程会创建一个命名管道并等待来自上述服务的连接。

  • Windows服务启动,连接到命名管道。

  • 上面生成的进程接收连接,并调用ImpersonateNamedPipeClient,这样就会为SYSTEM用户创建一个模拟令牌。

然后,我们只需用新收集的SYSTEM模拟令牌生成cmd.exe,这样,我们就获得了一个具有SYSTEM权限的进程。

当然,这里涉及到一个Windows用户模拟的概念:Windows操作系统允许一个进程模拟另一个用户的安全上下文,安全上下文当初当然包括权限。例如FTP账户启动的FTP服务进程可以模拟用户USERA的权限去访问一个文件夹,提供读写功能等。

https://docs.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-impersonatenamedpipeclient?redirectedfrom=MSDN

于是我们知道这个提权的关键点在于管道PIPE,庆幸的是,经过测试我们可以找到相关的特征,于是规则也就可以做出来了。

2、BypassUAC

这个我们是根据MSF的源代码进行一些分析,我们可以很轻松的在Rapid7的GitHub账号上找到开源的MSF的1代码。

我们随机提取一个Injection的例子,我们再来看看他的描述

这里用到了Windows下的内存对抗技术,反射性DLL注入,什么是反射性DLL注入呢?

我们先来说说进程注入,注入恶意Payload:

  • OpenProcess 可以打开目标进程

  • VirtualAllocEx 在目标进程中分配一块内存区域

  • WriteProcessMemory 在刚刚分配的内存区域中写入恶意的Payload

以上3个函数可以实现Payload的注入,这些都是Windows的一些API。

再来看看反射DLL注入(这个DLL可以是本地的,也可以是网络的):

  • 使用RWX权限打开目标进程(OpenProcess),并为该DLL分配足够大的内存(VirtualAllocEx)。

  • 将DLL复制到分配的内存空间(WriteProcessMemory)。

  • 计算DLL中用于执行反射加载的导出的内存偏移量(GetReflectiveLoaderOffset)。

  • 调用CreateRemoteThread(或类似的未公开的API函数RtlCreateUserThread)在远程进程中开始执行,使用反射加载函数的偏移地址作为入口点。

  • 反射加载函数使用适当的CPU寄存器查找目标进程的进程环境块(PEB),并使用它查找内存中的地址kernel32.dll以及任何其他所需的库。

  • 解析的KERNEL32出口目录中找到所需的API功能,如内存地址LoadLibraryA,GetProcAddress和VirtualAlloc。

  • 使用这些函数,然后正确加载DLL(本身)到内存中,并调用它的入口点,DllMain。

所以我们需要使用EDR 去Hook这些关键的函数,然后利用获取到进行注入的源进程名、目标进程名去判断,有大厂背书签名的,自己注自己的(比如Google的Chrome)的暂且放过,剩下的就可以去排查排查。

当然,这样也有问题,如果签名被盗用怎么办?如果大厂软件程序被感染怎么办?这就需要依赖其他规则去检测这几方面的问题了。

然后我们说下权限维持中的例子。

3、Windows Library-MS持久化

这个东西的典型例子是我的文档,他不是一个文件夹,本质是就是这样一个XML文件。

这个利用过程如图:

我们可以添加一个CLSID,里面有一个URI 写到XML里面。

根据这个URL的位置改成自己恶意程序注册的那个就可以了,下次用户打开这个XML对应的路径就可以引起你的后门上线。

这个注册是要在注册表里生成新的键值的,所以还是要监控注册表。

4.凭据窃取。

大家都知道一个很常用的叫做Mimikatz的凭据提取工具,大部分杀软对这个程序都是查杀的。

但是如果对方使用的是PowerShell版本的 VBS版本/JS版本/C#版本的Mimikatz,还有多少能查杀呢?

如果对方并没有上传Mimikatz,而是直接任务管理器转存了lsass.exe的内存,Dump下来,在攻击者本地上跑Mimikatz,那是不是我们就无能为力了?

大家如果是Windows机器,可以打开任务管理器,找到lsass.exe进程,右键都会有一个转储功能。会生成一个文件,攻击者拖回去,就可以拿到账号对应的密码或者密码的Hash值。

为了应对这个问题,我们是这么解决的:

监控所有针对lsass.exe进行Dump行为的程序,当然或者Winlogon这个进程,因为这两个进程都是存储Windows凭据的地方,尤其是lsass.exe。

然后去日志里面收集所有有过相关操作的进程名称,经过筛选后设计了一个白名单,凡是在白名单中的进程Dump Lsass进程的内存,我们就忽略,否则就报警。

这样无论你是什么编程语言修改后的Mimikatz,或者哪怕你不是Mimikatz,你是Kekeo、Rubeus、ProcDump等等,只要你尝试读取关键进程的内存,我们都会告警。

再举一个横行移动的例子吧,说个简单些的PsExec,利用一些网络流量特征、注册表特征,可以轻松的获取特征。

PsExec本质上是一个MSRPC调用的过程,例如psexec.exe \\xxxxxx xxxxx

Psexec 首先向EPM服务也就是135端口发起一个查询,查询到SCMR ncacn_ip_tcp用到的Endpoint ,会获取到一个端口,然后连接这个端口进行BIND,调用这个端口的开放的接口函数,创建远程的服务,或者执行一些命令获取结果。这个过程势必要要改动注册表。

我们进行绕过测试,在客户端把PsExec改成中文且去掉了文件属性,我们还客户化了目标服务名称,发现目标服务的文件属性还是会有原来的属性,而且注册表的关键字不受影响。

特征很明显。此外由于这个网络通信近乎于明文,在流量上检测,也是很可行的一种方法。

但是这类工具有很多新的演变,例如smbexec.py等,使用了SMB3.0协议后,很多通信内容进行了加密,在流量侧进行检测,就难度很大了。

我们总结一下,虽然攻击技术各有各的实现原理,但终归还是利用操作系统自己设计机制的一些脆弱性,从攻击检测的角度来讲,我们还是要把检测点更加贴近这些机制的,而不仅是使用一些进程信息、网络连接信息这些相对容易被篡改的地方,例如:

  • 监控一些重点注册表项,尤其是关于注册COM组件的地方和一些关于服务启动过程中会带起的一些进程的地方(俗称白利用)。

  • Hook一些关键的系统API调用,例如在ALSR场景下导出具体函数或者模块地址的API,以及那些和注入相关的API。

  • 关注一些重点进程及其相关服务的异动,例如lsass.exe的Dump行为等等、或者一些高权限进程或服务对管道的连接。

顺便提一句,最近比较火的pipePotato提权,也利用了管道方面的技术,管道检测可以作为参考。当然,对于由于漏洞引起的一些攻击行为,修复漏洞是最好的防御手段。

由于时间所限,不能分享每一个技术点的检测方式,但基本思路都是类似的,实战攻击-提炼异常特征-制定规则-工程化。

期待与大家多多交流,共同进步,谢谢大家。

提问环节

Q:感谢分享,都是精华。有个疑问请指教,对于API、注册表等的一些Hook、监控,杀毒软件应该可以实现一部分吧,杀软覆盖可能不全。

A:杀软、主防、HIDS都可以实现一些,不过可能没办法自己添加规则,很全的目前还比较少见。

---------------------------------------------------------------

Q:你们是到了内核层么?天擎EDR+Sysmon(有用么) ?

A:Hook了一些内核函数吧。

---------------------------------------------------------------

Q:感谢,还想请教您前面提到的类似“我安装了卡巴斯基,专治内存攻击手法的,没拦住?答:底层DLL和驱动已经被替换了!”如何解决的?

A:本质上是动lsass.exe,我们现在把所有动lsass.exe的进程全部提取出来,去对照白名单。

---------------------------------------------------------------

Q:域特有的规则集呢?比如不从终端拿Hash密码,DCSyncDump。

A:基于流量的NTA的设备可以直接检测DCSync,内部也是这么用的。

---------------------------------------------------------------

Q:大佬再问一个问题,你们Win建模的维度有哪些哦?

1. 进程

2. Win事件日志

3. 网络流量(本机 NIDS)

4.注册表等?

A:这些事都包括的,还有服务、管道、如果后面发现了更多的,就继续完善。

---------------------------------------------------------------

Q1:ATT&CK攻击模型描述的有些范,各家理解都不一样。

A1:所以一开始我们弄了一个自己的地图

Q2:那就是大家追求的指标不是覆盖率,那是啥?可测评的覆盖率?

A2:我看到里面还有音频视频攻击,可能和不少企业的业务都不相关,所以这种覆盖率没必要追求吧,优先搞和自己相关的。

---------------------------------------------------------------

Q:发现一个现象 ATT&CK攻击模型大家聊的大部分都是Windows Linux说的很少,现在企业部署的应用80%都是Linux承载 搞的这个事就成了噱头了 不解决实际问题

A:也有很多公司线上业务少,办公网占比可能比较大。

补充:实战对抗时,Windows被突破的比较多。不是Linux多就是问题的关键点。被暴打被撕开的点,除了远程RCE,就是终端。

---------------------------------------------------------------

Q:感觉大部分还是依靠攻击的行为来分析,但是这个东西对于大部分企业来说维护有点困难啊,变形也很多!之外有没有可其他方式呢?还有一个就是现在中小企业Linux居多这块有好点检测规则之类的东西嘛

A:Linux多用在机房吧,这边主要还是针对办公内网等进行的一些,Linux其实思路也差不多,通过攻击复现的方式查找思路,Liunx的日志比Windows好很多,其实相对更容易些。

补充:其实刚才陈然也讲到很多,攻击要分析到原理层。像是我们针对Lsass的权限申请或者内存读取,达到了以不变应万变的凭据提取攻击。无论是怎么样的凭据提取攻击,原理到最后都是要读这个Lsass认证进程的内存。监控到这个核心行为就好。

---------------------------------------------------------------

Q:陈总,好。在分配的内存区域中写入恶意的Payload,是否需要具备一定的前置条件?

A:需要读写权限,对应进程内存的读写权限。但是如果没有对应进程的读写权限,也有办法,可以开一个线程执行你上传的Payload。但是只杀要有创建进程、线程的权限。

---------------------------------------------------------------

Q:陈总,请问您关于日常运营告警数量级是怎么样的,另外,有没有技巧来快速判断。

A:单条数量级一般是有要求的,比如每天不能超过10条或者20条,当然也需要根据告警对应的攻击造成的影响和后果判断,总量肯定是考虑团队承受程度。

---------------------------------------------------------------

Q:在护碗行动中利用终端攻击的比例大概有多少?

A:比例不好说,但概率是100%,一方面是正面打线上系统,另一方面就是打终端然后打域控等核心拿内网。

---------------------------------------------------------------

Q:我也有这个感觉,案例十分精彩,但是一下子深入到了某一个漏洞,在补丁尚未出来之前,那真的就是靠行为,攻击队的技术能力超过检测能力的时候确实就发现不了,而企业有比较大的概率无法超过攻击队,比如说即使是红蓝对抗成熟的企业,肯定也有没掌握和不曾被发现的手法,难道就做不了防御了么?显然不是的,再以金融为例,也可能会以白名单进程、白名单网络、黑名单行为等等弥补措施来护碗,在这个方面,陈师傅有没有尝试过在某个漏洞之上一层,想过这样的痛点或者建议,就是即使攻击队掌握了0day,攻击手法没有被发现,只要做到了某些层面,也能发现和应急。

A1:规则不可能解决所有攻击,比如PTH就很难,但是异常行为模型可以,你的ip不是这个账号,你今天认证了这个账号就有问题,需要互补。

打内网的目的并不一定是为了打域控,攻击的本质是信息收集、分析和关联,而传统内网里的敏感信息最多。打内网的话找数据更能得利,还不易被发现,只是说护碗而言终端分太低了,和域控这种核心相差几百倍。

我们有一点恶意行为的监测,思路不大一样,倒不是去监测未知的攻击手法,而是做了些行为分析。攻击者通过位置手段控制了一个终端,他总要干些坏事啊,在内网Wiki搜密码,在内网IM搜密码,用自己账号试着登陆些公司内部IT系统。假如这个用户在非常用时间非常用地点 非常用IP段登陆系统,或者短时间大量风险行为,我们也有模型告警。

打内网的目的并不一定是为了打域控,攻击的本质是信息收集、分析和关联,而传统内网里的敏感信息最多。

声明:本文来自君哥的体历,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。