Djangoはchanls/mikoに基づいてwebsshオンラインサーバ管理を実現する
Webshell
Webの意味は明らかにサーバがウェブサービスを開放する必要があり、shellの意味はサーバに対してある程度の操作権限を取得することである.Webshellは、ウェブサイトポートを介してウェブサイトサーバをある程度操作する権限と呼ばれることが多い.
一方,webshellはサイト管理,サーバ管理などに駅長がよく用いられるが,FSO権限によっては,Webスクリプトのオンライン編集,ダウンロードファイルのアップロード,データベースの表示,任意のプログラムコマンドの実行などが機能する.
一方,侵入者に利用され,ウェブサイトサーバを制御する目的を達成する.これらのウェブスクリプトはよくWEBスクリプト木馬と呼ばれ、比較的流行しているaspやphp木馬にも基づいている.NETのシナリオ木馬とJSPのシナリオ木馬.国内でよく使われるWebShellには海陽ASP木馬、Phpspy、c 99 shellなどがあります.
バックエンドは、
Webエンドの実装
1.インストール
2.ガイドパック
3.ページでの表示
4.データ操作
5.webエンドの完全なコード
サーバ側実装
1.インストール
2.
3.
Webの意味は明らかにサーバがウェブサービスを開放する必要があり、shellの意味はサーバに対してある程度の操作権限を取得することである.Webshellは、ウェブサイトポートを介してウェブサイトサーバをある程度操作する権限と呼ばれることが多い.
一方,webshellはサイト管理,サーバ管理などに駅長がよく用いられるが,FSO権限によっては,Webスクリプトのオンライン編集,ダウンロードファイルのアップロード,データベースの表示,任意のプログラムコマンドの実行などが機能する.
一方,侵入者に利用され,ウェブサイトサーバを制御する目的を達成する.これらのウェブスクリプトはよくWEBスクリプト木馬と呼ばれ、比較的流行しているaspやphp木馬にも基づいている.NETのシナリオ木馬とJSPのシナリオ木馬.国内でよく使われるWebShellには海陽ASP木馬、Phpspy、c 99 shellなどがあります.
web
端は、Xterm.js
または他のWebShell
組立体およびwebsocket
を使用するバックエンドは、
WebSocket
およびSSH
プロトコルをサポートするリモートログインモジュールのみでよいWebエンドの実装
1.インストール
npm install [email protected] --save
指定バージョンインストール、最新版xtermファイルの変更が大きく、次の方法でエラーが発生します.2.ガイドパック
import 'xterm/dist/xterm.css';
// , terminal textarea
import {
Terminal } from 'xterm';
import * as fit from 'xterm/lib/addons/fit/fit';
import * as attach from 'xterm/lib/addons/attach/attach'
Terminal.applyAddon(fit);
Terminal.applyAddon(attach);
3.ページでの表示
<template>
<div>
<div id="terminal" style="width: 500px;height:300px;"></div>
</div>
</template>
4.データ操作
mounted () {
let terminalContainer = document.getElementById('terminal')
// xterm
this.term = new Terminal({
cursorBlink: true, //
cursorStyle: "underline" //
}) // Terminal
this.term.open(terminalContainer) // term dom
console.log(this.term)
// xterm ( )
this.term.write("$ ")
// xterm
this.term.on("key",(key,ev)=>{
//key ,ev
console.log('key======',ev.keyCode);
//
this.term.write(key)
if (ev.keyCode == 13) {
// (ASCII 13 )
this.terminalSocket.send(this.order) //
// this.order = ''
console.log(' order',this.order)
}else if (ev.keyCode == 8) {
// (ASCII 8 )
this.order = this.order.substr(0,this.order.length - 1)
//
this.term.write("\x1b[2K\r")
// ,
this.term.write("$ "+this.order)
console.log(" :"+this.order)
typeof this.order
}else{
//
this.order += key
console.log(" order",this.order)
}
})
// websocket, django
this.terminalSocket = new WebSocket("ws://127.0.0.1:8000/webssh/");
//
this.terminalSocket.onmessage = (res) => {
console.log(res.data);
// var message = JSON.parse(res.data);
// xterm
this.term.writeln("\r
"+res.data);
//
this.order = ""
// ,
this.term.write("\r
$ ");
}
},
5.webエンドの完全なコード
<template>
<div class="console" id="terminal"></div>
</template>
<script>
import {
Terminal } from 'xterm'
import * as attach from 'xterm/lib/addons/attach/attach'
import * as fit from 'xterm/lib/addons/fit/fit'
export default {
name: 'webssh',
data () {
return {
term: null,
terminalSocket: null,
order:''
}
},
methods: {
},
mounted () {
let terminalContainer = document.getElementById('terminal')
// xterm
this.term = new Terminal({
cursorBlink: true, //
cursorStyle: "underline" //
}) // Terminal
this.term.open(terminalContainer) // term dom
console.log(this.term)
// xterm ( )
this.term.write("$ ")
// xterm
this.term.on("key",(key,ev)=>{
//key ,ev
console.log('key======',ev.keyCode);
//
this.term.write(key)
if (ev.keyCode == 13) {
// (ASCII 13 )
this.terminalSocket.send(this.order) //
// this.order = ''
console.log(' order',this.order)
}else if (ev.keyCode == 8) {
// (ASCII 8 )
this.order = this.order.substr(0,this.order.length - 1)
//
this.term.write("\x1b[2K\r")
// ,
this.term.write("$ "+this.order)
console.log(" :"+this.order)
typeof this.order
}else{
//
this.order += key
console.log(" order",this.order)
}
})
// websocket, django
this.terminalSocket = new WebSocket("ws://127.0.0.1:8000/webssh/");
//
this.terminalSocket.onmessage = (res) => {
console.log(res.data);
// var message = JSON.parse(res.data);
// xterm
this.term.writeln("\r
"+res.data);
//
this.order = ""
// ,
this.term.write("\r
$ ");
}
},
},
}
</script>
サーバ側実装
1.インストール
pip install paramiko
2.
paramiko
によるssh
リモート登録import paramiko
# SSH
client = paramiko.SSHClient()
# SSH Host , Known_host 。
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# SSH
client.connect(
hostname="192.168.000.000",
port=22,
username='root',
password='123123'
)
# stdout ,stderr ,
stdin, stdout, stderr = client.exec_command("ls")
# ls
print(stdout.read().decode('utf-8'))
3.
websocket
と連携してリアルタイム操作を実現#wsserver.py
from channels.generic.websocket import WebsocketConsumer
import paramiko
class WebSSHService(WebsocketConsumer):
def connect(self):
self.accept()
self.sh = paramiko.SSHClient() # 1 SSH
self.sh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 2 know_hosts
self.sh.connect("192.168.000.000",
port=22,
username="root",
password="123123") # 3
print(" ")
def receive(self, text_data=None, bytes_data=None):
print(str(text_data)) #
print(type(text_data))
stdin, stdout, stderr = self.sh.exec_command(text_data)
right_info = stdout.read()
err_info = stderr.read()
print(right_info)
if right_info:
new_data = right_info.decode("utf-8").replace("
","\r
")
print(new_data)
self.send(new_data)
elif err_info:
new_data = err_info.decode("utf-8").replace("
", "\r
")
print(new_data)
self.send(new_data)
else:
print(self.send(" "))
def disconnect(self, code):
print(f'sorry,{self}, , !')