在拿到设备固件或者镜像文件后,若要进行更进一步的漏洞挖掘,我们便需要找到与当前设备功能相关联的软件的位置与启动方式等信息。
一般来讲如果只知道软件的位置便进行分析可能措施很多关键的信息,如:程序运行时设置的环境变量以及一些配置信息的设置。
大多数情况下,程序在启动时并不是直接从elf文件启动,而是启动自shell脚本,同时为了能够让程序在每次重启系统或者开机时自动启动,
这些程序往往被注册成service可能被嵌入到一些其他在linux启动过程中会自动执行的脚本或者目录中。为了厘清在linux启动过程中究竟有哪些脚本被自动执行了,
我们首先需要对linux的启动过程有一个大概得了解。
在用户按下电源按钮启动系统是,首先发挥总用的是bios系统,启主要完成的功能包括POST,即开机自检,主要完成对系统的硬件进行检查等工作;
在bios系统完成其使命后期会通过其内部设置去尝试访问不同的存储介质尝试拉起系统,
在Windos下进行PE启动时我们往往会进入到bios选择操作系统的引导位置为USB就是这一过程的体现,一般情况下,操作系统的引导位置都是硬盘;
在堆硬盘进行访问时,首先会读取硬盘的主引导分区中的信息,住引导分区中存储着的便是我们通常所说的bootloader(拉着自己鞋带向上提),
bootloader一般包括两部分,一部分由汇编编写,主要完成一些依赖CPU体系的初始化工作,并调用第二部分代码,第二部分由C语言来实现,
常见的bootloader包括grub grub2 uboot等,我们在启动linux时通常会见到一个让我们选择系统内核版本的界面,该界面就是bootloader在起作用;
在bootloader将操作系统内核加载到内存中后将开始运行操作系统的第一个程序,在最新版本的linux中通常是systemd程序而在较低版本中可能是init;
之后会选择系统的运行级别runlevel,在此过程中会加载运行一些etcrc.d目录下的脚本运行;再之后便会进入到用户登录选项了,
在用户输入正确的用户名密码登录后会加载etcprofile - etcprofile.d.sh -~.bash_profile - ~.bashrc - etcbashrc等文件初始化环境变量。
在linux启动过程中凡是涉及到自动脚本执行的地方都有可能被修改插入设备程序启动脚本的地方,在查找时可以逐一排查。
不过,一般情况下更普遍的做法是将程序的启动过程注册为service。linux系统中的service可以通过命令systemctl 查看,
找到我们感兴趣的服务然后执行systemctl show service_name便可以查看与该服务相关的信息,我们可以从中找到服务的存储位置,
如:etcsystemdsystemdefault.target.wants.service usrlibsystemdsystem.service 查看对应的service文件我们便可以找到相关的启动脚本所在位置,
然后通过阅读启动脚本了解程序启动过程中设置的环境变量、配置、启动参数等信息。
除了这种追本溯源的方式,还有一种更加简单直接的方式,我们可以通过查进程的方式找到相关得信息。比如我们要找一个java程序,
可以直接执行ps -ef grep java 便可以找到相关的程序的启动命令。如果只知道启动的端口,我们可以先执行netstat -tulnp查看到对应的PID信息,
然后通过PID使用命令ps命令也可以。