Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
PwnKit-Exploit — C 기반의 CVE-2021-4034 (PwnKit) 개념 증명 익스플로잇으로, pkexec의 경계를 벗어난 쓰기를 통해 로컬 권한 상승을 가능하게 합니다. 빌드 지침과 취약점 설명이 포함되어 있습니다. | Kitploit
도구/GitHubGitHub/luijait/pwnkit-exploit
Privilege EscalationVulnerability AnalysisExploitationPenetration Testing
GitHubluijait/pwnkit-exploit

PwnKit-Exploit

C 기반의 CVE-2021-4034 (PwnKit) 개념 증명 익스플로잇으로, pkexec의 경계를 벗어난 쓰기를 통해 로컬 권한 상승을 가능하게 합니다. 빌드 지침과 취약점 설명이 포함되어 있습니다.

저장소 보기
9818104년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

PwnKit-Exploit

CVE-2021-4034

PolKit

@c0br40x가 README의 이 섹션을 만드는 데 도움을 주었습니다!!

개념 증명

개념 증명

debian@debian:~/PwnKit-Exploit$ make
cc -Wall    exploit.c   -o exploit
debian@debian:~/PwnKit-Exploit$ whoami
debian
debian@debian:~/PwnKit-Exploit$ ./exploit
Current User before execute exploit
hacker@victim$whoami: debian
Exploit written by @luijait (0x6c75696a616974)
[+] Enjoy your root if exploit was completed succesfully
root@debian:/home/debian/PwnKit-Exploit# whoami
root
root@debian:/home/debian/PwnKit-Exploit# 

수정

명령어용도
sudo chmod 0755 pkexecCVE-2021-4034 수정

설치 및 사용

git clone https://github.com/luijait/PwnKit-Exploit

cd PwnKit-Exploit

make

./exploit

whoami

명령어용도
make clean수정된 코드를 테스트하기 위한 빌드 정리

설명

기반: blog.qualys.com

pkexec의 main() 함수 시작 부분은 명령줄 인수를 처리하고(534-568행), 실행할 프로그램의 경로가 절대 경로가 아닌 경우 PATH 환경 변수의 디렉터리에서 검색합니다(610-640행):


435 main (int argc, char *argv[])
436 {
...
534   for (n = 1; n < (guint) argc; n++)
535     {
...
568     }
...
610   path = g_strdup (argv[n]);
...
629   if (path[0] != '/')
630     {
...
632       s = g_find_program_in_path (path);
...
639       argv[n] = path = s;
640     }

불행히도, 명령줄 인수 argc가 0인 경우 – 즉 execve()에 전달하는 인수 목록 argv가 빈 목록 {NULL}인 경우 – argv[0]은 NULL입니다. 이것이 인수 목록의 종결자입니다. 따라서:

  • 534행에서 정수 n은 영구적으로 1로 설정됩니다.
  • 610행에서 포인터 path는 argv[1]에서 경계를 벗어나 읽힙니다.
  • 639행에서 포인터 s는 argv[1]에 경계를 벗어나 기록됩니다.

그런데 이 경계를 벗어난 argv[1]에서 정확히 무엇을 읽고 쓰는 걸까요?

이 질문에 답하기 위해 잠시 설명을 확장해야 합니다. execve()로 새 프로그램을 실행할 때 커널은 인수, 환경 문자열 및 포인터(argv 및 envp)를 새 프로그램 스택의 끝에 복사합니다. 예를 들어:

|---------+---------+-----+------------|---------+---------+-----+------------| 
| argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | 
|----|----+----|----+-----+-----|------|----|----+----|----+-----+-----|------| 
V         V                V           V         V                V 

"program" "-option"           NULL      "value" "PATH=name"          NULL 

분명히, argv와 envp 포인터는 메모리에서 연속적이므로, argc가 0이면 경계를 벗어난 argv[1]은 실제로 envp[0], 즉 첫 번째 환경 변수인 "value"를 가리키는 포인터입니다. 따라서:

  • 610행에서 실행할 프로그램의 경로는 argv[1] (즉 envp[0])에서 경계를 벗어나 읽혀지며, "value"를 가리킵니다.
  • 632행에서 이 경로 "value"는 ("value"가 슬래시로 시작하지 않으므로 629행에서) g_find_program_in_path()에 전달됩니다.
  • 그런 다음 g_find_program_in_path()는 PATH 환경 변수의 디렉터리에서 "value"라는 실행 파일을 검색합니다.
  • 이러한 실행 파일이 발견되면 전체 경로가 pkexec의 main() 함수로 반환됩니다(632행).
  • 마지막으로 639행에서 이 전체 경로가 argv[1] (즉 envp[0])에 경계를 벗어나 기록되어 첫 번째 환경 변수를 덮어씁니다.

더 정확히 말하면:

  • PATH 환경 변수가 "PATH=name"이고, 디렉터리 "name"이 (현재 작업 디렉터리에) 존재하며 "value"라는 실행 파일을 포함하는 경우, "name/value" 문자열에 대한 포인터가 envp[0]에 경계를 벗어나 기록됩니다.
  • 또는 PATH가 "PATH=name=."이고 디렉터리 "name=."이 존재하며 "value"라는 실행 파일을 포함하는 경우, "name=./value" 문자열에 대한 포인터가 envp[0]에 경계를 벗어나 기록됩니다.

즉, 이 경계를 벗어난 쓰기를 통해 "안전하지 않은" 환경 변수(예: LD_PRELOAD)를 pkexec의 환경에 다시 도입할 수 있습니다. 이러한 "안전하지 않은" 변수는 일반적으로 main() 함수가 호출되기 전에 SUID 프로그램의 환경에서 (ld.so에 의해) 제거됩니다. 다음 섹션에서 이 강력한 원시 도구를 활용할 것입니다.

마지막 참고 사항: polkit은 Solaris 및 *BSD와 같은 Linux가 아닌 운영 체제도 지원하지만, 이들의 악용 가능성은 조사하지 않았습니다. 그러나 OpenBSD는 argc가 0인 프로그램을 execve()하는 것을 커널이 거부하므로 악용할 수 없습니다.

도구 다운로드