НСбольшой бэкдор Π½Π° Flask ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ Π² локальной сСти

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€!

НСдавно я посмотрСл ΡΠΊΠ°Ρ‡Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ стрима ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ «Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ своС Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° FlaskΒ». И Ρ€Π΅ΡˆΠΈΠ» Π·Π°ΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ свои знания Π² ΠΊΠ°ΠΊΠΎΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. Π”ΠΎΠ»Π³ΠΎ Π½Π΅ Π·Π½Π°Π», Ρ‡Ρ‚ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡˆΠ»Π° идСя: «А ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠΈΠ½ΠΈ-бэкдор Π½Π° Flask?Β».

Π’ Π³ΠΎΠ»ΠΎΠ²Π΅ Ρ‚ΡƒΡ‚ ΠΆΠ΅ появились ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΈ возмоТностСй бэкдора. Но я Ρ€Π΅ΡˆΠΈΠ» сразу ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ список возмоТностСй бэкдора:

  1. Π£ΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ сайты
  2. Π˜ΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС
  3. Π£ΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ„ΠΎΡ‚ΠΎ, Π²ΠΈΠ΄Π΅ΠΎ

Π˜Ρ‚Π°ΠΊ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ ΠΊΡ€Π°ΠΉΠ½Π΅ Π»Π΅Π³ΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ модуля webbrowser. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡƒΠ½ΠΊΡ‚ я Ρ€Π΅ΡˆΠΈΠ» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ модуля 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’}

Ну, Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Ρ‡Ρ‚ΠΎ β€˜command’ – ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ. А β€˜data’ – Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

МоТно ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ JSON запросы для взаимодСйствия с сСрвСром Ρ€ΡƒΡ‡ΠΊΠ°ΠΌΠΈ(Π²Π°ΠΌ Π² ΠΏΠΎΠΌΠΎΡ‰ΡŒ requests). А ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚.

НаписаниС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

Код:

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

ОбъяснСния:

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ импортируСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒ requests(для взаимодСйствия с сСрвСром). Π”Π°Π»ΡŒΡˆΠ΅ описания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ start ΠΈ test. А дальшС Ρ†ΠΈΠΊΠ» Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ происходит Π²ΠΎΠ»ΡˆΠ΅Π±ΡΡ‚Π²ΠΎ. Π§ΠΈΡ‚Π°Π»ΠΈ ΠΊΠΎΠ΄? Π—Π½Π°Ρ‡ΠΈΡ‚ Π²Π°ΠΌ ясСн смысл Π²ΠΎΠ»ΡˆΠ΅Π±ΡΡ‚Π²Π°, происходящСго Π² Ρ†ΠΈΠΊΠ»Π΅. Π’Π²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ – ΠΎΠ½Π° выполняСтся. Shell – ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки(Π»ΠΎΠ³ΠΈΠΊΠ° Π·Π°ΡˆΠΊΠ°Π»ΠΈΠ²Π°Π΅Ρ‚).

Test – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ сСрвСр(бэкдор)
Link – использованиС «ярлыка»
Openweb – ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сайта
Quit – Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
Set – Π·Π°Π΄Π°Π½ΠΈΠ΅ ip вашСго ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π² локальной сСти

А сСйчас ΠΏΠΎΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ link.

Рядом с сСрвСром Π»Π΅ΠΆΠΈΡ‚ Ρ„Π°ΠΉΠ» link.txt. Π’ Π½Ρ‘ΠΌ находятся ссылки(ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ) ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ(Π²ΠΈΠ΄Π΅ΠΎ, Ρ„ΠΎΡ‚ΠΎ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹).

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° такая:

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

Π˜Ρ‚ΠΎΠ³

ΠœΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ сСрвСр-бэкдор для управлСния ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ Π² локальной сСти(Π²Π½ΡƒΡ‚Ρ€ΠΈ wi-fi сСти). ВСхничСски ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ с любого устройства, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅ΡΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ python.

P.S. ΠšΠΎΠΌΠ°Π½Π΄Ρƒ set я Π΄ΠΎΠ±Π°Π²ΠΈΠ» для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ссли ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ Π² локальной сСти присвоят Π΄Ρ€ΡƒΠ³ΠΎΠΉ ip, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ прямо Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com