← レッドチーム / 攻撃技術
RED TEAM  ·  /etc/passwd

ユーザーは「名前」ではなく
番号(UID 0)で root になる。

/etc/passwd は、システム上の全ユーザーの名簿。1行が1ユーザーで、: 区切りの7つのフィールドでできています。この構造と「UID=0 が管理者」という一点を押さえると、権限昇格の急所が見えてきます。

1レコード = 1ユーザー(root の行)
rootユーザー名①
:
xパスワード
(実体は shadow)
②
:
0UID
0=管理者
③
:
0GID④
:
root説明(コメント)⑤
:
/rootホーム⑥
:
/bin/bashログインシェル⑦
急所は③の UID。名前が "root" だから管理者なのではなく、UIDが 0 だから管理者。ここが攻撃の的になる。
1 ファイルの正体

全ユーザーの名簿。1行7フィールド

/etc/passwd を cat すると、こんな行が並びます。左から : で区切られた7項目を順に読みます。

#フィールドrootの値意味
①ユーザー名rootログイン名
②パスワードx「実体は /etc/shadow にある」の目印
③UID0ユーザーID。0 なら管理者(root)
④GID0プライマリグループID
⑤コメントroot説明欄(フルネームなど)
⑥ホーム/rootホームディレクトリ
⑦シェル/bin/bashログイン時に起動するシェル

⑦が /usr/sbin/nologin や /bin/false になっている行は「ログインさせないアカウント」(サービス用など)。systemd-coredump のような行がそれです。

2 UID 0 の意味

「root」は名前ではなく、番号 0 のこと

Linuxが「この操作を許すか」を判断する材料は、ユーザー名ではなく UID です。そしてカーネルは UID が 0 のユーザーを無条件に管理者として扱います。名前が root でも hacker でも taro でも関係ない——UIDが0でありさえすれば、それはrootです。

これが攻撃の核心

だから「/etc/passwd に UID 0 の行を1つ書き足す」ことができれば、rootと同格の別アカウントを新設できる。既存のrootを乗っ取る必要すらありません。パスワードは自分で決めるので当然わかる → 堂々とroot権限でログインできてしまう。

3 パスワード欄と shadow

なぜ ② が x なのか

昔は②のパスワード欄にハッシュを直接書いていました。ところが /etc/passwd は全員が読めるファイル。ハッシュが見えると、オフラインでゆっくりクラックされてしまいます。

そこでハッシュは /etc/shadow(rootしか読めない)へ移し、/etc/passwd 側は「shadowを見てね」の目印として x を置くようになりました。

⚠ 抜け道

ただし②にハッシュを直接書く古い方式は今でも有効です。x の代わりにハッシュ文字列を書けば、そのパスワードでログインできてしまう。攻撃者が突くのはまさにこの後方互換の抜け道です。

4 パーミッションが穴になる

本来「その他は読むだけ」であるべき

/etc/passwd は全員が参照する必要があるので「誰でも読める」のは正常。でも書き込みは root だけであるべきです。ここが緩んでいると、一般ユーザーが名簿を改ざんできてしまいます。

-rw-r--r--
644 ・ 正常

所有者(root)=読み書き、グループ=読むだけ、その他=読むだけ。一般ユーザーは書き換えられない。

-rw-rw-rw-
666 ・ 設定ミス

その他にも w が付いている=一般ユーザーでも書き換え可能。UID 0 の行を追記できてしまう。重大な脆弱性。

mowree@EvilBoxOne
$ ls -la /etc/passwd
-rw-rw-rw- 1 root root 1398 Aug 16 2021 /etc/passwd  # 誰でも書ける!

パーミッション数字の読み方は「所有者/グループ/その他」×(read 4+write 2+execute 1)。644=6(rw-)/4(r--)/4(r--)、666=6/6/6。.bashrc のときにやった読み方と同じです。

5 攻撃の実演

UID 0 のバックドアアカウントを仕込む

「書き込める /etc/passwd」を悪用した権限昇格の流れです。

バックアップを取る

cp /etc/passwd ./。壊すと全員ログイン不能になり得るので、慎重な攻撃者は必ず退避する。

パスワードハッシュを作る

その場にある openssl で、自分の決めたパスワードのハッシュを生成する(次項)。

UID 0 の行を書き足す

例:hacker:$1$usersalt$AdRP...NT/:0:0:root:/root:/bin/bash を追記。③④を 0 にするのがポイント。

その新ユーザーになる

su hacker → 決めたパスワードを入力 → UID 0 = root を掌握。権限昇格成功。

ハッシュ生成:openssl passwd

mowree@EvilBoxOne
$ openssl passwd -1 -salt usersalt
Password: # "pass" と入力
$1$usersalt$AdRPkkbvjFipmAjyOm.NT/  # ← これを②欄に書く

-1 は MD5形式(-6 なら SHA512、本来はこちらが推奨)。-salt でソルトを指定。出てきたハッシュはこう分解できます。

$1$アルゴリズム識別子(1=MD5 / 6=SHA512)
usersaltソルト
$
AdRPkkbvjFipmAjyOm.NT/パスワード+ソルトから計算した本体
? ソルトとは

ハッシュを作るときに混ぜるランダムな追加文字列。無いと同じパスワードは必ず同じハッシュになり、事前計算した対応表(レインボーテーブル)で一発逆引きされてしまう。ソルトを混ぜると同じ "pass" でも毎回違うハッシュになり、事前計算が効かなくなる。
※今回は攻撃者が自分でハッシュを作る側なので、ソルトは usersalt と適当に固定しているだけ。守る側の技術を悪用している構図です。

6 守る側・IR視点

「書き込み権限」と「UID 0 の増殖」を見張る

✓ 予防

/etc/passwd は 644 から絶対に緩めない。書き込み可能になっていないか定期的に確認する。パスワードは /etc/shadow(640/root専有)で管理する。

✓ 検知

侵害調査では UID 0 のアカウントが root 以外に無いかを必ず確認する。root 以外に UID 0 の行があれば、まずバックドアを疑う。

incident response
$ awk -F: '($3==0){print}' /etc/passwd   # UID(3番目)が0の行だけ抽出
root:x:0:0:root:/root:/bin/bash
hacker:$1$usersalt$...:0:0:root:/root:/bin/bash  # ← root以外にUID 0!要調査
✓ 30秒でおさらい

要点を一本の線で

  • 正体 — /etc/passwd は全ユーザーの名簿。1行 = :区切りの7フィールド。
  • 急所は③のUID — 名前ではなく UID 0 が root。番号がすべて。
  • ②の x — ハッシュ本体は /etc/shadow(root専有)へ。ただし②に直書きする古い方式も有効。
  • 穴 — 本来 644。-rw-rw-rw- だと一般ユーザーが名簿を改ざんできる。
  • 攻撃 — 書き込める passwd に UID 0 の行を追記+openssl passwd でハッシュ生成 → root化。
  • 検知 — awk -F: '($3==0)' で UID 0 を洗い出す。root以外があれば黒。