
OS X용 포렌식 증거 수집 및 분석 툴킷

OSXCollector는 OSX를 위한 포렌식 증거 수집 및 분석 도구 키트입니다.
수집 스크립트는 잠재적으로 감염된 머신에서 실행되며, 대상 머신을 설명하는 JSON 파일을 출력합니다. OSXCollector는 plists, SQLite 데이터베이스 및 로컬 파일 시스템에서 정보를 수집합니다.
포렌식 수집 결과를 바탕으로 분석가는 다음과 같은 질문에 답할 수 있습니다:
Yelp는 대부분의 OSXCollector 실행 분석을 자동화하여 출력을 _의심스러운 것들만_의 쉽게 읽고 실행 가능한 요약으로 변환합니다. 자동화된 OSXCollector 출력 분석을 최대한 활용하는 방법을 알아보려면 OSXCollector Output Filters 프로젝트를 확인하세요.
osxcollector.py는 표준 OSX 머신에서 종속성 없이 실행되는 단일 Python 파일입니다. 따라서 어떤 머신에서든 수집을 매우 쉽게 실행할 수 있습니다 - brew, pip, 설정 파일 또는 환경 변수를 건드릴 필요가 없습니다. 단일 파일을 머신에 복사하고 실행하기만 하면 됩니다:
sudo osxcollector.py만 있으면 됩니다.
$ sudo osxcollector.py
Wrote 35394 lines.
Output in osxcollect-2014_12_21-08_49_39.tar.gz
방금 GitHub 저장소를 클론했다면, osxcollector.py는 osxcollector/ 디렉토리 안에 있으므로 다음과 같이 실행해야 합니다:
$ sudo osxcollector/osxcollector.py
중요: Mac OS X 머신에서 python 명령이 시스템에 기본으로 제공되는 Python 인터프리터를 사용하도록 하고, 예를 들어 brew를 통해 설치된 Python 버전으로 재정의되지 않도록 주의하십시오. OSXCollector는 OS X 라이브러리에 대한 몇 가지 네이티브 Python 바인딩에 의존하는데, 이는 시스템에 원래 설치된 Python 버전 이외의 다른 버전에서는 사용할 수 없을 수 있습니다. 또는 사용하려는 Python 버전을 명시적으로 지정하여 osxcollector.py를 실행할 수 있습니다:
$ sudo /usr/bin/python2.7 osxcollector/osxcollector.py
수집기의 JSON 출력은 시스템 로그와 같은 유용한 파일과 함께 .tar.gz로 번들되어 분석가에게 전달됩니다.
osxcollector.py에는 수집 방식을 변경할 수 있는 많은 유용한 옵션이 있습니다:
-i INCIDENT_PREFIX/--id=INCIDENT_PREFIX:
출력 파일의 접두사로 사용되는 식별자를 설정합니다. 기본값은 osxcollect입니다.
$ sudo osxcollector.py -i IncontinentSealord
Wrote 35394 lines.
Output in IncontinentSealord-2014_12_21-08_49_39.tar.gz
인시던트 이름을 창의적으로 지으세요. 고통 속에서도 웃을 수 있게 해줍니다.
-p ROOTPATH/--path=ROOTPATH:
수집을 실행할 파일 시스템의 루트 경로를 설정합니다. 기본값은 /입니다. 디스크 이미지에서 수집을 실행하는 데 유용합니다.
$ sudo osxcollector.py -p '/mnt/powned'
-s SECTION/--section=SECTION:
전체 수집 중 일부만 실행합니다. 여러 번 지정할 수 있습니다. 섹션 및 서브섹션의 전체 목록은 다음과 같습니다:
versionsystem_info수집기는 수집된 모든 아티팩트를 포함하는 .tar.gz를 출력합니다. 아카이브에는 대부분의 정보가 포함된 JSON 파일이 들어 있습니다. 또한 대상 시스템 로그에서 유용한 로그 집합도 포함됩니다.
JSON 파일의 각 줄은 1개의 _정보 조각_을 기록합니다. 모든 JSON 레코드에 나타나는 몇 가지 공통 키가 있습니다:
osxcollector_incident_id: 모든 레코드가 공유하는 고유 ID.osxcollector_section: 이 레코드가 보유한 데이터의 섹션 또는 유형.osxcollector_subsection: 이 레코드가 보유한 데이터 유형의 서브섹션 또는 더 자세한 설명자.파일을 나타내는 레코드에는 유용한 키들이 있습니다:
atime: 파일 접근 시간.ctime: 파일 생성 시간.mtime: 파일 수정 시간.file_path: 파일의 절대 경로.md5: 파일 내용의 MD5 해시.sha1: 파일 내용의 SHA1 해시.sha2: 파일 내용의 SHA2 해시.다운로드된 파일을 나타내는 레코드의 경우:
xattr-wherefrom: 다운로드된 파일의 소스 및 리퍼러 URL을 포함하는 목록.xattr-quarantines: 어떤 애플리케이션이 파일을 다운로드했는지 설명하는 문자열.SQLite 데이터베이스의 행을 나타내는 레코드의 경우:
osxcollector_table_name: 행이 속한 테이블 이름.osxcollector_db_path: SQLite 파일의 절대 경로.특정 사용자와 연결된 데이터를 나타내는 레코드의 경우:
osxcollector_username: 사용자 이름OSXCollector는 타임스탬프를 YYYY-mm-dd hh:MM:ss 형식의 사람이 읽을 수 있는 날짜/시간 문자열로 변환하려고 시도합니다. 휴리스틱을 사용하여 다양한 타임스탬프를 자동으로 식별합니다:
version 섹션OSXCollector의 현재 버전.
system_info 섹션시스템에 대한 기본 정보를 수집합니다:
kext 섹션다음에서 커널 확장을 수집합니다:
/System/Library/Extensions/Library/Extensionsstartup 섹션다음에서 LaunchAgents, LaunchDaemons, ScriptingAdditions, StartupItems 및 기타 로그인 항목에 대한 정보를 수집합니다:
/System/Library/LaunchAgents/System/Library/LaunchDaemons/Library/LaunchAgents~/Library/LaunchAgents/Library/LaunchDaemons/System/Library/ScriptingAdditions/Library/ScriptingAdditions/System/Library/StartupItems/Library/StartupItems~/Library/Preferences/com.apple.loginitems.plistMac OS X 시작에 대한 자세한 내용은 다음에서 확인할 수 있습니다: http://www.malicious-streams.com/article/Mac_OSX_Startup.pdf
applications 섹션설치된 애플리케이션의 해시를 생성하고 다음에서 설치 기록을 수집합니다:
/Applications~/Applications/Library/Receipts/InstallHistory.plistquarantines 섹션격리(Quarantine)는 사용자가 인터넷에서 다운로드한 파일을 열려고 할 때 '이 파일을 실행하시겠습니까?'를 표시하는 데 필요한 정보입니다. 자세한 내용은 Apple Support의 Quarantines 설명을 확인하세요: http://support.apple.com/kb/HT3662
이 섹션은 격리된 파일에 대한 XProtect 해시 기반 멀웨어 검사 정보도 수집합니다. plist 파일 위치:
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.plist
XProtect는 인터넷 플러그인의 최소 버전도 추가합니다. 해당 plist 파일 위치:
/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/XProtect.meta.plist
downloads 섹션모든 사용자의 다운로드된 파일 해시를 다음에서 수집합니다:
~/Downloads~/Library/Mail Downloads~/Library/Containers/com.apple.mail/Data/Library/Mail Downloadschrome 섹션Google Chrome 웹 브라우저에서 다음 정보를 수집합니다:
이 데이터는 ~/Library/Application Support/Google/Chrome/Default에서 추출됩니다.
firefox 섹션Firefox 프로필의 여러 SQLite 데이터베이스에서 정보를 수집합니다:
이 정보는 ~/Library/Application Support/Firefox/Profiles에서 추출됩니다.
Firefox 프로필 폴더에 대한 자세한 내용은 http://kb.mozillazine.org/Profile_folder_-_Firefox 를 참조하세요.
safari 섹션Safari 프로필의 여러 plist 및 SQLite 데이터베이스에서 정보를 수집합니다:
accounts 섹션사용자 계정에 대한 정보를 수집합니다:
/private/var/db/dslocal/nodes/Default/groups/admin.plist/private/var/db/dslocal/nodes/Default/users~/Library/Accounts/Accounts3.sqlite~/Library/Preferences/com.apple.recentitems.plistmail 섹션메일 앱 디렉토리 내 파일의 해시를 생성합니다:
~/Library/Mail~/Library/Mail Downloadsfull_hash 섹션디스크에 있는 모든 파일의 해시를 생성합니다. 전부 다요. 기본적으로 실행되지 않습니다. 다음 명령으로 실행해야 합니다:
$ sudo osxcollector.py -s full_hash
포렌식 분석은 예술과 과학이 조금씩 섞여 있습니다. 각 분석가는 OSXCollector 출력을 읽을 때 조금씩 다른 이야기를 보게 됩니다. 그것이 분석을 재미있게 만드는 요소입니다.
일반적으로 수집은 무언가 수상한 점이 있어 대상 머신에서 수행됩니다: 안티바이러스가 마음에 들지 않는 파일을 발견했거나, 심층 패킷 검사가 콜아웃을 관찰했거나, 엔드포인트 모니터링이 새로운 시작 항목을 발견했거나. 이 초기 경고의 세부 사항 - 파일 경로, 타임스탬프, 해시, 도메인, IP 등 - 그것만으로도 시작하기에 충분합니다.
특정 타임스탬프 전후 몇 분을 단순히 grep하는 방식이 효과적입니다:
$ cat INCIDENT32.json | grep '2014-01-01 11:3[2-8]'
기록이 포함되어 있습니다. jq와 같은 도구를 사용하면 멋진 출력을 얻을 수 있습니다:
$ cat INCIDENT32.json | grep '2014-01-01 11:3[2-8]' | jq 'select(has("url"))|.url'
$ cat INCIDENT32.json | jq 'select(.osxcollector_username=="ivanlei")|.'
OSXCollector Output Filters 프로젝트에는 OSXCollector의 출력을 처리하고 변환하는 필터가 포함되어 있습니다. 필터의 목표는 OSXCollector 출력을 쉽게 분석할 수 있도록 하는 것입니다.
OSXCollector의 기능은 단일 파일인 osxcollector.py에 저장되어 있습니다. 수집기는 추가 패키지나 종속성 없이 OS X의 기본 설치에서 실행되어야 합니다.
소스 코드를 편집하기 전에 모든 OSXCollector 테스트가 통과하는지 확인하십시오. 다음을 사용하여 테스트를 실행할 수 있습니다: make test
소스 코드를 변경한 후 make test를 다시 실행하여 변경 사항이 테스트를 깨뜨리지 않는지 확인하십시오.
이 작업은 GNU 일반 공중 라이선스(GNU General Public License)에 따라 라이선스가 부여되었으며, https://github.com/jipegit/OSXAuditor에서 파생되었습니다.
OS X 포렌식에 대해 더 배우고 싶으신가요?
다른 흥미로운 도구들:
kextstartup
launch_agentsscripting_additionsstartup_itemslogin_itemsapplications
applicationsinstall_historyquarantinesdownloads
downloadsemail_downloadsold_email_downloadschrome
historyarchived_historycookieslogin_datatop_sitesweb_datadatabaseslocal_storagepreferencesfirefox
cookiesdownloadsformhistoryhistorysignonspermissionsaddonsextensioncontent_prefshealth_reportwebapps_storejson_filessafari
downloadshistoryextensionsdatabaseslocalstorageextension_filesaccounts
system_adminssystem_userssocial_accountsrecent_itemsmailfull_hash$ sudo osxcollector.py -s 'startup' -s 'downloads'
-c/--collect-cookies:
쿠키 값을 수집합니다. 기본적으로 OSXCollector는 쿠키 값에 민감한 정보(예: 세션 ID)가 포함될 수 있으므로 덤프하지 않습니다.
-l/--collect-local-storage:
웹 브라우저의 로컬 저장소에 저장된 값을 수집합니다. 기본적으로 OSXCollector는 값에 민감한 정보가 포함될 수 있으므로 덤프하지 않습니다.
-d/--debug:
자세한 출력 및 Python 중단점을 활성화합니다. OSXCollector에 문제가 있으면 시도해 보세요.
$ sudo osxcollector.py -d