本帖最后由 zhaorong 于 2021-11-24 16:06 编辑
木马是黑客实施网络攻击的常用兵器之一,个别木马可以通过免杀技术的加持躲过杀毒软件查杀
Cobaltstrike是用于行动,APT模拟攻击的软件它具备很强大的协
同能力状语从句:难以置信的柯林斯扩展性。
无论是编写的shellcode,创建自定义的C2可执行二进制文件还是修改代码来隐藏恶意程序它们都
的英文日常工作的一部分。阅读和理解成熟的C2框架代码也是理所当然的事情。
CobaltStrike是如何生成的ShellCode的
CS是使用Swing进行UI的,代码中直接找对话操作类。
+ ` aggressor \ dialogs \WindowsExecutableDialog.class`
可以看得很清楚的生成逻辑。
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">受保护的字节[] stager;</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">@覆盖</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">公共无效dialogAction(最终的ActionEvent ActionEvent的,最终地图选项){ </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> this.options =选项; </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> this.stager = DialogUtils.getStager(options); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 如果(this.stager.length == 0){</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回;</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> } </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> final String string = options.get("output") + ""; </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 字符串 s = ""; </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if (string.indexOf("EXE") > -1) { </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> s = "artifact.exe"; </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> } </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else if (string.indexOf("DLL") > -1) { </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> s = "artifact.dll"; </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> } </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> SafeDialogs.saveFile(NULL,S,这一点);</font></font>
复制代码
通过DialogUtils.getStager()获得生成的stager然后通过saveFile保存文件。
getStager()方法调用了aggressor\DataUtils.shellcode()
而这里实际上是Stagers的接口。
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">返回 Stagers.shellcode(s, "x86", b);</font></font>
复制代码
最终在 stagers\Stagers.shellcode() 可知监听器类型,
实例化了继承自的 GenericStager 的 stagers\GenericHTTPStager 类
并由 generate() 生成shellcode
shellcode生成时,读取了resources/httpstager.bin并根据监听器的host和port等值组合为Packer
最终替换到多个X、Y占位的bin文件中最终返回bytes[]类型的shellcode
Patch Artifact
shellcode生成完成后,回到原点可以看到根据用户的选择对不同的神器进模板
行补丁。以86的模板为例,
继续跟进patchArtifact
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">new ArtifactUtils(this.client).patchArtifact(this.stager, "artifact32.exe", s);</font></font>
复制代码
+ `common\BaseArtifactUtils.class`
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">public byte[] patchArtifact(final byte[] array, final String s) { </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> final Stack<Scalar> stack = new Stack<Scalar>(); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> stack.push(SleepUtils.getScalar(array)); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> stack.push(SleepUtils.getScalar(s)); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 最终字符串格式 = this.client.getScriptEngine().format(" </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">EXECUT ABLE_ARTIFACT_GENERATOR", stack); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if (format == null) { </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return this.fixChecksum(this._patchArtifact(array, s)); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> }</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回this.fixChecksum(CommonUtils.toBytes(格式)); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">}</font></font>
复制代码
好像是通过PE编辑器修复了校验码。
这里不赘述了对编辑器实现动物的可以去看看pe\PEEditor。
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">最终 PEEditor peEditor = new PEEditor(array); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">peEditor.updateChecksum(); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">返回 peEditor.getImage();</font></font>
复制代码
注意看这里 this._patchArtifact(array, s) 调用了同名方法PS:差点以为在看Python
读取了资源文件夹下的artifact32.exe视为模板文件重复
的1024个A来定位shellcode位置。
与生成shellcode时类似,使用common/
CommonUtils.replaceAt ()对bytes流转为的字符串进行编辑替换。
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">public static String replaceAt(final String s, final String s2, final int n) { </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> final StringBuffer sb = new StringBuffer(s); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> sb.delete(n, n + s2.length()); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> sb.insert(n, s2); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回 sb.toString(); </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">}</font></font>
复制代码
使用16个编辑器可以直接显示用于宣讲的shellcode的位置。
值得一提的是,替换shellcode的pe文件,因为shellcode长度没有完全覆盖到标识的1024
个一般生成的exe普遍保留部分字符。这当然并不会影响shellcode的执行。
Shellcode Launcher
利用加载器远程连获取下一阶段payload加载到内存中的软件检测Alloc到
WriteProcessM虚拟应用的内存模式虚拟化被
其最新的远控软件广泛利用。介绍视频中披露了部分神器的源码并演示了如何
通过修改加载器绕过了防御者的查杀。
在上面我们添加了一个非常专业的shellcode异或清洁的功能,基于
c++的shellcode加载这个基础进行了基础。
然后参考CS的方式,在本应应用的shellcode的缓冲区中置入大量重复的占位符作为定位。
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">python -c "打印(1024*'A')"</font></font>
复制代码
用VisualStudio或MingW将其编译为模板。exe
开发免杀小工具并
新建一个JavaFx的项目样式与部分代码参考某混沌免杀小助手。
捋下流程首先需要对CS或MSF的shellcode进行重构。然后进行异性或扫描读取
模板文件定位到shellcode位置,进行最后的保存。
有很多直接可以从CS复制过来类用。
重点看下xor,是为了跟发射器性格一致需要先转换为int类型进行异或然后
再转回hex最终打包为jar
生成载体类型的有效载荷 复制粘贴 生成保存。
最终免杀效果取决于Launcher模板,作为一个非常精简、没什么改动
的模板效果已经出乎意料了。
毕竟目的并非追求免杀效果而应注重于理解CS木马的Artifact生成机制。 |