본문으로 바로가기

How to install malcontrol

category Defensive Security/Linux 2014.05.15 14:07


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/

저작자 표시 비영리 동일 조건 변경 허락
신고

댓글을 달아 주세요

  1. BlogIcon rootnix 신고">2014.05.15 16:29 신고

    좋은 설명 감사합니다.
    그런데, node server 를 했을때 아무반응이 없고,
    npm start 를 해도
    > malwareControlCenter@0.0.2 start /home/rootnix/malcontrol
    > make run
    에서 반응이없습니다.
    환경은 ubuntu 12.04 LTS 로 동일하게 맞춘 상태이구요.
    설명 그대로 따라했습니다.
    혹시 몰라 github에 설명을 한번 보았는데, grunt 라는 부분이 있길래
    grunt 도 설치하여 grunt 도 해보았는데 역시나 똑같이 반응이없습니다.
    혹시 이 문제에 대해 설명을 들을수있을까요?

    • BlogIcon hakawati 신고">2014.05.15 16:56 신고

      아무 반응이 없다는건 저도 잘 모르겠어요^^;; 에러코드 있으면 삽질하면서 본 기억으로..음.. 도움이 되지 못해 죄송하네요;

    • BlogIcon Leekyu 신고">2014.05.18 02:03 신고

      저도 동일한 문제를 겪었는데요 아마 질문하신분이 vmware에서 설치하지 않았는가 합니다. 저같은 경우에는 malcontrol의 server.js 파일의 소스코드의 58번째 줄을 for (var i = 0; i <= cpuCount; i += 1) 이렇게 수정하니까 정상적으로 실행 되었습니다 윗부분에 cpuCount CPU 개수 구하는 부분에서 cpuCount가 1인 경우 문제가 발생했던거 같네요~ 잘 해결되기를 바랍니다~

    • BlogIcon rootnix 신고">2014.06.19 15:20 신고

      앗 클라우드에서 돌렸는데 테스트 해보려고 CPU 1개 놓고 돌렸는데 그런부분이 있었군요! 감사합니다 ㅎㅎ

  2. 2014.06.16 15:50

    비밀댓글입니다

    • BlogIcon hakawati 신고">2014.06.16 18:03 신고

      오옷 안녕하세요. 요즘 이직하고 블로그 할 시간을 못내고 있어 제 블로그를 눈팅하는 운영자입니다. ^^

      아무래도 오픈소스를 다루기에는 리눅스가 편하죠. 윈도우에서 성공하시다니.. 대단하십니다. ㅎㅎ

      malcontrol이 아무래도 오픈소스고, 네트워크를 계속 크롤링해서 처리하고 반영하다보니 느려질 수 밖에 없다고 보입니다. 오픈된 악성코드 정보가 아닌 내부적으로 운영하는 데이터베이스에 붙여서 활용하는 것이 좋을 것 같습니다. ^^

티스토리 툴바