mistake와 같이 1점짜리 문제다. 우선 코드를 보자
#include <stdio.h>
int main(){
setresuid(getegid(), getegid(), getegid());
setresgid(getegid(), getegid(), getegid());
system("/home/shellshock/bash -c 'echo shock_me'");
return 0;
}
모르는 것을 정리해보자
setresuid(real uid, effective uid, saved uid) 를 변환하는 함수이다.
unprivileged process - 각 UID를 현재 프로세스의 각 UID로 설정(=수정불가)
privileged processes(=CAP_SETUID 권한보유) - 각 UID를 임의 값으로 설정 가능
성공 0, 에러 -1 리턴
getegid() : 현재 프로세스의 유효(effective) 그룹 ID를 리턴
-c 옵션이 있으면 문자열에서 명령을 읽는다. 문자열 뒤에 인수가 있으면 $ 0부터 위치 매개 변수에 지정된다.
shellshock : 리눅스 계열 OS에서 주로 사용하는 GNU Bash에서 공격자가 원격에서 악의적인 시스템 명령을 실행할 수 있는 취약점
다음은 write-up을 참고한다. 일반적으로 보던 유형이 아니어서 그런지 쉬운것도 어렵게 느껴진다.
shellshock 취약점 진단 코드가 따로 있었다.
env x='() {:;}; echo hi' ./bash
보안기사를 공부하면서 많이 봤었던 코드인데, 실제로 보니까 많이 낯설다. 앞으로 pwnable에 많이 등장할것같다.
env x='() { :;}; /bin/cat flag' ./shellshock
해당코드를 입력하면 flag를 볼 수 있다.
정리
bash 취약점은 env x='() { :;}; 를 입력하는것으로 간단히 진단할 수 있다.
- env x = (함수명) {수행코드}; 환경변수를 등록하는 코드
- /bin/cat flag' ./shellshock 는 무시되거나 오류를 발생해야 하지만 실제로는 수행이 되어 화면상에 출력된다.
전형적인 입력값 유효성 검증이 정상적으로 수행되지 않은 버그로서 다양한 공격이 가능하다.
https://m.blog.naver.com/renucs/220144713558
방대한 공격인 만큼 짧은 시간에 다 파악할 수는 없을 것 같다.
이정도로 마무리 짓자.
'pwnable' 카테고리의 다른 글
[Toddler's Bottle] random (0) | 2024.05.11 |
---|---|
[Toddler's Bottle] mistake (0) | 2024.05.11 |
[Toddler's Bottle] black jack (0) | 2024.05.11 |
[Toddler's Bottle] cmd1 (0) | 2024.05.11 |
[Toddler's Bottle] lotto (0) | 2024.05.11 |