Download presentation
Presentation is loading. Please wait.
1
SCADA 공격의 실제 사례 연구 Stuxnet 악성 코드
이 재명
2
Stuxnet 이해에 필요한 선수 지식 Windows OS Computer Security
Win32 API : High-level APIs , used by common windows applications Native API : Low-level APIs , including system call wrapper(Zw*) Kernel Driver PE(Portable Executable) – EXE(executable), DLL(library), SYS(kernel driver) Computer Security Reverse Engineering Application Hacking (DLL Injection, Hooking, Vulnerability) System Hacking (Rootkit) IPS – NIPS(Network IPS), HIPS(Host-based IPS)
3
Stuxnet 이란? 2010년 6월에 발견된 SCADA 시스템 공격용 웜 바이러스
이란의 우라늄 농축 시설을 공격하기 위해 만들어진 것으로 추정 극도로 복잡하고 치밀한 설계 국가적 규모의 지원 하에 개발된 것으로 추측됨 Conficker 웜 바이러스에서 영감을 얻은 듯한 부분 존재 Conficker – 역사상 가장 복잡하고 널리 전파됐던 윈도우 웜 바이러스 2009년 1월 기준 9백만 ~ 1천5백만 대 정도의 컴퓨터 감염시킨 바이러스 Microsoft 사에서 Conficker 웜 개발자를 체포하고 유죄판결을 받도록 정보 제공하는 사람에게 $250,000의 현상금까지 걸었었음
4
Stuxnet 감염 통계 이란 약 십만 여 대의 감염된 컴퓨터
5
Stuxnet 의 구조 현대의 바이러스가 사용하는 기법의 대부분이 모두 쓰임 바이러스 설치를 위한 Dropper 기법
프로세스 권한 상승을 위한 0-day 취약점 바이러스 설치 사실을 은폐하기 위한 Rootkit 기법 Autorun.inf를 이용한 USB 저장 장치 감염 C&C 서버와의 통신을 통한 감염 컴퓨터 제어 보안 제품들의 우회 시도 신뢰 프로세스에의 DLL 인젝션 허위 디지털 서명
6
Stuxnet 의 구조 - Dropper Dropper 의 사용 Dropper?
시스템에 바이러스를 설치하는 트로이 목마(Trojan) 바이러스 설치할 바이러스를 내부에 포함하고 있거나, 외부로부터 다운로드함 설치할 Stuxnet의 모든 구성 요소가 Dropper 내 “stub” 섹션에 담김 섹션(Section)? PE 구조에서 데이터의 블록을 구분하는 단위
7
(참고) PE 섹션의 예 – notepad.exe
Process Memory (notepad.exe) PE Header PE Header .text .text .data 6개의 섹션 실행 .data .rdata .pdata .rdata .reloc Thread Stack Mem … .rsrc
8
Stuxnet 의 구조 – Dropper (Cont.)
Dropper가 실행되면 우선 “stub” 섹션에서 Stuxnet DLL을 추출 DLL(Dynamic Link Library)? 윈도우에서 사용되는 외부 라이브러리의 PE 파일 형식 리눅스의 .so 파일에 해당 외부 프로그램이 쓸 수 있는 함수를 노출(export) 그 후, 추출된 DLL을 로드하여 실행할 함수 하나를 호출 함수의 인자로 “stub” 섹션의 메모리 포인터를 넘겨 줌 함수는 “stub” 섹션으로부터 다시 DLL을 추출/로드, 다른 함수를 호출 이 과정이 Stuxnet 실행동안 계속 반복
9
(참고) DLL 예 – kernel32.dll 외부로 노출된 (Export된) 함수들
10
Stuxnet 의 구조 – Dropper (Cont.)
보안 제품 우회 시도 행위 기반 침입 탐지를 수행하는 모니터링 툴/HIPS 우회를 시도 모니터링 툴의 예시 Process Monitor (Sysinternals) HIPS(Host-based IPS)의 예시 COMODO Defense+
11
Stuxnet 의 구조 – Dropper (Cont.)
Windows에서 DLL 로드 함수는 kernel32.dll의 LoadLibrary API 보안 제품들은 DLL 로드 감시를 위해 LoadLibrary 함수를 후킹 후킹(Hooking)? 메모리 조작 등을 통해 대상 함수 호출 시 다른 함수가 불리게 하는 해킹 기법 main: xxx yyy main: jump newmain yyy newmain: 메모리 상의 코드를 조작해 main 함수 대신 newmain 함수가 불리도록 후킹한 예
12
Stuxnet 의 구조 – Dropper (Cont.)
거짓된 파일 경로(예: fake.dll)로 LoadLibrary 함수를 호출하여 경로를 속이고 실제 DLL(예: real.dll) 로드는 정상적으로 이루어지도록 파일 관련 함수를 후킹 ntdll.dll의 ZwOpenFile은 파일을 열 때 사용하는 Low Level API Dropper HIPS의LoadLibrary “fake.dll” 정상LoadLibrary Stuxnet의 ZwOpenFile 파일 Open 시도 (ZwOpenFile) 원래 함수 호출 정상ZwOpenFile “real.dll”
13
Stuxnet 의 구조 – Stuxnet DLL
Stuxnet의 Payload들을 담고 있는 핵심 DLL Payload: ① 화물 ; ② [네트워크] 전송 데이터 ; ③ [보안] 악성코드의 감염 증상 Dropper의 Stub section 속 환경 설정에 따라 지정된 동작 수행 Stuxnet DLL이 export하고 있는 외부 노출 함수들
14
Stuxnet 의 구조 – Stuxnet DLL (Cont.)
DLL Injection “대상 프로세스”는 Stuxnet이 임의로 생성한 프로세스일수도, 기존에 실행 중인 프로세스일 수도 있음 “대상 프로세스”는 신뢰되는 프로세스 중 하나로 정함 (윈도우 시스템 프로세스, 안티바이러스 제품들) 행위 기반 침입 탐지 시스템을 우회하기 위함
15
Stuxnet 의 구조 – Stuxnet DLL (Cont.)
Windows는 Vista(‘06) 이후 사용자 계정 컨트롤(UAC)이라는 보안 시스템 추가 권한이 낮은 프로세스가 권한이 높은 프로세스에 간섭할 수 없음 Stuxnet은 권한이 높은 프로세스에의 DLL 인젝션을 위해 2건의 프로세스 권한 상승 0-day 취약점 중 하나를 이용 0-day 취약점: 공격자 외에는 아직 알려지지 않아 패치되지 않은 취약점 UAC 경고 창
16
Stuxnet 의 구조 – 설치 제일 처음에 Stuxnet DLL의 Export #15번 함수가 호출됨
Export #15번 함수는 윈도우 버전 호환성, 안티바이러스 동작 여부 등을 확인/조치한 뒤, DLL 인젝션 수행 설치 과정을 나타낸 순서도
17
Stuxnet 의 구조 – 감염 NTVDM TRACE 레지스트리 값을 확인
값이 (개발자의 생일?)와 같으면 바이러스 종료 (킬 스위치) VDM(Virtual DOS Machine) – 16bit emulator based on V8086 mode Stuxnet은 시스템 날짜가 전일 때만 동작 Deadline은 신호 전달 목적의 Mutex 생성 Mutex (Mutual exclusion) 원래는 동시성 제어를 위해 만들어진 개념 Windows에서는 Kernel object로 취급되어, Kernel object는 중복 생성이 불가하다는 점에서 중복 실행 방지 트릭으로도 활용 Stuxnet은 동작의 완료를 다른 프로세스에 전달하기 위해 Mutex를 활용
18
Stuxnet 의 구조 – 감염 (Cont.) 커널 드라이버 설치 루트킷(Rootkit)?
Mrxcls.sys: 시스템 부팅 시마다 악성코드 시작 용도 Mrxnet.sys: Rootkit 의심을 피하기 위해 파일 생성 시각을 조작 시스템 폴더 내 다른 일반적인 파일들과 같게 만듦 루트킷(Rootkit)? 어원은 root(유닉스/리눅스 권한) + kit(도구). 유닉스 계열 시스템에서 해커가 시스템 툴을 rootkit으로 바꾸는 데서 유래 악성코드가 존재를 감추기 위해 설치하는 소프트웨어
19
Stuxnet 의 구조 – 감염 (Cont.) RPC 서버 시작
services.exe 시스템 프로세스에 Stuxnet DLL을 주입하여 시작 RPC(Remote Procedure Call) 다른 프로세스에서 제공하는 함수를 호출할 수 있도록 하는 기술 Stuxnet에서는 페이로드 제어의 중심 부분이자, LAN 내부 컴퓨터들끼리의 통신에도 사용됨 외부망과의 연결이 차단된 컴퓨터의 제어에 이용 (버전 업데이트 등)
20
Stuxnet 의 구조 – 감염 (Cont.) WinCC/Step7 프로젝트 파일 감염
WinCC: Siemens 사의 SCADA & HMI 시스템 Step7: PLC 자동화 시스템인 SIMATIC의 제어 소프트웨어 s7tgtopx.exe(WinCC Simatic manager) 프로세스에 Stuxnet DLL 주입 주입된 DLL에서 s7tgtopx.exe 프로세스의 사용 함수를 후킹 CreateFileA : MS-윈도우에서 파일을 생성하거나 여는 API *.s7p(Step7 프로젝트 파일) 파일을 열 때 불리는 함수 열려는 파일이 확장자가 .s7p인 파일이면 파일 경로를 RPC 서버에 보고 StgOpenStorage : Simatic manager가 *.mcp 파일을 열 때 사용하는 함수 *.mcp 파일은 Step7 프로젝트 구성 요소의 하나 *.mcp 확장자를 가진 파일에 접근하면 파일 경로를 RPC 서버에 보고 보고된 파일들이 속한 프로젝트 폴더가 이후 서술할 프로젝트 감염 대상
21
Stuxnet 의 구조 – Mrxcls.sys
시스템 부팅 시마다 악성코드 시작 용도 Realtek 사 또는 JMicron 사의 허위 디지털 서명으로 서명됨 services.exe 프로세스에 Stuxnet DLL 주입 S7tgtopx.exe 프로세스에 Stuxnet DLL 주입 CCProjectMgr.exe 프로세스에 Stuxnet DLL 주입 쉘 프로세스(explorer.exe) 에 oem7m.PNF 주입 oem7m.PNF 파일은 Stuxnet 안에 들어있지 않음 공격자가 원격 전송하는 파일?
22
Stuxnet 의 구조 – C&C (명령 및 제어)
인터넷 연결 여부 체크 (MSN, 윈도우 업데이트 서버) C&C 서버로 감염 컴퓨터의 기본적인 정보 전송 Stuxnet의 환경 설정 데이터 요약 OS 버전 컴퓨터 이름, 도메인 이름(작업 그룹 이름) IP 주소 Siemens Step7 또는 WinCC 가 구동 중인지 조사하여 그 여부
23
Stuxnet 의 구조 – Rootkit (Mrxnet.sys)
NTFS, FAT, CDFS 파일시스템의 필터 드라이버로 작동 IRP 요청을 가로채서 “디렉토리 조회” 명령의 결과 조작 필터 드라이버(Filter Driver) 특정 하드웨어 장치와 OS 사이의 드라이버 스택에 삽입되는 드라이버 IRP(I/O Request Packet) OS 또는 타 Driver에서 특정 Driver로 보내는 I/O 요청 구조체 Realtek 사의 허위 디지털 서명으로 서명됨
24
(참고) 드라이버 스택 예시 OS H/W
25
Stuxnet 의 구조 – 전파 Stuxnet은 크게 세 가지 방법으로 전파됨 네트워크를 통한 전파
이동식 저장 매체를 통한 전파 Step7 프로젝트 감염을 통한 전파
26
Stuxnet 의 구조 – 네트워크 전파 네트워크 전파에 사용된 방법 P2P(Peer-to-Peer) P2P 통신과 업데이트
하드코딩된 DB 서버 비밀번호로 WinCC 컴퓨터 감염 네트워크 공유 폴더를 통한 전파 Print Spooler 0-day 취약점(MS10-061)을 통한 전파 윈도우 서버 서비스 취약점(MS08-067)을 통한 전파 P2P(Peer-to-Peer) 기존의 클라이언트-서버 모델이 아닌 동등한 위치의 컴퓨터들끼리 서로 네트워크 통신하며 정보를 교환하는 모델 P2P 파일 공유 예: BitTorrent, 윈도우 네트워크 파일 공유
27
Stuxnet 의 구조 – 네트워크 전파 (P2P)
RPC(Remote Procedure Call) 이용 RPC는 로컬 컴퓨터 외 네트워크의 원격 컴퓨터의 프로시저도 호출 가능 MS RPC 레퍼런스 문서: us/windows/desktop/rpc/rpc-start-page 다른 컴퓨터의 Stuxnet 버전이 구버전이면 로컬 Stuxnet 전송 신버전이면 원격지의 Stuxnet을 다운로드/설치 외부 망과 분리된 컴퓨터의 Stuxnet의 버전을 최신으로 유지
28
Stuxnet 의 구조 – 네트워크 전파 (WinCC)
WinCC 데이터베이스 S/W가 동작 중인 서버 해킹 시도 DBMS가 MS SQL Server WinCC 소프트웨어에 하드코딩된 기본 비밀번호 이용, DB 접속 시도 비밀번호 변경 없이 기본 비밀번호를 사용하고 있을 경우 접속 성공
29
Stuxnet 의 구조 – 네트워크 전파 (WinCC) (Cont.)
접속에 성공하면 CREATE TABLE/INSERT INTO SQL 문을 보내 Stuxnet EXE 바이너리 전송 OLE Automation 저장 프로시저 이용, 전송된 Stuxnet을 저장 및 실행 ADODB.Stream COM 오브젝트 호출 (바이너리를 디스크에 저장하는 용도) WScript.Shell COM 오브젝트 호출 (EXE 실행 용도) ADODB.Stream과 WScript.Shell은 VBScript 바이러스에서 흔히 사용 OLE(Object Linking & Embedding) : COM(Component Object Model)의 전신 COM(Component Object Model) (= ActiveX) MS Windows에서 사용하는 C++ 기반 객체 모델링 규격 OLE Automation : COM extension for scripting (IDispatch 인터페이스)
30
Stuxnet 의 구조 – 네트워크 전파 (WinCC) (Cont.)
Stuxnet EXE가 실행되면, EXE는 .cab 파일을 리소스에서 추출해 “GraCS\cc_tlg7.sav” 경로에 저장 *.cab 파일은 Windows Cabinet 압축파일 형식으로, 윈도우 내장 유틸리티 extrac32.exe로 압축 해제 가능 xp_cmdshell 내장 저장 프로시저를 이용하여 extrac32.exe 프로그램 실행, “cc_tlg7.savx” 라는 이름으로 Stuxnet DLL 추출 “sp_run” 이라는 이름의 확장 저장 프로시저로 추가 후 실행, 삭제 Stuxnet DLL이 SQL 서버 프로세스의 컨텍스트에서 로드되어 실행됨 Stuxnet 제거가 어렵도록 한 것
31
Stuxnet 의 구조 – 네트워크 전파 (공유 폴더)
네트워크 공유 폴더를 이용한 전파 방식은 예전부터 자주 사용된 기법 과거에 전파력이 강했던 바이러스들이 이용 Win32/Funlove.4099 (1999), Win32/Nimda (2001), Win32/Parite.B (2001), Conficker.B (2008) 등 현재 오피스 환경에서의 파일 공유가 보편적 → 지금까지도 유효 네트워크 상에 C$, Admin$ 공유 항목이 있는 컴퓨터를 찾음 C$ (C:\), Admin$ (%windir%)은 윈도우 기본 공유 항목 쓰기 가능한 디렉토리 내에 DEFRAGxxxxx.TMP 라는 이름으로 Stuxnet DLL 복제
32
Stuxnet 의 구조 – 네트워크 전파 (공유 폴더)
복제에 성공하면, rundll32.exe 명령을 원격으로 실행해서 Stuxnet 원격 실행 시도 rundll32.exe는 DLL 파일의 함수를 호출하는 윈도우 기본 프로그램 rundll32.exe “DEFRAGxxxxx.TMP”,DllGetClassObjectEx rundll32 명령 원격 실행을 위해 다음 네 가지 방법 시도 현재 사용자 인증 정보를 이용해 명령 수행 explorer.exe(윈도우 쉘 프로세스)의 인증 정보 이용하여 수행 WMI의 Win32_Process:Create 메소드 호출을 이용 NetScheduleJobAdd API 함수를 이용해 원격 컴퓨터에 작업 스케줄 추가 WMI(Windows Management Instrumentation) 윈도우의 관리 정보에 접근할 수 있도록 윈도우에서 외부로 노출시키는 인터페이스 Win32_Process class는 프로세스를 관리 (정보 조회, 시작/종료 등)
33
(참고) WMI 프로그래밍 예시 (Win32_Process)
아래 프로그램은 현재 시스템에서 실행 중인 프로세스의 목록을 출력 코드 복사 후 program.vbs 이름으로 저장 후 실행 Dim oWMI, oQuery, oProcess, sResult Set oWMI = GetObject("winmgmts:") Set oQuery = oWMI.ExecQuery("SELECT * FROM Win32_Process") sResult = "" For Each oProcess In oQuery sResult = sResult & oProcess.Name & vbCrLf Next MsgBox sResult, vbInformation, "프로세스 목록" (실행 결과)
34
Stuxnet 의 구조 – 이동식 디스크 전파 네트워크에 연결되어 있지 않은 컴퓨터 감염을 위함
USB 저장장치 감염을 위해 두 가지 방법 이용 *.lnk (바로 가기 파일) 취약점 (CVE ) – Stuxnet 신버전 Autorun.inf (자동 실행) – Stuxnet 구버전 Autorun.inf도 여러 바이러스에서 많이 쓰는 방법 (Conficker.B 등) 현재 백신들은 Autorun.inf 실행 방지의 옵션을 제공한다
35
Stuxnet 의 구조 – 이동식 디스크 전파(Autorun)
AhnLab 기준으로, 최초로 Autorun.inf 를 전파에 사용한 바이러스는 Win32/Leebad.worm (2006) 이후 2007년 들어서 유행하기 시작 Stuxnet에서는 바이러스 실행 파일과 autorun.inf 를 하나의 파일로 넣는 트릭 선보임 Windows에서 autorun.inf를 파싱할 때 올바른 명령어가 아닌 부분은 무시함을 이용 앞 부분은 Stuxnet 실행 파일, 뒷 부분에 autorun.inf 명령어를 집어넣음
36
Stuxnet 의 구조 – Step7 프로젝트 파일 감염
p.20에서 수집한 Step7 프로젝트 폴더 속 프로젝트 파일을 수정 프로젝트를 열면 Stuxnet DLL이 로드되도록 함 Apilog\types 파일을 수정하여 특정 파일 이름의 DLL을 로드하도록 함 DLL Hijacking 기법 DLL Hijacking (a.k.a. DLL Preloading) 응용 프로그램이 DLL을 로드할 때 전체 경로가 아닌 파일명으로만 로드함을 이용, 원래 로드하려던 DLL보다 더 우선 순위의 경로에 조작된 DLL을 위치시키는 수법 DLL 검색 순서: library-search-order SCADA 제어 컴퓨터에 침투하기 위함
37
Stuxnet 의 구조 – PLC 수정 Simatic 소프트웨어의 s7otbxdx.dll 파일을 Stuxnet의 #208번 리소스 파일로 교체 s7otbxdx.dll 파일은 PLC와 컴퓨터 간의 PLC block 교환을 담당 PLC 장치는 STL/SCL와 같은 언어로 된 Code Block, Data Block으로 로드됨 s7otbxdx.dll 파일을 교체함으로써 PLC에서 읽거나 쓰는 PLC block을 감시 PLC block에 독자적인 block을 추가하거나 바꾸어 PLC 감염 PLC 감염 표시 남기기 (재감염 예방 목적) 수행
38
Stuxnet 의 구조 – PLC 루트킷 PLC PLC 감염 사실을 알아차리지 못하도록 루트킷 역할도 수행 Simatic
변조된 s7otbxdx.dll 파일은 s7blk_read, s7blk_write, s7blk_findfirst, s7blk_findnext, s7blk_delete 함수를 가로채서 감염된 PLC block에 대한 정보 은폐, I/O 차단 수행 Simatic S/W PLC comm module (s7otbxdx.dll) PLC Stuxnet block Failure (not exist)
39
추천 도서 윈도우 API 윈도우 커널 역공학 (리버스 엔지니어링) 김상형, “윈도우즈 API 정복 1”, 한빛미디어, 2006
정덕영, “Windows 구조와 원리”, 한빛미디어, 2006 Mark Russinovich et al., “Windows Internals”, 6th ed., Microsoft Press, 2012 이봉석, “실전 윈도우 디바이스 드라이버”, 에이콘출판, 2015 역공학 (리버스 엔지니어링) 이호동, “Windows 시스템 실행파일의 구조와 원리”, 한빛미디어, 2005 이승원, “리버싱 핵심 원리”, 인사이트, 2012
40
참고 문헌 – Stuxnet 관련 Nicolas Falliere et al., “W32.Stuxnet Dossier”, Symantec, y_response/whitepapers/w32_stuxnet_dossier.pdf 박형근, “스턱스넷(Stuxnet) 상세 분석 보고서”, IBM Security, “Win-Trojan/Stuxnet ”, AhnLab, ?virusSeq=33556&tabGubun=1
41
이미지 출처 p.4 그래프 : W32.Stuxnet Dossier, Nicolas Falliere et al.(Symantec), 2011 p.9 CreateFileA 문서 : us/windows/desktop/api/fileapi/nf-fileapi-createfilea 에서 캡처 p.10 COMODO Defense+ 스크린샷 : p.13 DLL Exports 표 : W32.Stuxnet Dossier, Nicolas Falliere et al.(Symantec), 2011
42
이미지 출처 p.15 UAC 경고 창 : uac p.16 Control flow : Nicolas Falliere et al., “W32.Stuxnet Dossier”, Symantec, 2011 p.24 좌 : 우 : hardware/drivers/gettingstarted/driver-stacks p.35 Autorun.inf 사진 : Nicolas Falliere et al., “W32.Stuxnet Dossier”, Symantec, 2011
43
Thank you Any Questions?
Similar presentations