A backdoor cilik ing Flask utawa carane ngontrol komputer ing jaringan lokal

Hey Habr!

Aku bubar nonton versi sing diundhuh saka stream program "Carane nggawe aplikasi web dhewe ing Flask." Lan aku mutusake kanggo nggabungake kawruh ing sawetara proyek. Suwe-suwe aku ora ngerti apa sing kudu ditulis lan ide kasebut teka: "Napa ora nggawe mini-backdoor ing Flask?"

Pilihan pisanan kanggo implementasine lan kemampuan backdoor langsung katon ing sirahku. Nanging aku mutusake kanggo langsung nggawe dhaptar kemampuan backdoor:

  1. Ngerti carane mbukak situs web
  2. Nduwe akses baris perintah
  3. Bisa mbukak program, foto, video

Dadi, titik pisanan gampang banget kanggo dileksanakake nggunakake modul browser web. Aku mutusakΓ© kanggo ngleksanakake titik kapindho nggunakake modul os. Lan katelu uga liwat modul os, nanging aku bakal nggunakake "pranala" (liyane ing mengko).

Nulis server

Dadi, *drumroll* kabeh kode server:

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')

Aku wis mbuwang kabeh kode, iku wektu kanggo nerangake inti.

Kabeh kode mlaku ing komputer lokal ing port 5000. Kanggo sesambungan karo server, kita kudu ngirim panjalukan JSON POST.

Struktur permintaan JSON:

{β€˜command’:  β€˜comecommand’, β€˜data’: β€˜somedata’}

Inggih, masuk akal yen 'command' minangka perintah sing arep kita lakoni. Lan 'data' minangka argumen perintah.

Sampeyan bisa nulis lan ngirim panjalukan JSON kanggo sesambungan karo server kanthi manual (panyuwunan bakal mbantu sampeyan). Utawa sampeyan bisa nulis klien console.

Nulis klien

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

Katerangan:

Kaping pisanan, modul panjaluk diimpor (kanggo sesambungan karo server). Ing ngisor iki ana katrangan babagan fungsi wiwitan lan tes. Lan banjur siklus kang Piandel mengkono. Apa sampeyan wis maca kode? Dadi sampeyan ngerti makna sihir sing kedadeyan ing siklus kasebut. Ketik printah - wis kaleksanan. Shell - printah kanggo baris printah (logika ora skala).

Tes - priksa manawa server mlaku (lawang mburi)
Link - nggunakake "trabasan"
Openweb - mbukak situs web
Quit - metu saka klien
Setel - nyetel ip komputer ing jaringan lokal

Lan saiki luwih akeh babagan link.

Ana file link.txt ing jejere server. Isine pranala (path lengkap) menyang file (video, foto, program).

Struktur kasebut kaya mangkene:

ΠΏΠΎΠ»Π½Ρ‹ΠΉ_ΠΏΡƒΡ‚ΡŒ>описаниС
ΠΏΠΎΠ»Π½Ρ‹ΠΉ_ΠΏΡƒΡ‚ΡŒ>описаниС

Asile

Kita duwe server backdoor kanggo ngontrol komputer ing jaringan lokal (ing jaringan wi-fi). Secara teknis, kita bisa mbukak klien saka piranti apa wae sing duwe interpreter python.

PS Aku ditambahakΓ© printah pesawat supaya yen komputer ing jaringan lokal diutus IP beda, bisa diganti langsung ing klien.

Source: www.habr.com

Add a comment