From e261c60b3490989c6a0e65af3423b2b796cbb49f Mon Sep 17 00:00:00 2001 From: miha-q <> Date: Mon, 14 Aug 2023 14:01:18 -0400 Subject: [PATCH] Mon Aug 14 02:01:18 PM EDT 2023 --- src/pam | Bin 0 -> 16400 bytes src/pam.c | 60 ++++++++++++++++++++++++++++++++++------------------ src/test | Bin 0 -> 16296 bytes src/test.c | 24 +++++++++++++++++++++ src/test2.c | 51 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 115 insertions(+), 20 deletions(-) create mode 100755 src/pam create mode 100755 src/test create mode 100644 src/test.c create mode 100644 src/test2.c diff --git a/src/pam b/src/pam new file mode 100755 index 0000000000000000000000000000000000000000..b603d34b2cba696fe62022fba662d12389376baa GIT binary patch literal 16400 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 C%o>FN literal 0 HcmV?d00001 diff --git a/src/pam.c b/src/pam.c index 736efc6..aa39d17 100644 --- a/src/pam.c +++ b/src/pam.c @@ -8,35 +8,55 @@ #include #include #include +#include +#include +#include +#include + +static int pamconv(int num_msg, const struct pam_message **msg, + struct pam_response **resp, void *appdata_ptr) +{ + char *pass = malloc(strlen(appdata_ptr)+1); + strcpy(pass, appdata_ptr); + + int i; -static int pam_conv_func(int num_msg, const struct pam_message **msg, - struct pam_response **resp, void *appdata_ptr) { - *resp = (struct pam_response *)malloc(num_msg * sizeof(struct pam_response)); - for (int i = 0; i < num_msg; i++) { - resp[i]->resp = strdup((char *)appdata_ptr); - resp[i]->resp_retcode = 0; + *resp = calloc(num_msg, sizeof(struct pam_response)); + + for (i = 0; i < num_msg; ++i) + { + /* Ignore all PAM messages except prompting for hidden input */ + if (msg[i]->msg_style != PAM_PROMPT_ECHO_OFF) + continue; + + /* Assume PAM is only prompting for the password as hidden input */ + resp[i]->resp = pass; } + return PAM_SUCCESS; } -uint8_t pam(uint8_t* username, uint8_t* password) +bool checkAuthentication(const char *user, const char *pass) { - struct passwd *p; - p = getpwuid(geteuid()); - if (p == NULL) return 0; - if (username == NULL) username = p->pw_name; + /* use own PAM conversation function just responding with the + password passed here */ + struct pam_conv conv = { &pamconv, (void *)pass }; - pam_handle_t *pamh = NULL; - struct pam_conv conv = { pam_conv_func, NULL }; + pam_handle_t *handle; + int authResult; - conv.appdata_ptr = (void*)password; + pam_start("shutterd", user, &conv, &handle); + authResult = pam_authenticate(handle, + PAM_SILENT|PAM_DISALLOW_NULL_AUTHTOK); + pam_end(handle, authResult); + + return (authResult == PAM_SUCCESS); +} - int retval = pam_start("login", username, &conv, &pamh); - if (retval == PAM_SUCCESS) - retval = pam_authenticate(pamh, 0); +void main() +{ + printf("%i\n", checkAuthentication("home", "jasopoint")); - if (pamh) pam_end(pamh, retval); - return retval == PAM_SUCCESS; } -#endif \ No newline at end of file +#endif diff --git a/src/test b/src/test new file mode 100755 index 0000000000000000000000000000000000000000..289a101b78a6a1afcfeba6b6b82cff98eca47df4 GIT binary patch literal 16296 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 +#include +#include +#include +#include +#include +#include + +uint8_t authenticate(const char *username, const char* password) +{ + struct spwd* pw; + pw = getspnam(username); + if (!pw) + { + fprintf(stderr, "authenticate(): Permission denied.\n"); + return 0; + } + const char* hashedPassword = crypt(password, pw->sp_pwdp); + return strcmp(hashedPassword, pw->sp_pwdp) == 0; +} + +void main() +{ +} diff --git a/src/test2.c b/src/test2.c new file mode 100644 index 0000000..8d04889 --- /dev/null +++ b/src/test2.c @@ -0,0 +1,51 @@ + +uint8_t authenticate(const char *username, const char* password) { + struct spwd spw; + struct spwd *result; + char *buf; + size_t bufsize; + int s; + + bufsize = sysconf(_SC_GETPW_R_SIZE_MAX); + if (bufsize == -1) { + bufsize = 16384; // use a default size if sysconf returns indeterminate size + } + + buf = malloc(bufsize); + if (buf == NULL) { + perror("malloc"); + exit(EXIT_FAILURE); + } + + s = getspnam_r(username, &spw, buf, bufsize, &result); + if (result == NULL) { + if (s == 0) { + fprintf(stderr, "User not found\n"); + } else { + perror("getspnam_r"); + } + free(buf); + return 0; + } + + const char *hashedPassword = crypt(password, spw.sp_pwdp); + + int status = strcmp(hashedPassword, spw.sp_pwdp) == 0; + free(buf); + return status; +} + +int main(int argc, char **argv) { + if (argc != 3) { + printf("Usage: %s \n", argv[0]); + return 1; + } + + if (authenticate(argv[1], argv[2])) { + printf("Authenticated!\n"); + } else { + printf("Authentication failed.\n"); + } + + return 0; +} -- 2.39.5