Μια μικρή κερκόπορτα στο Flask ή πώς να ελέγχετε έναν υπολογιστή σε τοπικό δίκτυο

Γεια σου Χαμπρ!

Πρόσφατα παρακολούθησα μια ληφθείσα έκδοση της ροής προγραμματισμού "Πώς να δημιουργήσετε τη δική σας εφαρμογή Ιστού στο Flask". Και αποφάσισα να εμπεδώσω τις γνώσεις μου σε κάποιο έργο. Για πολύ καιρό δεν ήξερα τι να γράψω και μου ήρθε η ιδέα: "Γιατί να μην φτιάξω μια mini-backdoor στο Flask;"

Οι πρώτες επιλογές για υλοποιήσεις και δυνατότητες του backdoor εμφανίστηκαν αμέσως στο μυαλό μου. Αλλά αποφάσισα να φτιάξω αμέσως μια λίστα με τις δυνατότητες του backdoor:

  1. Μάθετε πώς να ανοίγετε ιστότοπους
  2. Έχετε πρόσβαση στη γραμμή εντολών
  3. Να μπορείς να ανοίγεις προγράμματα, φωτογραφίες, βίντεο

Έτσι, το πρώτο σημείο είναι εξαιρετικά εύκολο να εφαρμοστεί χρησιμοποιώντας τη μονάδα webbrowser. Αποφάσισα να εφαρμόσω το δεύτερο σημείο χρησιμοποιώντας τη μονάδα os. Και το τρίτο είναι επίσης μέσω της ενότητας os, αλλά θα χρησιμοποιήσω "συνδέσμους" (περισσότερα για αυτό αργότερα).

Γράψιμο διακομιστή

Έτσι, *drumroll* όλος ο κώδικας διακομιστή:

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 – εντολές για τη γραμμή εντολών (η λογική είναι εκτός κλίμακας).

Δοκιμή - ελέγξτε εάν ο διακομιστής λειτουργεί (backdoor)
Σύνδεσμος – χρήση «συντόμευσης»
Openweb – άνοιγμα ιστότοπου
Έξοδος – έξοδος από τον πελάτη
Ρύθμιση – ρύθμιση της ip του υπολογιστή σας στο τοπικό δίκτυο

Και τώρα περισσότερα για τον σύνδεσμο.

Υπάρχει ένα αρχείο link.txt δίπλα στον διακομιστή. Περιέχει συνδέσμους (πλήρης διαδρομή) προς αρχεία (βίντεο, φωτογραφίες, προγράμματα).

Η δομή έχει ως εξής:

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

Σύνολο

Έχουμε έναν διακομιστή backdoor για τον έλεγχο ενός υπολογιστή σε ένα τοπικό δίκτυο (εντός ενός δικτύου wi-fi). Τεχνικά, μπορούμε να εκτελέσουμε τον πελάτη από οποιαδήποτε συσκευή διαθέτει διερμηνέα python.

Υ.Γ. Πρόσθεσα την εντολή set έτσι ώστε αν σε έναν υπολογιστή στο τοπικό δίκτυο εκχωρηθεί διαφορετική IP, να μπορεί να αλλάξει απευθείας στον πελάτη.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο