Hej, Habr!
Nyligen sÄg jag den nedladdade versionen av en stream om programmering "Hur man skapar sin egen webbapplikation med Flask". Jag bestÀmde mig för att förstÀrka mina kunskaper med ett projekt. Jag visste lÀnge inte vad jag skulle skriva och kom pÄ idén: "Varför inte göra en mini-backdoor med Flask?".
Först dök de första varianterna av implementationer och möjligheter till backdooren upp i huvudet. Men jag bestÀmde mig för att omedelbart göra en lista över backdoorens funktioner:
- Kunna öppna webbplatser
- Ha tillgÄng till kommandoraden
- Kunna öppna program, bilder, videor
SĂ„ det första punkt Ă€r extremt enkelt att implementera med hjĂ€lp av modulwebblĂ€saren. Den andra punkten bestĂ€mde jag mig för att implementera med hjĂ€lp av modulen os. Och den tredje â ocksĂ„ genom modulen os, men jag kommer att anvĂ€nda "lĂ€nkar" (mer om detta senare).
Skrivande servern
SĂ„, *trumvirvel* hela 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 'Servern körs och vÀntar pÄ kommandon...'
if json_string['command'] == 'openweb':
webbrowser.open(url='https://www.'+json_string['data'], new=0)
return 'Ăppnar sidan ' + json_string['data'] + '...'
if json_string['command'] == 'shell':
os.system(json_string['data'])
return 'Kör kommandot ' + 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 'Starta ' + link.split('>')[1]
if __name__ == '__main__':
app.run(host='0.0.0.0')
Jag har redan visat hela koden, det Àr dags att förklara essensen.
Hela koden körs pÄ den lokala datorn pÄ port 5000. För att interagera med servern mÄste vi skicka en JSON POST-begÀran.
Strukturen för JSON-begÀran:
{âcommandâ: âcomecommandâ, âdataâ: âsomedataâ}Ja, det Ă€r logiskt att 'command' Ă€r kommandot vi vill utföra. Och 'data' Ă€r kommandots argument.
Man kan skriva och skicka JSON-begÀrningar manuellt för att interagera med servern (hÀr har ni hjÀlp av requests). Eller sÄ kan man skriva en konsolklient.
Skriva klienten
Kod:
import requests
logo = ['nn',
'****** ********',
'******* *********',
'** ** ** **',
'** ** ** ** Skriven i Python',
'******* ** **',
'******** ** **',
'** ** ** ** Författare: 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('Kommandot innehÄller inga argument!')
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('Kommandot innehÄller inga argument!')
if a[0] == 'set':
if a[1] == 'host':
ip = a[2] + ':5000'
if command == 'quit':
break
Förklaringar:
Först importeras requests-modulen (för att interagera med servern). DĂ€refter beskrivs funktionerna start och test. Och sedan en loop dĂ€r magin hĂ€nder. Har du lĂ€st koden? DĂ„ förstĂ„r du meningen med magin som hĂ€nder i loopen. Skriv in kommandot â det utförs. Shell â kommandon för kommandoraden (logiken Ă€r övervĂ€ldigande).
Test â kontrollerar om servern (bakdörren) fungerar
Link â anvĂ€ndning av "genvĂ€g"
Openweb â öppnar en webbplats
Quit â avbryter klienten
Set â anger IP-adressen för din dator i det lokala nĂ€tverket
Nu ska vi prata mer om link.
Bredvid servern ligger filen link.txt. I den finns lÀnkar (full vÀg) till filer (video, bilder, program).
Strukturen Àr följande:
full_path>beskrivning
full_path>beskrivning
Resultat
Vi har en bakdörrserver för att styra datorn i det lokala nÀtverket (inne i wi-fi-nÀtverket). Tekniskt kan vi köra klienten frÄn vilken enhet som helst som har en Python-tolk.
P.S. Kommandot set lade jag till för att om datorn i det lokala nÀtverket fÄr en annan IP-adress, kan den Àndras direkt i klienten.
KĂ€lla: habr.com
