
모듈형 사고 대응 툴킷으로, 감염 가능성이 있는 macOS 엔드포인트에서 포렌식 데이터를 수집하여 브라우저 아티팩트, 지속성 메커니즘, 프로세스 및 네트워크 구성을 캡처합니다.
이 스크립트 세트는 감염이 의심되는 엔드포인트에서 다양한 데이터를 수집하여 사고 대응 프로세스를 지원하도록 설계되었습니다. 이 데이터는 완전한 포렌식 데이터 수집으로 간주되어서는 안 되지만, 많은 유용한 포렌식 정보를 캡처합니다.
진정한 포렌식 데이터를 원한다면 전체 메모리 덤프를 캡처하고 전체 드라이브를 이미징해야 합니다. 이는 이 툴킷의 범위를 벗어납니다.
스크립트는 라이브 시스템에서 실행되어야 하며, 이미지나 다른 포렌식 데이터 저장소에서는 실행되지 않아야 합니다. 실행에 root 권한이 _필수_는 아니지만, root 권한 없이는 의도된 데이터 대부분을 수집할 수 없습니다.
데이터는 두 가지 형태로 수집됩니다. 첫째는 요약 파일 형태로, 셸 명령어의 출력, 데이터베이스에서 추출된 데이터 등을 포함합니다. 예를 들어, browser 모듈은 Safari, Chrome, Firefox에 설치된 모든 브라우저 확장 프로그램의 요약이 포함된 browser_extensions.txt 파일을 출력합니다.
둘째는 파일 시스템에서 수집된 완전한 파일들입니다. 이들은 수집 폴더 내의 artifacts 하위 폴더에 저장됩니다.
스크립트 실행은 매우 간단합니다. 필수 매개변수 하나만 필요하며, JSON 형식의 구성 스크립트를 전달합니다:
./pict.py -c /path/to/config.json
구성 스크립트는 스크립트가 수집할 내용과 방법을 설명합니다. 다음과 같은 형태여야 합니다:
{
"collection_dest" : "~/Desktop/",
"all_users" : true,
"collectors" : {
"browser" : "BrowserExtCollector",
"persist" : "PersistenceCollector",
"suspicious" : "SuspiciousBehaviorCollector",
"browserhist" : "BrowserHistoryCollector",
"bash_config" : "BashConfigCollector",
"bash_hist" : "BashHistoryCollector",
"processes" : "ProcessCollector",
"network_config" : "NetworkConfigCollector",
"profiles" : "ProfileCollector",
"certs" : "TrustedCertCollector"
},
"settings" : {
"keepLSData" : true,
"zipIt" : true
},
"moduleSettings" : {
"browser" : {
"collectArtifacts" : true
}
},
"unused" : {
"installs" : "InstallationCollector"
}
}
이는 수집된 데이터를 저장할 경로를 지정합니다. 절대 경로이거나 사용자 홈 폴더에 상대적인 경로(물결표로 시작)일 수 있습니다. 지정되지 않은 경우 기본 경로는 /Users/Shared입니다.
데이터는 이 위치에 생성된 폴더에 수집됩니다. 해당 폴더의 이름은 PICT-computername-YYYY-MM-DD 형식이며, 여기서 컴퓨터 이름은 시스템 환경설정 > 공유에 지정된 시스템 이름이고, 날짜는 수집 날짜입니다.
true인 경우 가능할 때마다 시스템의 모든 사용자로부터 데이터를 수집합니다. false인 경우 스크립트를 실행하는 사용자에 대해서만 데이터를 수집합니다. 지정되지 않은 경우 이 값은 기본적으로 true입니다.
PICT는 모듈식이며, 사용되는 Collector 모듈을 변경하여 범위를 쉽게 확장하거나 축소할 수 있습니다.
collectors 데이터는 딕셔너리로, 키는 로드할 모듈의 이름(확장자 .py를 제외한 Python 파일 이름)이고 값은 해당 모듈에 있는 Collector 서브클래스의 이름입니다. 사용자 정의 모듈에 대한 추가 항목을 추가하거나(자신만의 모듈 작성 참조) 항목을 제거하여 해당 모듈이 실행되지 않도록 할 수 있습니다. 나중에 다시 추가하려는 경우 정확한 이름을 검색할 필요 없이 모듈을 제거하는 쉬운 방법은 해당 모듈을 unused라는 최상위 딕셔너리로 이동하는 것입니다.
이 딕셔너리는 전역 설정을 제공합니다.
keepLSData는 lsregister.txt 파일(상당히 클 수 있음)을 보관할지 여부를 지정합니다. (이 파일은 자동으로 생성되며 다른 모듈에서 출력을 구축하는 데 사용됩니다. 풍부한 유용한 정보를 포함하지만 크기가 100MB를 초과할 수 있습니다. 해당 데이터가 모두 필요하지 않거나 그렇게 많은 데이터를 처리하고 싶지 않다면 이 값을 false로 설정하면 수집이 완료될 때 삭제됩니다.)
zipIt는 수집 폴더의 내용을 자동으로 압축 파일로 생성할지 여부를 지정합니다. 데이터를 압축하고 해제하는 과정에서 파일 소유권과 같은 일부 속성이 변경될 수 있습니다.
이 딕셔너리는 모듈별 설정을 지정합니다. 모든 모듈에 자체 설정이 있는 것은 아니지만, 모듈이 자체 설정을 허용하는 경우 여기에 제공할 수 있습니다. 위 예시에서는 browser 모듈과 함께 collectArtifacts라는 부울 설정이 사용되는 것을 볼 수 있습니다.
또한 Collector 클래스에서 유지 관리하며 각 모듈에 대해 개별적으로 설정할 수 있는 전역 모듈 설정도 있습니다.
collectArtifacts는 해당 모듈에서 일반적으로 수집되는 파일 아티팩트를 수집할지 여부를 지정합니다. false인 경우 해당 모듈의 모든 아티팩트가 생략됩니다. 저장 공간이 문제이고 수집된 아티팩트가 큰 경우, 또는 수집된 아티팩트가 분석 중인 시스템 사용자의 개인 정보 문제를 나타낼 수 있는 경우에 필요할 수 있습니다.
모듈은 collectors/collector.py에 정의된 Collector의 서브클래스인 클래스를 포함하는 파일로 구성되어야 하며, collectors 폴더에 배치되어야 합니다. 새로운 Collector 모듈은 collectors/template.py 파일을 복제하고 자신의 용도에 맞게 사용자 정의하여 쉽게 만들 수 있습니다.
def __init__(self, collectionPath, allUsers)이 메서드는 필요한 경우 재정의할 수 있지만, 이러한 경우 슈퍼 Collector.init() 반드시 호출되어야 하며, 가능하면 사용자 정의 코드가 실행되기 전에 호출하는 것이 좋습니다. 이렇게 하면 코드에서 속성을 사용하기 전에 객체가 속성을 설정할 기회를 얻습니다.
def printStartInfo(self)이것은 이 모듈의 수집이 시작될 때 호출되는 매우 간단한 메서드입니다. 무슨 일이 일어나고 있는지에 대한 피드백을 제공하여 사용자에게 진행 상황을 알리는 메시지를 stdout에 출력하기 위한 것입니다.
def applySettings(self, settingsDict)이를 통해 모듈은 사용자 정의 설정을 적용할 수 있습니다. 각 모듈은 자체 정의된 설정을 가질 수 있지만, Collection 클래스가 정의하는 설정을 처리할 수 있도록 settingsDict는 슈퍼에도 전달되어야 합니다.
def collect(self)이 메서드는 모듈의 핵심입니다. 모듈이 수집을 시작할 때 호출됩니다. 필요한 만큼 많은 파일을 쓸 수 있지만, 이 활동을 self.collectionPath 경로 내의 파일로 제한해야 하며, 다른 모듈이 이미 사용하지 않은 파일 이름을 사용해야 합니다.
아티팩트를 수집하려면 직접 처리하지 마십시오. self.pathsToCollect 배열에 경로를 추가하기만 하면 Collector 클래스가 해당 파일을 artifacts 폴더의 적절한 하위 경로로 복사하고 아티팩트의 메타데이터(권한, 확장 속성, 플래그 등)를 유지 관리합니다.
메서드가 완료되면 반드시 슈퍼(Collector.collect(self))를 호출하여 Collector 클래스가 아티팩트 수집과 같은 책임을 처리할 기회를 제공하십시오.
collect 메서드는 self.collectionPath에 있는 basic_info.txt 또는 lsregister.txt 파일에 수집된 모든 데이터를 사용할 수 있습니다. 이 파일들은 pict.py 스크립트에 의해 처음에 수집되며 다른 모든 모듈에서 사용할 수 있다고 가정할 수 있습니다. 그러나 다른 모듈의 출력에 의존해서는 안 됩니다. 모듈이 구성 JSON에 나타나는 순서대로 실행된다는 보장이 없기 때문입니다(Python 딕셔너리는 순서가 없으므로).
바이너리 plist, 날짜 데이터 유형이 포함된 plist 등을 읽는 많은 문제를 해결해 준 FoundationPlist.py를 제공한 Greg Neagle에게 감사드립니다.