Привет, Хабр!
Недавно я посмотрел скачанную версию стрима по программированию «Как создать свое веб-приложение на Flask». И решил закрепить свои знания в каком-нибудь проекте. Долго не знал, что написать и мне пришла идея: «А почему бы не сделать мини-бэкдор на Flask?».
В голове тут же появились первые варианты реализаций и возможностей бэкдора. Но я решил сразу составить список возможностей бэкдора:
Итак, первый пункт крайне легко реализовать при помощи модуля webbrowser. Второй пункт я решил реализовать при помощи модуля os. И третий – тоже через модуль os, но я буду использовать «ссылки»(об этом позже).
Написание сервера
Итак, *барабанная дробь* весь код сервера:
Я уже вывалил весь код, пора объяснять суть.
Весь код запускается на локальном компьютере на 5000 порту. Для взаимодействия с сервером мы должны отправлять JSON POST запрос.
Структура JSON запроса:
Ну, логично, что ‘command’ – команда, которую мы хотим выполнить. А ‘data’ – аргументы команды.
Можно писать и отправлять JSON запросы для взаимодействия с сервером ручками(вам в помощь requests). А можно написать консольный клиент.
Написание клиента
Код:
Объяснения:
Первым делом импортируется модуль requests(для взаимодействия с сервером). Дальше описания функций start и test. А дальше цикл в котором происходит волшебство. Читали код? Значит вам ясен смысл волшебства, происходящего в цикле. Вводите команду – она выполняется. Shell – команды для командной строки(логика зашкаливает).
Test – проверка, работает ли сервер(бэкдор)
Link – использование «ярлыка»
Openweb – открытие сайта
Quit – выход из клиента
Set – задание ip вашего компьютера в локальной сети
А сейчас поподробнее о link.
Рядом с сервером лежит файл link.txt. В нём находятся ссылки(полный путь) к файлам(видео, фото, программы).
Структура такая:
Мы имеем сервер-бэкдор для управления компьютером в локальной сети(внутри wi-fi сети). Технически мы можем запустить клиент с любого устройства, на котором есть интерпретатор python.
P.S. Команду set я добавил для того, чтобы если компьютеру в локальной сети присвоят другой ip, можно было прямо в клиенте его изменить.
Недавно я посмотрел скачанную версию стрима по программированию «Как создать свое веб-приложение на Flask». И решил закрепить свои знания в каком-нибудь проекте. Долго не знал, что написать и мне пришла идея: «А почему бы не сделать мини-бэкдор на Flask?».
В голове тут же появились первые варианты реализаций и возможностей бэкдора. Но я решил сразу составить список возможностей бэкдора:
- Уметь открывать сайты
- Иметь доступ к командной строке
- Уметь открывать программы, фото, видео
Итак, первый пункт крайне легко реализовать при помощи модуля webbrowser. Второй пункт я решил реализовать при помощи модуля os. И третий – тоже через модуль os, но я буду использовать «ссылки»(об этом позже).
Написание сервера
Итак, *барабанная дробь* весь код сервера:
from flask import Flask, request import webbrowser import os import re app = Flask(__name__) @app.route('/mycomp', methods=['POST']) def hell(): json_string = request.json if json_string['command'] == 'test': return 'The server is running and waiting for commands...' if json_string['command'] == 'openweb': webbrowser.open(url='https://www.'+json_string['data'], new=0) return 'Site opening ' + json_string['data'] + '...' if json_string['command'] == 'shell': os.system(json_string['data']) return 'Command execution ' + json_string['data'] + '...' if json_string['command'] == 'link': links = open('links.txt', 'r') for i in range(int(json_string['data'])): link = links.readline() os.system(link.split('>')[0]) return 'Launch ' + link.split('>')[1] if __name__ == '__main__': app.run(host='0.0.0.0')
Я уже вывалил весь код, пора объяснять суть.
Весь код запускается на локальном компьютере на 5000 порту. Для взаимодействия с сервером мы должны отправлять JSON POST запрос.
Структура JSON запроса:
{‘command’: ‘comecommand’, ‘data’: ‘somedata’}
Ну, логично, что ‘command’ – команда, которую мы хотим выполнить. А ‘data’ – аргументы команды.
Можно писать и отправлять JSON запросы для взаимодействия с сервером ручками(вам в помощь requests). А можно написать консольный клиент.
Написание клиента
Код:
import requests logo = ['\n\n', '****** ********', '******* *********', '** ** ** **', '** ** ** ** Written on Python', '******* ** **', '******** ** **', '** ** ** ** Author: ROBOTD4', '** ** ** **', '** ** ** **', '******** *********', '******* ********', '\n\n'] p = '' iport = '192.168.1.2:5000' host = 'http://' + iport + '/mycomp' def test(): dict = {'command': 'test', 'data': 0} r = requests.post(host, json=dict) if r.status_code == 200: print (r.content.decode('utf-8')) def start(): for i in logo: print(i) start() test() while True: command = input('>') if command == '': continue a = command.split() if command == 'test': dict = {'command': 'test', 'data': 0} r = requests.post(host, json=dict) if r.status_code == 200: print (r.content.decode('utf-8')) if a[0] == 'shell': for i in range(1, len(a)): p = p + a[i] + ' ' dict = {'command': 'shell', 'data': p} r = requests.post(host, json=dict) if r.status_code == 200: print (r.content.decode('utf-8')) p = '' if a[0] == 'link': if len(a) > 1: dict = {'command': 'link', 'data': int(a[1])} r = requests.post(host, json=dict) if r.status_code == 200: print (r.content.decode('utf-8')) else: print('Комманда не содержит аргументов!') if a[0] == 'openweb': if len(a) > 1: dict = {'command': 'openweb', 'data': a[1]} r = requests.post(host, json=dict) if r.status_code == 200: print (r.content.decode('utf-8')) else: print('Комманда не содержит аргументов!') if a[0] == 'set': if a[1] == 'host': ip = a[2] + ':5000' if command == 'quit': break
Объяснения:
Первым делом импортируется модуль requests(для взаимодействия с сервером). Дальше описания функций start и test. А дальше цикл в котором происходит волшебство. Читали код? Значит вам ясен смысл волшебства, происходящего в цикле. Вводите команду – она выполняется. Shell – команды для командной строки(
Test – проверка, работает ли сервер(бэкдор)
Link – использование «ярлыка»
Openweb – открытие сайта
Quit – выход из клиента
Set – задание ip вашего компьютера в локальной сети
А сейчас поподробнее о link.
Рядом с сервером лежит файл link.txt. В нём находятся ссылки(полный путь) к файлам(видео, фото, программы).
Структура такая:
полный_путь>описание
полный_путь>описаниеИтог
Мы имеем сервер-бэкдор для управления компьютером в локальной сети(внутри wi-fi сети). Технически мы можем запустить клиент с любого устройства, на котором есть интерпретатор python.
P.S. Команду set я добавил для того, чтобы если компьютеру в локальной сети присвоят другой ip, можно было прямо в клиенте его изменить.