上文,我们详细介绍了在LDAP属性的命令和控制过程中所遇到的一些问题,本文中,我们会接着介绍解决这些问题的办法。
消息响应
如果我们通过LDAP发送消息,我们将不知道该消息是否已正确接收以及在传输过程中是否保持了完整性。要知道是否已正确接收到消息,需选择另一个属性(与数据属性完全相同)来交换有关该消息的信息。在此属性中,CRC校验和被存储并被用于验证是否已接收到正确的消息。
为了在两个客户端(Alice和Bob)之间发送消息,Alice首先计算要发送的消息的CRC值,然后再通过LDAP将消息发送给Bob。Alice将其发送给Bob后,将监视Bob的CRC属性,以查看它是否包含数据。如果它包含数据,Alice将验证数据是否与它自己计算的CRC值匹配。如果匹配,Alice将知道消息已被正确接收。
如果不匹配,Alice将在100毫秒的时间间隔内等待1秒,直到Bob发布正确的CRC值。
接收端的过程要简单得多,在接收到新消息后,将计算CRC并将其写入CRC属性,然后将处理该消息。
碎片化问题
我们需要克服的另一个挑战是,属性的最大长度可能会小于将通过LDAP发送的消息的长度。因此,超过该属性最大长度的消息需要进行分段。
消息本身包含实际数据、部件数量和用于跟踪的消息ID,这被编码到base64字符串中,这将增加33%的额外开销。
然后将消息分割成适合属性的片段,为此,我们需要知道可以在该属性中存储多少信息。
每个属性都有不同的最大长度,可以在Active Directory架构中查找。下面的屏幕快照显示了信息属性的最大长度,即1024。
在工具开始运行时,将保存属性信息,例如属性的名称和最大长度。该属性的最大长度用于将消息分段成正确的大小,以适合该属性。如果数据属性的最大长度为1024字节,则1536消息将被分为1024字节消息和512字节消息。
在接收到所有片段之后,这些片段将被放回原始消息中。通过使用CRC,我们可以通过LDAP发送大文件。根据所选数据属性的最大长度,通道的传输速度可以是慢的,也可以是正常的。
Autodiscover
LDAP通道的工作取决于用户帐户,最好不要静态配置帐户,因此我们需要一种让客户彼此独立地找到对方的方法。
我们的最终目标是在LDAP上路由Cobalt Strike信标,Cobalt Strike有一个实验性的C2接口,可以用来创建自己的传输通道。外部C2服务器将根据请求创建DLL可注入有效载荷,可以将其注入到进程中,该进程将启动命名管道服务器。可以配置管道的名称以及体系结构。具体信息,请点此了解。
到目前为止,我们已经收集了以下信息:
· 8字节:数据属性的哈希;
· 8字节:crc属性的哈希;
· 8字节:域控制器FQDN的哈希;
由于管道的名称以及体系结构都是可配置的,因此我们需要更多信息:
· 8字节:系统架构的哈希;
· 8字节:管道名称;
系统架构的哈希与数据、CRC和域控制器属性以相同的方式收集,管道的名称是由八个字符组成的随机字符串。所有这些信息都被连接到一个字符串中,并发布到我们前面定义的占位符属性中:
· primaryInternationalISDNNumber
· otherFacsimileTelephoneNumber
· primaryTelexNumber
该工具将在Active Directory域中查询其中每个属性之一包含数据的帐户。如果找到并成功解析,则两个客户端都可以找到彼此,但也知道在该过程中使用了哪个域控制器,哪个属性将包含数据,哪个属性将包含接收到的数据的CRC校验和,以及使用Cobalt Strike的外部C2侦听器创建有效载荷的参数。此过程之后,该信息将从占位符属性中删除。
到目前为止,我们还没有对客户进行区分。为了使用Cobalt Strike,你需要一个允许创建出站连接的工作站。该工作站可以用作植入物,以将通过LDAP的流量路由到另一个不允许创建出站连接的工作站。在视觉上,它是这样的。
假设我们的工具在A段和B段中运行Alice和Bob,通过LDAP进行通信并使用Cobalt Strike生成有效载荷所需的所有信息已经在Alice和Bob之间共享。Alice会将这些信息转发给Cobalt Strike,并将收到一个自定义有效载荷,它将通过LDAP将该有效载荷传输给Bob。 Bob接收到有效载荷后,Bob将启动一个新的挂起的子进程,并将有效载荷注入此进程中,此后,命名管道服务器将启动。现在,Bob连接到指定的管道服务器,并通过LDAP将来自管道服务器的所有数据发送到Alice,而后者又将其转发给Cobalt Strike。来自Cobalt Strike的数据将发送到Alice,它将通过LDAP将其转发给Bob,此过程将一直持续下去,直到命名管道服务器终止或由于任何原因导致其中一个系统不可用。为了在良好的流程流中可视化这一点,我们使用了外部C2规范文档中提供的出色格式。
当一个新的SMB信标在Cobalt Strike中生成后,你就可以像平常一样与它互动了。例如,你可以运行MimiKatz来转储凭证、浏览本地硬盘驱动器或启动VNC流。
目前,该工具已成为开源工具,源代码可以在这里找到。
该工具易于使用,指定cshost和csport参数将使该工具充当代理,该代理将数据往返于Cobalt Strike。如果使用集成的AD身份验证,则无需指定AD凭据。你可以在Github页面上找到更多信息,请注意,默认的Cobalt Strike有效载荷将被现代杀毒软件捕获。不过,如何绕过杀毒软件,则超出了本文章的范围。
为什么要使用C2 LDAP通道?
这种解决方案非常适合这样一种情况,即网络段完全被分割并具有防火墙,但仍然共享相同的Active Directory域。如果你设法获得这些网络中的系统上的代码执行特权,使用此通道,你仍然可以创建一个可靠的后门通道,以连接到其他网络无法访问的内部网络部分。根据所选择的属性,速度可以接受,但仍然不及旧的反向HTTPS通道。此外,不需要特殊特权,并且很难检测到。
缓解措施
为了检测这样的LDAP通道,需要首先确定一个检测标准。这意味着你需要知道有多少流量被认为是正常的、流量的类型等。识别了这些信息之后,你就可以过滤掉这些异常,比如:
1. 从客户端到域控制器的异常流量;
2. 对AD对象的大量更改,因此可以监视域控制器上的事件ID 5136;
3. 启用并检查LDAP日志记录,有关如何执行此操作的更多信息,请参见这篇文章;
4. 使用Microsoft的高级威胁防护,它具有一些简洁的功能,可以更轻松地检测恶意LDAP查询。有关更多信息,请参阅这篇文章。
回顾本文前面提到的三个静态占位符的用法似乎也不错,但是,这将是基于已发生的攻击的预防,因为攻击者很容易使用不同的属性绕过既有防御,如果攻击者更改属性,这种补救策略就会失效。
本文翻译自:https://blog.fox-it.com/2020/03/19/ldapfragger-command-and-control-over-ldap-attributes/如若转载,请注明原文地址: