Linux Basic Analysis

文档侧重于以电子数据取证为目的的Linux 系统解析,主要包含Linux 文件系统目录、特殊的系统文件、常用软件的目录、文件与功能等,可能不会介绍Linux 开发的相关内容。

一、常见的Linux 发行版

DebianOS,以及其衍生版本:Ubuntu、LinuxMint、Deepin、Kali Linux

Redhat,以及其衍生版本:CentOS、Fedora

其他:Archlinux 等

查看当前的Linux 发行版版本:

lsb_release :

lsb_release -a

uname :

uname -a

查找\etc 中的文件:

对于Debian 及其衍生版:

cat \etc\issue

cat \etc\issue.net

cat \etc\lsb-release

cat \etc\os-release

对于CentOS:

cat \etc\centos-release

对于Fedora:

cat \etc\fedora-release

二、Linux 系统的典型目录结构(Dir Structure)

目录 说明
/ 根目录,根目录下一般只有以下文件夹,没有文件|
/bin 存放了系统命令的可执行文件,例如cat、vi,相当于Windows 的系统环境变量PATH
/etc 存放了系统配置,例如release
/home 用户文件夹,例如/home/user1 ,/home/user2
/usr 存放了用户应用的可执行文件、代码、动态链接库等,相当于Windows 的用户环境变量PATH
/usr/bin 用户安装的应用的可执行文件
/usr/doc Linux 文档
/usr/include 头文件目录
/usr/lib 存放动态链接库、软件包配置文件
/usr/man 执行man命令显示的帮助文档
/usr/src 源代码,例如Linux内核源码: /usr/src/linux
/usr/local 本机单独增加的命令、动态链接库
/root root用户的用户文件夹被单独拿出来放到root目录里,不在usr目录里
/opt 可选应用程序的安装目录
/dev 存放设备文件(分字符设备和块设备)
/boot 系统引导
/lib 存放跟文件系统中的程序运行所需要的共享库及内核模块。共享库又叫动态链接共享库,作用类似windows里的.dll文件,存放了根文件系统程序运行所需的共享文件
/tmp 临时文件夹
/var 日志
/lost+found 意外丢失的文件
/proc 虚假的目录,磁盘中并不存在,其中的内容是系统映射出来的内存中的信息。

三、Linux 系统重要文件夹与文件的内容

1、 /etc/passwd

保存了用户数据库,其中包括用户名、加密过的密码等

2、/etc/group

保存了用户组的信息

3、/etc/issue

默认是发行版信息,实际上,文件里的内容用来显示在每次登录系统后终端显示的欢迎文字

4、/var/log

保存了许多程序的日志文件,例如登录日志

5、/sys/class/net

存储了各个网卡信息,例如eth0 文件夹内的address 文件记录了eth0 网卡的MAC 地址

6、/etc/timezone

时区信息:Asia/Shanghai

7、/etc/system-release

发行版信息:CentOS Linux release 7.3.1611 (Core)

8、/etc/locale.conf

系统使用语言:LANG=en_US.UTF-8

9、/etc/hostname

主机名称

10、/etc/motd

登录欢迎语:Welcome to Alibaba Cloud Elastic Compute Service !

11、/etc/resolv.conf

使用的DNS 地址

四、Linux 文件的属性(File Attribute)

查看文件或文件夹的权限

使用 ls -l filename 命令查看文件的权限,例如:

-rw-r--r-- 1 root root 298 Sep 30 21:31 os-release

  • 第一个字符 - 代表这是一个文件,d表示目录(即文件夹,在Linux内,文件夹也是一种特殊的文件),l表示链接

  • 接下来三个字符rw- 表示文件的所有者对该文件可读(r,read)可写(w,write)但不可运行(x)

  • 之后三个字符r-- 表示文件所有者所在的用户组 的其他用户们 对该文件可读,不可写,不可运行

  • 最后三个r-- 表示其他用户对该文件可读,不可写,不可运行

  • 数字1表示链接的文件数(与l类型的文件有关)

  • 之后的root 表示为文件所属的用户

  • 第二个root 表示为文件所属的用户(即root用户)所在的用户组为root用户组

  • Sep 30 21:31 表示文件最后的更改日期

  • os-release 为文件名

