Elasticsearch 및 Kibana를 사용하여 이메일 MBOX 파일 및 기타 CSV 데이터(예: 문자 메시지)에서 통신 콘텐츠를 가져오고 분석하기 위한 단순화된 OSINT 도구 세트를 제공하는 Docker 이미지입니다. 이는 전체 OSINT 분석 소프트웨어 스택을 시작하고 Kibana 및 ElasticSearch를 통해 분석할 수 있도록 모든 통신을 가져오는 단일 명령을 제공합니다.
이 프로젝트는 Dockerfile을 관리하여 실행 시 ElasticSearch와 Kibana를 모두 시작한 다음 선택적으로 컨테이너 내에 번들로 제공되는 다음 도구를 사용하여 통신 데이터를 가져오는 이미지를 생성합니다.
중요 아래 링크는 이 프로젝트 개발 당시 수정되지 않은 원본 프로젝트의 뛰어난 문제로 인해 원본 프로젝트의 포크 입니다.
거기에서... 음, 통신에 관한 거의 모든 것을 분석하고 시각화할 수 있습니다. 즐기다.
아래 예제를 실행하기 전에 Docker가 설치되어 있어야 합니다.
Windows 참고 : 빌드하기 전에 Windows에서 이 프로젝트를 git clone
때 git clone 플래그 --config core.autocrlf=input
추가해야 합니다. 예 git clone https://github.com/bitsofinfo/comms-analyzer-toolbox.git --config core.autocrlf=input
. 여기서 더 읽어보세요
Docker가 설치되면 명령줄 셸을 열고 다음을 입력하여 도구 상자용 Docker 이미지를 만듭니다.
docker build -t comms-analyzer-toolbox .
Windows용 Docker 도구 상자 참고 사항
생성된 default
Docker 시스템 VM은 이를 즉시 실행하기에는 성능이 부족할 수 있습니다. 로컬 가상 박스 머신의 CPU와 메모리를 늘리려면 다음을 수행해야 합니다.
"Docker Quickstart Terminal"을 불러옵니다.
기본 머신 제거: docker-machine rm default
다시 만들기: docker-machine create -d virtualbox --virtualbox-cpu-count=[N cpus] --virtualbox-memory=[XXXX megabytes] --virtualbox-disk-size=[XXXXXX] default
문제 해결 오류: "최대 가상 메모리 영역 vm.max_map_count [65530]이 너무 낮습니다. 최소 [262144]로 늘리십시오."
도구 상자를 시작할 때 이 오류가 표시되면(Elasticsearch에서 오류가 보고됨) 컨테이너가 시작되는 Docker 호스트에서 다음을 수행해야 합니다.
sysctl -w vm.max_map_count=262144
Docker Toolbox를 사용하는 경우 이 명령을 실행하려면 먼저 docker ssh default
사용하여 boot2docker VM에 셸해야 합니다. 또는 영구적으로 만들려면 다음을 수행하십시오: docker/machine#3859
MBOX 파일의 모든 이메일 메시지에 대해 각 메시지는 모든 이메일 헤더가 개별 필드로 인덱싱되고 모든 본문 콘텐츠가 html/css/js에서 인덱싱 및 제거되는 ElasticSearch의 별도 문서가 됩니다.
예를 들어, 인덱스로 가져온 각 이메일에는 Kibana에서 검색 및 분석에 사용할 수 있는 다음 필드가 있습니다(그 외에도 훨씬 더 많음).
시스템에서 Docker를 사용할 수 있게 되면 comms-analyzer-toolbox
실행하기 전에 MBOX 형식으로 분석할 이메일이 있어야 합니다. 예를 들어, 아래는 Gmail에서 이메일을 내보내는 방법입니다.
컴퓨터의 웹 브라우저를 사용하여 Gmail 계정에 로그인하세요.
이동: https://takeout.google.com/settings/takeout
"데이터 다운로드" 화면에서 "포함할 데이터 선택" 섹션에서 "없음 선택" 버튼을 클릭하세요. 아래에 나열된 모든 "제품"이 회색으로 표시됩니다.
이제 아래로 스크롤하여 "메일" 이라고 표시된 회색으로 표시된 섹션을 찾은 다음 오른쪽에 있는 X 확인란을 클릭하세요. 이제 녹색으로 바뀌어 이 데이터를 다운로드할 준비가 되었음을 나타냅니다.
아래로 스크롤하여 파란색 "다음" 버튼을 클릭하세요.
"아카이브 형식 사용자 정의" 설정을 그대로 두고 "아카이브 만들기" 버튼을 누르세요.
이제 "보관 파일을 준비 중입니다."라는 메시지가 표시됩니다. 화면. 가지고 있는 모든 이메일의 크기에 따라 이 작업은 몇 시간이 걸릴 수 있습니다.
아카이브를 다운로드할 준비가 되면 Google로부터 이메일을 받게 됩니다. 다운로드한 후 zip 파일을 로컬 컴퓨터의 하드 드라이브에 다운로드하면 takeout-[YYYMMMDDD..].zip
같은 이름이 지정됩니다.
하드 드라이브에 저장한 후 파일의 압축을 풀면 Gmail에서 내보낸 모든 메일이 Takeout/Mail/
폴더의 mbox 내보내기 파일에 저장되고 All mail Including Spam and Trash.mbox
메일이 포함된 파일 이름은 다음 위치에 있습니다. All mail Including Spam and Trash.mbox
이 파일의 이름을 my-email.mbox
와 같이 더 간단한 이름으로 바꿔야 합니다.
도구 상자를 실행할 때 아래에서 사용할 것이므로 .mbox 파일의 위치를 기록해 두십시오.
아래 예제를 실행하기 전에 Docker가 설치되어 있어야 합니다.
컴퓨터에서 터미널이나 명령 프롬프트를 열고 다음을 실행하세요. 그렇게 하기 전에 아래의 PATH/TO/YOUR/email.mbox
및 PATH/TO/ELASTICSEARCH_DATA_DIR
로컬 시스템의 적절한 경로로 바꿔야 합니다.
참고: Windows용 Docker Toolbox를 사용하는 경우 아래에 마운트된 모든 볼륨은 권한 문제로 인해 c:Users[your username]...
아래의 홈 디렉터리 아래 어딘가에 있어야 합니다.
docker run --rm -ti
--ulimit nofile=65536:65536
-v PATH/TO/YOUR/my-email.mbox:/toolbox/email.mbox
-v PATH/TO/ELASTICSEARCH_DATA_DIR:/toolbox/elasticsearch/data
comms-analyzer-toolbox:latest
python /toolbox/elasticsearch-gmail/src/index_emails.py
--infile=/toolbox/email.mbox
--init=[True | False]
--index-bodies=True
--index-bodies-ignore-content-types=application,image
--index-bodies-html-parser=html5lib
--index-name=comm_data
--init=True
로 설정하면 comm_data
인덱스가 삭제되고 다시 생성됩니다. --init=False
로 설정하면 이미 존재하는 모든 데이터가 유지됩니다.
콘솔은 진행 상황에 대한 출력을 기록하며, 시스템이 부팅되면 데스크탑에서 웹 브라우저를 열고 http://localhost:5601 로 이동하여 Kibana를 사용하여 데이터를 분석할 수 있습니다. 참고: docker toolbox를 실행하는 경우; 'localhost'가 작동하지 않을 수 있습니다. docker-machine env default
실행하여 docker 호스트 IP 주소를 확인한 다음 http://[machine-ip]:5601로 이동하세요.
Configure an index pattern
이라는 첫 번째 화면에서 Index name or pattern
필드에 comm_data
입력하면 date_ts
필드가 자동으로 선택된 것을 볼 수 있으며 Create
버튼을 누릅니다. 이제 Kibana를 사용할 준비가 되었습니다!
시작은 다음 순서로 여러 작업을 수행합니다.
mbox 가져오기 도구가 실행되면 시스템이 mbox 파일에서 메일을 가져오는 작업을 수행하면서 로그에 다음 항목이 표시됩니다.
...
[I 170825 18:46:53 index_emails:96] Upload: OK - upload took: 467ms, total messages uploaded: 1000
[I 170825 18:48:23 index_emails:96] Upload: OK - upload took: 287ms, total messages uploaded: 2000
...
comms-analyzer-toolbox
이미지를 실행할 때 인수 중 하나는 다음 인수를 사용하는 elasticsearch-gmail 스크립트를 호출하는 것입니다. 위의 docker run
명령을 조정하여 원하는 대로 다음 플래그를 전달할 수 있습니다.
Usage: /toolbox/elasticsearch-gmail/src/index_emails.py [OPTIONS]
Options:
--help show this help information
/toolbox/elasticsearch-gmail/src/index_emails.py options:
--batch-size Elasticsearch bulk index batch size (default
500)
--es-url URL of your Elasticsearch node (default
http://localhost:9200)
--index-bodies Will index all body content, stripped of
HTML/CSS/JS etc. Adds fields: 'body',
'body_size' and 'body_filenames' for any
multi-part attachments (default False)
--index-bodies-html-parser The BeautifulSoup parser to use for
HTML/CSS/JS stripping. Valid values
'html.parser', 'lxml', 'html5lib' (default
html.parser)
--index-bodies-ignore-content-types
If --index-bodies enabled, optional list of
body 'Content-Type' header keywords to match
to ignore and skip decoding/indexing. For
all ignored parts, the content type will be
added to the indexed field
'body_ignored_content_types' (default
application,image)
--index-name Name of the index to store your messages
(default gmail)
--infile The mbox input file
--init Force deleting and re-initializing the
Elasticsearch index (default False)
--num-of-shards Number of shards for ES index (default 2)
--skip Number of messages to skip from the mbox
file (default 0)
MBOX 이메일 데이터를 가져올 때 로그 출력에 다음과 같은 경고/오류가 표시될 수 있습니다.
이는 예상된 내용이며 괜찮습니다. 이는 단순히 디코딩할 수 없는 일부 특수 문자에 대한 경고일 뿐입니다.
...
/usr/lib/python2.7/site-packages/bs4/__init__.py:282: UserWarning: "https://someurl.com/whatever" looks like a URL. Beautiful Soup is not an HTTP client. You should probably use an HTTP client like requests to get the document behind the URL, and feed that document to Beautiful Soup.
' that document to Beautiful Soup.' % decoded_markup
[W 170825 18:41:56 dammit:381] Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
[W 170825 18:41:56 dammit:381] Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
...
도구 상자에 포함된 CSV 가져오기 도구인 csv2es
아래 예제 형식뿐만 아니라 모든 CSV 파일을 가져올 수 있습니다.
CSV 파일의 모든 데이터 행에 대해 각 행은 모든 CSV 열이 개별 필드로 인덱싱되는 ElasticSearch의 별도 문서가 됩니다.
예를 들어, 인덱스로 가져온 아래 CSV 데이터 파일(iPhone에서 보낸 문자 메시지)의 각 줄에는 Kibana에서 검색 및 분석에 사용할 수 있는 다음 필드가 있습니다.
"Name","Address","date_ts","Message","Attachment","iMessage"
"Me","+1 555-555-5555","7/17/2016 9:21:39 AM","How are you doing?","","True"
"Joe Smith","+1 555-444-4444","7/17/2016 9:38:56 AM","Pretty good you?","","True"
"Me","+1 555-555-5555","7/17/2016 9:39:02 AM","Great!","","True"
....
위의 문자 메시지 내보내기 CSV는 단지 예일 뿐입니다. 도구 상자와 함께 번들로 제공되는 csv2es
도구는 위의 예제 형식뿐만 아니라 원하는 모든 데이터 세트를 가져올 수 있습니다 .
시스템에서 Docker를 사용할 수 있게 되면 comms-analyzer-toolbox
실행하기 전에 CSV 형식으로 분석할 일부 데이터가 있어야 합니다. 예를 들어, 아래는 iPhone의 문자 메시지를 CSV 파일로 내보내는 방법입니다.
Mac 또는 Windows용 iExplorer를 사용하여 iPhone 메시지 내보내기
생성된 CSV 파일을 편집하고 첫 번째 행의 헤더 값 "Time"
을 "date_ts"
로 변경하고 저장하고 종료합니다.
도구 상자를 실행할 때 아래에서 사용할 것이므로 .csv 파일의 위치를 기록해 두십시오.
아래 예제를 실행하기 전에 Docker가 설치되어 있어야 합니다.
아래 예는 특히 IExplorer를 사용하여 내보낸 문자 메시지 데이터가 포함된 CSV 데이터 파일에 대한 것입니다.
data.csv의 내용
"Name","Address","date_ts","Message","Attachment","iMessage"
"Me","+1 555-555-5555","7/17/2016 9:21:39 AM","How are you doing?","","True"
"Joe Smith","+1 555-444-4444","7/17/2016 9:38:56 AM","Pretty good you?","","True"
"Me","+1 555-555-5555","7/17/2016 9:39:02 AM","Great!","","True"
....
csvdata.mapping.json의 내용
{
"dynamic": "true",
"properties": {
"date_ts": {"type": "date" },
"name": {"type": "string", "index" : "not_analyzed"},
"address": {"type": "string", "index" : "not_analyzed"},
"imessage": {"type": "string", "index" : "not_analyzed"}
}
}
컴퓨터에서 터미널 또는 명령 프롬프트를 열고 다음을 실행하세요. 그렇게 하기 전에 PATH/TO/YOUR/data.csv
, PATH/TO/YOUR/csvdata.mapping.json
및 PATH/TO/ELASTICSEARCH_DATA_DIR
바꿔야 합니다. 아래에 로컬 시스템의 적절한 경로를 적절하게 입력하세요.
참고: Windows용 Docker Toolbox를 사용하는 경우 아래에 마운트된 모든 볼륨은 권한 문제로 인해 c:Users[your username]...
아래의 홈 디렉터리 아래 어딘가에 있어야 합니다.
docker run --rm -ti -p 5601:5601
-v PATH/TO/YOUR/data.csv:/toolbox/data.csv
-v PATH/TO/YOUR/csvdata.mapping.json:/toolbox/csvdata.mapping.json
-v PATH/TO/ELASTICSEARCH_DATA_DIR:/toolbox/elasticsearch/data
comms-analyzer-toolbox:latest
python /toolbox/csv2es/csv2es.py
[--existing-index ]
[--delete-index ]
--index-name comm_data
--doc-type txtmsg
--mapping-file /toolbox/csvdata.mapping.json
--import-file /toolbox/data.csv
--delimiter ','
--csv-clean-fieldnames
--csv-date-field date_ts
--csv-date-field-gmt-offset -1
기존 comm_data
인덱스에 대해 실행하는 경우 --existing-index
플래그만 포함해야 합니다. 가져오기 전에 comm_data
인덱스를 다시 생성하려면 --delete-index
플래그만 포함하십시오.
콘솔은 진행 상황에 대한 출력을 기록하며, 시스템이 부팅되면 데스크탑에서 웹 브라우저를 열고 http://localhost:5601 로 이동하여 Kibana를 사용하여 데이터를 분석할 수 있습니다. 참고: docker toolbox를 실행하는 경우; 'localhost'가 작동하지 않을 수 있습니다. docker-machine env default
실행하여 docker 호스트 IP 주소를 확인한 다음 http://[machine-ip]:5601로 이동하세요.
Configure an index pattern
이라는 첫 번째 화면에서 Index name or pattern
필드에 comm_data
입력하면 date_ts
필드가 자동으로 선택된 것을 볼 수 있으며 Create
버튼을 누릅니다. 이제 Kibana를 사용할 준비가 되었습니다!
시작은 다음 순서로 여러 작업을 수행합니다.
mbox 가져오기 도구가 실행되면 시스템이 mbox 파일에서 메일을 가져오는 작업을 수행하면서 로그에 다음 항목이 표시됩니다.
comms-analyzer-toolbox
이미지를 실행할 때 인수 중 하나는 다음 인수를 사용하는 csv2es 스크립트를 호출하는 것입니다. 위의 docker run
명령을 조정하여 원하는 대로 다음 플래그를 전달할 수 있습니다.
Usage: /toolbox/csv2es/csv2es.py [OPTIONS]
Bulk import a delimited file into a target Elasticsearch instance. Common
delimited files include things like CSV and TSV.
Load a CSV file:
csv2es --index-name potatoes --doc-type potato --import-file potatoes.csv
For a TSV file, note the tab delimiter option
csv2es --index-name tomatoes --doc-type tomato --import-file tomatoes.tsv --tab
For a nifty pipe-delimited file (delimiters must be one character):
csv2es --index-name pipes --doc-type pipe --import-file pipes.psv --delimiter '|'
Options:
--index-name TEXT Index name to load data into
[required]
--doc-type TEXT The document type (like user_records)
[required]
--import-file TEXT File to import (or '-' for stdin)
[required]
--mapping-file TEXT JSON mapping file for index
--delimiter TEXT The field delimiter to use, defaults to CSV
--tab Assume tab-separated, overrides delimiter
--host TEXT The Elasticsearch host
(http://127.0.0.1:9200/)
--docs-per-chunk INTEGER The documents per chunk to upload (5000)
--bytes-per-chunk INTEGER The bytes per chunk to upload (100000)
--parallel INTEGER Parallel uploads to send at once, defaults
to 1
--delete-index Delete existing index if it exists
--existing-index Don't create index.
--quiet Minimize console output
--csv-clean-fieldnames Strips double quotes and lower-cases all CSV
header names for proper ElasticSearch
fieldnames
--csv-date-field TEXT The CSV header name that represents a date
string to parsed (via python-dateutil) into
an ElasticSearch epoch_millis
--csv-date-field-gmt-offset INTEGER
The GMT offset for the csv-date-field (i.e.
+/- N hours)
--tags TEXT Custom static key1=val1,key2=val2 pairs to
tag all entries with
--version Show the version and exit.
--help Show this message and exit.
이 모드에서 실행하면 elasticsearch와 kibana가 실행되고 아무 것도 가져오지 않습니다. Elasticsearch에 있는 이전에 가져온 데이터를 분석할 수 있도록 도구 상자를 불러옵니다.
참고: Windows용 Docker Toolbox를 사용하는 경우 아래에 마운트된 모든 볼륨은 권한 문제로 인해 c:Users[your username]...
아래의 홈 디렉터리 아래 어딘가에 있어야 합니다.
docker run --rm -ti -p 5601:5601
-v PATH/TO/ELASTICSEARCH_DATA_DIR:/toolbox/elasticsearch/data
comms-analyzer-toolbox:latest
analyze-only
docker 환경 변수(예: -e ES_JAVA_OPTS="-Xmx1g -Xms1g"
등)를 통해 기본 ElasticSearch JVM 메모리 힙 옵션을 제어할 수 있습니다.
hotmail/outlook의 경우 PST로 내보낸 다음 두 번째 단계로 MBOX로 변환해야 합니다.
이 도구를 사용하는 것은 이 도구를 실행 중인 모든 컴퓨터(예: Docker 호스트)에 완전히 로컬입니다. 노트북이나 데스크톱 컴퓨터에서 실행하는 경우 100% 로컬입니다.
데이터는 어디에도 업로드되거나 전송되지 않습니다.
데이터는 이것이 실행 중인 Docker 호스트에 대한 로컬 디스크 이외의 다른 곳으로 이동하지 않습니다.
분석된 데이터를 완전히 제거하려면 컴퓨터에서 실행 중인 comms-analyzer-toolbox
컨테이너의 docker rm -f [container-id]
사용할 수 있습니다.
호스트의 볼륨을 통해 elasticsearch 데이터 디렉터리를 마운트한 경우(예: -v PATH/TO/ELASTICSEARCH_DATA_DIR:/toolbox/elasticsearch/data
) 해당 로컬 디렉터리는 인덱싱된 모든 데이터가 디스크에 로컬로 있는 곳입니다.