Backdoor kecil di Flask atau cara mengontrol komputer di jaringan lokal

Hei Habr!

Saya baru-baru ini menonton versi unduhan dari aliran pemrograman β€œCara membuat aplikasi web Anda sendiri di Flask.” Dan saya memutuskan untuk mengkonsolidasikan pengetahuan saya dalam beberapa proyek. Untuk waktu yang lama saya tidak tahu harus menulis apa dan muncul ide: β€œMengapa tidak membuat mini-backdoor di Flask?”

Opsi pertama untuk implementasi dan kemampuan pintu belakang segera muncul di kepala saya. Namun saya memutuskan untuk segera membuat daftar kemampuan backdoor:

  1. Ketahui cara membuka situs web
  2. Memiliki akses baris perintah
  3. Dapat membuka program, foto, video

Jadi, poin pertama sangat mudah diterapkan menggunakan modul browser web. Saya memutuskan untuk menerapkan poin kedua menggunakan modul os. Dan yang ketiga juga melalui modul os, tapi saya akan menggunakan β€œlink” (lebih lanjut tentang itu nanti).

Menulis server

Jadi, *drumroll* semua kode servernya:

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

Saya sudah membuang semua kodenya, saatnya menjelaskan intinya.

Semua kode berjalan di komputer lokal pada port 5000. Untuk berinteraksi dengan server, kita harus mengirimkan permintaan JSON POST.

Struktur permintaan JSON:

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

Masuk akal jika 'perintah' adalah perintah yang ingin kita jalankan. Dan 'data' adalah argumen perintah.

Anda dapat menulis dan mengirim permintaan JSON untuk berinteraksi dengan server secara manual (permintaan akan membantu Anda). Atau Anda dapat menulis klien konsol.

Menulis 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

Penjelasan:

Pertama-tama, modul permintaan diimpor (untuk berinteraksi dengan server). Di bawah ini adalah deskripsi fungsi start dan test. Dan kemudian siklus di mana keajaiban terjadi. Sudahkah Anda membaca kodenya? Sehingga Anda memahami arti keajaiban yang terjadi dalam siklus tersebut. Masukkan perintah - itu dijalankan. Shell – perintah untuk baris perintah (logikanya di luar skala).

Test – memeriksa apakah server sedang berjalan (backdoor)
Tautan – penggunaan β€œjalan pintas”
Openweb – membuka situs web
Keluar – keluar dari klien
Set – mengatur ip komputer Anda di jaringan lokal

Dan sekarang lebih banyak tentang tautan.

Ada file link.txt di sebelah server. Ini berisi tautan (jalur lengkap) ke file (video, foto, program).

Strukturnya seperti ini:

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

Total

Kami memiliki server pintu belakang untuk mengendalikan komputer di jaringan lokal (dalam jaringan wi-fi). Secara teknis, kita dapat menjalankan klien dari perangkat apa pun yang memiliki juru bahasa python.

PS Saya menambahkan perintah set sehingga jika komputer di jaringan lokal diberi IP yang berbeda, maka dapat diubah langsung di klien.

Sumber: www.habr.com

Tambah komentar