如何修改文件或文件夹的权限:

1、使用数字表示

例如:rw-r--r--,以二进制表示为110,100,100,即644

chmod 644 os-release

例如 rwxrw-r--,以二进制表示为111,110,100,即764

chmod 764 os-release

2、使用字母表示

chmod u+x os-release

表示给文件所属的用户(u)增加(+)运行(x)权限;

chmod g-wx os-release

表示给文件所属用户的用户组(g)去除(-)写权限(w)和运行权限(x)

chmod o+wx os-release

表示给文件所属用户用户组之外的用户(o)增加(+)写权限(w)和运行权限(x)

chmod a+r os-release

表示给所有用户(a)增加读(r)权限

3、改变文件所有者

chown命令(change owner)

chown user1 os-release 将os-release文件所有者改为user1

chgrp命令(change group)

chgrp basic—user os-release 将os-release文件所属用户组改为basic-user

五、文件系统(File System)

当前的Linux 正在使用什么文件系统,可以在 /etc/fstab 文件中查看,通常为ext4

Windows 通常为NTFS

//TODO: 等待完成

六、常见的系统功能

1、NTP 时间同步

NTP 服务使用UDP123 端口与NTP服务器通信,更新系统时间,ntp 服务器配置保存在/etc/ntp.conf 文件中

2、Bash

与Windows 的cmd 或PowerShell 类似,Linux 使用Bash 来进行系统交互。(也有oh-my-zsh等)

随着微软对WSL 和PowerShell 的开发,Windows 上现在也可以使用Bash,Linux 和macOS 上也可以使用PowerShell

Shell 和Terminal 有什么区别?

  • 我们打开 Windows 的那个「小黑框」(Command Prompt),实际上就是打开了一个终端(Terminal)
  • 在终端里面「输入命令,得到结果」的交互程序,就是命令行解释器(Shell)

也正因如此,Windows 最新的 Shell 叫 PowerShell。(控制台 Console 则是相对古老的概念,是大型机物理意义上面的独立终端,我们在这里先不探讨这个话题。)使用 macOS 和 Linux 的同学如果听说过 bashzsh 的话,它们同样也是 Shell。

打个比方,Terminal 就像是一个人的衣服,可以有各种颜色、形状甚至功能;那么 Shell 则是这个人,你和他沟通来获得信息,并且他可以在与你沟通的过程中事先告诉你许多信息、提醒,甚至自动帮你补充你想说的话。

Terminal 和 Shell 的区别和联系

来源:https://sspai.com/post/52868

每个用户的用户文件夹下都有该用户的Bash 历史记录(~/.bash_history),可以检索执行过的命令

参考:

1、 https://linux.cn/article-9586-1.html 查看Linux发行版名称与版本号的8种方法

2、 https://www.cnblogs.com/zhuchenglin/p/8686924.html Linux 各个目录的详细介绍

3、 https://www.cnblogs.com/123-/p/4189072.html Linux下用户组、文件权限详解

Linux Program Analysis

一、Linux 下的Docker 容器

我们可以把Docker 当作多功能沙盒,可以将需要的软件放在一个容器内运行,而不干扰容器外的系统。例如,在两个个容器内分别运行nginx服务器,容器一对外开放端口10801,容器二对外开放端口10802,这样,在同一台主机内,两个web服务器就可以同时互不干扰地运行。

使用Docker 时,主要区分以下两个概念:

1、Docker镜像 image

2、容器 Container

我们可以在Docker Hub上下载各种images,例如nginx,mysql,ubuntu等,也可以将自己的软件运行环境打包成一个image

使用image来新建一个container

举个栗子:用一个Windows 7 iso镜像,可以给好多电脑安装系统。用一个MySQL Docker 镜像,可以创建好多个MySQL 容器

Docker 入门

例如:

查阅Docker Hub内的官方MySQL 文档,首先下载MySQL镜像

docker pull mysql

如果要指定某个版本的MySQL,在mysql后加冒号指定版本,例如:

docker pull mysql:8.0.10

不指定版本则默认为latest(最新版)

等待下载完成,下载完成后查看目前已经下载好的images:

