From 704d47e2c2e1616b86da2d2c71423bf8eca06fbb Mon Sep 17 00:00:00 2001 From: root Date: Sun, 9 Mar 2025 23:05:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D0=B8=20my=5Ffin?= =?UTF-8?q?=20my=5Fcheck=5Fparams=20=D0=B8=20=D1=81=D1=82=D1=80=D1=83?= =?UTF-8?q?=D0=BA=D1=82=D1=83=D1=80=D0=B0=20=D1=83=D1=82=D0=B8=D0=BB=D0=B8?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B2=20main?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.sh | 2 + src/DosAtk.cpp | 327 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 320 insertions(+), 9 deletions(-) create mode 100755 build.sh diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..477c251 --- /dev/null +++ b/build.sh @@ -0,0 +1,2 @@ +g++ src/DosAtk.cpp -o DosAtk -lcurl +./DosAtk "$@" diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index 5b2f00b..725ef8f 100644 --- a/src/DosAtk.cpp +++ b/src/DosAtk.cpp @@ -1,19 +1,328 @@ +#include #include #include -// DCL +#include +#include +#include +#include +#include +#include +#include +#include -int attack_type; +// ====== DCL ====== // + +std::string attack_type; std::string domain; std::string ip; -std::string port; -std::string log_file = "/var/logs/DosAtk"; +std::string port; +std::string log_file; std::string telegram_id; -std::string telegram_token; +std::string telegram_token; +int n_ok_requests; +int n_fail_requests; +std::chrono::system_clock::time_point start_timestamp; +std::string log_msg; +std::string fin_msg; +std::string msg; - -int main(int argc, char **argv) +int my_check_params(int argc, char **argv) { - + std::string debug_msg; + debug_msg = ""; + for (int i = 0; i < argc; i++) { + debug_msg += argv[i]; + debug_msg += " "; + } + printf("begin my_check_params (argc: %i, argv: %s)\n", argc, debug_msg.c_str()); + int status; + int opt; + const char* short_options = "a:d:i:p:l:t:b:h"; + const struct option long_options[] = { + {"attack", required_argument, NULL, 'a'}, + {"domain", required_argument, NULL, 'd'}, + {"ip", required_argument, NULL, 'i'}, + {"port", required_argument, NULL, 'p'}, + {"log", required_argument, NULL, 'l'}, + {"telegram", required_argument, NULL, 't'}, + {"token", required_argument, NULL, 'b'}, + {"help", no_argument, NULL, 'h'}, + {NULL, 0, NULL, 0} + }; + + while ((opt = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) { + switch (opt) { + case 'a': + attack_type = optarg; + break; + case 'd': + domain = optarg; + break; + case 'i': + ip = optarg; + break; + case 'p': + port = optarg; + break; + case 'l': + log_file = optarg; + break; + case 't': + telegram_id = optarg; + break; + case 'b': + telegram_token = optarg; + break; + case 'h': + status = 0; + break; + case '?': + status = -101; + break; + } + } + + if (status != 0 && status != -101) + { + if (attack_type != "flood" && attack_type != "scan") { + status = -1; + } + else if (attack_type == "scan" && domain.empty() && ip.empty()) { + status = -10; + } + else if (attack_type == "flood" && domain.empty() && ip.empty()) { + status = -20; + } + else if ((!telegram_id.empty() && telegram_token.empty()) || (telegram_id.empty() && !telegram_token.empty())) { + status = -600; + } + else if (attack_type == "scan") { + status = 1; + } + else if (attack_type == "flood") { + status = 2; + } + } + + printf("end my_check_params status: %i\n", status); + return status; +} + +void my_diag(int status) +{ + printf("begin my_diag (status: %i)\n", status); + switch (status) + { + case 0: + printf("Usage: ./DosAtk [options]\n" + "Required:\n" + " -a, --attack TYPE Type of attack (scan|flood)\n" + " -d, --domain DOMAIN Target domain\n" + " -i, --ip IP Target IP\n" + " -p, --port PORT Port. Required only for flood type!\n" + "Optional:\n" + " -l, --log FILE Log file\n" + " -t, --telegram ID Telegram ID\n" + " -b, --token TOKEN Telegram bot token\n"); + break; + case -1: + printf("Error: Invalid attack type!\n--help for more info\n"); + break; + case -10: + printf("Error: Missing required parameters for port scanning!\n--help for more info\n"); + break; + case -20: + printf("Error: Missing required parameters for tcp syn dos attack!\n--help for more info\n"); + break; + case -101: + printf("Error: Unknown option!\n.--help for info\n"); + break; + case -600: + printf("Error: To use telegram integration both telegram_id and telegram_token have to be provided!\n.--help for info\n"); + break; + } + printf("end my_diag\n"); +} + +void my_msg() +{ + printf("begin my_msg()\n"); + printf("%s\n", msg.c_str()); + printf("end my_msg"); +} + +int my_log() +{ return 0; -} \ No newline at end of file +} + +void my_fin() +{ + auto end_timestamp = std::chrono::system_clock::now(); + auto end_time_t = std::chrono::system_clock::to_time_t(end_timestamp); + auto end_ms = std::chrono::duration_cast(end_timestamp.time_since_epoch()) % 1000; + + auto duration = end_timestamp - start_timestamp; + auto hours = std::chrono::duration_cast(duration); + auto minutes = std::chrono::duration_cast(duration % std::chrono::hours(1)); + auto seconds = std::chrono::duration_cast(duration % std::chrono::minutes(1)); + auto milliseconds = std::chrono::duration_cast(duration % std::chrono::seconds(1)); + + std::cout << "Worked for "; + if (duration < std::chrono::minutes(2)) { + double total_seconds = std::chrono::duration(duration).count(); + std::cout << std::fixed << std::setprecision(3) << total_seconds << " seconds"; + } else { + if (hours.count() > 0) std::cout << hours.count() << "h "; + if (minutes.count() > 0) std::cout << minutes.count() << "m "; + std::cout << seconds.count() << "s " << milliseconds.count() << "ms"; + } + std::cout << std::endl; + + std::cout << "Sent " << (n_ok_requests + n_fail_requests) << " requests (" + << n_ok_requests << " ok, " << n_fail_requests << " failed)" << std::endl; + + std::cout << "DosAtk stopped at " << std::put_time(std::localtime(&end_time_t), "%Y-%m-%d %H:%M:%S") + << "." << std::setfill('0') << std::setw(3) << end_ms.count() << std::endl; + + std::exit(0); +} + +int my_dns() +{ + return 0; +} + +int my_tcp_syn() +{ + return 2; +} + +int my_udp() +{ + return 2; +} + +int main(int argc, char **argv) +{ + int check_params_status; + int log_status; + int dns_status; + int udp_status; + int tcp_syn_status; + + // ====== Тело программы ====== // + n_ok_requests = 0; + n_fail_requests = 0; + start_timestamp = std::chrono::system_clock::now(); + + time_t now_time_t = std::chrono::system_clock::to_time_t(start_timestamp); + + std::chrono::milliseconds ms = std::chrono::duration_cast(start_timestamp.time_since_epoch()) % 1000; + + printf("Starting DosAtk at %04d-%02d-%02d %02d:%02d:%02d.%03ld\n", + std::localtime(&now_time_t)->tm_year + 1900, + std::localtime(&now_time_t)->tm_mon + 1, + std::localtime(&now_time_t)->tm_mday, + std::localtime(&now_time_t)->tm_hour, + std::localtime(&now_time_t)->tm_min, + std::localtime(&now_time_t)->tm_sec, + ms.count()); + + check_params_status = my_check_params(argc, argv); + switch (check_params_status) + { + case 1: + dns_status = my_dns(); + if (dns_status == 0) + { + while (udp_status = my_udp()) + { + if (udp_status == 2) + { + break; + } + else if (udp_status < 0) + { + my_diag(udp_status); + log_status = my_log(); + if (log_status == 1) + { + my_msg(); + } + } + } + log_status = my_log(); + my_msg(); + my_fin(); + } + else if (dns_status == 1) + { + my_diag(check_params_status); + log_status = my_log(); + if (log_status == 0){ + my_fin(); + } + else if (log_status == 1) + { + my_msg(); + my_fin(); + } + } + break; + case 2: + dns_status = my_dns(); + if (dns_status == 0) + { + while (tcp_syn_status = my_tcp_syn()) + { + if (tcp_syn_status == 2) + { + break; + } + else if (tcp_syn_status < 0) + { + my_diag(tcp_syn_status); + log_status = my_log(); + if (log_status == 1) + { + my_msg(); + } + } + } + log_status = my_log(); + my_msg(); + my_fin(); + } + else if (dns_status == 1) + { + my_diag(check_params_status); + log_status = my_log(); + if (log_status == 0) + { + my_fin(); + } + else if (log_status == 1) + { + my_msg(); + my_fin(); + } + } + break; + default: + my_diag(check_params_status); + log_status = my_log(); + if (log_status == 0) + { + my_fin(); + } + else if (log_status == 1) + { + my_msg(); + my_fin(); + } + break; + } + return 0; +}