2016-08-17 62 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