前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >魔改 CS 加载 mimikatz 模块-bypass莫60核晶

魔改 CS 加载 mimikatz 模块-bypass莫60核晶

作者头像
Gamma实验室
发布2022-12-02 16:13:38
1K0
发布2022-12-02 16:13:38
举报

前言

今天无意看到了这个:

现在公开了,本来我还想留着hw用来着,之前我在创建吐司账号的时候就在论坛中发过,链接:https://www.t00ls.cc/thread-65597-1-1.html

当时是改cs4.2实现bypass360核晶的功能,现在看到cs官网已经更新,所以我也就把改功能的原理说一下,这里只是讲一个功能点,大多数功能点都能这样改。

经过实际测试,360 核晶模式下,是没有对 lsass 进程进行保护和检测的,所以我们的 打开 lsass 进程句柄这种操作是不会被检测到了,只要能正常执行的 mimikatz(pe 或者更 改源码达到文件 bypss 能执行起来)是正常能抓到的,也不会爆毒,但是 cs 默认的 logonpasswords 命令是会被拦截的,也就是会弹框,原因是 cs 中默认的 mimikatz 他的执行 是通过反射到 rundll32 这个进程中执行,这种新起进程的,反射行为正对 360 拦截的规则, 在实际的测试中,在 360 物理核晶的模式下,注入自己进程的进程是不会拦截的,所以这里 就想着把 logonpasswords 的执行代码给替换了,rundll32 spawn 反射执行 改成 inject 反 射,起到 bypass 的作用。

源码分析

从 cs 中的源码分析,logonpasswords 命令模块执行流程如下:

执行函数 LogonPasswords:

然后:

然后:

然后:

然后:

Spawn 方法源码:

Inject 方法的源码:

具体实现如上,反射执行 dll,这里他默认是会派生一个 rundll32 进程,这里就有特征,这 里就会被拦截,所以我们不能用 spawn 这个方法,我们改用 inject 这个方法,其实 inject 方 法在实现上是没有太大区别,就是一个默认派生一个,一个直接注入进程,实际上改了之后, 是可以完成相应的功能的。

从实际的测试效果,用 inject 注入到当前进程是不会被拦截的,那么我们是否把 cs 中缩减 版 dll 直接注入到当前进程勒?可以,且实现能正常抓出密码,但是执行完进程就退出了, 进一步排查时 dll 的问题。

把 MImikatzSmall 方法直接改成如下就行了:

public void MimikatzSmall(String var1) {
  for(int i = 0; i < this.bids.length; ++i) {
    BeaconEntry Session = DataUtils.getBeacon(this.data, this.bids[i]);
    int PID = CommonUtils.toNumber(Session.getPid(), 0);
    if ("x64".equals(Session.arch())) {
      (new MimikatzJobSmall(this, var1)).inject(PID, "x64");
      // (new MimikatzJobSmall(this, var1)).spawn(this.bids[i], "x64");
    } else {
      (new MimikatzJobSmall(this, var1)).inject(PID, "x86");
      // (new MimikatzJobSmall(this, var1)).spawn(this.bids[i], "x86");
    }
  }
}

解密 dll 文件,然后 ida 打开

退出函数二进制代码就这一段

64 位对应的不一样

32 位对应的二进制代码:FF 15 A0 31 02 10

64 位对应的二进制代码: FF 15 52 08 02 00

FF 15 对应着 call 代码 后面跟着退出进程函数的地址

直接 nop 指令换掉 90

改了,看似行了,实则不行还是该退出就退出,因为不止这一个函数有退出,不知道具体是哪个函数,只能把所有退出的地方都给他改了,直接看函数调用,找到所有地方,全改了。

但是全改进程会崩掉的,这里调试崩掉的地方

其实这里已经崩掉了,正常的流程是直接执行 exitprocess 结束当前进程,但是我把他改成 nop,然后直接滑到了异常处理点 int 3。

我现在有两种思路,要么让把 rip 地址改到初始化模块地址去重新上线一次,但是有重定位 的困难,要么跳到就初始化 becaon 模块那里,但是得恢复堆栈状态,且也有重定位的烦恼。之前的堆栈状态:

执行之后的堆栈状态:

有限的地址空间,去恢复堆栈状态不太可能,然后从大哥那里了解到一种方法,winhex 打 开直接去改二件文件的 Exitprocess 字符 直接改成 ExitThread,把 cc cc 我也改成 00 00 了 以防再蹦,这里 ida 再打开,就会发现直接调用 ExitThread 函数了,直接更改了符号表,这 波操作属实牛逼。

后续再次尝试

成了,那么可以看看 360 核晶状态的效果咋样了

END

看完记得点赞,关注哟,爱您!

请严格遵守网络安全法相关条例!此分享主要用于学习,切勿走上违法犯罪的不归路,一切后果自付!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Gamma安全实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 源码分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档