首先,我们来学习用 ps 命令列出正在运行的进程。
对于 ps 的含义,有人认为是 "process snapshot"(进程快照),也有人认为是 "process status"(进程状态);它的作用就是列出进程。
默认情况下,ps 只列出当前终端中运行的进程,说实话,这样的用处不大:
hacker@dojo:~$ ps
PID TTY TIME CMD
329 pts/0 00:00:00 bash
349 pts/0 00:00:00 ps
hacker@dojo:~$
上面的例子列出了 shell(bash)和 ps 进程本身,这就是该终端中运行的所有进程。
我们还能看到,每个进程都有一个数字标识符(进程 ID,简称 PID),用于在 Linux 环境中唯一标识一个正在运行的进程。
输出还显示了命令运行所在的终端(本例中为 pts/0),以及进程到目前为止消耗的CPU 时间总量(这些进程的计算需求很低,消耗的时间连 1 秒都不到!)。
多数情况下,直接运行 ps 只能看到这些信息。
要让它更有用,我们需要传入一些参数。
ps 是一个历史悠久的工具,它的用法也因此有些杂乱。
指定参数有两种方式。
“标准”语法:在这种语法中,可以用 -e 列出所有进程,用 -f 以完整格式输出,包括命令的参数。
这两个选项可以合并为一个参数 -ef。
“BSD”语法:在这种语法中,可以用 a 列出所有用户的进程,用 x 列出没有在终端中运行的进程,用 u 生成便于用户阅读的输出。
这三个选项可以合并为一个参数 aux。
这两种方式,即 ps -ef 和 ps aux,输出略有不同,但显示的信息大体可以相互对应。
在 dojo 环境中试试看:
hacker@dojo:~$ ps -ef
UID PID PPID C STIME TTY TIME CMD
hacker 1 0 0 05:34 ? 00:00:00 /sbin/docker-init -- /bin/sleep 6h
hacker 7 1 0 05:34 ? 00:00:00 /bin/sleep 6h
hacker 102 1 1 05:34 ? 00:00:00 /usr/lib/code-server/lib/node /usr/lib/code-server --auth=none -
hacker 138 102 11 05:34 ? 00:00:07 /usr/lib/code-server/lib/node /usr/lib/code-server/out/node/entr
hacker 287 138 0 05:34 ? 00:00:00 /usr/lib/code-server/lib/node /usr/lib/code-server/lib/vscode/ou
hacker 318 138 6 05:34 ? 00:00:03 /usr/lib/code-server/lib/node --dns-result-order=ipv4first /usr/
hacker 554 138 3 05:35 ? 00:00:00 /usr/lib/code-server/lib/node /usr/lib/code-server/lib/vscode/ou
hacker 571 554 0 05:35 pts/0 00:00:00 /usr/bin/bash --init-file /usr/lib/code-server/lib/vscode/out/vs
hacker 695 571 0 05:35 pts/0 00:00:00 ps -ef
hacker@dojo:~$
这里可以看到用于初始化挑战环境的进程(docker-init)、为节省计算资源而在超时后自动结束挑战的进程(sleep 6h,6 小时后超时)、VSCode 环境的进程(几个 code-server 辅助进程)、shell(bash),以及刚刚运行的 ps -ef 命令。
使用 ps aux 看到的情况基本一样:
hacker@dojo:~$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
hacker 1 0.0 0.0 1128 4 ? Ss 05:34 0:00 /sbin/docker-init -- /bin/sleep 6h
hacker 7 0.0 0.0 2736 580 ? S 05:34 0:00 /bin/sleep 6h
hacker 102 0.4 0.0 723944 64660 ? Sl 05:34 0:00 /usr/lib/code-server/lib/node /usr/lib/code-serve
hacker 138 3.3 0.0 968792 106272 ? Sl 05:34 0:07 /usr/lib/code-server/lib/node /usr/lib/code-serve
hacker 287 0.0 0.0 717648 53136 ? Sl 05:34 0:00 /usr/lib/code-server/lib/node /usr/lib/code-serve
hacker 318 3.3 0.0 977472 98256 ? Sl 05:34 0:06 /usr/lib/code-server/lib/node --dns-result-order=
hacker 554 0.4 0.0 650560 55360 ? Rl 05:35 0:00 /usr/lib/code-server/lib/node /usr/lib/code-serve
hacker 571 0.0 0.0 4600 4032 pts/0 Ss 05:35 0:00 /usr/bin/bash --init-file /usr/lib/code-server/li
hacker 1172 0.0 0.0 5892 2924 pts/0 R+ 05:38 0:00 ps aux
hacker@dojo:~$
ps -ef 与 ps aux 有许多共同之处:两者都会显示用户(USER 列)、PID、TTY、进程启动时间(STIME/START)、累计消耗的 CPU 时间(TIME),以及命令(CMD/COMMAND)。
ps -ef 还会输出父进程 ID(PPID),也就是启动当前进程的那个进程的 PID;ps aux 则会输出当前进程占用的系统 CPU 和内存百分比。
此外还有一些其他信息,我们暂时不展开。
好了!
来练习一下。
在这一关中,我们再次将 /challenge/run 重命名为一个随机文件名,而且这次你无法用 ls 查看 /challenge 目录!
不过,我们也已经启动了它,所以你可以在运行中的进程列表中找到它,确定文件名,然后直接再次运行它来获取 flag!
祝你好运!
注意:ps -ef 和 ps aux 都会按照终端宽度截断命令列表(这也是上面的示例在屏幕右侧对齐得如此整齐的原因)。
如果无法看清进程的完整路径,你可能需要把终端加宽(或者把输出重定向到其他地方,以避免截断)!
也可以将 w 选项传入两次(例如 ps -efww 或 ps auxww),来禁用截断。
通过 SSH 连接
在
个人设置 中绑定你的 SSH 公钥后,使用以下命令连接:
ssh hacker@dojo.pwn.college