A backdoor leutik on Flask atawa kumaha carana ngadalikeun komputer dina jaringan lokal

Héy Habr!

Kuring nembe ningali versi anu diunduh tina aliran program "Kumaha cara ngadamel aplikasi wéb anjeun nyalira dina Flask." Sareng kuring mutuskeun pikeun ngahijikeun pangaweruh kuring dina sababaraha proyék. Lila-lila kuring henteu terang naon anu kedah ditulis sareng ideu sumping ka kuring: "Naha henteu ngadamel mini-backdoor di Flask?"

Pilihan munggaran pikeun palaksanaan sareng kamampuan backdoor langsung muncul dina sirah kuring. Tapi kuring mutuskeun pikeun langsung ngadamel daptar kamampuan backdoor:

  1. Nyaho kumaha muka situs wéb
  2. Boga aksés garis paréntah
  3. Bisa muka program, poto, video

Janten, titik anu munggaran gampang pisan diimplementasikeun nganggo modul webbrowser. Kuring mutuskeun pikeun nerapkeun titik kadua ngagunakeun modul os. Sareng anu katilu ogé ngalangkungan modul os, tapi kuring bakal nganggo "Tumbu" (nu langkung seueur ngeunaan éta engké).

Nulis server a

Janten, *drumroll* sadaya 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')

Abdi parantos ngalungkeun sadayana kode, waktosna pikeun ngajelaskeun hakekatna.

Sadaya kode dijalankeun dina komputer lokal dina port 5000. Pikeun berinteraksi sareng server, urang kedah ngirim pamundut JSON POST.

Struktur pamundut JSON:

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

Nya, masuk akal yén 'komando' nyaéta paréntah anu urang hoyong laksanakeun. Sareng 'data' mangrupikeun argumen paréntah.

Anjeun tiasa nyerat sareng ngirim pamundut JSON pikeun berinteraksi sareng server sacara manual (pamundut bakal ngabantosan anjeun). Atawa anjeun bisa nulis klien konsol.

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:

Anu mimiti, modul requests diimpor (pikeun interacting jeung server). Di handap ieu katerangan ngeunaan fungsi ngamimitian sareng uji. Lajeng siklus nu magic lumangsung. Dupi anjeun maca kodeu? Sangkan anjeun ngartos harti magic nu lumangsung dina siklus nu. Lebetkeun paréntah - éta dieksekusi. Shell - paréntah pikeun garis paréntah (logika pareum skala).

Test - pariksa naha server jalan (backdoor)
Link - ngagunakeun "potong kompas"
Openweb - muka situs wéb
Kaluar - kaluar klien
Setel - netepkeun ip komputer anjeun dina jaringan lokal

Sareng ayeuna langkung seueur ngeunaan tautan.

Aya file link.txt gigireun server. Éta ngandung tautan (jalur lengkep) kana file (video, poto, program).

Strukturna sapertos kieu:

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

hasil

Simkuring boga server backdoor pikeun ngadalikeun komputer dina jaringan lokal (dina jaringan wi-fi). Téhnisna, urang tiasa ngajalankeun klien tina sagala alat nu boga juru python.

PS I ditambahkeun paréntah set supados lamun komputer dina jaringan lokal ditugaskeun IP béda, eta bisa dirobah langsung di klien nu.

sumber: www.habr.com

Tambahkeun komentar