Advertisement
Guest User

Untitled

a guest
Nov 17th, 2016
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.27 KB | None | 0 0
  1. /* A simple forking TCP Server
  2. */
  3.  
  4. #define _GNU_SOURCE   /* setresuid */
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <sys/wait.h>
  12. #include <netinet/in.h>
  13.  
  14. #include "libinetsec.h"
  15.  
  16. #define ANSI_COLOR_RED     "\x1b[31m"
  17. #define ANSI_COLOR_GREEN   "\x1b[32m"
  18. #define ANSI_COLOR_YELLOW  "\x1b[33m"
  19. #define ANSI_COLOR_BLUE    "\x1b[34m"
  20. #define ANSI_COLOR_MAGENTA "\x1b[35m"
  21. #define ANSI_COLOR_CYAN    "\x1b[36m"
  22. #define ANSI_COLOR_RESET   "\x1b[0m"
  23.  
  24. #define MAX_TRANSACTIONS 20
  25. #define MAX_ACCOUNTS 10
  26.  
  27. #define LOGFILE "./banking.log"
  28.  
  29. #define FORK
  30.  
  31. FILE *f;
  32. int newsockfd;
  33. char seed1[10],seed2[10];
  34. char *user, *pass;
  35. char msg[2048] = {0};
  36.  
  37.  
  38. void handle_sig(int signal)
  39. {
  40.     wait3(NULL, WNOHANG, NULL);
  41. }
  42.  
  43. void error(char *msg)
  44. {
  45.     perror(msg);
  46.     exit(1);
  47. }
  48.  
  49.  
  50. typedef struct {
  51.     char holder[32];
  52.     char *type;
  53. } account;
  54.  
  55. typedef struct {
  56.     char holder[32];
  57.     char *type;
  58.     char CARD_NUMBER[30];
  59.     char EXPIRATION_DATE[17];
  60. } CC;
  61.  
  62. typedef struct {
  63.     char holder[32];
  64.     char *type;
  65.     char IBAN[35];
  66.     char BIC[12];
  67. } BA;
  68.  
  69. typedef struct {
  70.     char receiver[32];
  71.     long amount;
  72.     char comment[47];
  73. } Transaction;
  74.  
  75.  
  76. Transaction* transactions[MAX_TRANSACTIONS] = {NULL};
  77. int transactions_used[MAX_TRANSACTIONS] = {0};
  78.  
  79. account* accounts[MAX_ACCOUNTS] = {NULL};
  80. int accounts_used[MAX_ACCOUNTS] = {0};
  81.  
  82. // Credit Card or Bank Account
  83. char *account_type[2] = { "CC", "BA" };
  84.  
  85.  
  86. void get_input( char* prompt, char* buffer, size_t size )
  87. {
  88.     printf("%s: ", prompt);
  89.     fgets(buffer, size, stdin);
  90.     size_t len = strlen(buffer)-1;
  91.     if (buffer[len] == '\n') {
  92.         buffer[len] = '\0';
  93.     }
  94. }
  95.  
  96.  
  97. int get_account_slot()
  98. {
  99.     for(int i = 0; i < MAX_ACCOUNTS; i++) {
  100.         if(!accounts_used[i]){
  101.             return i;
  102.         }
  103.     }
  104.     return -1;
  105. }
  106.  
  107.  
  108. void add_CC()
  109. {
  110.     int index = get_account_slot();
  111.     if( index != -1 ){
  112.         CC* cc = malloc(sizeof(CC));
  113.         cc->type = account_type[0];
  114.         get_input("Holder", cc->holder, sizeof(cc->holder));
  115.         get_input("Card Number", cc->CARD_NUMBER, sizeof(cc->CARD_NUMBER));
  116.         get_input("Expiration Date", cc->EXPIRATION_DATE, sizeof(cc->EXPIRATION_DATE));
  117.         accounts_used[index] = 1;
  118.         accounts[index] = (account*) cc;
  119.     }
  120. }
  121.  
  122.  
  123. void add_BA()
  124. {
  125.     int index = get_account_slot();
  126.     if( index != -1 ){
  127.         BA* ba = malloc(sizeof(BA));
  128.         ba->type = account_type[1];
  129.         get_input("Holder", ba->holder, sizeof(ba->holder));
  130.         get_input("IBAN", ba->IBAN, sizeof(ba->IBAN));
  131.         get_input("BIC", ba->BIC, sizeof(ba->BIC));
  132.         accounts_used[index] = 1;
  133.         accounts[index] = (account*) ba;
  134.     }
  135. }
  136.  
  137.  
  138. void del_account(unsigned int id)
  139. {
  140.     if( id < MAX_ACCOUNTS && accounts_used[id]) {
  141.         accounts_used[id] = 0;
  142.         free(accounts[id]);
  143.     }
  144. }
  145.  
  146. void list_accounts()
  147. {
  148.     for( int i=0; i < MAX_ACCOUNTS; i++) {
  149.         if( accounts_used[i]){
  150.             printf("%d: %-32s (%s)\n", i, accounts[i]->holder, accounts[i]->type);
  151.         }
  152.     }
  153. }
  154.  
  155. void show_account(unsigned int id)
  156. {
  157.     if( accounts[id] != NULL) {
  158.         if(accounts[id]->type == account_type[0]) {
  159.             CC* cc = (CC*) accounts[id];
  160.             printf("%s: %-32s %s %s\n", cc->type, cc->holder, cc->CARD_NUMBER, cc->EXPIRATION_DATE);
  161.         }
  162.         else {
  163.             BA* ba = (BA*) accounts[id];
  164.             printf("%s: %-32s %s %s\n", ba->type, ba->holder, ba->IBAN, ba->BIC);
  165.  
  166.         }
  167.     }
  168. }
  169.  
  170.  
  171. int get_transaction_slot()
  172. {
  173.     for(int i = 0; i < MAX_TRANSACTIONS; i++) {
  174.         if(!transactions_used[i]) {
  175.             return i;
  176.         }
  177.     }
  178.     return -1;
  179. }
  180.  
  181.  
  182. void list_transactions()
  183. {
  184.     for( int i=0; i < MAX_TRANSACTIONS; i++) {
  185.         if( transactions_used[i]) {
  186.             printf("%d: %-32s %20lu\n", i, transactions[i]->receiver, transactions[i]->amount);
  187.         }
  188.     }
  189. }
  190.  
  191.  
  192. void show_transaction(unsigned int id)
  193. {
  194.     if( id < MAX_TRANSACTIONS && transactions_used[id]) {
  195.         printf("%-32s %20lu %s\n", transactions[id]->receiver, transactions[id]->amount, transactions[id]->comment);
  196.     }
  197. }
  198.  
  199.  
  200. void del_transaction(unsigned int id)
  201. {
  202.     if( id < MAX_TRANSACTIONS && transactions_used[id]) {
  203.         transactions_used[id] = 0;
  204.         free(transactions[id]);
  205.     }
  206. }
  207.  
  208. void add_transaction()
  209. {
  210.     char amount_buffer[50];
  211.     int index = get_transaction_slot();
  212.     if( index != -1 ) {
  213.         Transaction* ta = malloc(sizeof(Transaction));
  214.         get_input("Receiver", ta->receiver, sizeof(ta->receiver));
  215.         get_input("Amount", amount_buffer, sizeof(amount_buffer));
  216.         sscanf(amount_buffer,"%lu", &ta->amount);
  217.         get_input("Comment", ta->comment, sizeof(ta->comment));
  218.         transactions_used[index] = 1;
  219.         transactions[index] = ta;
  220.     }
  221. }
  222.  
  223. void change_amount( unsigned int id )
  224. {
  225.     char amount_buffer[50];
  226.     if(transactions_used[id]) {
  227.         get_input("Amount", amount_buffer, sizeof(amount_buffer));
  228.         sscanf(amount_buffer,"%lu", &transactions[id]->amount);
  229.     }
  230. }
  231.  
  232. void print_usage()
  233. {
  234.     printf(ANSI_COLOR_YELLOW);
  235.     printf(".-------------------------------------------.\n");
  236.     printf("|  ?,h      help                            |\n");
  237.     printf("|  u        update username                 |\n");
  238.     printf("+----- Accounts ----------------------------+\n");
  239.     printf("|  A[C|B]   add [Credit Card|Bank Account]  |\n");
  240.     printf("|  L        list accounts                   |\n");
  241.     printf("|  D[id]    delete account by id            |\n");
  242.     printf("|  S[id]    show account by id              |\n");
  243.     printf("+----- Transactions ------------------------+\n");
  244.     printf("|  a        add transaction                 |\n");
  245.     printf("|  l        list transactions               |\n");
  246.     printf("|  d[id]    delete transaction by id        |\n");
  247.     printf("|  s[id]    show transaction by id          |\n");
  248.     printf("|  c[id]    change transaction              |\n");
  249.     printf("|  e        exit                            |\n");
  250.     printf("`-------------------------------------------´\n");
  251.     printf(ANSI_COLOR_RESET);
  252. }
  253.  
  254. void handle_banking(int sock, char* uname)
  255. {
  256.     byte canary1;
  257.     char username[128] = {0};
  258.     byte canary2;
  259.     int n;
  260.     int id = 0;
  261.     char cmd = '?';
  262.     int exit_flag = 0;
  263.  
  264.     init_canary(&canary1,seed1);
  265.     init_canary(&canary2,seed2);
  266.     strncat( username, uname, sizeof(username)-1 );
  267.  
  268.     dup2(sock, STDOUT_FILENO);
  269.     dup2(sock, STDERR_FILENO);
  270.     dup2(sock, STDIN_FILENO);
  271.     close(sock);
  272.     setbuf(stdout, NULL);
  273.     setbuf(stderr, NULL);
  274.  
  275.     printf( ANSI_COLOR_BLUE "Hello %s!\nWelcome to ROP Version 1.3.37\n" ANSI_COLOR_RESET, username);
  276.  
  277.     while(!exit_flag) {
  278.         printf("> ");
  279.  
  280.         n = read(STDIN_FILENO, msg, sizeof(msg)-1);
  281.         if (n < 0) {
  282.             error("error: reading from socket");
  283.             break;
  284.         }
  285.         if(n == 0) {
  286.             printf("Error: No more data!\n");
  287.             break;
  288.         }
  289.  
  290.         msg[n] = '\0';
  291.         sscanf(msg, "%c %d", &cmd, &id);
  292.         switch (cmd) {
  293.             case 'A':
  294.                 if(msg[1]=='C')
  295.                     add_CC();
  296.                 else if(msg[1]=='B')
  297.                     add_BA();
  298.                 else
  299.                     print_usage();
  300.                 break;
  301.             case 'L':
  302.                 list_accounts();
  303.                 break;
  304.             case 'D':
  305.                 del_account(id);
  306.                 break;
  307.             case 'S':
  308.                 show_account(id);
  309.                 break;
  310.             case 'a':
  311.                 add_transaction();
  312.                 break;
  313.             case 'l':
  314.                 list_transactions();
  315.                 break;
  316.             case 'd':
  317.                 del_transaction(id);
  318.                 break;
  319.             case 's':
  320.                 show_transaction(id);
  321.                 break;
  322.             case 'c':
  323.                 change_amount(id);
  324.                 break;
  325.             case 'u':
  326.                 memcpy( username, msg+2, n-2);
  327.                 break;
  328.             case 'e':
  329.                 printf("Goodbye!\n");
  330.                 exit_flag = 1;
  331.                 break;
  332.             case 'h':
  333.             case '?':
  334.             default:
  335.                 print_usage();
  336.                 break;
  337.         }
  338.     }
  339.  
  340.     for(n=0; n < MAX_TRANSACTIONS; n++) {
  341.         del_transaction(n);
  342.     }
  343.  
  344.     for(n=0; n < MAX_ACCOUNTS; n++) {
  345.         del_account(n);
  346.     }
  347.  
  348.  
  349.     if (!check_canary(&canary1,seed1) || !check_canary(&canary2,seed2)) {
  350.         fprintf(stderr, ANSI_COLOR_RED "STACK SMASHING DETECTED\n" ANSI_COLOR_RESET);
  351.         exit(0);   
  352.     }
  353.  
  354.     return;
  355. }
  356.  
  357.  
  358.  
  359. void handle_con(int sock)
  360. {
  361.     int n, uid, tuid;
  362.     size_t len;
  363.     char msg[128];
  364.  
  365.     char header[] = "  _____ _  _ ___   ___            _   \n\
  366. |_   _| || | __| | _ ) __ _ _ _ | |__\n\
  367.   | | | __ | _|  | _ \\/ _` | ' \\| / /\n\
  368.   |_| |_||_|___| |___/\\__,_|_||_|_\\_\\\n\
  369.   \n\
  370.   Remote Access Portal\n\nLogin: ";
  371.  
  372.     write(sock, header, sizeof(header));
  373.  
  374.     len = sizeof(msg);
  375.     memset(msg, 0, len);
  376.  
  377.     n = read(sock, msg, len - 1);
  378.     if (n < 0)
  379.         error("error: reading from socket");
  380.  
  381. #ifdef DEBUG
  382.     printf("%s\n", msg);
  383. #endif
  384.  
  385.     /* very simple authentication */
  386.     msg[10] = '\0';
  387.     msg[19] = '\0';
  388.  
  389. #ifdef DEBUG
  390.     printf("%s\n", msg);
  391.     printf("%s\n", msg+11);
  392.     printf("%s\n", msg+20);
  393. #endif
  394.  
  395.     /*
  396.      * login with your user id and the password in the challenge description
  397.      *  e.g.    "inetsec999:XXXXXXXX"
  398.      *
  399.      */
  400.     user = msg;
  401.  
  402.     /*
  403.      * you will find your password in your challenge description
  404.      *
  405.      * please check twice before sending us an email ;-)
  406.      *
  407.      */
  408.     pass = msg + 11;
  409.  
  410.     if ((uid = auth_user(user, pass)) != 0) {
  411.  
  412.         /* change to inetsec user on bandit */
  413.         printf("authenticated user %s with passwd %s: uid %i\n", user,pass, uid);
  414.         fprintf(f,"authenticated user %s with passwd %s: uid %i\n",user,pass, uid);
  415.  
  416.         tuid = uid;
  417.         if (setresuid(tuid, tuid, tuid) < 0) {
  418.             printf("error: setting permissions\n");
  419.             fprintf(f, "error: setting permissions\n");
  420.             error("error: setting permissions");
  421.         }
  422.  
  423.         strncpy(seed1, user, 10);
  424.         strncpy(seed2, pass, 10);
  425.  
  426.         handle_banking(sock, user);
  427.  
  428.     }  
  429.     else {
  430.         printf("user: \"%s\", passwd: \"%s\" Access denied\n",user,pass);
  431.         fprintf(f,"user: \"%s\", passwd: \"%s\" Access denied\n",user,pass);
  432.         fflush(f);
  433.     }
  434. }
  435.  
  436.  
  437.  
  438. int main(int argc, char *argv[])
  439. {
  440. #ifdef FORK
  441.     int pid;
  442. #endif
  443.  
  444.     unsigned int clilen;
  445.     int sockfd, portno, on;
  446.     struct sockaddr_in serv_addr, cli_addr;
  447.  
  448.     f=fopen( LOGFILE ,"a");
  449.  
  450.     signal(SIGCHLD, handle_sig);
  451.  
  452.     if (argc < 2) {
  453.         fprintf(stderr,"error: no port provided\n");
  454.         exit(1);
  455.     }
  456.  
  457.     sockfd = socket(AF_INET, SOCK_STREAM, 0);
  458.  
  459.     if (sockfd < 0)
  460.         error("error: opening socket");
  461.  
  462.     on = 1;
  463.     if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
  464.         error("error: set socket option");
  465.  
  466.     memset((char *) &serv_addr, 0, sizeof(serv_addr));
  467.     portno = atoi(argv[1]);
  468.     serv_addr.sin_family = AF_INET;
  469.     serv_addr.sin_addr.s_addr = INADDR_ANY;
  470.     serv_addr.sin_port = htons(portno);
  471.  
  472.     if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
  473.         error("error: bind");
  474.  
  475.     listen(sockfd,5);
  476.     clilen = sizeof(cli_addr);
  477.  
  478.     while (1) {
  479.  
  480.         //printf("server: Listening to incoming connections...\n\n");
  481.  
  482.         newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
  483.  
  484.         if (newsockfd < 0)
  485.             error("error: accept");
  486.  
  487. #ifdef FORK
  488.         pid = fork();
  489.  
  490.         if (pid < 0)
  491.             error("error: fork");
  492.  
  493.         if (pid == 0)  {
  494.             close(sockfd);
  495. #endif
  496.  
  497.  
  498.             /* drop privileges */
  499.             handle_con(newsockfd);
  500. #ifdef FORK
  501.             exit(0);
  502.         }
  503.         else
  504.             close(newsockfd);
  505. #endif
  506.  
  507.  
  508.     }
  509.  
  510.     return 0; /* we never get here */
  511.  
  512. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement