探索黑客技术攻防,实战研究与安全创新

导航菜单

结合Windows浅谈Linux进程管理

Linux出色的性能无须多言,假如我们把Linux看作是一盘棋,那么系统中所有的进程就是这盘棋中的棋子,如果不能及时掌握棋子的位置及状态,那么无论攻击还是防御都将无从谈起,因此不管你是Linux个人用户还是服务器维护人员,都必须要对进程管理相当熟悉才行,本文危险漫步就结合Windows系统来讨论一下Linux下的进程管理。

要了解进程管理,我们先来明确几个概念——程序、进程、线程,程序是存储于硬盘等外部存储器上的静态二进制信息集合,进程是内存中动态的二进制信息集合,而线程是对于CPU来说的,它是CPU可调度的基本单位,假如把公交车站看作外部存储器,那么里面的每辆公交车就是一个个等待执行的程序,当公交车启动时,就是一个进程,每一个公交车里面可以有N多的人,这里面的人就相当于线程,也就是说一个进程可以有多个线程,每辆公交车(程序)都有准备出发(就绪)、出发(运行)、暂停(挂起)、下班(终止束)几种状态。

一,Linux进程的御建与消亡

我们通过对比Windows来描述Linux下进程的产生与消亡,无论我们通过Wrndows的cm cl还是explorer来执行程序,实际上都是在调用CreateProcess().这个函数完成了虚拟内存分配、PE可执行文件装入等过程。与Windows不同,在Linux系统中,一个进程的创建首先需要调用fork()来从当前进程复制信息并创建一个于进程,然后通过exec()家族函数来将ELF(Linux平台的可执行文件格式)载入内存,这里需要明确一点,exec()并不存在于Linux函数库中,它实际上指的是一系列以exec开头的家族函数,返回值为一个pidt的结构体,如果返回值为负数,一般为-1,表示执行失败,如果返回值大于0就表示其父进程,如果为0则为当前进程。也就是说,在Linux启动后,每个运行的程序都有一个父进程,值得一提的是,在Linrix中父进程的标识是用ppid表示,子进程的标识是用pici表示。

