Một backdoor nhỏ trên Flask hay cách điều khiển máy tính trong mạng cục bộ

Này Habr!

Gần đây tôi đã xem phiên bản tải xuống của luồng lập trình “Cách tạo ứng dụng web của riêng bạn trong Flask”. Và tôi quyết định củng cố kiến ​​​​thức của mình trong một số dự án. Trong một thời gian dài, tôi không biết phải viết gì và nảy ra ý tưởng: “Tại sao không tạo một cửa hậu nhỏ trong Flask?”

Các tùy chọn đầu tiên để triển khai và khả năng của cửa sau ngay lập tức xuất hiện trong đầu tôi. Nhưng tôi quyết định lập ngay danh sách các khả năng của cửa hậu:

  1. Biết cách mở các trang web
  2. Có quyền truy cập dòng lệnh
  3. Có thể mở chương trình, hình ảnh, video

Vì vậy, điểm đầu tiên là cực kỳ dễ thực hiện bằng mô-đun webbrowser. Tôi quyết định triển khai điểm thứ hai bằng mô-đun os. Và cái thứ ba cũng thông qua mô-đun os, nhưng tôi sẽ sử dụng “liên kết” (sẽ nói thêm về điều đó sau).

Viết một máy chủ

Vì vậy, *trống* tất cả mã máy chủ:

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

Tôi đã bỏ hết mã rồi, đã đến lúc giải thích bản chất.

Tất cả mã chạy trên máy tính cục bộ trên cổng 5000. Để tương tác với máy chủ, chúng tôi phải gửi yêu cầu JSON POST.

Cấu trúc yêu cầu JSON:

{‘command’:  ‘comecommand’, ‘data’: ‘somedata’}

Chà, có lý khi 'lệnh' là lệnh chúng ta muốn thực thi. Và 'dữ liệu' là các đối số lệnh.

Bạn có thể viết và gửi các yêu cầu JSON để tương tác với máy chủ theo cách thủ công (các yêu cầu sẽ giúp ích cho bạn). Hoặc bạn có thể viết một máy khách giao diện điều khiển.

Viết một khách hàng

Code:

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

Giải thích:

Trước hết, mô-đun yêu cầu được nhập (để tương tác với máy chủ). Dưới đây là mô tả về chức năng bắt đầu và kiểm tra. Và sau đó là chu kỳ mà điều kỳ diệu xảy ra. Bạn đã đọc mã chưa? Vậy là bạn đã hiểu được ý nghĩa của điều kì diệu xảy ra trong vòng tuần hoàn. Nhập lệnh - nó được thực thi. Shell – các lệnh cho dòng lệnh (logic không đúng quy mô).

Test – kiểm tra xem máy chủ có đang chạy không (backdoor)
Liên kết – sử dụng “phím tắt”
Openweb – mở một trang web
Thoát – thoát khỏi máy khách
Set – cài đặt ip máy tính của bạn trên mạng cục bộ

Và bây giờ nói thêm về liên kết.

Có một tệp link.txt bên cạnh máy chủ. Nó chứa các liên kết (đường dẫn đầy đủ) đến các tệp (video, ảnh, chương trình).

Cấu trúc như thế này:

полный_путь>описание
полный_путь>описание

Tổng

Chúng tôi có một máy chủ cửa sau để điều khiển máy tính trên mạng cục bộ (trong mạng wi-fi). Về mặt kỹ thuật, chúng tôi có thể chạy ứng dụng khách từ bất kỳ thiết bị nào có trình thông dịch python.

Tái bút Tôi đã thêm lệnh set để nếu một máy tính trên mạng cục bộ được gán một IP khác, nó có thể được thay đổi trực tiếp trong máy khách.

Nguồn: www.habr.com

Thêm một lời nhận xét