Extracting Config from Agent Tesla RAT
Overview
Agent Tesla is a .NET-based Remote Access Trojan (RAT) and keylogger that ranked among the top 10 malware variants in 2024, impacting 6.3% of corporate networks globally. It exfiltrates stolen credentials via SMTP email, FTP upload, Telegram bot API, or Discord webhooks. The malware configuration is embedded in the .NET assembly, typically obfuscated using string encryption, resource encryption, or custom loaders that decrypt and execute Agent Tesla in memory via .NET Reflection (fileless). Configuration extraction involves decompiling the .NET assembly with dnSpy or ILSpy, identifying the decryption routine for configuration strings, and extracting SMTP server addresses, credentials, FTP endpoints, Telegram bot tokens, and targeted applications.
When to Use
Trigger phrases:
"extracting config from agent tesla rat"
"Extract embedded configuration from Agent Tesla RAT samples including SMTP/FTP/T"
When performing authorized security testing that involves extracting config from agent tesla rat
When analyzing malware samples or attack artifacts in a controlled environment
When conducting red team exercises or penetration testing engagements
When building detection capabilities based on offensive technique understanding
Prerequisites
- dnSpy or ILSpy for .NET decompilation
- Python 3.9+ with
dnlib or pythonnet for automated extraction
- de4dot for .NET deobfuscation
- Understanding of .NET IL code and Reflection
- Sandbox for dynamic analysis (ANY.RUN, CAPE)
Workflow
- Scope the task — define objectives, boundaries, and success criteria
- Gather information — collect all necessary data and context before proceeding
- Execute the core workflow — follow the domain-specific steps methodically
- Validate results — verify outputs against expected outcomes or baselines
- Document findings — record results, anomalies, and recommendations
Step 1: Deobfuscate and Extract Configuration
#!/usr/bin/env python3
"""Extract Agent Tesla RAT configuration from .NET assemblies."""
import re
import sys
import json
import base64
import hashlib
from pathlib import Path
def extract_strings_from_dotnet(filepath):
"""Extract readable strings from .NET binary for config analysis."""
with open(filepath, 'rb') as f:
data = f.read()
# Extract US (User Strings) heap from .NET metadata
strings = []
# Look for common Agent Tesla config patterns
patterns = {
"smtp_server": re.compile(rb'smtp[\.\-][\w\.\-]+\.\w{2,}', re.I),
"email": re.compile(rb'[\w\.\-]+@[\w\.\-]+\.\w{2,}'),
"ftp_url": re.compile(rb'ftp://[\w\.\-:/]+', re.I),
"telegram_token": re.compile(rb'\d{8,10}:[A-Za-z0-9_-]{35}'),
"telegram_chat": re.compile(rb'(?:chat_id=|chatid[=:])[\-]?\d{5,15}', re.I),
"discord_webhook": re.compile(rb'https://discord\.com/api/webhooks/\d+/[\w-]+'),
"password": re.compile(rb'(?:pass(?:word)?|pwd)[=:]\s*[\w!@#$%^&*]{4,}', re.I),
"port": re.compile(rb'(?:port|smtp_port)[=:]\s*\d{2,5}', re.I),
}
results = {}
for name, pattern in patterns.items():
matches = pattern.findall(data)
if matches:
results[name] = [m.decode('utf-8', errors='replace') for m in matches]
# Extract Base64-encoded strings (common obfuscation)
b64_pattern = re.compile(rb'[A-Za-z0-9+/]{20,}={0,2}')
b64_decoded = []
for match in b64_pattern.finditer(data):
try:
decoded = base64.b64decode(match.group())
text = decoded.decode('utf-8', errors='strict')
if text.isprintable() and len(text) > 5:
b64_decoded.append(text)
except Exception:
pass
if b64_decoded:
results["base64_decoded_strings"] = b64_decoded[:30]
return results
def decrypt_agenttesla_strings(data, key_hex):
"""Decrypt Agent Tesla encrypted configuration strings."""
key = bytes.fromhex(key_hex)
# Agent Tesla V1: Simple XOR with key
decrypted_strings = []
# Find encrypted blobs (high-entropy byte sequences)
blob_pattern = re.compile(rb'[\x80-\xff]{16,256}')
for match in blob_pattern.finditer(data):
blob = match.group()
# Try XOR decryption
decrypted = bytes(b ^ key[i % len(key)] for i, b in enumerate(blob))
try:
text = decrypted.decode('utf-8', errors='strict')
if text.isprintable() and len(text.strip()) > 3:
decrypted_strings.append(text.strip())
except UnicodeDecodeError:
pass
# V2: SHA256-based key derivation then AES
sha256_key = hashlib.sha256(key).digest()
return decrypted_strings
def analyze_exfiltration_config(config):
"""Analyze extracted configuration for exfiltration methods."""
methods = []
if config.get("smtp_server"):
methods.append({
"type": "SMTP",
"servers": config["smtp_server"],
"emails": config.get("email", []),
})
if config.get("ftp_url"):
methods.append({
"type": "FTP",
"urls": config["ftp_url"],
})
if config.get("telegram_token"):
methods.append({
"type": "Telegram",
"tokens": config["telegram_token"],
"chat_ids": config.get("telegram_chat", []),
})
if config.get("discord_webhook"):
methods.append({
"type": "Discord",
"webhooks": config["discord_webhook"],
})
return methods
if __name__ == "__main__":
if len(sys.argv) < 2:
print(f"Usage: {sys.argv[0]} <agent_tesla_sample>")
sys.exit(1)
config = extract_strings_from_dotnet(sys.argv[1])
methods = analyze_exfiltration_config(config)
report = {"raw_config": config, "exfiltration_methods": methods}
print(json.dumps(report, indent=2))
Validation Criteria
- Exfiltration method identified (SMTP/FTP/Telegram/Discord)
- Server addresses and credentials extracted from config
- Targeted applications list recovered
- Keylogger and screenshot capture settings documented
- Persistence mechanism identified
- IOCs suitable for network blocking extracted
When NOT to Use
- You need to analyze extracted data (use analyzing-* skills)
- Task is about detecting extraction (use detecting-* skills)
- You need to implement extraction tools (use implementing-* skills)
- Task is about building extraction infrastructure (use building-* skills)
- You don't have access to forensic images
- Task requires chain of custody (follow forensic process)
Red Flags
- Performing actions without explicit written authorization from the asset owner
- Testing against production systems without a defined scope and rules of engagement
- Sharing sensitive findings or credentials in unencrypted communications
- Failing to properly scope and contain the assessment before starting
Verification
- All steps executed successfully against a test environment before production use
- Output documented with screenshots or logs demonstrating expected behavior
- Results validated against known-good baselines or reference implementations
- Documentation complete enough for another analyst to reproduce findings
References
Process
- Analyze the task requirements
- Apply domain expertise
- Verify output quality
Anti-Rationalization Table
| Rationalization |
Reality |
| "We are too small to be targeted" |
Automated attacks target everyone. Size does not matter. |
| "Security slows us down" |
A breach slows you down 100x more. Build security in from the start. |
| "We will fix it after launch" |
Vulnerabilities in production are exploited within hours. Fix before deploy. |
1---2name: extracting-config-from-agent-tesla-rat3description: Use when extract embedded configuration from Agent Tesla RAT samples including SMTP/FTP/Telegram exfiltration credentials, keylogger settings, and C2 endpoints using .NET decompilation and memory analysis. Use when working with extracting config from agent tesla rat.4license: Apache-2.05---67# Extracting Config from Agent Tesla RAT89## Overview1011Agent Tesla is a .NET-based Remote Access Trojan (RAT) and keylogger that ranked among the top 10 malware variants in 2024, impacting 6.3% of corporate networks globally. It exfiltrates stolen credentials via SMTP email, FTP upload, Telegram bot API, or Discord webhooks. The malware configuration is embedded in the .NET assembly, typically obfuscated using string encryption, resource encryption, or custom loaders that decrypt and execute Agent Tesla in memory via .NET Reflection (fileless). Configuration extraction involves decompiling the .NET assembly with dnSpy or ILSpy, identifying the decryption routine for configuration strings, and extracting SMTP server addresses, credentials, FTP endpoints, Telegram bot tokens, and targeted applications.121314## When to Use15**Trigger phrases:**16- "extracting config from agent tesla rat"17- "Extract embedded configuration from Agent Tesla RAT samples including SMTP/FTP/T"181920- When performing authorized security testing that involves extracting config from agent tesla rat21- When analyzing malware samples or attack artifacts in a controlled environment22- When conducting red team exercises or penetration testing engagements23- When building detection capabilities based on offensive technique understanding2425## Prerequisites2627- dnSpy or ILSpy for .NET decompilation28- Python 3.9+ with `dnlib` or `pythonnet` for automated extraction29- de4dot for .NET deobfuscation30- Understanding of .NET IL code and Reflection31- Sandbox for dynamic analysis (ANY.RUN, CAPE)3233## Workflow34351. **Scope the task** — define objectives, boundaries, and success criteria362. **Gather information** — collect all necessary data and context before proceeding373. **Execute the core workflow** — follow the domain-specific steps methodically384. **Validate results** — verify outputs against expected outcomes or baselines395. **Document findings** — record results, anomalies, and recommendations40### Step 1: Deobfuscate and Extract Configuration4142```python43#!/usr/bin/env python344"""Extract Agent Tesla RAT configuration from .NET assemblies."""45import re46import sys47import json48import base6449import hashlib50from pathlib import Path515253def extract_strings_from_dotnet(filepath):54 """Extract readable strings from .NET binary for config analysis."""55 with open(filepath, 'rb') as f:56 data = f.read()5758 # Extract US (User Strings) heap from .NET metadata59 strings = []6061 # Look for common Agent Tesla config patterns62 patterns = {63 "smtp_server": re.compile(rb'smtp[\.\-][\w\.\-]+\.\w{2,}', re.I),64 "email": re.compile(rb'[\w\.\-]+@[\w\.\-]+\.\w{2,}'),65 "ftp_url": re.compile(rb'ftp://[\w\.\-:/]+', re.I),66 "telegram_token": re.compile(rb'\d{8,10}:[A-Za-z0-9_-]{35}'),67 "telegram_chat": re.compile(rb'(?:chat_id=|chatid[=:])[\-]?\d{5,15}', re.I),68 "discord_webhook": re.compile(rb'https://discord\.com/api/webhooks/\d+/[\w-]+'),69 "password": re.compile(rb'(?:pass(?:word)?|pwd)[=:]\s*[\w!@#$%^&*]{4,}', re.I),70 "port": re.compile(rb'(?:port|smtp_port)[=:]\s*\d{2,5}', re.I),71 }7273 results = {}74 for name, pattern in patterns.items():75 matches = pattern.findall(data)76 if matches:77 results[name] = [m.decode('utf-8', errors='replace') for m in matches]7879 # Extract Base64-encoded strings (common obfuscation)80 b64_pattern = re.compile(rb'[A-Za-z0-9+/]{20,}={0,2}')81 b64_decoded = []82 for match in b64_pattern.finditer(data):83 try:84 decoded = base64.b64decode(match.group())85 text = decoded.decode('utf-8', errors='strict')86 if text.isprintable() and len(text) > 5:87 b64_decoded.append(text)88 except Exception:89 pass9091 if b64_decoded:92 results["base64_decoded_strings"] = b64_decoded[:30]9394 return results959697def decrypt_agenttesla_strings(data, key_hex):98 """Decrypt Agent Tesla encrypted configuration strings."""99 key = bytes.fromhex(key_hex)100 # Agent Tesla V1: Simple XOR with key101 decrypted_strings = []102103 # Find encrypted blobs (high-entropy byte sequences)104 blob_pattern = re.compile(rb'[\x80-\xff]{16,256}')105 for match in blob_pattern.finditer(data):106 blob = match.group()107 # Try XOR decryption108 decrypted = bytes(b ^ key[i % len(key)] for i, b in enumerate(blob))109 try:110 text = decrypted.decode('utf-8', errors='strict')111 if text.isprintable() and len(text.strip()) > 3:112 decrypted_strings.append(text.strip())113 except UnicodeDecodeError:114 pass115116 # V2: SHA256-based key derivation then AES117 sha256_key = hashlib.sha256(key).digest()118119 return decrypted_strings120121122def analyze_exfiltration_config(config):123 """Analyze extracted configuration for exfiltration methods."""124 methods = []125126 if config.get("smtp_server"):127 methods.append({128 "type": "SMTP",129 "servers": config["smtp_server"],130 "emails": config.get("email", []),131 })132133 if config.get("ftp_url"):134 methods.append({135 "type": "FTP",136 "urls": config["ftp_url"],137 })138139 if config.get("telegram_token"):140 methods.append({141 "type": "Telegram",142 "tokens": config["telegram_token"],143 "chat_ids": config.get("telegram_chat", []),144 })145146 if config.get("discord_webhook"):147 methods.append({148 "type": "Discord",149 "webhooks": config["discord_webhook"],150 })151152 return methods153154155if __name__ == "__main__":156 if len(sys.argv) < 2:157 print(f"Usage: {sys.argv[0]} <agent_tesla_sample>")158 sys.exit(1)159160 config = extract_strings_from_dotnet(sys.argv[1])161 methods = analyze_exfiltration_config(config)162163 report = {"raw_config": config, "exfiltration_methods": methods}164 print(json.dumps(report, indent=2))165```166167## Validation Criteria168169- Exfiltration method identified (SMTP/FTP/Telegram/Discord)170- Server addresses and credentials extracted from config171- Targeted applications list recovered172- Keylogger and screenshot capture settings documented173- Persistence mechanism identified174- IOCs suitable for network blocking extracted175176## When NOT to Use177178- You need to analyze extracted data (use analyzing-* skills)179- Task is about detecting extraction (use detecting-* skills)180- You need to implement extraction tools (use implementing-* skills)181- Task is about building extraction infrastructure (use building-* skills)182- You don't have access to forensic images183- Task requires chain of custody (follow forensic process)184185186## Red Flags187188- Performing actions without explicit written authorization from the asset owner189- Testing against production systems without a defined scope and rules of engagement190- Sharing sensitive findings or credentials in unencrypted communications191- Failing to properly scope and contain the assessment before starting192193## Verification194195- All steps executed successfully against a test environment before production use196- Output documented with screenshots or logs demonstrating expected behavior197- Results validated against known-good baselines or reference implementations198- Documentation complete enough for another analyst to reproduce findings199200## References201202- [Splunk - Agent Tesla Detection and Analysis](https://www.splunk.com/en_us/blog/security/inside-the-mind-of-a-rat-agent-tesla-detection-and-analysis.html)203- [Qualys - Catching the RAT Agent Tesla](https://blog.qualys.com/vulnerabilities-threat-research/2022/02/02/catching-the-rat-called-agent-tesla)204- [ANY.RUN Agent Tesla Analysis](https://any.run/malware-trends/agenttesla/)205- [Trustwave - Agent Tesla Novel Loader](https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/agent-teslas-new-ride-the-rise-of-a-novel-loader/)206- [Malpedia - Agent Tesla](https://malpedia.caad.fkie.fraunhofer.de/details/win.agent_tesla)207208## Process2092101. Analyze the task requirements2112. Apply domain expertise2123. Verify output quality213214## Anti-Rationalization Table215216| Rationalization | Reality |217|---|---|218| "We are too small to be targeted" | Automated attacks target everyone. Size does not matter. |219| "Security slows us down" | A breach slows you down 100x more. Build security in from the start. |220| "We will fix it after launch" | Vulnerabilities in production are exploited within hours. Fix before deploy. |