IT/시스템 보안

[Shellshock attack] environment variable, bash, parse_and_execute()

kykyky 2024. 5. 19. 20:58

Shell function을 child process에게 전달하는 방법

▶Shell function 예시

 

▶방법 1. 

parent shell에서 "함수" 형태를 가진 환경 변수를 정의한다.

(정말 함수로서 정의됐는지 보려고 declare -f로 확인해 보았을때 정상적으로 함수 코드가 보이며, 함수를 실행하면 제대로 작동한다.)

 

이제 export -f로 함수를 export하고,

 

child shell을 실행하면, child shell은 함수를 잘 전달받았다. 

(정말 잘 전달받은지 보려고 다시 declare -f로 확인해 보았을 때 정상적으로 함수 코드가 보이며,
함수를 실행하면 제대로 작동함)

 

▶방법 2.

parent에서 (이 방법에서는 parent가 꼭 shell이 아니어도 된다.) 단순히 "string" 형태의 환경 변수를 정의한다.

(정말로 함수 형태로 전달된 것이 아닌지를 declare -f로 확인해 보았을 때, 예상대로 함수 코드가 없다.)

 

이제 환경 변수를 export하고, 

 

child shell을 실행하면, child shell은 이를 함수 정의로 전환한다.

(정말 함수로서 인식하는지 보려고 다시 declare -f로 확인해 보았을때 여기서는 정상적으로 함수 코드가 보이며,

함수를 실행하면 제대로 작동함)

 

Bash 프로그램의 문제점

▶근본적 원인

bash 프로그램의 소스 코드 내 존재하는 아래 parse_and_execute() 함수로 인해 취약해지는 것이다.

 

이 함수는 environment variable을 parse하고, 그 조각이 

function definition이면 ㅡ execute는 안하고,

shell command면 ㅡ execute한다. 

 

▶직접 실험해보자

아래 command를 통해, 위의 Shell function을 child process에게 전달하는 방법 에서 방법 2.를 수행한다. 

 

 

echo해 보면 foo는 아래와 같다:

 

 

이제 이를 export한 뒤 vulnerable한 bash를 실행하면 아래와 같다:

 

위처럼 되는 bash 내부 매커니즘은 아래와 같다:

 

bash는 environment variable인 foo (아래)의 맨 앞 () { 를 보고 함수임을 인지한다.

 

따라서 아래처럼 = 을 없앤다. 

이렇게 하고 나니 그냥 command가 두개 있는것처럼 보인다!

 

이제, parse_and_execute() 함수가 위 두 command를 각각 실행해버리는 것이다.

 

 

Shellshock vulnerability

 

▶이 공격이 일어나기 위한 선결 조건

i) target 프로세스가 bash나 system()을 실행하여야 함 

- system()은 내부적으로 bash를 실행하므로 bash의 취약점을 내포함  

 

ii) target 프로세스가 환경 변수를 통해 위험한 사용자 입력을 받아야 함 

 

 

Exploit

▶on Set-UID program

예시 프로그램 분석

만약 RUID != EUID이면, bash는 환경 변수에 있는 함수 정의를 애초에 처리하지 않으므로 (보안을 위한 bash의 기본적 조치임), shellshock attack가 안 먹힌다.
그러나 이 프로그램에는 setuid(geteuid())가 있어서, RUID도 EUID와 같이 root로 설정되므로, shellshock attack에 취약하다!
※ setuid(value): 프로세스의 EUID가 root면 → 프로세스의 RUID는 value로 설정됨. 

 

위 Set-UID 프로그램은 원래 아래와 같이 진행된다:

system() → fork() → execl() → /bin/sh (= vulnerable bash) → /bin/ls

 

정상 실행의 경우 아래와 같다.

 

 

exploit

 

 

환경변수 foo를 export하므로, Set-UID 프로그램 실행 시 foo는 이후의 child process의 환경 변수가 될 것이다.

Set-UID 프로그램에 의해 실행된 bash는 위 foo를 위험한 parsing logic에 의해 parse하여, 

함수 정의 부분 뒤의 /bin/sh를 실행해버리는데, 

이때 현재 프로그램은 Set-UID이니 사용자는 임시적으로 root 권한이므로, 

root 권한의 /bin/sh가 실행되는 것이다.

 

▶on CGI Program

아래 글 참고. 

 

2024.05.30 - [IT/시스템 보안] - [Shellshock attack] 환경변수를 통해 bash에게 명령어 string 전달해 실행시키기, reverse shell, patch [SEED Labs - 7]

 

[Shellshock attack] 환경변수를 통해 bash에게 명령어 string 전달해 실행시키기, reverse shell, patch [SEED La

아래는 실습 보고서 파일입니다.

intoky.tistory.com