Isang maliit na backdoor sa Flask o kung paano kontrolin ang isang computer sa isang lokal na network

Hoy Habr!

Napanood ko kamakailan ang isang na-download na bersyon ng stream ng programming na "Paano lumikha ng iyong sariling web application sa Flask." At nagpasya akong pagsamahin ang aking kaalaman sa ilang proyekto. Sa loob ng mahabang panahon hindi ko alam kung ano ang isusulat at dumating sa akin ang ideya: "Bakit hindi gumawa ng mini-backdoor sa Flask?"

Ang mga unang opsyon para sa mga pagpapatupad at kakayahan ng backdoor ay agad na lumitaw sa aking isipan. Ngunit nagpasya akong gumawa kaagad ng listahan ng mga kakayahan sa backdoor:

  1. Alamin kung paano magbukas ng mga website
  2. Magkaroon ng command line access
  3. Magbukas ng mga programa, larawan, video

Kaya, ang unang punto ay napakadaling ipatupad gamit ang module ng webbrowser. Nagpasya akong ipatupad ang pangalawang punto gamit ang os module. At ang pangatlo ay sa pamamagitan din ng os module, ngunit gagamit ako ng "mga link" (higit pa sa na mamaya).

Pagsusulat ng isang server

Kaya, *drumroll* lahat ng code ng 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')

Na-dump ko na lahat ng code, oras na para ipaliwanag ang essence.

Ang lahat ng code ay tumatakbo sa lokal na computer sa port 5000. Upang makipag-ugnayan sa server, dapat kaming magpadala ng kahilingan sa JSON POST.

Istraktura ng kahilingan ng JSON:

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

Well, makatuwiran na ang 'utos' ay ang utos na gusto nating isagawa. At ang 'data' ay ang mga argumento ng command.

Maaari kang magsulat at magpadala ng mga kahilingan sa JSON upang manu-manong makipag-ugnayan sa server (tutulungan ka ng mga kahilingan). O maaari kang magsulat ng isang console client.

Pagsusulat ng isang kliyente

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

Mga Paliwanag:

Una sa lahat, ang module ng mga kahilingan ay na-import (para sa pakikipag-ugnayan sa server). Nasa ibaba ang mga paglalarawan ng pagsisimula at pag-andar ng pagsubok. At pagkatapos ay ang cycle kung saan nangyayari ang magic. Nabasa mo na ba ang code? Kaya naiintindihan mo ang kahulugan ng magic na nangyayari sa cycle. Ipasok ang command - ito ay naisakatuparan. Shell – mga command para sa command line (ang logic ay off scale).

Pagsubok - suriin kung tumatakbo ang server (backdoor)
Link - paggamit ng "shortcut"
Openweb – pagbubukas ng website
Quit – lumabas sa kliyente
Itakda – pagtatakda ng ip ng iyong computer sa lokal na network

At ngayon higit pa tungkol sa link.

May link.txt file sa tabi ng server. Naglalaman ito ng mga link (buong landas) sa mga file (mga video, larawan, programa).

Ang istraktura ay ganito:

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

Kabuuan

Mayroon kaming backdoor server para sa pagkontrol sa isang computer sa isang lokal na network (sa loob ng isang wi-fi network). Sa teknikal na paraan, maaari naming patakbuhin ang kliyente mula sa anumang device na may interpreter ng python.

PS Idinagdag ko ang set command upang kung ang isang computer sa lokal na network ay itinalaga ng ibang IP, maaari itong mabago nang direkta sa kliyente.

Pinagmulan: www.habr.com

Magdagdag ng komento