`2HEUKQPQ0P63C_YYT240(3.jpg

我们通过pstree命令可趴查看到Linux的进程时,不难猜出,Linux的所有进程都是由iriit这个进程创建的,这个进程是在kernel内核镜像挂载完成后所创建。当进程执行完,它就会执行exit()函数,通知父进程“我已经死亡”,此对的进程即为,当父进程接收到“我已死亡”的信息,通过waitpid()(有的地方为wait(),wait()实际上是直接调用的waitpid())发送信息“赐死”进程,这时候进程才彻底的结束掉,也就是说Linux的子进程是由父进程“埋葬发丧”的,这种机制换来执行效率的同时,也存在着一些小缺陷,我会在后面介绍的。

二,Linux FWJ“任务管理器”top命令

存Windows系统中,每当发现系统异常时,我们总会按下cTLR+A LT+DEL键打开任务管理器,Linux下的“任务管理器”是通过执行top命令打开的,这是一个相当完美的命令,我们一行行的来分析它输出的内容,首先看第一行“01:30:i6”p3:Ol,2“sers”,它指明了登录时的系统时间为1:30 716,运行3时01分钟,2个用户登录,这一行的信息相当于执行“ptime命令。再看第二行的‘‘Ta sks:70 total,l runni“g,69 sl。eping,0 stopped,0 zornbie”,它指明了当前任务队列中的任务是70,在Linux中进程创建后都会放人进程队列中供CPU调度,进程队列实际上就是一个双向循环链表结构,ecELiriux中被定义为task_strcutgj结构体,running表示正在执行的任务数,sleeping指的是睡眠中的任务数,stopped是停止的任务数,zombie指的是僵尸进程数,如果大家发现僵尸进程数大于0,就说明有一些非法进程了,应该及时检测系统。第3、4、5行相当于Windows任务管理器“性能”选项的内容,显示了CPU.物理内存以及虚拟内存的使用量n接下来就是当前进程PrD.用户名,PR(优先级)等信息,大家要注意,Nl也是优先级,NI与PR两个优先级的不同在于,NI可以通过njce命令调整,也就是说NI命令提供了很多快捷键,比如P键可以根据CPU使用大小进行排序,以根据时间排序,M键可以切换显示内存信息等,在查看非法进程的过程中这些快捷键都是相当好用的。另外,由于top命令会不断的更新相关的数据,因此消耗的资源也是相对比较多的,查看信息完毕后按q键即可以退出top命令了。

在Windows系统下编写与进程相关的批处理文件时,我们通常使用tasklist和taskkill命令,在Linux系统中也提供了两个相类似的命令-ps和kill,ps命令用于列出当前系统中的进程,一般来说常用的参数为-aux和lx。表示显示当前sheIl下的所有应用程序,u是指以用户名排序,x指的是显示所有的任务,包括一些内核态的程序或者说系统进程,l参数可以让显示的信息更加详细,比如显mppid(父进程的进程标识符)。如Windows下的进程批处理编写一样,我们需要通i:find过滤才能定位到某一个具体的进程,在linux中也提供了类似的用法,一般是通过“grep要过滤的字符串”来具体到某-个进程,通过执行ps -auxlgrep”bash”找到包含bash字符串的所有进程。

}6VU3~D7)[XIJDBKXS~{TFC.png

在日常的Linux管理中,一旦发现进程我们就需要及时的杀掉它;这就需要kill命令来完成了,Windows图形界面的WM_CL/OSE关闭消息类似,kiIl命令也是通过向进程发送相应的蒲息来结束进程的,命令的使用格式非常简单:killc消息号或消息名>《进程PID>,进程的PID我们可以通过“ps -aux”查询得到,消息号可以通过“kill一l”查询得到,一般我们使用SIGKILL.SJGTERM、SIGSTOP这个信号,名字很好区分的,SIG是signal信号的前三个字母,后面的字母分别对应于krll、terminate. stop,SIGKILL是强制杀死进程,在Windows中使用s扫描器时,如果想要结束扫描,一般是使用ctrl+C络止它,这个信号就相当快捷键,SIGTERM是较正常的退出,SIGSTOP是暂停程序转人后台运行,在Linux的Shell中让一个程序进程在后台运行只要在命令后面加上一个“&”就可以了。

大家一定对Windows系统中的netstat命令比较熟悉了,它有一个不太好的地方,就是不能查看到与某个端口相关联的进程,因此不利于我们查找恶意程序,所以很多时候在Windows中我们都是使用fp ort程序来替代netstat,因为它可以显示出每个端口与之对应的进程。Linux中的netstat命令就具备了fporfBfj能力,只要加上“p”参数就可以查着与端口关联的进程pid,比如我们执行netstat -tupl指的是监听状态的套接字,这里面详细列出了每个端口使用的协议、状态及与之相关联的进程。    

Linux的进程创建机制为其快速及稳定执行程序提供了条件,同时Linux的进程安全策略也为Linux进程提供了一个相对安全的环境,比如at命令,在Windows中它依赖于Task Scheduler,只要添加管理员权限成功都可以防问,如果要对该服务进行权限设置,一般也需要借助第三方的工具。在Windows系统中,我们知道进程间的权限都是相互继承的,比如提升explorer.exe的权限为system.则由它运行的所有程序都为system权限,Linux也一样,但是在Linux中,这样的一个小小不起眼的地方却有可能引发大的隐患,如apache服务运行于/usr/local/httpd目录下,开机时是以root权限运行,当外部机器通过80端口访问率机时,则在本地计算机中apache父进程会建立多个nobody权限的子进程,但是所有接收到的信息都会经过root限的apache父进程处理后交给子进程,在这个过程中,如果我们提交的是一些奇特的数据,就相当于具备了root权限,这时候就有可能访问到/usedlocal甚至是整个“,”(根)目录,这个问题的根本原因就在于apache的根目录和系统的根目录是一样的。对于这种情况,我们可以借助于chroot机制来修改apache的可见根目录,使用chroot实际上就是将进程权限限制在某个特定的目录中,这类似于Windows的subst机制,当我们执行subst j:f:\iis\web时,此时对于任何IIS用户来说,虽然可以访问驱动器,但实际上它的权限却被锁在了“f:\iis\web”目录中,chroot机制的使用关键是建立与之配套的运行环境,比如ap ache酌运行需要相应的库文件和配置文件,这些文件都在/etc或/usr目录下,这时候我们就需要将其相关的文件都放置到chroot目录下。

无论攻击还是防御,其实都是计算机操作者在对进程进行有效的排列组合,同时进程的管理、分析、设置也是所有攻击与防御体系必须走的一环,比如对Windows文件夹作权限设置、对服务作权限设置,实际上还是对进程作权限设置,因为在计算机的世界里,只有程序才是惟一的纽带,好了,文章就写到这里吧。

本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法行为。