自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux進(jìn)程隱藏的一種實(shí)現(xiàn)思路

系統(tǒng) Linux
Linux 操作系統(tǒng)天生自帶一個(gè)虛擬分區(qū) /proc,該分區(qū)下保存硬件信息、內(nèi)核運(yùn)行參數(shù)、系統(tǒng)狀態(tài)信息等等,進(jìn)程運(yùn)行時(shí)的一些信息自然也就存在這個(gè)分區(qū)下。

 前言

[[174515]]

之前團(tuán)隊(duì)內(nèi)技術(shù)交流時(shí)小伙伴分享的自建蜜罐深深的引起了我的興趣,于是本人決定山寨一個(gè)類似的蜜罐把玩一番~但是擺在眼前的一個(gè)問題就是:

一些監(jiān)控進(jìn)程需要運(yùn)行在蜜罐中,一但“請(qǐng)君入罐”后被黑客察覺到這些奇奇怪怪的進(jìn)程,就十分尷尬了

所以當(dāng)務(wù)之急是需要將這些監(jiān)控進(jìn)程隱藏起來,對(duì)Linux略知一二的樓主自然也就接受挑戰(zhàn)啦。

準(zhǔn)備工作

眾所周知,Linux 操作系統(tǒng)天生自帶一個(gè)虛擬分區(qū) /proc,該分區(qū)下保存硬件信息、內(nèi)核運(yùn)行參數(shù)、系統(tǒng)狀態(tài)信息等等,進(jìn)程運(yùn)行時(shí)的一些信息自然也就存在這個(gè)分區(qū)下。

如上圖所示,系統(tǒng)里運(yùn)行的每一個(gè)進(jìn)程都會(huì)在 /proc 分區(qū)下新建一個(gè)以自己 pid 命名的目錄,并將本進(jìn)程的參數(shù)存到該目錄下。在該目錄下我們可以通過修改 cgroup 文件暴力的將進(jìn)程綁定在某個(gè) CPU 上,也可以通過修改 cpuset 文件來優(yōu)化進(jìn)程在 NUMA 架構(gòu)系統(tǒng)上的運(yùn)行效率,還可以通過修改 oom_adj 文件讓系統(tǒng) OOM 機(jī)制永遠(yuǎn)高抬貴手。而 ps、top 這類查看進(jìn)程的命令恰恰也就是在 /proc 分區(qū)下收集信息。換句話說,如果讓 ps、top 命令選擇性失明,也就能達(dá)到我們隱藏進(jìn)程的目的了。

初次嘗試

網(wǎng)上關(guān)于 Linux 隱藏進(jìn)程的方式有很多,比如:

1)強(qiáng)行將進(jìn)程 pid 變?yōu)?0,這種方法存在破綻因此不予考慮。

2)還有一種簡(jiǎn)單的方法:系統(tǒng)啟動(dòng)時(shí)會(huì)依據(jù) /etc/fstab 文件內(nèi)容來掛載分區(qū),在 proc 分區(qū)掛載參數(shù)中加入 hidepid=2 參數(shù)后,登陸系統(tǒng)的用戶只能查看到當(dāng)前用戶啟動(dòng)的進(jìn)程的信息。也就是說, tomcat 用戶只能看到屬于 tomcat 用戶進(jìn)程的信息。

這種方法也存在弊端,罐中的黑客只能看到有限的進(jìn)程信息,可能就會(huì)產(chǎn)生會(huì)懷疑。而且如果再存在個(gè)最近流行的 tomcat 提權(quán)漏洞,那罐子的身份就會(huì)瞬間露餡。所以這種方式也不合適,究竟如何才能將我們的問題解決在系統(tǒng)最底層呢?

“肝”起來

對(duì)于 Linux 系統(tǒng)來說有著得天獨(dú)厚的優(yōu)勢(shì),我們可以從內(nèi)核解決一切問題。可是樓主的 C語言 實(shí)在是捉急,不由得又開始在互聯(lián)網(wǎng)上尋找巨人的肩膀。一篇相關(guān)的干貨貼引起了我的注意 http://blog.csdn.net/billpig/article/details/6038330(文末有引用說明),這位作者的思路很明確,在內(nèi)核中新增兩個(gè)信號(hào),當(dāng)進(jìn)程向內(nèi)核發(fā)出 hide 信號(hào)時(shí),內(nèi)核將不會(huì)為該進(jìn)程在 /proc 目錄下生成對(duì)應(yīng)的目錄,從而也就從底層鏟除了進(jìn)程的信息,即使黑客獲得了 root 權(quán)限也無法通過常規(guī)手段察覺到蛛絲馬跡。除此之外,新增的unhide信號(hào)作用恰好與 hide 信號(hào)相反。

通過查閱 crux 官方文檔發(fā)現(xiàn),Demo 中使用的內(nèi)核版本為 2.6.15。在include/asm-i386/unistd.h 文件中定義新信號(hào) 294 和 295。

系統(tǒng)在接收到我們新定義的 294 和 295 兩個(gè)信號(hào)之后需要調(diào)用對(duì)應(yīng)的函數(shù)來做出相應(yīng)的動(dòng)作。在 kernel/sys.c 中我們實(shí)現(xiàn) 294 和 295 信號(hào)調(diào)用的函數(shù)。如下圖所示,sys_hide 和 sys_unhide 兩個(gè)函數(shù)主要功能是修改進(jìn)程 hide 變量的值。

