午前2時、スマートフォンが鳴った。Grafanaからのアラート:本番サーバーでroot権限の不審なユーザーがcronジョブを実行中。調査に飛び込んで気がついた——サーバーはすでに侵害されており、攻撃者が長年放置されていたサービスアカウントから権限昇格していたのだ。
初めてではなかった。数年前にもSSHブルートフォース攻撃があり、やはり深夜で、半分眠った状態で手動でパッチを当てた。それ以来、積極的な事前監査に切り替えた——誰かがexploitする前に、新しく構築したサーバーや引き継いだサーバーすべてでLinPEASを実行するようにしている。
5分でLinPEASを実行する
bashスクリプト1本だけ。インストール不要、ビルド不要——ダウンロードすればすぐに実行できる:
# 方法1: ダウンロードして直接実行
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh
# 方法2: 先にダウンロードしておく(本番環境推奨)
wget https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh
chmod +x linpeas.sh
./linpeas.sh
サーバーにインターネット接続がない場合は、ローカルマシンからscpでコピーする:
# ローカルマシンから
scp linpeas.sh [email protected]:/tmp/
# サーバー上で
chmod +x /tmp/linpeas.sh
/tmp/linpeas.sh
後から分析できるよう、出力は必ず保存しておこう——スクロールして消えてしまう前に:
./linpeas.sh 2>/dev/null | tee linpeas_output.txt
LinPEASのカラーコード——数時間ではなく数分で問題を見つける
LinPEASの出力は長く、1000行を超えることもある。幸い、すべて読む必要はない。カラーコードを理解すれば数分で把握できる:
- 赤/濃い黄色:95%の確率で権限昇格ベクター——すぐに確認
- 薄い黄色:注目すべき、要確認
- 緑:有用な情報だが直接的な危険はない
- 青/色なし:参考用の生システムデータ
シンプルなルール:赤から始める。赤がなければ黄色を確認する。
LinPEASの主要チェック項目
- SUID/SGIDバイナリ:SUIDビットが設定されたファイル——最も一般的な権限昇格の起点
- sudoルール:パスワードなしでsudo実行が許可されているコマンド
- cronジョブ:root権限でスケジュール実行されるスクリプトで、一般ユーザーが書き込み可能なもの
- PATH内の書き込み可能なパス:rootのPATHに含まれる書き込み可能なディレクトリ
- ユーザー & グループ:docker、sudo、lxd、admグループのメンバー
- 認証情報:平文パスワードを含む設定ファイル、保護されていないSSHキー
- コンテナチェック:Docker/LXC内かどうか、コンテナエスケープが可能かどうか
- カーネルエクスプロイト:現在のカーネルバージョンに対応するエクスプロイトを提案
結果の読み方——1行ずつ読まない
危険な部分に直接フィルタリングする。最初から最後まで読むのは時間の無駄だ:
# 95%危険と判定された行をフィルタリング
grep -a "95%" linpeas_output.txt
# SUIDセクション全体を表示
grep -a -A 30 "SUID - Check" linpeas_output.txt
# sudoルールを確認
grep -a -A 20 "Sudo version" linpeas_output.txt
# 不審なcronジョブを検索
grep -a -A 20 "Cron jobs" linpeas_output.txt
最もよく見られる3つの危険な結果
1. 非標準バイナリのSUIDビット:
# LinPEASの出力:
-rwsr-xr-x 1 root root 12345 Jan 1 00:00 /usr/local/bin/custom-tool
# GTFOBinsでそのバイナリを確認:
# https://gtfobins.github.io/
# リストに載っていれば — 今すぐ修正が必要な脆弱性
2. 過剰に広いsudoルール:
# 危険な出力:
(ALL) NOPASSWD: /usr/bin/vim
(ALL) NOPASSWD: /usr/bin/python3
# vimの場合、権限昇格は1コマンドで可能:
sudo vim -c ':!/bin/bash'
# python3の場合:
sudo python3 -c 'import os; os.system("/bin/bash")'
3. rootのcronジョブが書き込み可能なスクリプトを実行している:
# LinPEASがcrontabで検出:
* * * * * root /opt/maintenance/cleanup.sh
# ファイルのパーミッションを確認:
ls -la /opt/maintenance/cleanup.sh
# world-writableまたは自分が所属するグループがwritableな場合:
# → スクリプトにコマンドを注入するだけでroot権限でコード実行が可能
必要に応じたLinPEASのカスタマイズ
デフォルトのLinPEASはすべてをスキャンする——約3〜5分かかる。高速化や特定エリアへの絞り込みが必要な場合は、以下のオプションを使用する:
# ネットワークのみを検査
./linpeas.sh -o network
# プロセスとサービスのみを検査
./linpeas.sh -o procs_crons_timers_srvcs_sockets
# ネットワークスキャンをスキップ(高速化、ノイズ削減)
./linpeas.sh -s
# 本番環境で長時間ブロックされないようタイムアウト付きで実行
timeout 300 ./linpeas.sh 2>/dev/null | tee linpeas_output.txt
# 利用可能なオプションをすべて表示
./linpeas.sh -h
本番サーバーでは、通常-sフラグで実行している——ネットワークスキャンをスキップすることで高速化し、システム負荷を抑えられる。
ディスクにファイルを残さずに実行する
ペンテスト時やアーティファクトを最小化したい場合は、この方法を使う:
# 監査マシン側 — 一時HTTPサーバーを起動
python3 -m http.server 8080
# 監査対象サーバー側(スクリプトはRAM上で実行、ファイル不要)
curl http://AUDITOR_IP:8080/linpeas.sh | bash 2>/dev/null | tee /dev/shm/result.txt
LinPEASを実戦で何度も使って学んだこと
低権限で実行すること、rootではなく。 LinPEASは一般ユーザーで実行したときに最も実用的な結果が得られる——攻撃者がシェルを取得してrootに昇格しようとする状況とまったく同じだ。rootで実行すると出力が変わり、参考になりにくい。
# テスト用にサービスアカウントユーザーに切り替え
su - webapp_user
./linpeas.sh 2>/dev/null | tee /tmp/linpeas_webapp.txt
出力を日付別に保存し、diffで異常な変更を検出する。 2回の実行の間に新しいSUIDファイルや不審なcronジョブが現れたら、すぐに調査が必要なサインだ:
# 日付でファイル名を付ける
./linpeas.sh 2>/dev/null | tee "linpeas_$(date +%Y%m%d).txt"
# 前回との差分を比較
diff linpeas_20260601.txt linpeas_20260701.txt | grep "^[<>]" | head -50
カーネルエクスプロイト——本番環境では極めて慎重に。 LinPEASはカーネルバージョンに応じたカーネルエクスプロイトを提案する。CTFなら自由に試してよい。しかし実際の本番環境では:実行しないこと。カーネルエクスプロイトはシステム全体をクラッシュさせる可能性がある。カーネルバージョンを記録して、パッチ済みバージョンにアップデートすれば十分だ。
不審なSUIDやsudoルールを見つけたらすぐにGTFOBinsを調べる。 gtfobins.github.ioはLinuxの各バイナリの悪用方法を網羅している。そこに名前があり、サーバーでSUIDまたはsudo NOPASSWDが設定されているバイナリがあれば——今夜中に修正する、朝まで待たない。
LinPEAS結果を受けた対処チェックリスト
- 不要なバイナリからSUIDビットを削除する:
chmod u-s /path/to/binary - sudoルールを厳格化する——絶対パスを使用し、引数を制限し、不要ならNOPASSWDを削除する
- rootのcronが呼び出すすべてのスクリプトのパーミッションを確認・設定する:
chmod 750、オーナーはroot - グループメンバーシップを監査する——不要なら一般ユーザーを
docker、sudo、admから削除する - 深刻なCVEが提案されている場合はカーネルをアップデートする
- 設定ファイル内の平文認証情報を見つけて暗号化または削除する
LinPEASは攻撃ツールだ——その目的は悪用可能なすべての弱点を見つけることにある。これをディフェンス側から活用する:攻撃者より先に実行し、先に発見し、先に修正する。あのSSHブルートフォース攻撃以来、毎月すべてのサーバーで定期的にLinPEASを実行している。午前2時にスマートフォンが鳴るのを待つよりはるかに効果的だ。

