Covenant C2源码调试分析-Grunt

Covenant C2源码调试分析-Grunt

在上篇Covenant创建Launcher时,我们就获取到了Grunt的源码。本篇我们来调试一下Grunt的源码,了解其工作过程。

Grunt工作流程

经过我前期的调试大概了解了一下Grunt的主要工作内容,因为Covenant使用的是非堆成加密,所以Grunt的主要工作就是先进行密钥的交换进行身份验证,然后加载ExecuteStage。

通信过程如下图:

image-20200425223213884

源码分析

Grunt身份验证密钥交换过程分为Stage0、Stage1、Stage2三个步骤。三个步骤的通信内容如下:

  • Stage0:Client提交Rsa密钥,Server使用Rsa密钥加密下发协商密钥
  • Stage1:Client使用协商密钥加密挑战密钥C1发起身份验证请求,Server使用协商密钥加密返回挑战密钥C1+C2
  • Stage2:Client使用协商密钥加密挑战密钥C2,Server解密后验证C2一致则完成认证,返回ExecuteStage

Stage0:

  1. 将预设的共享密钥是作为AESKEY

    image-20200425225309663

  2. 使用共享密钥加密RSA密钥,发送给服务器

    image-20200425225604567

  3. 揭秘获得RSA密钥,并创建协商密钥

    image-20200425225742110

  4. 使用RSA密钥加密协商密钥,发送给客户端

    image-20200425225941487

  5. 客户端收到后解密,获取协商密钥将其作为AES加密密钥

    image-20200425230217162

Stage1:

  1. 客户端使用协商密钥加密4位挑战密钥发送给服务器

    image-20200425230336071

  2. 服务器收到挑战密钥1后新增挑战密钥2,将1、2密钥拼接发送客户端,进行身份认证

    image-20200425230624103

Stage2:

  1. 客户端收到回复后解密信息,验证密钥1是否一致,将挑战密钥2发送给服务器,进行身份认证

    image-20200425230915567

  2. 服务器收到客户端挑战密钥2后进行验证,如果通过,则调用编译ExecuteStageAPI返回ExecuteStage代码

    image-20200425231155096

  3. 客户端收到ExecuteStage后进行内存加载

    image-20200425231439675

总结

本次的源码分析只给出了最核心的密钥交换、身份验证、ExecuteSatge加载过程。其实在分析的过程中还牵扯到框架内互相调用的过程、API的调用、code是如何替换编译的等等,等后期分析完源码后我会写一个Convnant的架构图,可以更清晰的快速了解架构调用逻辑。本人也没有系统的学习的C#在分析代码的过程中,花了一些力气才完全弄懂,心情舒畅了很多。