proc 相關(guān)內(nèi)核代碼位于 fs/proc/base.c 中,在進(jìn)程相關(guān)結(jié)構(gòu)體中新聲明變量hide,通過發(fā)送信號(hào)來修改 hide 的值,最后在 base.c 文件 proc_pid_readdir 函數(shù)中將 hide 變量的值作為進(jìn)程是否在 proc 文件系統(tǒng)中體現(xiàn)的依據(jù)。

除此之外還有些零碎的步驟,查看上文中的原帖地址即可,不再贅述。

踩坑

新內(nèi)核編譯完成后本以為可以愉快的開始玩耍了,結(jié)果新內(nèi)核根本無法啟動(dòng)。通過各種修改啟動(dòng)參數(shù)發(fā)現(xiàn),內(nèi)核報(bào)錯(cuò) “kernel too old” ,這就很尷尬了。再次站在巨人的肩膀上發(fā)現(xiàn),確實(shí)是因?yàn)?kernel too old 。之前缺乏編譯老舊內(nèi)核的經(jīng)驗(yàn),現(xiàn)在才知道原來 gcc 調(diào)用的 libc 不是完全向下兼容的,我們可以通過

  1. file /lib/libc-*.*.so 

來查看當(dāng)前 libc 能夠編譯的最低版本的內(nèi)核,如下圖所示 libc-2.5.so 可以編譯最低到 2.6.9 版本的內(nèi)核,如果編譯內(nèi)核版本低于 2.6.9 的話就會(huì)產(chǎn)生 kernel too old 的報(bào)錯(cuò)導(dǎo)致內(nèi)核無法啟動(dòng)。

綜上,我們的 libc 版本不可太高,又因?yàn)?Demo 中修改的是 i386 架構(gòu)的內(nèi)核源碼,所以我選擇的實(shí)驗(yàn)環(huán)境為 CentOS 5.11 (32bit) 。

后續(xù)

至此,我們就可以成功安裝并啟動(dòng) 2.6.15 版本內(nèi)核了,然而事情并沒有結(jié)束。系統(tǒng)供外部進(jìn)程使用的信號(hào)僅有如下 64 個(gè)。

所以一般情況下我們的進(jìn)程只能發(fā)出上圖這 64 種信號(hào),我們想要發(fā)出 294 和 295 號(hào)信號(hào)就必須借助于與系統(tǒng)關(guān)系更密切的 C語言 程序完成。

然后通過執(zhí)行命令

  1. gcc hide.c -fPIC -shared -o hide.so 

將 hide.c 編譯為 hide.so 的動(dòng)態(tài)鏈接庫。

以后我們?nèi)绻羞M(jìn)程需要隱藏的話,只需要在代碼里調(diào)用 hide.so 中的 hide 函數(shù)即可,同樣 unhide 函數(shù)是他的逆過程。如下圖所示,在 Python 中 import ctypes ,使用它調(diào)用 hide.so 庫即可實(shí)現(xiàn)當(dāng)前 Python2.7 進(jìn)程的隱藏與恢復(fù)。

至此,已經(jīng)實(shí)現(xiàn)了內(nèi)核級(jí)別的進(jìn)程隱藏,可以愉快地做一些想做而又怕被別人發(fā)現(xiàn)的事情了…

Linux下編譯內(nèi)核

就跟Windows編譯程序是一樣的思路,Windows 下程序編譯之后是一個(gè)可執(zhí)行的文件,Linux下呢,編譯內(nèi)核的時(shí)候,一般也是從Git上把代碼拖下來,是一個(gè)代碼工程,編譯后,生成一個(gè)對(duì)應(yīng)格式的文件,這個(gè)時(shí)候該文件在Linux下 就跟其他文件一樣,就是一個(gè)普通的文件。如果你想要把編譯的這個(gè)內(nèi)核在當(dāng)前的系統(tǒng)中啟動(dòng)起來的話,由于當(dāng)前系統(tǒng)中已經(jīng)有一個(gè)正在運(yùn)行的內(nèi)核了,一個(gè)思路是你可以設(shè)置Linux一個(gè)變量(類似于Windows的環(huán)境變量),將該變量指向這個(gè)新編譯好的內(nèi)核文件,然后這個(gè)時(shí)候再重啟當(dāng)前Linux系統(tǒng),系統(tǒng)啟動(dòng)時(shí)會(huì)讀取那個(gè)變量的值,然后啟動(dòng)新的內(nèi)核。

責(zé)任編輯:武曉燕 來源: FreeBuf
相關(guān)推薦

2022-06-23 07:05:46

跳板機(jī)服務(wù)器PAM

2024-05-09 08:20:29

AC架構(gòu)數(shù)據(jù)庫冗余存儲(chǔ)

2017-08-24 15:02:01

前端增量式更新

2023-09-17 23:16:46

緩存數(shù)據(jù)庫

2018-04-18 07:34:58

2020-11-27 14:45:57

開發(fā)服務(wù)器代碼

2009-06-17 09:05:05

Linux隱藏網(wǎng)絡(luò)鏈接命令

2009-06-17 12:01:21

Linux

2024-04-30 08:12:05

CRUD方法JavaAC架構(gòu)

2024-04-26 08:58:54

if-else代碼JavaSpring

2019-11-22 09:21:17

技術(shù)研發(fā)數(shù)據(jù)

2016-10-13 10:57:55

phptcp專欄

2021-05-18 06:22:39

CSS 制作波浪技巧

2013-07-29 10:02:42

2020-09-16 14:01:10

Vue.js項(xiàng)目語言

2010-08-23 14:25:13

marginCSS

2013-05-22 15:31:07

AOP的CGlib實(shí)現(xiàn)

2009-06-03 15:38:37

Struts框架RBAC

2020-12-23 10:10:23

Pythonweb代碼

2022-06-22 09:44:41

Python文件代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)