Ahoj, Habr!
Nedávno jsem se podíval na staženou verzi streamu o programování „Jak vytvořit svou webovou aplikaci na Flasku“. A rozhodl jsem se upevnit své znalosti v nějakém projektu. Dlouho jsem nevěděl, co napsat, a napadlo mě: „Proč si neudělat mini-backdoor na Flasku?“.
Hned se mi v hlavě objevily první možnosti realizace a funkce backdooru. Ale rozhodl jsem se nejprve sestavit seznam možností backdooru:
- Umět otevírat webové stránky
- Mít přístup k příkazovému řádku
- Umět otevírat programy, fotografie, videa
První bod lze snadno realizovat pomocí modulu webbrowser. Druhý bod jsem se rozhodl realizovat pomocí modulu os. A třetí také přes modul os, ale budu používat „linky“ (o tom později).
Psání serveru
Takže, *bubny prosím* veškerý kód serveru:
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 'Server běží a čeká na příkazy...'
if json_string['command'] == 'openweb':
webbrowser.open(url='https://www.' + json_string['data'], new=0)
return 'Otevírám stránku ' + json_string['data'] + '...'
if json_string['command'] == 'shell':
os.system(json_string['data'])
return 'Provádím příkaz ' + 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 'Spouštím ' + link.split('>')[1]
if __name__ == '__main__':
app.run(host='0.0.0.0')
Už jsem odhalil celý kód, teď je čas vysvětlit podstatu.
Veškerý kód běží na místním počítači na portu 5000. Pro interakci s serverem musíme posílat JSON POST dotaz.
Struktura JSON dotazu:
{‘command’: ‘comecommand’, ‘data’: ‘somedata’}No, logicky, že ‘command’ – je příkaz, který chceme provést. A ‘data’ – argumenty příkazu.
Můžete psát a posílat JSON dotazy pro interakci se serverem ručně (můžete k tomu použít requests). Nebo si můžete napsat konzolového klienta.
Psání klienta
Kód:
import requests
logo = ['nn',
'****** ********',
'******* *********',
'** ** ** **',
'** ** ** ** Napsáno v Pythonu',
'******* ** **',
'******** ** **',
'** ** ** ** Autor: ROBOTD4',
'** ** ** **',
'** ** ** **',
'******** *********',
'******* ********',
'nn']
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('Příkaz neobsahuje argumenty!')
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('Příkaz neobsahuje argumenty!')
if a[0] == 'set':
if a[1] == 'host':
ip = a[2] + ':5000'
if command == 'quit':
break
Vysvětlení:
Nejprve je importován modul requests (pro komunikaci se serverem). Dále jsou popsány funkce start a test. A pak je zde smyčka, ve které se děje kouzlo. Četli jste kód? Pak je vám jasný smysl kouzla, které se děje v smyčce. Zadejte příkaz – bude vykonán. Shell – příkazy pro příkazovou řádku (logika je mimo).
Test – kontrola, zda server (zadní vchod) funguje
Link – použití "zkratky"
Openweb – otevření webové stránky
Quit – odhlášení z klienta
Set – nastavení IP vašeho počítače v lokální síti
A teď podrobněji o link.
Vedle serveru leží soubor link.txt. Obsahuje odkazy (plnou cestu) k souborům (video, fotky, programy).
Struktura je následující:
plný_článek>popis
plný_článek>popis
Výsledek
Máme server-zadní vchod pro ovládání počítače v lokální síti (uvnitř wi-fi sítě). Technicky můžeme spustit klienta z jakéhokoliv zařízení, na kterém je interpret python.
P.S. Příkaz set jsem přidal proto, aby bylo možné, pokud je počítači v lokální síti přiřazena jiná IP, měnit ji přímo v klientu.
Zdroj: habr.com