docker images

确认镜像已经下载成功,接下来使用这个镜像新建一个容器:

docker run --name first_mysql_container -p 23306:3306 -e MYSQL_ROOT_PASSWORD=yourpassword -d mysql

其中的命令和参数分别为:

  • run:docker操作,用来新建容器;

  • --name first_mysql_container:给容器命名,可选;

  • -p 23306:3306:端口映射,将容器内的3306端口映射到主机的23306端口

  • -e MYSQL_ROOT_PASSWORD=yourpassword:设置MySQL root密码

  • -d :容器创建后将会在后台运行,命令执行后返回一个container id

  • mysql:使用mysql镜像,如果要指定版本,则写为 mysql:tag

使用命令 docker ps 来查看已经创建的容器,Docker会显示以下详情:

  • CONTAINER ID :唯一的容器id,对应每一个单独的容器
  • IMAGE:这个容器是使用什么镜像创建的
  • COMMAND
  • CREATED: 容器创建的时间
  • STATUS:容器已经运行了或者停止了多长时间
  • PORTS:端口映射情况
  • NAMES:容器的名字

创建好容器之后,进入容器,亲手操作mysql:

docker exec -it first_mysql_container bash

  • exec:docker命令,在运行的容器中执行命令
  • -it:我一般都加上这两个参数
  • first_mysql_container:容器名字,此处填容器ID亦可
  • bash:在这个容器内运行bash

之后输入 mysql -u root -p 即可使用MySQL

Docker 的配置目录与文件分析

1、如果系统还可以仿真运行,docker服务可以启动,使用一下命令:

docker version 查询docker client 和server 版本,

docker info 可以详细调查正在运行、暂停或停止的container数量,是否使用了docker集群需要的swarm网络模式,docker镜像源地址等

docker sespect ImageID 查询某个镜像的详细信息

2、如果系统不能仿真,或是仿真之后无法启动docker服务,应该首先考虑修复系统丢失的文件或进行合理配置,恢复docker服务。

3、如果只能从硬盘分析入手,则考虑一下方法:

  • 要确定Docker Server的版本,可以查找apt 包管理程序的日志:/var/log/apt/term.log

  • 查看已经下载了哪些镜像,检查 /var/lib/docker/image/overlay2/repositories.json 文件

* 需要注意的是,docker image 使用OverlayFS 分层存储在/var/lib/docker/overlay2,不好区分

  • 查看container的详细信息,在/var/lib/docker/containers找到对应containerID 的文件夹,查看config.v2.json 中的内容,其中包含:当前容器是否在运行、暂停或者停止,容器运行的虚拟主机名称Hostname,在容器内使用的端口ExposedPorts,容器内的环境变量Env,容器所使用的镜像ID,容器映射的端口Network Settings.Ports 等等

Docker 网络

//TODO: 等待完成

二、OpenSSH

使用SSH 来远程连接Linux 主机。

被连接的主机:安装SSH server

进行连接的主机:安装SSH client

查看SSH 连接日志、SSH config 文件可以检索到曾经连接过这台主机的客户机IP地址。

常见的几个文件:

文件名 说明
/var/log/secure 日志文件,记录登录历史记录
~/.ssh/config ssh 配置文件,用来进行快速密钥认证登录,其中可能记录了私钥
~/.ssh/authorized_keys 记录公钥

密钥认证基本流程:

使用ssh-keygen 命令生成一对密钥,私钥放在主机A 的config 文件里(当然需要编辑host等字段),公钥放在主机B 的authorized_keys 内,主机A 则可以无需密码通过SSH 连接主机B。

参考:

1、https://www.jianshu.com/p/806485990aea Docker文件目录 - 简书

2、https://hub.docker.com/_/mysql mysql - Docker Hub

3、李鹏超, 周凯. 基于Docker容器的电子数据取证方法[J]. 吉林大学学报(理学版), 2019, 57(06): 1485-1490.

Linux Server Analysis

一、Mysql 数据库

除了使用容器运行数据库外,MySQL 还可以直接安装在主机上,直接在Linux 文件目录中留下痕迹。

数据库取证一般遵循以下步骤:

