扫描slab找出被隐藏的task_struct或者随便别的什么

如果一个进程被隐藏了,如何把它检测出来?

这里给出一种100%可以检测成功的方法:
https://blog.csdn.net/bin_linux96/article/details/105889045

代码在那篇文章中已经给出了,我这里就不赘述了。

我在本文中所写的,是对上述文章的补充。

其实我们大可不必去扫描内存,我来解释一下这是为什么。

黑客的攻击对象,或者说所有的被攻击对象,95%以上甚至99%的都是小白用户,我说过不止一次,如果你拿任何黑客技术去挑战安全专家,那基本都是惨败,充其量势均力敌,然而大部分中招的用户都不是安全专家!

包括大型互联网公司在内的绝大多数公司的IT资源,在黑客眼里,基本都是裸奔!这绝不是危言耸听!在KPI大于天的大型公司,聚个餐,旅个游都要带着开着机的电脑,一脸疲惫的倦客,你指望他们会去关注安全??没出事都是侥幸心理,千万别耽误我上线!谁TM会在上线的组件里加哪怕100行代码去做一个可能万年不会触发的逻辑!谢天谢地!

这就是黑客的机会。技术的背后,99%的都是心理学!

扯的太多不好,毕竟大象无形,大道至简,我还是直接上代码吧,下面的代码可以99%找出被隐藏的进程,我采用的方法是扫描slab缓存,背后的假设是, 即便是被隐藏的进程,它也是通过正常的fork/vfork调用被创建的。

#include <linux/module.h>
#include <linux/kallsyms.h>

#define for_each_object(__p, __s, __addr, __objects) \
	for (__p = (__addr); __p < (__addr) + (__objects) * (__s)->size;\
			__p += (__s)->size)

void list_task(struct kmem_cache *s, struct page *page)
{
	void *addr;
	void *p;

	addr = page_address(page);
	for_each_object(p, s, addr, page->objects) {
		struct task_struct *p1 = (struct task_struct *)p;
		printk("##### %s   %d   \n", p1->comm, p1->pid);
	}
}

void list_cpu_partial(struct kmem_cache *s)
{
	struct page *page;
	void *addr;
	void *p;
	int cpu;

	for_each_possible_cpu(cpu) {
		struct kmem_cache_cpu *c = per_cpu_ptr(s->cpu_slab, cpu);

		page = c->partial;
		if (!page)
			continue;
		addr = page_address(page);
		for_each_object(p, s, addr, page->objects) {
			struct task_struct *p1 = (struct task_struct *)p;
			printk("cpu partial %s   %d   \n", p1->comm, p1->pid);
		}
	}


	for_each_possible_cpu(cpu) {
		struct kmem_cache_cpu *c = per_cpu_ptr(s->cpu_slab, cpu);
		void *addr;
		void *p;

		page = c->page;
		if (!page)
			continue;
		addr = page_address(page);
		for_each_object(p, s, addr, page->objects) {
			struct task_struct *p1 = (struct task_struct *)p;
			printk("cpu page %s   %d   \n", p1->comm, p1->pid);
		}
	}
}

static int __init listtask_init(void)
{
	//struct kmem_cache *s = (struct kmem_cache *)0xffff88003e041100;//(struct kmem_cache *)kallsyms_lookup_name("task_struct_cachep");
	struct kmem_cache *s = *(struct kmem_cache **)kallsyms_lookup_name("task_struct_cachep");

	struct page *page, *prev = NULL;
	struct task_struct *p;

	for_each_process(p) {
		// 在既有task页面的slub里找
		page = virt_to_page((void *)p);
		if (page != prev && page->objects != 32767) {
			list_task(s, page);
			prev = page;
		}
	}
	// 在新的freelist和partial里找。
	// 注意,有漏洞!如果被隐藏task是一个新的slub page的第一个obj,那么还是能逃过!!!
	list_cpu_partial(s);
	// ... 所以!这里我还漏了除了cpu slub之外的别的,刘着补充
	// 我实在是没有时间了,还要给安德森先生喂饭,还要给小小检查数学作业...
	// 我太忙了...
	return -1; // oneshot load!
}
module_init(listtask_init);
MODULE_LICENSE("GPL");

来来来,试一下。

用我前面的强力方法隐藏一个进程,摘链,然后…

[root@localhost test]# ps -e|grep loop
[root@localhost test]# echo $?
1
# 然而...
[root@localhost test]# insmod listt.ko
insmod: ERROR: could not insert module listt.ko: Operation not permitted
# 哈哈,哪里逃!
[root@localhost test]# dmesg |grep loop
[  811.582915] ##### loop_sleep   2842

所以,想要隐藏自己的进程,千万不要用slub分配task,也就是不要用fork的copy_process了,说白了就是不要在task_struct_cachep里分配task。所以,要用alloc_pages,或者,至少用kmalloc(8192, …)来混淆试听,详见:
https://blog.csdn.net/dog250/article/details/105939822

其实,我还是要说几句, 绝大部分的运维和网工基本都是靠日志,系统监控机制这种来检测系统,然而等到他们发现事情不对时,黑客早就得手溜之大吉咯。 我在跟朋友(本文引文的作者)聊天时说,港片里演的,警察总是刚到现场就收队…

如果警察盯着古惑仔们的一举一动,谁敢造次?

给经理网购一只¥18000的皮鞋,一条¥49899的西裤,送到经理家,货到付款!这属于社会工程学,但值得一试。


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

展开阅读全文

150讲轻松搞定Python网络爬虫

05-16
【为什么学爬虫?】        1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。   从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 【课程服务】 专属付费社群+每周三讨论会+1v1答疑
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值