Ahoj, Habr!
Nedávno som si pozrel stiahnutú verziu streamu o programovaní „Ako vytvoriť svoje webové aplikácie v Flasku“. A rozhodol som sa upevniť svoje vedomosti v nejakom projekte. Dlho som nevedel, čo napísať, a prišla mi myšlienka: „A prečo by som neurobil mini-backdoor na Flasku?“
V hlave sa okamžite objavili prvé návrhy implementácie a možnosti backdooru. Ale rozhodol som sa ihneď zostaviť zoznam možností backdooru:
- Vedieť otvárať webové stránky
- Mať prístup k príkazovému riadku
- Vedieť otvárať programy, fotografie, videá
Takže prvý bod je veľmi ľahko realizovateľný pomocou modulu webbrowser. Druhý bod som sa rozhodol realizovať pomocou modulu os. A tretí – tiež cez modul os, ale budem používať „linky“ (o tom neskôr).
Písanie servera
Takže, *bubnová rôznová* celý kód servera:
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 beží a čaká na príkazy...'
if json_string['command'] == 'openweb':
webbrowser.open(url='https://www.'+json_string['data'], new=0)
return 'Otvorenie stránky ' + json_string['data'] + '...'
if json_string['command'] == 'shell':
os.system(json_string['data'])
return 'Spustenie príkazu ' + 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 'Spustenie ' + link.split('>')[1]
if __name__ == '__main__':
app.run(host='0.0.0.0')
Už som ukázal celý kód, je čas vysvetliť podstatu.
Celý kód sa spúšťa na lokálnom počítači na porte 5000. Na interakciu s serverom musíme poslať JSON POST požiadavku.
Štruktúra JSON požiadavky:
{‘command’: ‘comecommand’, ‘data’: ‘somedata’}No, logicky, že ‘command’ – príkaz, ktorý chceme vykonať. A ‘data’ – argumenty príkazu.
Môžete písať a posielať JSON požiadavky na interakciu so serverom manuálne (máte na to pomoc requests). Alebo môžete napísať konzolového klienta.
Písanie klienta
Kód:
import requests
logo = ['nn',
'****** ********',
'******* *********',
'** ** ** **',
'** ** ** ** Napísané v Pythone',
'******* ** **',
'******** ** **',
'** ** ** ** 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('Prí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('Príkaz neobsahuje argumenty!')
if a[0] == 'set':
if a[1] == 'host':
ip = a[2] + ':5000'
if command == 'quit':
break
Vysvetlenie:
Najprv sa naimportuje knižnica requests (na interakciu so serverom). Následne sú opísané funkcie start a test. Potom nasleduje cyklus, v ktorom sa deje čaro. Študovali ste kód? Potom je vám zrejmé, aké čaro sa v cykle deje. Zadajte príkaz – ten sa vykoná. Shell – príkazy pre príkazový riadok (logika presahuje očakávania).
Test – kontrola, či server (backdoor) funguje.
Link – použitie "skratky"
Openweb – otvorenie webovej stránky
Quit – odhlásenie z klienta
Set – nastavenie IP vášho počítača v lokálnej sieti
A teraz podrobnejšie o link.
Vedľa servera sa nachádza súbor link.txt. Obsahuje odkazy (celú cestu) k súborom (videá, fotografie, programy).
Štruktúra je takáto:
plný_cesta>popis
plný_cesta>popis
Záver
Máme server-backdoor na ovládanie počítača v lokálnej sieti (v rámci wifi siete). Technicky môžeme spustiť klienta z akéhokoľvek zariadenia, na ktorom je interpret python.
P.S. Príkaz set som pridal, aby sa v prípade priradenia inej IP adrese počítaču v lokálnej sieti mohol priamo v klientovi zmeniť.
Zdroj: habr.com
