1. Introduction
malcontrol은 악성코드 분석 웹 사이트로부터 오픈 데이터를 받아 관제하는 "Malware Control Monitor"라 불리는 프로젝트이다. 오픈 데이터 리스트는 다음 웹 사이트에서 받아온다.
이 도구는 Node.js로 운영되고 mongodb를 사용하며, 설치는 npm으로 한다. npm은 Node Packaged Modules의 약자로 Node.js에서 사용되는 모듈을 패키지 형태로 모아놓은 도구이다.
2. Environment
- OS : Ubuntu 12.04 LTS 64bit on Virtualbox
- CPU : 4개
- MEM : 2048MB
- Node.js : v0.10.28
- npm : v1.4.9
- User : hakawati
- Building Path : /home/hakawati/tools
3. Installation
sudo apt-get install mongodb git build-essential
문제는 Ubuntu 12.04 LTS에 기본값으로 등록된 저장소(Repository)에서 제공하는 Node.js와 npm은 버전이 상당히 낮다. 이 버전에서는 malcontrol이 사용하는 Node.js의 모듈을 가지고 있지 않다.
- Node.js : v0.6.12
- npm : 1.1.4
Node.js 저장소를 등록하고 설치한다. 최신 Node.js를 설치하면 npm도 함께 설치된다.
sudo apt-add-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install python-software-properties nodejs
- Node.js : v0.10.28
- npm : v1.4.9
malcontrol을 설치
git clone https://github.com/marcoramilli/malcontrol.git malcontrol
cd malcontrol
npm install
설치가 완료되면 다음과 같은 메시지를 보게 된다.
Successfully Updated Databases from MaxMind.
path@0.4.9 node_modules/path
grunt-contrib-copy@0.5.0 node_modules/grunt-contrib-copy
wait.for@0.6.4 node_modules/wait.for
supertest@0.9.2 node_modules/supertest
├── methods@0.1.0
└── superagent@0.17.0 (methods@0.0.1, cookiejar@1.3.0, extend@1.2.1, debug@0.7.4, qs@0.6.5, emitter-component@1.0.0, reduce-component@1.0.1, mime@1.2.5, formidable@1.0.14)
mocha@1.18.2 node_modules/mocha
├── debug@0.8.1
├── diff@1.0.7
├── growl@1.7.0
├── commander@2.0.0
├── mkdirp@0.3.5
├── glob@3.2.3 (inherits@2.0.1, graceful-fs@2.0.3, minimatch@0.2.14)
└── jade@0.26.3 (commander@0.6.1, mkdirp@0.3.0)
request@2.34.0 node_modules/request
├── json-stringify-safe@5.0.0
├── aws-sign2@0.5.0
├── forever-agent@0.5.2
├── qs@0.6.6
├── tunnel-agent@0.3.0
├── oauth-sign@0.3.0
├── node-uuid@1.4.1
├── mime@1.2.11
├── tough-cookie@0.12.1 (punycode@1.2.4)
├── form-data@0.1.2 (async@0.2.10, combined-stream@0.0.4)
├── hawk@1.0.0 (cryptiles@0.2.2, sntp@0.2.4, boom@0.4.2, hoek@0.9.1)
└── http-signature@0.10.0 (assert-plus@0.1.2, asn1@0.1.11, ctype@0.5.2)
jquery@2.1.1 node_modules/jquery
grunt-conventional-changelog@1.1.0 node_modules/grunt-conventional-changelog
└── conventional-changelog@0.0.6 (event-stream@3.1.5, lodash.assign@2.4.1)
toobusy@0.2.4 node_modules/toobusy
└── bindings@1.1.0
fibers@1.0.1 node_modules/fibers
v8-profiler@4.0.1 node_modules/v8-profiler
grunt-contrib-uglify@0.4.0 node_modules/grunt-contrib-uglify
├── chalk@0.4.0 (has-color@0.1.7, ansi-styles@1.0.0, strip-ansi@0.1.1)
├── maxmin@0.1.0 (pretty-bytes@0.1.1, gzip-size@0.1.1)
└── uglify-js@2.4.13 (uglify-to-browserify@1.0.2, async@0.2.10, optimist@0.3.7, source-map@0.1.33)
jsdom@0.10.5 node_modules/jsdom
├── xmlhttprequest@1.6.0
├── cssom@0.3.0
├── nwmatcher@1.3.3
├── htmlparser2@3.7.1 (domelementtype@1.1.1, domutils@1.4.3, entities@1.0.0, domhandler@2.2.0, readable-stream@1.1.13-1)
├── contextify@0.1.8 (bindings@1.2.0, nan@1.0.0)
└── cssstyle@0.2.11
moment@2.6.0 node_modules/moment
grunt@0.4.5 node_modules/grunt
├── dateformat@1.0.2-1.2.3
├── which@1.0.5
├── eventemitter2@0.4.13
├── getobject@0.1.0
├── rimraf@2.2.8
├── colors@0.6.2
├── async@0.1.22
├── grunt-legacy-util@0.2.0
├── hooker@0.2.3
├── exit@0.1.2
├── lodash@0.9.2
├── glob@3.1.21 (inherits@1.0.0, graceful-fs@1.2.3)
├── nopt@1.0.10 (abbrev@1.0.5)
├── minimatch@0.2.14 (sigmund@1.0.0, lru-cache@2.5.0)
├── coffee-script@1.3.3
├── underscore.string@2.2.1
├── iconv-lite@0.2.11
├── findup-sync@0.1.3 (glob@3.2.9, lodash@2.4.1)
├── js-yaml@2.0.5 (esprima@1.0.4, argparse@0.1.15)
└── grunt-legacy-log@0.1.1 (underscore.string@2.3.3, lodash@2.4.1)
grunt-apidoc@0.4.0 node_modules/grunt-apidoc
└── apidoc@0.4.3 (colors@0.6.2, underscore@1.6.0, marked@0.3.2, wrench@1.5.8, semver@2.2.1, optimist@0.6.1, lodash@2.4.1)
mongoose@3.8.9 node_modules/mongoose
├── regexp-clone@0.0.1
├── sliced@0.0.5
├── muri@0.3.1
├── hooks@0.2.1
├── mpath@0.1.1
├── mpromise@0.4.3
├── ms@0.1.0
├── mquery@0.7.0 (debug@0.7.4)
└── mongodb@1.4.3 (kerberos@0.0.3, bson@0.2.7)
express@3.4.8 node_modules/express
├── methods@0.1.0
├── merge-descriptors@0.0.1
├── range-parser@0.0.4
├── cookie-signature@1.0.1
├── fresh@0.2.0
├── buffer-crc32@0.2.1
├── cookie@0.1.0
├── debug@0.8.1
├── mkdirp@0.3.5
├── send@0.1.4 (mime@1.2.11)
├── commander@1.3.2 (keypress@0.1.0)
└── connect@2.12.0 (uid2@0.0.3, pause@0.0.1, qs@0.6.6, bytes@0.2.1, raw-body@1.1.2, batch@0.5.0, negotiator@0.3.0, multiparty@2.2.0)
grunt-plato@1.0.0 node_modules/grunt-plato
└── plato@1.0.1 (posix-getopt@1.0.0, lodash@1.0.1, complexity-report@0.10.5, jshint@2.1.11, fs-extra@0.3.2)
geoip-lite@1.1.3 node_modules/geoip-lite
├── colors@0.6.0-1
├── async@0.1.22
├── rimraf@2.0.3 (graceful-fs@1.1.14)
├── lazy@1.0.11
├── iconv-lite@0.2.11
├── glob@3.2.9 (inherits@2.0.1, minimatch@0.2.14)
└── unzip@0.0.4 (fstream@0.1.25, pullstream@0.0.4, binary@0.3.0)
4. Configuration
HOST, PORT 변경을 위한 설정 외엔 딱히 설정할 부분은 없다. 설정 파일은 malcontrol/conf 디렉터리에 configs.json 에서 할 수 있다.
{
"system": {
"frontend": "./frontend",
"listening_port": "8080",
"db_address": "127.0.0.1",
"db_dbname": "malware_collector",
"background_geoloc_service" : 3000
},
"scrapers":{
"phishtank_timer" : 30000,
"urlquery_timer": 60000,
"webinspector_timer" : 45000,
"virusscanner_timer": 20000,
"malwr_timer" : 60000
}
5. Starting
시작은 다음과 같이 두 가지로 가능하다.
node server (또는 npm start)
> http://localhost:8080/
실제 실행하면 각 설정 사이트에서 스크랩핑을 실시간으로 수행해서 DB에 반영한다. 30분정도 스크랩핑 한 결과 세계지도에 다이나믹하게 표현되지 않는다. 그 원인은 잘 모르겠으며 별도로 설정하는게 있는가 의문을 가지고 있다.
6. Reference
- https://github.com/marcoramilli/malcontrol
- https://rtcamp.com/tutorials/nodejs/node-js-npm-install-ubuntu/
'Information Security > OpenSource' 카테고리의 다른 글
바이퍼(Viper) #01 - 개요 및 설치 (3) | 2015.01.04 |
---|---|
How to using volatility in Cuckoo Sandbox (2) | 2014.06.25 |
How to using api.py in Cuckoo Sandbox (5) | 2014.05.12 |
Using HPFClient Report within Cuckoo Sandbox (0) | 2014.04.15 |
Using MMDef Report within Cuckoo Sandbox (0) | 2014.04.15 |