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 ์š”์ฒญ์„ ์ž‘์„ฑํ•˜๊ณ  ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์š”์ฒญ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค). ์•„๋‹ˆ๋ฉด ์ฝ˜์†” ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ž‘์„ฑ

์ฝ”๋“œ :

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 ๋„คํŠธ์›Œํฌ ๋‚ด)์˜ ์ปดํ“จํ„ฐ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฑ๋„์–ด ์„œ๋ฒ„๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์žฅ์น˜์—์„œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PS ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์˜ ์ปดํ“จํ„ฐ์— ๋‹ค๋ฅธ IP๊ฐ€ ํ• ๋‹น๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก set ๋ช…๋ น์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€