dotnet-reversing
Use when reverse engineering .NET assemblies, decompiling DLLs/EXEs, or hunting for vulnerabilities in .NET applications.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Use when reverse engineering .NET assemblies, decompiling DLLs/EXEs, or hunting for vulnerabilities in .NET applications.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Pre-engagement reconnaissance workflow using HackerOne MCP tools to enumerate program scope, study prior disclosures, and identify high-value targets. Use when starting a new HackerOne program engagement, building an asset inventory, or planning target selection before active testing.
Pre-submission eligibility check for bug bounty findings. Catches ineligible patterns, AI/scanner false positives, and generates impact justification for borderline lows. Use before writing a report or when assessing whether a finding is worth reporting.
Static code analysis for DOM-based vulnerabilities in client-side JavaScript -- source/sink enumeration via grep and AST tools, data flow tracing, sanitization assessment, and framework-specific sink detection. Use when performing pre-commit reviews, auditing large codebases without dynamic execution, or triaging minified code for XSS issues.
Create custom jxscout analyzers (regex, derived, or script-based) and retrigger analysis. Use when the user wants to find specific code patterns across all project files, add new match kinds, or extend jxscout's static analysis capabilities.
Use when the user wants to connect to Jira, Confluence, or Compass — search issues with JQL, read or create issues and pages, link content across products, or set up Atlassian auth. The connector — not security tradecraft.
Use when the user wants to connect to Azure DevOps — query Boards work items with WIQL, read PRs, inspect pipeline runs, create or update work items and wiki pages, or set up ADO auth. The connector — not security tradecraft.
| name | dotnet-reversing |
| description | Use when reverse engineering .NET assemblies, decompiling DLLs/EXEs, or hunting for vulnerabilities in .NET applications. |
Load the vuln-assessment-methodology skill alongside this one for severity
calibration, disprove-first discipline, and reporting standards.
dotnet_scan_binaries(path="/target") # find all .NET binaries
dotnet_list_namespaces(path="App.dll") # survey structure
dotnet_search_by_name(path="App.dll", search="password") # find interesting types/methods
dotnet_decompile_type(path="App.dll", type_name="App.AuthService") # read the code
| Tool | Purpose |
|---|---|
dotnet_scan_binaries(path, pattern?, exclude?) | Find .NET binaries. exclude is comma-separated patterns to skip. |
dotnet_list_namespaces(path) | List namespaces |
dotnet_list_types(path) / dotnet_list_types_in_namespace(path, namespace) | List types |
dotnet_list_methods(path) / dotnet_list_methods_in_type(path, type_name) | List methods |
dotnet_decompile_type(path, type_name) | Decompile a type to C# — preferred for targeted analysis |
dotnet_decompile_methods(path, method_names) | Decompile specific methods by name |
dotnet_decompile_module(path) | Decompile entire assembly — avoid, output is huge |
dotnet_search_by_name(path, search) | Find types/methods by name |
dotnet_search_references(path, search) | Find methods that call or use an API in IL bytecode |
dotnet_get_call_flows(paths, method_name, max_depth?) | Trace how a method is reached from entry points |
dotnet_download_nuget(package, version?, output_dir?) | Download NuGet package for analysis |
report_finding(file, method, criticality, content) | Report a finding. Criticality: critical/high/medium/low/info |
report_auth(auth_material) | Report hardcoded credentials, API keys, tokens |
report_poc(poc) | Save a proof-of-concept with exploitation steps |
finish_task(success, markdown_summary) | Mark task complete with summary |
Key difference: search_by_name finds things named "Sql", while search_references finds code that uses SqlCommand.
dotnet_scan_binaries(path="/app")
dotnet_list_namespaces(path="Target.dll")
Identify the application structure. Focus on non-Microsoft assemblies.
Use dotnet_search_by_name for name-based searches and dotnet_search_references for IL bytecode/API usage searches. Run these across each target assembly.
Name searches (search_by_name): password, credential, secret, apikey, token, auth, encrypt, decrypt, hash, query, endpoint, url
API/IL reference searches (search_references):
BinaryFormatter, ObjectStateFormatter, NetDataContractSerializer, LosFormatter, JsonConvert.DeserializeObject, XmlSerializer, JavaScriptSerializerProcess.Start, System.Diagnostics.Process, PowerShell, cmd.exeSystem.Security.CryptographySystem.IO.File, FileStream, StreamReader, Path.CombineSqlCommand, ExecuteNonQuery, ExecuteReaderHttpClient, WebRequest, HttpWebRequestXmlReader, XmlDocument, XDocument, XmlTextReaderDirectorySearcher, DirectoryEntry, System.DirectoryServicesdotnet_decompile_type(path="App.dll", type_name="App.Services.AuthenticationService")
Read the actual C# source. When you find a dangerous pattern, read the full function and its callers before drawing conclusions. Check for:
ReadToken/ReadJwtToken without ValidateToken is NOT a vulnerability when
the token is validated by a downstream service (Azure AD, ARM) or used only for
metadata extraction (expiry, caching). Only report it when unvalidated claims
drive authorization decisions.
dotnet_get_call_flows(
paths=["App.dll", "App.Core.dll"],
method_name="ExecuteCommand",
max_depth=10
)
Find how vulnerable methods are reached from entry points (controllers, handlers, public APIs).
Assign severity based on actual exploitability — not the vulnerability class
name. The vuln-assessment-methodology skill has the full guidance; the
essentials:
| Source of dangerous input | Access required | Severity |
|---|---|---|
| HTTP request parameter | Unauthenticated, internet-facing | Critical/High |
| HTTP request parameter | Authenticated user | High/Medium |
| HTTP request parameter | Internal network only | Medium |
| Config file / env var | Container or host access | Low |
| Hardcoded value (as sink input) | N/A | Not a finding (but hardcoded credentials are — see methodology skill) |
Before reporting every finding:
report_finding(
file="App.dll",
method="AuthService.ValidateToken",
criticality="critical",
content="Hardcoded JWT signing secret in source code:\n```csharp\nprivate static string Secret = \"supersecret123\";\n```"
)
report_auth(auth_material="API key in config: `sk-1234567890abcdef`")
report_poc(poc="## Exploitation\n1. Extract JWT secret\n2. Forge admin token\n3. ...")
finish_task(success=True, markdown_summary="Found 2 high-severity issues...")
Always report findings to persist them to the Dreadnode platform.
For each pattern, both vulnerable AND safe versions are shown. You must check which one the code matches before reporting.
// VULNERABLE — real secret in source code
private static string ApiKey = "sk-1234567890abcdef";
connectionString = "Server=db;User=admin;Password=P@ssw0rd";
// NOT A FINDING — loaded from config/env
var apiKey = Configuration["ApiKey"];
var connStr = Environment.GetEnvironmentVariable("DB_CONNECTION");
// NOT A FINDING — misleading error message (not a real credential)
throw new Exception("Api Key is invalid. Subscription validation failed.");
// VULNERABLE — BinaryFormatter with untrusted input
BinaryFormatter formatter = new BinaryFormatter();
object obj = formatter.Deserialize(untrustedStream);
// VULNERABLE — TypeNameHandling enables type control
JsonConvert.DeserializeObject(json, new JsonSerializerSettings {
TypeNameHandling = TypeNameHandling.All
});
// SAFE — System.Text.Json (no type handling by default)
var obj = JsonSerializer.Deserialize<MyType>(json);
// SAFE — TypeNameHandling.None (default)
JsonConvert.DeserializeObject<MyType>(json);
// VULNERABLE — direct interpolation
Process.Start("cmd.exe", "/c " + userInput);
Arguments = $"-c \"{command} {string.Join(" ", args)}\"";
// PARTIALLY SAFE — has validation, but check for bypasses
var error = ValidateCommand(command); // blocks ; && || | etc.
if (error != null) return error;
// If ValidateCommand misses characters like " or ${ }, it's
// an incomplete validation bypass (Medium), not "no sanitization" (High)
// SAFE — no shell, direct exec with argument array
Process.Start("myapp", new[] { "--flag", sanitizedValue });
// VULNERABLE — user input concatenated into SQL
string query = "SELECT * FROM users WHERE id = " + request.UserId;
// LOW RISK — env var / config value concatenated (defense-in-depth issue)
// Attacker needs container access to control env var
string proc = "[" + schemaFromEnvVar + "].[MyProcedure]";
// SAFE — parameterized query
cmd.CommandText = "SELECT * FROM users WHERE id = @id";
cmd.Parameters.AddWithValue("@id", userId);
// VULNERABLE — user input directly cast to MarkupString
builder.AddContent(0, (MarkupString)userInput);
// SAFE — HtmlEncoded BEFORE MarkupString cast
var encoded = WebUtility.HtmlEncode(userInput);
var colored = AnsiParser.ConvertToHtml(encoded, state); // adds <span> tags
builder.AddContent(0, (MarkupString)colored); // MarkupString needed for spans
// SAFE — Markdown pipeline with HTML disabled
pipeline.DisableHtml();
var html = Markdown.ToHtml(input, pipeline);
builder.AddContent(0, (MarkupString)html);
// VULNERABLE — claims trusted for local authorization
var token = new JwtSecurityTokenHandler().ReadJwtToken(jwt);
if (token.Claims.First(c => c.Type == "role").Value == "admin")
GrantAdminAccess(); // No signature verification!
// SAFE — token read for metadata, validated by downstream service
var token = handler.ReadJwtToken(jwt);
var expiry = token.ValidTo; // Just extracting expiry for caching
return DelegatedTokenCredential.Create(jwt); // Azure AD validates the sig
// VULNERABLE — user input in path without validation
string path = Path.Combine(baseDir, userFileName);
File.ReadAllText(path);
// SAFE — canonicalization check with trailing separator
string normalizedBase = Path.GetFullPath(baseDir) + Path.DirectorySeparatorChar;
string full = Path.GetFullPath(Path.Combine(baseDir, userFileName));
if (!full.StartsWith(normalizedBase)) throw new SecurityException();
DO:
dotnet_scan_binaries to find targetsdotnet_decompile_type for targeted analysis (not dotnet_decompile_module)report_finding — even low-severity onesreport_auth only for real credentials, not error messages or placeholdersfinish_task when analysis is completeDO NOT:
ReadToken/ReadJwtToken as "JWT bypass" when the token is validated server-sideMarkupString as XSS when the content is HtmlEncoded upstreamdotnet_decompile_module on large assemblies — it will overflow contextdotnet_decompile_type not dotnet_decompile_module — smaller output, faster analysisdotnet_search_references finds actual usage in bytecode, not just type namesdotnet_get_call_flows accepts multiple assemblies to trace calls across DLLsdotnet_download_nuget to analyze third-party dependenciesexclude parameter in dotnet_scan_binaries to skip files, e.g. exclude="Microsoft.,System."search_references calls to cover all vulnerability classes before decompiling