Flask-тегі шағын бэкдор немесе жергілікті желідегі компьютерді басқару әдісі

Эй Хабр!

Мен жақында «Flask-те өзіңіздің веб-қосымшаңызды қалай жасауға болады» бағдарламалау ағынының жүктелген нұсқасын көрдім. Ал мен білімімді қандай да бір жобада бекітуді жөн көрдім. Ұзақ уақыт бойы мен не жазарымды білмедім және маған: «Неге колбада мини-бэкдор жасамасқа?» деген ой келді.

Менің басымда бэкдорды іске асырудың және мүмкіндіктерінің алғашқы нұсқалары бірден пайда болды. Бірақ мен дереу бэкдор мүмкіндіктерінің тізімін жасауды шештім:

  1. Веб-сайттарды қалай ашу керектігін біліңіз
  2. Пәрмен жолына кіру мүмкіндігі бар
  3. Бағдарламаларды, фотоларды, бейнелерді аша білу

Сонымен, бірінші тармақты веб-шолғыш модулі арқылы жүзеге асыру өте оңай. Мен os модулі арқылы екінші тармақты жүзеге асыруды шештім. Үшіншісі де OS модулі арқылы, бірақ мен «сілтемелерді» қолданамын (бұл туралы кейінірек).

Сервер жазу

Сонымен, *барабан * барлық сервер кодын:

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

Мен барлық кодты тастадым, мәнін түсіндіретін уақыт келді.

Барлық код 5000 портындағы жергілікті компьютерде жұмыс істейді. Сервермен әрекеттесу үшін JSON POST сұрауын жіберуіміз керек.

JSON сұрау құрылымы:

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

«Пәрмен» біз орындағымыз келетін пәрмен екені мағынасы бар. Ал «деректер» пәрмен дәлелдері болып табылады.

Сервермен қолмен әрекеттесу үшін JSON сұрауларын жазуға және жіберуге болады (сұраулар сізге көмектеседі). Немесе консоль клиентін жаза аласыз.

Клиент жазу

Код:

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

Түсініктемелер:

Ең алдымен сұраулар модулі импортталады (сервермен әрекеттесу үшін). Төменде бастау және сынақ функцияларының сипаттамалары берілген. Содан кейін сиқыр болатын цикл. Сіз кодты оқыдыңыз ба? Осылайша сіз циклде болатын сиқырдың мағынасын түсінесіз. Пәрменді енгізіңіз - ол орындалады. Shell – пәрмен жолына арналған командалар (логика масштабтан тыс).

Тест – сервердің жұмыс істеп тұрғанын тексеріңіз (бэк есік)
Сілтеме – «төте жолды» пайдалану
Openweb – веб-сайт ашу
Шығу – клиенттен шығу
Орнату – жергілікті желіде компьютердің IP мекенжайын орнату

Ал енді сілтеме туралы толығырақ.

Сервердің жанында link.txt файлы бар. Онда файлдарға (бейнелер, фотосуреттер, бағдарламалар) сілтемелері (толық жол) бар.

Құрылымы келесідей:

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

Нәтиже

Бізде компьютерді жергілікті желіде (wi-fi желісінде) басқаруға арналған бэкдор сервері бар. Техникалық тұрғыдан біз клиентті питон аудармашысы бар кез келген құрылғыдан іске қоса аламыз.

PS Егер жергілікті желідегі компьютерге басқа IP тағайындалған болса, оны тікелей клиентте өзгертуге болатындай етіп орнату пәрменін қостым.

Ақпарат көзі: www.habr.com

пікір қалдыру