BiggieJozin

Untitled

Jan 21st, 2023
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.47 KB | None | 0 0
  1. #include <security/pam_appl.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include <stdarg.h>
  6. #include <pid.h>
  7.  
  8. #include <pwd.h>
  9. #include <string.h>
  10. #include <err.h>
  11. #include <paths.h>
  12.  
  13. #include "main.h"
  14.  
  15.  
  16. //appdata_ptr is the data we passed to the pam conv struct
  17. /*
  18. struct pam_message {
  19. int msg_style;
  20. const char *msg;
  21. }
  22.  
  23. struct pam_response {
  24. char *resp;
  25. int resp_retcode
  26. }
  27. */
  28. static pam_handle_t *pam_handle;
  29.  
  30. static int conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr){
  31. if(num_msg != 1)
  32. return PAM_BUF_ERR;
  33.  
  34. char *user = strdup(((char **)appdata_ptr)[0]);
  35. char *pass = strdup(((char **)appdata_ptr)[1]);
  36.  
  37. int result = PAM_SUCCESS;
  38.  
  39. *resp = malloc(sizeof(struct pam_response));
  40.  
  41. switch(msg[0]->msg_style) {
  42. case PAM_PROMPT_ECHO_ON:
  43. printf("Unhandled PAM_PROMPT_ECHO_ON in conv\n");
  44. break;
  45. case PAM_PROMPT_ECHO_OFF:
  46. (*resp)[0].resp = pass;
  47. break;
  48. case PAM_ERROR_MSG:
  49. printf("Handle PAM_ERROR_MSG in conv\n");
  50. break;
  51. case PAM_TEXT_INFO:
  52. printf("Unhandled PAM_TEXT_INFO in conv\n");
  53. break;
  54. }
  55.  
  56. return result;
  57. }
  58.  
  59. static void set_env(char *name, char *value) {
  60. // The `+ 2` is for the '=' and the null byte
  61. size_t name_value_len = strlen(name) + strlen(value) + 2;
  62. char *name_value = malloc(name_value_len);
  63. snprintf(name_value, name_value_len, "%s=%s", name, value);
  64. pam_putenv(pam_handle, name_value);
  65. free(name_value);
  66. }
  67.  
  68.  
  69. static void init_env(struct passwd *pw) {
  70. set_env("HOME", pw->pw_dir);
  71. set_env("PWD", pw->pw_dir);
  72. set_env("SHELL", pw->pw_shell);
  73. set_env("USER", pw->pw_name);
  74. set_env("LOGNAME", pw->pw_name);
  75. set_env("PATH", "/usr/local/sbin:/usr/local/bin:/usr/bin");
  76. set_env("MAIL", _PATH_MAILDIR);
  77.  
  78. /* size_t xauthority_len = strlen(pw->pw_dir) + strlen("/.Xauthority") + 1;
  79. char *xauthority = malloc(xauthority_len);
  80. snprintf(xauthority, xauthority_len, "%s/.Xauthority", pw->pw_dir);
  81. set_env("XAUTHORITY", xauthority);
  82. free(xauthority);
  83. */
  84. }
  85.  
  86.  
  87. void login(const char *user, const char *pass){
  88. const char *service_name = "login";
  89.  
  90. const char *data[2] = {user, pass};
  91. const struct pam_conv pam_conversation = {
  92. conv, data
  93. };
  94.  
  95. int status;
  96.  
  97. status = pam_start(service_name, user, &pam_conversation, &pam_handle);
  98. handle_pam_status(status);
  99.  
  100. status = pam_authenticate(pam_handle, 0);
  101. handle_pam_status(status);
  102.  
  103. status = pam_acct_mgmt(pam_handle, 0);
  104. handle_pam_status(status);
  105.  
  106. status = pam_setcred(pam_handle, PAM_ESTABLISH_CRED);
  107. handle_pam_status(status);
  108.  
  109. status = pam_open_session(pam_handle, 0);
  110. handle_pam_status(status);
  111. if (status != PAM_SUCCESS)
  112. pam_setcred(pam_handle, PAM_DELETE_CRED);
  113.  
  114.  
  115. struct passwd *pw = getpwnam(user);
  116. init_env(pw);
  117.  
  118. /*pid_t child_pid = fork();
  119. if (*child_pid == 0) {
  120. chdir(pw->pw_dir);
  121. // We don't use ~/.xinitrc because we should already be in the users home directory
  122. char *cmd = "exec /bin/bash --login .xinitrc";
  123. execl(pw->pw_shell, pw->pw_shell, "-c", cmd, NULL);
  124. printf("Failed to start window manager");
  125. exit(1);
  126. }
  127. */
  128. }
  129.  
  130. /*int logout(pam_handle_t **pam_h){
  131. return pam_end(pam_h, pam_status);
  132. }
  133. */
  134.  
  135. int main(int argc, char **argv){
  136. const char *user = "root";
  137. const char *pass = "BMFnu6MhP.m3U";
  138. login(user,pass);
  139.  
  140. //signal(SIGTRAP, logout);
  141. return 0;
  142. }
  143.  
Add Comment
Please, Sign In to add comment