1、系统镜像可以仿真,并且能够直接使用MySQL 进行交互的,考虑去除root 用户密码,使用SQL语句检查整个数据库的内容

2、系统无法仿真的,或者仿真之后无法运行MySQL 的,考虑在不损坏或者已备份MySQL相关目录的前提下,修复运行环境,运行MySQL

3、系统无法仿真或者MySQL 文件目录不完整,单独排查MySQL 配置和数据目录中的文件

  • 确定MySQL 数据文件的存放路径: 搜索ibdata1 文件:

    find / -name ibdata1

  • 确定MySQL 版本:用16进制编辑器打开任意一个.frm 文件,检查0x34 和0x33 的位置,例如0x34 为0xC6,0x33 为0x29 ,则MySQL 版本为0xC629,即5.07.29

  • 复制整个MySQL 数据目录,删除ib_logfile 文件,转移到新安装的MySQL 环境中,检索其中的数据

  • 跳过root 密码:在 /etc/mysql/mysql.conf.d/mysqld.cnf 文件中[mysqld] 下添加 skip-grant-tables

  • 重启MySQL 服务,使用root 登录

二、文件服务器(FTP,SMB,NAS)

磁盘阵列参考:

FTP

可以在CentOS 或Ubuntu 使用vsftpd 配置FTP 服务。FTP服务使用TCP 21端口验证身份信息,使用TCP 20端口传输数据。

  • /etc/vsftpd/vsftpd.conf vsftpd 的核心配置文件
  • /etc/vsftpd/ftpusers 黑名单文件,此文件里的用户不允许访问 FTP 服务器
  • /etc/vsftpd/user_list 白名单文件,此文件里的用户允许访问 FTP 服务器
  • /etc/vsftpd.chroot_list 允许访问FTP 服务器的用户列表

** 配置文件也可能直接存放在/etc 目录下

vsftpd.conf 配置文件中的相关设置有:

配置变量 配置说明
local_root 登录FTP 服务器后所在目录
xferlog_enable Yes: 启用日志
pasv_address 服务器所在IP地址

vsftp的日志文件保存在 /var/log/vsftpd.log,其中包含的信息有尝试登录此FTP 服务器的IP地址等

Samba

Samba 是使用SMB 协议的一款软件。SMB 协议用来在Linux 与Windows 系统之间无痛共享存储与打印机

NAS

NAS 通常用来将大容量磁盘挂载在网络上,形成网络存储。在电子取证领域,时常需要分析大容量磁盘,但其实NAS 本身的配置等内容不常出现。

NAS 本身不代表任何协议,它可以使用FTP,Samba,甚至HTTP 等协议传送文件。

//TODO: 考虑是否有补充的必要

三、防火墙(iptables)

四、SSH

使用SSH 来远程连接Linux 主机。

被连接的主机:安装SSH server

进行连接的主机:安装SSH client

查看SSH 连接日志、SSH config 文件可以检索到曾经连接过这台主机的客户机IP地址。

常见的几个文件:

文件名 说明
/var/log/secure 日志文件,记录登录历史记录
~/.ssh/config ssh 配置文件,用来进行快速密钥认证登录,其中可能记录了私钥
~/.ssh/authorized_keys 记录公钥

密钥认证基本流程:

使用ssh-keygen 命令生成一对密钥,私钥放在主机A 的config 文件里(当然需要编辑host等字段),公钥放在主机B 的authorized_keys 内,主机A 则可以无需密码通过SSH 连接主机B。

参考:

1、http://www.xlysoft.net/detail/7-314-1194.html 效率源科技 如何对有访问密码的MySQL数据库进行取证

2、https://blog.csdn.net/hancoder/article/details/100988807 ubuntu下ftp的配置

