遮天2.0内核解析

admin 2023年2月24日11:04:27评论81 views字数 1898阅读6分19秒阅读模式

  遮天2.0内核解析


 时间飞逝,从1.0发布到3.0,刚好一年时间。1.0版本作为入门学习抄的loader模块,在此基础上定制了其他功能,满足一些需求。

 通过1.x版本也结识了一些朋友,一时也舍不得将项目就此结束,于是便有了2.x、3.x。

遮天2.0内核解析


 遮天3.0上线,使用在线生成方式,新增隐藏窗口、BypassUAC、反沙箱模块,域名:zTian.red


 2.0版本主要使用了两个技术:动态代码执行和PE模板生成。


 先说说动态代码执行技术,此技术是脚本语言常用,如php的eval函数,可以将字符串当成php代码执行。一句话木马原理如此。

 作为静态语言,go官方没有该技术的实现,但是社区提供了解决方案:github.com/traefik/yaegi

遮天2.0内核解析

 官方定义Yaegi 是一个优雅的 Go 语言解释器,可以执行 Go 脚本和插件。

特性
  • 完整支持 Go语言规范

  • Go编写,只使用标准库

  • 简单的解释器API: New()Eval()Use()

  • 只要能运行Go的地方就可以运行Yaegi

  • 所有Go和运行时资源都可以在脚本中访问

  • 安全:默认不使用和输出 unsafe  syscall 

  • 支持Go 1.18Go 1.19(最新的2个主要版本)

示例:

遮天2.0内核解析

 运行后会输出Kung-Foo。根据此逻辑,实现加载器完整代码:

遮天2.0内核解析

 Ps变量保存ShellCode的base64字符,temp存放的是shellcode    Loader加载代码,同ZheTian v1。解密之后内容如下:

遮天2.0内核解析

 以上就是核心加载代码逻辑,通用模板实现完成。

 PE模板生成技术主要基于修改HEX。先创建个Go项目,创建一个变量在控制台打印。

遮天2.0内核解析

 打包项目成可执行文件之后在命令行运行,打印了helloWorld。

遮天2.0内核解析

 使用分析工具CFF    Explorer打开PE文件,然后选择Hex编辑器搜索helloworld,找到对应hex字符串68656C6C6F576F726C64

遮天2.0内核解析

 使用代码读取文件内容尝试匹配字符串

遮天2.0内核解析

 运行结果,成功找到。

遮天2.0内核解析

 新建个字符串,长度要求和helloWorld一致

遮天2.0内核解析

 空格会被转为20,所以长度一致

遮天2.0内核解析

 
先读取 main.exe的二进制内容,再转换为十六进制

file, err := ioutil.ReadFile("C:\Users\29326\Desktop\main.exe")
if err != nil {return}
hexContent := hex.EncodeToString(file)
 
判断hexContent里是否包含helloWorld的十六进制

strings.Contains(hexContent, strings.ToLower("68656C6C6F576F726C64"))

将hi HeartsK的内容转换十六进制,然后替换helloWorld。

txtHex := hex.EncodeToString([]byte("hi HeartsK"))
hexContent = strings.ReplaceAll(hexContent, strings.ToLower("68656C6C6F576F726C64"), strings.ToLower(txtHex))
 将替换好的hexCount转换进制,然后写出exe即可。完整代码如下

遮天2.0内核解析

 运行后结果达到预期效果,成功输出"hi HeartsK"

遮天2.0内核解析

 基础修改模块完成之后,开始做一个通用payload生成器。

 结合第一篇动态加载技术修改,只需要在生成器处理ps变量即可

遮天2.0内核解析

 先将shellcode转为base64

遮天2.0内核解析

 再将模板里的ps变量复制一份,然后转换为hex

遮天2.0内核解析

 一般shellcode长度都不一致,这个ps变量是随机生成的10000长度的字符串

遮天2.0内核解析

 一个字符是两个数字组成,如空格是20,a是61,所以一万个长度的字符可以存储长度约为两万的shellcode。

 循环替换shellcode,key是十六进制,而pyload是base64字符串,所以要除以二得到字符串长度。这个5 是占位符的长度:{-$-}

遮天2.0内核解析

 计算相差,如果ps变量的长度大于shellcode+五个字符的长度,则在shellcode后面拼接7b2d242d7d,也就是{-$-}。

 如果相差十,则在shellcode拼接十个00作为占位符,以使最终的shellcode长度和ps变量相等。

 处理完shellcode之后就可以如上操作,替换了并写入新文件了。

遮天2.0内核解析

 模板操作要多加一步骤,截取shellcode中的{-$-},将之后的00给丢弃。

遮天2.0内核解析

 文章结束,源码同步github.com/yqcs/zhetian,已公开。

原文始发于微信公众号(Th0r安全):遮天2.0内核解析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月24日11:04:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   遮天2.0内核解析http://cn-sec.com/archives/1266348.html

发表评论

匿名网友 填写信息