From b2684cb5033317daaf6168e36042eb1e5a38a7a2 Mon Sep 17 00:00:00 2001 From: Ugo Cirmignani Date: Sun, 30 Dec 2018 17:07:53 +0100 Subject: [PATCH] Adding PAM auth method --- Makefile | 14 +++- build/modules/ftpCommandElaborate.o | Bin 71504 -> 72112 bytes build/modules/ftpServer.o | Bin 58064 -> 57808 bytes build/uFTP | Bin 204480 -> 213280 bytes ftpCommandElaborate.c | 16 ++++ ftpServer.c | 2 +- library/auth.c | 113 ++++++++++++++++++++++++++++ library/auth.h | 16 ++++ uFTP.c | 3 + 9 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 library/auth.c create mode 100644 library/auth.h diff --git a/Makefile b/Makefile index 5e715b9..2884605 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,10 @@ ENABLE_LARGE_FILE_SUPPORT=-D LARGE_FILE_SUPPORT_ENABLED -D _LARGEFILE64_SOURCE ENABLE_OPENSSL_SUPPORT= #TO ENABLE OPENSSL SUPPORT UNCOMMENT NEXT 2 LINES ENABLE_OPENSSL_SUPPORT=-D OPENSSL_ENABLED -LIBS=-lpthread -lssl -lcrypto +LIBS=-lpthread -lssl -lcrypto -lpam + +#USER PAM AUTH +#-lpam CFLAGS=$(CFLAGSTEMP) $(ENABLE_LARGE_FILE_SUPPORT) $(ENABLE_OPENSSL_SUPPORT) @@ -36,17 +39,20 @@ start: end: @echo Build process end -uFTP: uFTP.c fileManagement.o configRead.o logFunctions.o ftpCommandElaborate.o ftpData.o ftpServer.o daemon.o signals.o connection.o openSsl.o dynamicMemory.o errorHandling.o - @$(CC) $(ENABLE_LARGE_FILE_SUPPORT) $(ENABLE_OPENSSL_SUPPORT) uFTP.c $(LIBPATH)dynamicVectors.o $(LIBPATH)fileManagement.o $(LIBPATH)configRead.o $(LIBPATH)logFunctions.o $(LIBPATH)ftpCommandElaborate.o $(LIBPATH)ftpData.o $(LIBPATH)ftpServer.o $(LIBPATH)daemon.o $(LIBPATH)signals.o $(LIBPATH)connection.o $(LIBPATH)openSsl.o $(LIBPATH)dynamicMemory.o $(LIBPATH)errorHandling.o -o $(OUTPATH)uFTP $(LIBS) +uFTP: uFTP.c fileManagement.o configRead.o logFunctions.o ftpCommandElaborate.o ftpData.o ftpServer.o daemon.o signals.o connection.o openSsl.o dynamicMemory.o errorHandling.o auth.o + @$(CC) $(ENABLE_LARGE_FILE_SUPPORT) $(ENABLE_OPENSSL_SUPPORT) uFTP.c $(LIBPATH)dynamicVectors.o $(LIBPATH)fileManagement.o $(LIBPATH)configRead.o $(LIBPATH)logFunctions.o $(LIBPATH)ftpCommandElaborate.o $(LIBPATH)ftpData.o $(LIBPATH)ftpServer.o $(LIBPATH)daemon.o $(LIBPATH)signals.o $(LIBPATH)connection.o $(LIBPATH)openSsl.o $(LIBPATH)dynamicMemory.o $(LIBPATH)errorHandling.o $(LIBPATH)auth.o -o $(OUTPATH)uFTP $(LIBS) daemon.o: @$(CC) $(CFLAGS) $(SOURCE_MODULES_PATH)daemon.c -o $(LIBPATH)daemon.o dynamicVectors.o: @$(CC) $(CFLAGS) $(SOURCE_MODULES_PATH)dynamicVectors.c -o $(LIBPATH)dynamicVectors.o - + openSsl.o: @$(CC) $(CFLAGS) $(SOURCE_MODULES_PATH)openSsl.c -o $(LIBPATH)openSsl.o + +auth.o: + @$(CC) $(CFLAGS) $(SOURCE_MODULES_PATH)auth.c -o $(LIBPATH)auth.o configRead.o: dynamicVectors.o fileManagement.o @$(CC) $(CFLAGS) $(SOURCE_MODULES_PATH)configRead.c -o $(LIBPATH)configRead.o diff --git a/build/modules/ftpCommandElaborate.o b/build/modules/ftpCommandElaborate.o index e065215fc30d82c852d0073b098e70cbe2b6a4cf..1ce033c2b3a8cb3db74c259d93887e8454b56310 100644 GIT binary patch delta 14403 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 diff --git a/build/uFTP b/build/uFTP index d2bd8fdf00d9ee2c405ca93ec61dee48c3f5cbf0..3ab8ee4acc9241bf4f66e1ddb160c3a19fb325b3 100755 GIT binary patch delta 50169 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%0Dd5{}e}&6-UL*pW<+G@u+wT%GXE5`@pv=6WwOu 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 DN%NIj diff --git a/ftpCommandElaborate.c b/ftpCommandElaborate.c index af51e2b..5301473 100644 --- a/ftpCommandElaborate.c +++ b/ftpCommandElaborate.c @@ -42,6 +42,7 @@ #include "library/openSsl.h" #include "library/connection.h" #include "library/dynamicMemory.h" +#include "library/auth.h" #include "ftpCommandsElaborate.h" @@ -155,6 +156,21 @@ int parseCommandPass(ftpDataType * data, int socketId) if (strlen(thePass) >= 1) { + + printf("\nLogin try with user %s, password %s", data->clients[socketId].login.name.text, thePass); + + //PAM AUTH METHOD + loginCheck( data->clients[socketId].login.name.text, thePass, &data->clients[socketId].login, &data->clients[socketId].memoryTable); + if (data->clients[socketId].login.userLoggedIn == 1) + { + printf("\n User logged with PAM ok!"); + returnCode = socketPrintf(data, socketId, "s", "230 Login Ok.\r\n"); + if (returnCode <= 0) + return FTP_COMMAND_PROCESSED_WRITE_ERROR; + } + + + int searchUserNameIndex; searchUserNameIndex = searchUser(data->clients[socketId].login.name.text, &data->ftpParameters.usersVector); diff --git a/ftpServer.c b/ftpServer.c index 953de5e..0ccc732 100644 --- a/ftpServer.c +++ b/ftpServer.c @@ -565,7 +565,7 @@ void runFtpServer(void) if ( ((int)time(NULL) - ftpData.clients[processingSock].tlsNegotiatingTimeStart) > TLS_NEGOTIATING_TIMEOUT ) { ftpData.clients[processingSock].closeTheClient = 1; - printf("\nTLS timeout closing the client time:%lld, start time: %lld..", (int)time(NULL), ftpData.clients[processingSock].tlsNegotiatingTimeStart); + //printf("\nTLS timeout closing the client time:%lld, start time: %lld..", (int)time(NULL), ftpData.clients[processingSock].tlsNegotiatingTimeStart); } } diff --git a/library/auth.c b/library/auth.c new file mode 100644 index 0000000..0973187 --- /dev/null +++ b/library/auth.c @@ -0,0 +1,113 @@ +/* + * auth.c + * + * Created on: 30 dic 2018 + * Author: ugo + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "auth.h" +#include "ftpData.h" + +struct pam_response *reply; + +// //function used to get user input +int function_conversation(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) +{ + *resp = reply; + return PAM_SUCCESS; +} + +int authenticateSystem(const char *username, const char *password) +{ + const struct pam_conv local_conversation = { function_conversation, NULL }; + pam_handle_t *local_auth_handle = NULL; // this gets set by pam_start + + int retval; + retval = pam_start("su", username, &local_conversation, &local_auth_handle); + + if (retval != PAM_SUCCESS) + { + printf("pam_start returned: %d\n ", retval); + return 0; + } + + reply = (struct pam_response *)malloc(sizeof(struct pam_response)); + reply[0].resp = strdup(password); + reply[0].resp_retcode = 0; + retval = pam_authenticate(local_auth_handle, 0); + + if (retval != PAM_SUCCESS) + { + if (retval == PAM_AUTH_ERR) + { + printf("Authentication failure.\n"); + } + else + { + printf("pam_authenticate returned %d\n", retval); + } + return 0; + } + + retval = pam_end(local_auth_handle, retval); + + if (retval != PAM_SUCCESS) + { + printf("pam_end returned\n"); + return 0; + } + + return 1; +} + + +void loginCheck(char *name, char *password, loginDataType *login, DYNMEM_MemoryTable_DataType **memoryTable) +{ + if (authenticateSystem(name, password) == 1) + { + struct passwd *pass; + pass = getpwnam(name); + + if (pass == NULL) + { + cleanLoginData(login, 0, &*memoryTable); + } + else + { + //printf("Authenticate with %s - %s through system\n", login, password); + setDynamicStringDataType(&login->name, name, strlen(name), &*memoryTable); + setDynamicStringDataType(&login->homePath, pass->pw_dir, strlen(pass->pw_dir), &*memoryTable); + setDynamicStringDataType(&login->absolutePath, pass->pw_dir, strlen(pass->pw_dir), &*memoryTable); + setDynamicStringDataType(&login->ftpPath, "/", strlen("/"), &*memoryTable); + + login->ownerShip.uid = pass->pw_gid; + login->ownerShip.gid = pass->pw_uid; + login->ownerShip.ownerShipSet = 1; + login->userLoggedIn = 1; + + printf("\nLogin as: %s", pass->pw_name); + printf("\nPasswd: %s", pass->pw_passwd); + printf("\nDir: %s", pass->pw_dir); + printf("\nGid: %d", pass->pw_gid); + printf("\nUid: %d", pass->pw_uid); + } + } + else + { + cleanLoginData(login, 0, &*memoryTable); + } +} + + + + + + diff --git a/library/auth.h b/library/auth.h new file mode 100644 index 0000000..9ec2f98 --- /dev/null +++ b/library/auth.h @@ -0,0 +1,16 @@ +/* + * auth.h + * + * Created on: 30 dic 2018 + * Author: ugo + */ + +#ifndef LIBRARY_AUTH_H_ +#define LIBRARY_AUTH_H_ + +#include "ftpData.h" + +void loginCheck(char *name, char *password, loginDataType *login, DYNMEM_MemoryTable_DataType **memoryTable); +int authenticateSystem(const char *username, const char *password); + +#endif /* LIBRARY_AUTH_H_ */ diff --git a/uFTP.c b/uFTP.c index d8fa2e5..bcaa03a 100644 --- a/uFTP.c +++ b/uFTP.c @@ -24,10 +24,13 @@ #include #include + + #include "ftpServer.h" int main(int argc, char** argv) { + runFtpServer(); return (EXIT_SUCCESS); }