Linux 电子数据取证入门的更多相关文章

  1. 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

    Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)   介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...

  2. 大数据-03-Spark入门

    Spark 简介 行业广泛使用Hadoop来分析他们的数据集.原因是Hadoop框架基于一个简单的编程模型(MapReduce).这里,主要关注的是在处理大型数据集时在查询之间的等待时间和运行程序的等 ...

  3. 20165301 预备作业三:Linux安装及命令入门

    预备作业三:Linux安装及命令入门 VirtualBox虚拟机的安装 在进行安装之前,原本以为有了娄老师的安装教程会是一件很容易的事情.万万没想到,在自己实际动手操作中,还是遇到了许多困难.通过与同 ...

  4. Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门

    Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门 转载请在文首保留原文出处:EMC中文支持论坛 - https://community.emc.com/go/chines ...

  5. Linux下pwn从入门到放弃

    Linux下pwn从入门到放弃 0x0 简介 pwn,在安全领域中指的是通过二进制/系统调用等方式获得目标主机的shell. 虽然web系统在互联网中占有比较大的分量,但是随着移动端,ioT的逐渐流行 ...

  6. Linux 究级基础入门命令整理

    Linux 究级基础入门命令整理 条条框框,三三两两,怎讷个这么多,哈哈!no zuo no die. 纯粹个人菜鸟笔记,望大神笑纳! 后续,未完!! 查看系统信息 uname -a - 查看内核/操 ...

  7. 羽夏看Linux内核——段相关入门知识

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...

  8. Linux操作系统备份之三:通过二进制拷贝(dd)方式实现Linux操作系统数据的备份

    前面有两篇文章,<Linux操作系统备份之一:使用LVM快照实现Linux操作系统数据的在线备份>和<Linux操作系统备份之二:通过tar拷贝分区实现Linux操作数据的在线备份& ...

  9. Linux内核数据包的发送传输

    本文主要讲解了Linux内核数据包的传输流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式从内核高层面上梳理了二层数据包发送传输的流程,希望可以对大家有所帮助. ...

随机推荐

  1. Python—高级函数

    Python-高级函数 一.闭包 Python函数是支持嵌套的.如果在一个内部函数中对外部函数作用域(非全局作用域)的变量进行引用,那么内部函数就会被称为闭包.闭包需要满足如下3个条件: 存在于两个嵌 ...

  2. go基础——数组array

    package main import "fmt" /* 数组: array数组属于值类型,存储的是数值本身,数据传递给其他变量时传递的是数据的副本. slice,map等属于引用 ...

  3. PlatformIO 创建 libopencm3 + FreeRTOS 项目

    PlatformIO: libopencm3 + FreeRTOS 以下步骤基于常见的 Bluepill STM32F103C8T6, 也适用于其它 libopencm3 支持的MCU型号 方案一: ...

  4. Solution -「LOCAL」「cov. HDU 6816」折纸游戏

    \(\mathcal{Description}\)   Link(削弱版).   \(n\) 张纸叠在一起对折 \(k\) 次,然后从上到下为每层的正反两面写上数字,求把纸重新摊平后每张纸上的数字序列 ...

  5. Nginx兼容框架的pathinfo模式与URL重写

    几乎所有的框架(ThinkPHP,Zend Framework,CI,Yii,laravel等)都会使用URL重写或者pathinfo模式,使URL看起来更美观,比如可以隐藏掉入口文件,并且有利于搜索 ...

  6. ios开发 将json格式数据上传服务器

    看了一些大小牛的资料其实就3步 1.使用post 请求 ,因为get是不能上传的 2.设置请求类型 , 讲你的json数据上传 3.向服务器发送数据按照下面示例代码,就差不多了 1 // 1.创建请求 ...

  7. python2批量改密码

    客户端代码: 如果注释最下面三行socket发送,可以直接在本机修改密码不发送数据到服务端. # -*- coding: utf-8 -*- #author:Guoyabin import rando ...

  8. DDD与数据事务脚本

    DDD与数据事务脚本 扯淡 相信点进来看这篇文章的同学,大部分是因为标题里面的"DDD"所吸引!DDD并不是一个新技术,如果你百度一下它的历史就会知道,实际上它诞生于2004年, ...

  9. c++基础的记录(随笔记录一些基础的东西)

    1.父类的析构函数为什么要加上virtual关键字. 比如说,父类A,子类B.在A* a = new B()的语句的时候,如果父类析构函数没有virtual,我们在delete指针a的时候,会走父类的 ...

  10. k8s搭建监控:安装metrics server和dashboard

      安装metrics server 参考:https://github.com/kubernetes-sigs/metrics-server kubectl  create -f component ...