Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.28 KB | None | 0 0
  1. #define _GNU_SOURCE /* getresgid() */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/socket.h> /* socket() */
  5. #include <netinet/in.h> /* struct sockaddr_in */
  6. #include <arpa/inet.h> /* inet_ntop() */
  7. #include <unistd.h> /* close() */
  8. #include <string.h>
  9. #include <errno.h>
  10. #include <sys/types.h>
  11.  
  12.  
  13. int main(int argc, char** argv) {
  14.  
  15. /* Deskryptory dla gniazda nasluchujacego i polaczonego: */
  16. int listenfd, connfd, retval;
  17.  
  18. /* Gniazdowe struktury adresowe (dla klienta i serwera): */
  19. struct sockaddr_in client_addr, server_addr;
  20.  
  21. /* Rozmiar struktur w bajtach: */
  22. socklen_t client_addr_len, server_addr_len;
  23.  
  24. /* Bufor dla adresu IP klienta w postaci kropkowo-dziesietnej: */
  25. char addr_buff[256];
  26.  
  27. unsigned int port_number;
  28.  
  29. uid_t ruid, euid, suid; /* Identyfikatory uzytkownika. */
  30.  
  31. //MY CODE
  32. uid_t argument;
  33.  
  34. if (argc != 3) {
  35. fprintf(stderr, "Invocation: %s <PORT> <ID>\n", argv[0]);
  36. exit(EXIT_FAILURE);
  37. }
  38.  
  39. port_number = atoi(argv[1]);
  40. argument = (uid_t)atoi(argv[2]);
  41. /*
  42. * Tylko programy uruchamione przez roota lub z ustawionym bitem SUID moga
  43. * powiazac gniazdo z numerem portu < 1024.
  44. */
  45. if (port_number < 1024) {
  46. if (geteuid() != 0) {
  47. fprintf(stderr, "You need root privileges to "
  48. "bind to well-known port (<1024).\n");
  49. exit(EXIT_FAILURE);
  50. }
  51. }
  52.  
  53. /* Utworzenie gniazda dla protokolu TCP: */
  54. listenfd = socket(PF_INET, SOCK_STREAM, 0);
  55. if (listenfd == -1) {
  56. perror("socket()");
  57. exit(EXIT_FAILURE);
  58. }
  59.  
  60. /* Wyzerowanie struktury adresowej serwera: */
  61. memset(&server_addr, 0, sizeof(server_addr));
  62. /* Domena komunikacyjna (rodzina protokolow): */
  63. server_addr.sin_family = AF_INET;
  64. /* Adres nieokreslony (ang. wildcard address): */
  65. server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  66. /* Numer portu: */
  67. server_addr.sin_port = htons(port_number);
  68. /* Rozmiar struktury adresowej serwera w bajtach: */
  69. server_addr_len = sizeof(server_addr);
  70.  
  71.  
  72.  
  73. /* Pobranie identyfikatorow uzytkownika (real, effective, save set). */
  74. if (getresuid(&ruid, &euid, &suid) == -1) {
  75. perror("getresgid()");
  76. exit(EXIT_FAILURE);
  77. }
  78.  
  79. fprintf(stdout, "PRZED ZMIANA: UID: %u, EUID: %u, SUID: %u\n", ruid, euid, suid);
  80.  
  81.  
  82.  
  83. fprintf(stdout, "Binding to port %u...\n", port_number);
  84. /* Powiazanie "nazwy" (adresu IP i numeru portu) z gniazdem: */
  85. if (bind(listenfd, (struct sockaddr*) &server_addr, server_addr_len) == -1) {
  86. perror("bind()");
  87. exit(EXIT_FAILURE);
  88. }
  89. //MYCODE
  90. if (setresuid(argument, argument, argument) == -1) {
  91. perror("setresuid()");
  92. exit(EXIT_FAILURE);
  93. }
  94. if (getresuid(&ruid, &euid, &suid) == -1) {
  95. perror("getresgid()");
  96. exit(EXIT_FAILURE);
  97. }
  98.  
  99. fprintf(stdout, "PO ZMIANIE: UID: %u, EUID: %u, SUID: %u\n", ruid, euid, suid);
  100.  
  101. /* Program powinien wykonywac sie dalej z EUID != 0 i saved set-user-ID != 0. */
  102. if (euid == 0 || suid == 0) {
  103. fprintf(stderr, "Run server as unprivileged user!\n");
  104. exit(EXIT_FAILURE);
  105. }
  106.  
  107. /* Przeksztalcenie gniazda w gniazdo nasluchujace: */
  108. if (listen(listenfd, 2) == -1) {
  109. perror("listen()");
  110. exit(EXIT_FAILURE);
  111. }
  112.  
  113. fprintf(stdout, "Server is listening for incoming connection...\n");
  114.  
  115. /* Funkcja pobiera polaczenie z kolejki polaczen oczekujacych na zaakceptowanie
  116. * i zwraca deskryptor dla gniazda polaczonego: */
  117. client_addr_len = sizeof(client_addr);
  118. connfd = accept(listenfd, (struct sockaddr*)&client_addr, &client_addr_len);
  119. if (connfd == -1) {
  120. perror("accept()");
  121. exit(EXIT_FAILURE);
  122. }
  123.  
  124. fprintf(
  125. stdout, "TCP connection accepted from %s:%d\n",
  126. inet_ntop(AF_INET, &client_addr.sin_addr, addr_buff, sizeof(addr_buff)),
  127. ntohs(client_addr.sin_port)
  128. );
  129.  
  130. sleep(5);
  131.  
  132. fprintf(stdout, "Closing connected socket (sending FIN to client)...\n");
  133. close(connfd);
  134.  
  135. close(listenfd);
  136.  
  137. exit(EXIT_SUCCESS);
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement