나는 버퍼 오버플로 공격을 시도해 왔고 이를 사용하여 system("/bin/bash")
루트 쉘을 얻을 수 있다고 생각합니다.
그럼 난 읽어선적 서류 비치system()
.
그것은 말한다:
system()
실제로/bin/sh
bash 버전 2 시스템에서는 bash 2가 시작 시 권한을 제거하기 때문에 set-user-ID 또는 set-group-ID 권한이 있는 프로그램이 제대로 작동하지 않습니다.
내가 공격하는 시스템에는 bash 버전 4.3이 있고 를 사용할 때 system("/bin/bash")
루트 권한이 없습니다(물론 내가 공격하는 초기 프로그램은 루트 권한으로 시작합니다). 내 질문은: 시스템이 bash 버전 2에 대한 권한만 제거합니까, 아니면 버전 2 이상의 bash에 대한 권한을 제거합니까?
편집: /bin/bash
동시에 /bin/dash
또는 /bin/sh
동시에 권한을 제거하십시오.
@StéphaneChazelas의 의견을 읽은 후 EDIT2:
- 확인하다이 링크Bash에서 권한 제거에 대한 추가 설명과 정확성.
-p
bash가 빌드될 때 권한이 유지되도록 옵션을 사용할 수 있습니다.
답변1
현재 버전
-p
최신 버전의 bash는 다음 섹션에서 사용되지 않는 한 권한을 삭제합니다 .큰 타격(1)특권 모드 설명:
쉘 시작 시 유효 사용자(그룹) ID가 실제 사용자(그룹) ID와 동일하지 않은 경우-피옵션이 제공되지 않습니다. [...] 유효 사용자 ID는 실제 사용자 ID로 설정됩니다. 만약에-피이 옵션은 시작 시 제공되며 유효 사용자 ID는 재설정되지 않습니다. 이 옵션을 끄면 유효 사용자 및 그룹 ID가 실제 사용자 및 그룹 ID로 설정됩니다.
역사적인 버전
"어떤 버전에서...?"라고 묻습니다. 참조하는 섹션은 활성 Git 저장소에서 사용 가능한 최초 개정 이후 system()
변경되지 않았습니다.(버전 1.70). 해당 파일은 2004년에 체크인되었으며 댓글에 따르면 2001년에 마지막으로 수정되었다는 내용이 나와 있습니다.
Bash 버전 3은 2004년에 출시되었습니다.. 이는 당시 bash 2가 현재/최신 버전이 될 것임을 의미합니다. 따라서 실제로 "...bash 버전 2 이상/최신"이라고 말하는 것입니다. 이것이 그 경우 다~부터버전 2.
직접 확인하려면 중간 버전을 빌드하여 테스트하거나 bash에 문의하세요.Git 저장소. 담당 라인은 다음과 같습니다.
if (running_setuid && privileged_mode == 0)
disable_priv_mode ();
그 이후로 주변에 있었던 사람들버전 2.0. 과거를 되돌아보다버전 1.14.7, bash는 다음을 사용하여 권한 모드가 명시적으로 비활성화된 경우에만 권한을 제거합니다 +p
.
case 'p':
if (on_or_off == '+')
{
setuid (current_user.uid);
setgid (current_user.gid);
current_user.euid = current_user.uid;
current_user.egid = current_user.gid;
}