10.Capabilities

Find binaries with capabilities

find /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin -type f -exec getcap {} \;

Set cap_net_bind_service capability (Allows binding to privileged ports)

sudo setcap cap_net_bind_service=+ep /usr/bin/my_program

Clear capabilities

sudo setcap -r /usr/bin/my_program

List capabilities of a specific file

getcap /usr/bin/my_program

Using cap_dac_override to read a normally restricted file (Dangerous, be very careful)

/usr/bin/vim.basic /etc/shadow

Using cap_dac_override to overwrite a file

echo "evil code" > /tmp/evil.sh
chmod +x /tmp/evil.sh
echo -e ':%s/original content/malicious content/\nwq!' | /usr/bin/vim.basic -es /path/to/important/file # Very dangerous

Overwriting an SUID binary

cp /bin/bash /tmp/suid_bash
chmod u+s /tmp/suid_bash
echo -e ':%s/original content/malicious content/\nwq!' | /usr/bin/vim.basic -es /tmp/suid_bash # Very dangerous

Using cap_setuid to change user ID (Requires compiled C program)

Save the following code as setuid.c:

#include <unistd.h>
#include <sys/capability.h>
#include <stdio.h>

int main() {
    cap_value_t cap_list[1];
    cap_list[0] = CAP_SETUID;
    cap_t caps = cap_get_proc();
    cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET);
    cap_set_proc(caps);
    cap_free(caps);
    setuid(0); // Set UID to root
    execl("/bin/sh", "/bin/sh", NULL);
    return 0;
}

Compile and run:

gcc setuid.c -o setuid -lcap
sudo setcap cap_setuid+ep ./setuid
./setuid

Using cap_sys_admin to mount a file system

mkdir /tmp/mnt
dd if=/dev/zero of=/tmp/loopback.img bs=1M count=10
mkfs.ext4 /tmp/loopback.img
sudo setcap cap_sys_admin+ep /bin/mount
mount /tmp/loopback.img /tmp/mnt -o loop
sudo setcap cap_sys_admin+ep /bin/umount
umount /tmp/mnt

Using auditd to log capability usage

Install and configure auditd:

sudo apt install auditd # or yum install auditd, etc.
sudo systemctl enable auditd
sudo systemctl start auditd
sudo auditctl -a always,exit -F arch=b64 -S capset,setcap,getcap -k capabilities

View logs:

sudo ausearch -k capabilities -ts recent

Checking bounding sets

cat /proc/self/status | grep CapBnd

Checking effective, permitted, and inheritable sets

cat /proc/self/status | grep Cap

Checking the capabilities of a running process

sudo cat /proc/$(pidof processname)/status | grep Cap

Key Concepts:

  • Fine-grained Privileges: Capabilities allow for more specific control over permissions than the traditional user/group model.

  • Reduced Attack Surface: By granting only necessary capabilities, you limit the potential damage from compromised processes.

  • Vulnerabilities:

    • Over-privileging: Giving processes more capabilities than they need.

    • Inadequate Sandboxing: Allowing capable processes to interact with untrusted data or processes.

    • Misconfiguration: Incorrectly setting or understanding capability values.

  • setcap Command: Used to assign capabilities to executables.

  • Capability Values:

    • = (clear capabilities)

    • +ep (effective and permitted)

    • +ei (effective and inheritable)

    • +p (permitted)

  • Dangerous Capabilities:

    • cap_sys_admin: Broad administrative privileges.

    • cap_setuid: Change user ID.

    • cap_setgid: Change group ID.

    • cap_dac_override: Bypass file permission checks.

  • Enumeration: find /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin -type f -exec getcap {} \;

  • Exploitation Example: Using cap_dac_override to modify /etc/passwd and gain root access.

Important Considerations and Enhancements:

  • Security Best Practices:

    • Principle of Least Privilege: Grant only the necessary capabilities.

    • Regular Audits: Review capability assignments to ensure they are still appropriate.

    • Strong Sandboxing: Isolate capable processes as much as possible.

    • Use of tools like auditd to log capability usage.

  • Capability Sets: Understand the difference between permitted, effective, inheritable, and bounding capability sets.

  • Bounding Set: The bounding set limits the capabilities that a process can acquire, even if they are permitted. This is a crucial security feature.

  • File Capabilities vs. Thread Capabilities: Understand how capabilities are applied to files and threads.

  • Namespaces: Combine capabilities with namespaces (e.g., user namespaces) for even stronger isolation.

  • Modern Distributions: Modern Linux distributions often have enhanced security features that mitigate some capability-related risks, but careful configuration is still essential.

  • Real World Exploits: Research real world exploits that utilize linux capabilities. This will enhance your understanding of how they can be used maliciously.

  • Alternative to modifying /etc/passwd: While the example given works, it is very dangerous, and easily detectable. There are many other ways of exploiting cap_dac_override that are less detectable. For example, overwriting a SUID binary.

  • Capabilities and containers: Capabilities are used extensively in containerization technologies like Docker and Kubernetes. Understanding them is vital for container security.

Last updated