2014-03-02 3 views
2

Node.js에 첫 번째 앱을 개발하고 있는데, 내가 작성한 예제가 내가 생각한 것을 보여주지 않아서 리스너가 어떻게 작동하는지 정확하게 이해하지 못한다고 생각합니다. 보여줄거야.Node.js : 리스너에 문제가 있습니다.

metasploit RPC 클라이언트 인 모듈 (msfnode)을 사용하여 웹 소켓을 통해 연결합니다.

나는 클래스를 만들어 생성자이 코드가 있습니다

this.clientmsf = new MetasploitClient({ 
      login : options.login || 'myLogin', 
      password : options.password || 'myPassword' 
     }); 
     this.clientmsf.on('connected',function(err,token) { 
      if (err) throw err; 
     }); 

그래서 내가 그 클래스의 다른 기능에서 개체 "clientmsf"을 사용할 수 있다고 생각하고 오류를 보여줍니다 ERROR_MESSAGE를 : '잘못된 인증 토큰'.

this.clientmsf.exec(['console.create'], function(err,r){ 
      consoleID = r.id; 
      console.log(r); 
     }); 

나는 누군가가 나에게 도움이된다면 매우 감사 할 수 있도록 내가 Node.js를 모든 개념을 모르기 때문에 나는이 오류가 있다고 생각 :이 코드입니다.

대단히 감사합니다.

PD. 이 msfnode 라이브러리의 예입니다

var metasploitClient = require('metasploitJSClient'); 
var onConnect = function(err,token) { 
    if (err) { 
     console.log(err.error_message); 
     process.exit(0); 
    } 
    metasploitVersion(); 
} 
var metasploitVersion = function() { 
    // Do not care about token, it will automaticaly 
    // be added as the second arguments 
    // The first value of the array is the function 
    // you want to call. Full list is available 
    // in metasploit remote api documentation 
    var args = ['core.version']; 
    client.exec(args,function(err,r) { 
     if (err) return console.log('Error: '+err); 
     console.log('-> Version: '+r); 
    }); 
} 
var client = new metasploitClient({ 
    login:'myLogin', 
    password:'myPassword', 
}); 
client.on('connected',onConnect); 

오류 :

{ error: true, 
    error_class: 'Msf::RPC::Exception', 
    error_string: 'Msf::RPC::Exception', 
    error_backtrace: 
    [ 'lib/msf/core/rpc/v10/service.rb:148:in `process\'', 
    'lib/msf/core/rpc/v10/service.rb:90:in `on_request_uri\'', 
    'lib/msf/core/rpc/v10/service.rb:72:in `block in start\'', 
    'lib/rex/proto/http/handler/proc.rb:38:in `call\'', 
    'lib/rex/proto/http/handler/proc.rb:38:in `on_request\'', 
    'lib/rex/proto/http/server.rb:363:in `dispatch_request\'', 
    'lib/rex/proto/http/server.rb:297:in `on_client_data\'', 
    'lib/rex/proto/http/server.rb:157:in `block in start\'', 
    'lib/rex/io/stream_server.rb:48:in `call\'', 
    'lib/rex/io/stream_server.rb:48:in `on_client_data\'', 
    'lib/rex/io/stream_server.rb:192:in `block in monitor_clients\'', 
    'lib/rex/io/stream_server.rb:190:in `each\'', 
    'lib/rex/io/stream_server.rb:190:in `monitor_clients\'', 
    'lib/rex/io/stream_server.rb:73:in `block in start\'', 
    'lib/rex/thread_factory.rb:22:in `call\'', 
    'lib/rex/thread_factory.rb:22:in `block in spawn\'', 
    'lib/msf/core/thread_manager.rb:100:in `call\'', 
    'lib/msf/core/thread_manager.rb:100:in `block in spawn\'' ], 
    error_message: 'Invalid Authentication Token', 
    error_code: 401 } 

편집 2 : 이것은 내가 확인하는 코드입니다

:

clientmsf.on('connected',function(err,token) { 
    if (err) throw err; 
    var consoleID; 
    console.log('token:' + token); 
    // should have connected by now 
    clientmsf.exec(['console.list'], function(err,r){ 
     consoleID = r; 
     console.log(r); 
    }); 
    console.log (consoleID); 
}); 

는 그리고이입니다 표시되는 내용 :

token:[object Object] 
undefined 
{ consoles: [ { id: '0', prompt: 'msf > ', busy: false } ] } 
+0

:

내가 좋아하는 뭔가를 제안하고있어? 실제로 컴퓨터에서 msfrpcd를 시작 했습니까? –

+0

아니요, 오류는 Metasploit API에서 발생합니다. 연결하기 전에 "exec"가 실행되고 개체가 아직 토큰을 모르기 때문에 문제가 "경쟁 조건"이라고 생각할 수 있습니다. 전체 오류를 추가하겠습니다. 관심을 가져 주셔서 감사합니다. –

답변

1

토큰을 연결하고 가져온 후에 만 ​​샘플 코드에서 작업을 수행하는 방법 (metasploitVersion)에 유의하십시오.

var onConnect = function(err,token) { 
    if (err) { 
     console.log(err.error_message); 
     process.exit(0); 
    } 
    // in the connect callback here - you have a token 
    // only then call to do the work 
    metasploitVersion(); 
} 

'this.clientmsf.exec'코드를 연결 콜백 함수 내부로 이동해보십시오. 해당 콜백 외부에 있으면 연결이 완료되기 전에 실행됩니다.

제대로 연결되었는지 확인하기 위해 해당 콜백 내에 토큰을 로그 아웃하는 것이 좋습니다. 이것은 당신이 아니라 일반적으로 노드를 수신하면 오류가 발생한 줄 번호를 제공하는 전체 오류 메시지가

var clientmsf = new MetasploitClient({ 
    login : options.login || 'myLogin', 
    password : options.password || 'myPassword' 
}); 

clientmsf.on('connected',function(err,token) { 
    if (err) throw err; 

    console.log('token:' + token); 
    // should have connected by now 
    clientmsf.exec(['console.create'], function(err,r, token){ 
     consoleID = r.id; 
     console.log(r); 
    }); 
}); 
+0

예, 그랬지만 질문이있었습니다. "exec"를 두 번 이상 실행하려면 어떻게해야합니까? 고마워요, 브라이언 맥. –

+0

오류 : TypeError : 정의되지 않은 메서드 'exec'을 null에서 호출 할 수 없습니다. (/home/dani/proyectos_eclipse/tfg-pentesting/lib/msfManager.js:71:25) at EventEmitter.emit (events.js : 98 : 17) at msapi.onAuthLogin (/home/dani/proyectos_eclipse/tfg-pentesting/node_modules/msfnode/metasploitJSClient.js:65:14) at IncomingMessage. (/home/dani/proyectos_eclipse/tfg-pentesting/node_modules/msfnode/metasploitJSClient.js:41:24) IncomingMessage.EventEmitter.emit (events.js : 117 : 20) at _stream_readable.js : 920 : 16 at process._tickCallback (node.js : 415 : 13) –

+0

OK - 다음 호에 있습니다. JS에서는 'this'가이 함수가 될 것입니다. 따라서 clientmsf를 var로 선언해야합니다. 업데이트 된 코드 스 니펫. (내가 당신의 라인 번호를 볼 수 없다는 것을 기억하십시오) – bryanmac

관련 문제