Hei Habr!
Jeg så nylig en nedlastet versjon av programmeringsstrømmen "Hvordan lage din egen nettapplikasjon i Flask." Og jeg bestemte meg for å konsolidere kunnskapen min i et eller annet prosjekt. I lang tid visste jeg ikke hva jeg skulle skrive, og ideen kom til meg: "Hvorfor ikke lage en mini-bakdør i Flask?"
De første alternativene for implementeringer og muligheter for bakdøren dukket umiddelbart opp i hodet mitt. Men jeg bestemte meg for å umiddelbart lage en liste over bakdørsfunksjoner:
- Vet hvordan du åpner nettsider
- Har kommandolinjetilgang
- Kunne åpne programmer, bilder, videoer
Så det første punktet er ekstremt enkelt å implementere ved å bruke nettlesermodulen. Jeg bestemte meg for å implementere det andre punktet ved hjelp av os-modulen. Og den tredje er også gjennom os-modulen, men jeg vil bruke "lenker" (mer om det senere).
Skrive en server
Så, *drumroll* all serverkoden:
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')
Jeg har allerede dumpet all koden, det er på tide å forklare essensen.
All kode kjører på den lokale datamaskinen på port 5000. For å samhandle med serveren må vi sende en JSON POST-forespørsel.
JSON-forespørselsstruktur:
{‘command’: ‘comecommand’, ‘data’: ‘somedata’}
Vel, det er fornuftig at "kommando" er kommandoen vi ønsker å utføre. Og 'data' er kommandoargumentene.
Du kan skrive og sende JSON-forespørsler om å samhandle med serveren manuelt (forespørsler vil hjelpe deg). Eller du kan skrive en konsollklient.
Skrive en klient
Kode:
import requests
logo = ['nn',
'****** ********',
'******* *********',
'** ** ** **',
'** ** ** ** Written on Python',
'******* ** **',
'******** ** **',
'** ** ** ** Author: 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('Комманда не содержит аргументов!')
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
Forklaringer:
Først av alt importeres forespørselsmodulen (for samhandling med serveren). Nedenfor er beskrivelser av start- og testfunksjonene. Og så syklusen der magien skjer. Har du lest koden? Så du forstår betydningen av magien som skjer i syklusen. Skriv inn kommandoen - den utføres. Shell – kommandoer for kommandolinjen (logikken er utenfor skala).
Test – sjekk om serveren kjører (bakdør)
Link – bruk av en "snarvei"
Openweb – åpne et nettsted
Avslutt – gå ut av klienten
Sett – innstilling av IP-en til datamaskinen din på det lokale nettverket
Og nå mer om link.
Det er en link.txt-fil ved siden av serveren. Den inneholder lenker (full bane) til filer (videoer, bilder, programmer).
Strukturen er slik:
полный_путь>описание
полный_путь>описание
Total
Vi har en bakdørsserver for å kontrollere en datamaskin på et lokalt nettverk (innenfor et wi-fi-nettverk). Teknisk sett kan vi kjøre klienten fra enhver enhet som har en python-tolk.
PS Jeg la til set-kommandoen slik at hvis en datamaskin på det lokale nettverket er tildelt en annen IP, kan den endres direkte i klienten.
Kilde: www.habr.com