系统命令学习

不想当一个好运维的安全狗不是好的研究员

ps

用来看进程信息

首先看一下文档

好像没什么东西, 实际上他需要这样

ps --help all

就会看到很多参数了(上面只是一部分)

先简单的了解一下

ps

ps支持-x的参数形式, 也可以x直接调用

ps -x
# or
ps x

其中-xSYSV风格, 而xBSD风格

那么我们看一下常用的使用场景

如果我们想看到当前的所有进程, 可以用

ps ax

  • a: 表示所有控制tty的进程
  • x: 表示未控制tty的进程

如果想看cpu占用的相关信息, 加上一个u

ps aux

可以看到输出的内容变得更加详细, 这也是最常用的一个命令

有个类似的命令是

ps -ef

这个命令和ps aux大致相同, 输出的信息会有些不同, 可以参考 https://hao5743.github.io/2018/08/30/2018-08-30/ 查看一下各列的不同

网上主要推荐的是ps -ef, 另外虽然-aux等效于aux, 但是不太建议使用

如果想看某个用户的, 例如root, 可以使用

ps -u root

查看当前占用cou最高的命令可以使用

ps aux --sort -pcpu

降序输出的话是

ps aux --sort +pcpu

ps auxf
# or
ps -ef f

可以用来看进程的关系

更简洁的是

pstree

如果有些命令太长了, 我们可以用ww修饰

其他的功能我们基本上可以通过结合grep, awk之类的命令去处理, 就不展示了

netstat

主要用来看网络相关的信息

在查资料的时候看到了有趣的说明

Linux上,推荐使用ss替代netstat,使用ip route替代netstat -r,使用ip -s link替代netstat -i,使用ip maddr替代netstat -g

维基百科

但是在默认的发行版上, 不一定会集成ss命令, 但是一般都会有netstat

想看所有的连接信息的话, 可以用

netstat -a

不想打码, 所以图片一般只截取部分, 请谅解

在测试这条命令的时候, 我已经感受到了ss的优越性

ss -a

相比之下要快很多很多

继续看-a的命令, 这条命令会列出tcp, udp, unix协议下的套接字的连接

如果想看tcp的话, 可以用

netstat -at

udp则是-u

如果不需要看主机名, 可以使用-n直接显示ip地址来提升速度

看具体的进程信息的话, 加上-p

netstat -anpt

由于有些进程只能通过root查看, 所以我们要加上sudo

如果要看进程的用户, 加上-e

netstat -anpte

这里会发现用户的地方是uid, 我们可以去掉-n使得用户名解析

如何看正在监听的端口呢, 使用-l

netstat -nltp

注意不要混合-a, 不然会输出全部信息

如果想看网络接口的信息, 可以使用

netstat -ie

其中-i是输出网络接口信息, -e是使得信息更可读

实际上这也是我们熟知的

ifconfig

ss

既然提到了ss的优越性, 我们就来看看怎么用

查看所有监听端口

ss -l

加上p显示进程

ss -lp

如果想查某个端口的应用情况

ss -lp|grep port

从图中我们可以看到, 如果不加-n的话, 常用端口会被解析成程序名, grep的结果就会发生变化, 加上-n会更直观

查看tcp连接的话使用-t

同理udp就是-u

ss还有一套类似于wireshark的过滤语法, 比如列出所有http连接

ss -o state established '( dport = :http or sport = :http )'

过滤来源的话可以用

ss src ip[:port]

这里不太明白的是为什么会有端口号超过65537, 是因为不是tcp这类的端口号吗

查看统计信息的话, 使用

ss -s

lsof

这个命令用于查看进程相关的一些系统信息, 例如文件操作, 网络连接等等

如果想查询某个端口的相关信息, 可以使用

lsof -i :port

其他的类型还有

# ipv4
lsof -i 4
# ip
lsof -i @ip
# protocol
lsof -i tcp/udp
# all
lsof -i

查看某个用户打开的文件信息

查看某个进程号

lsof -p 6644

查看某个进程名的信息, 例如查看mysql开头的进程的信息

lsof -c mysql

根据文件描述符查找, 我们知道0,1,2分别对应标准输入, 输出和错误流, 程序打开的文件一般会从3开始

lsof -d 3

可以说lsof是把linux一切皆文件的思想表现的最具体的一个命令了

kill

这个命令实际上我们一般用到的是

kill pid

也就是不带参数, 我们先启动一个进程

python3 -m http.server 8000

然后查一下对应的pid

ps -ef|grep python3

kill 16256

直接杀死即可, 效果如下

一般加上-9强制杀死僵尸进程, 因为默认发送的是15, 含义可以看下图

https://www.jianshu.com/p/5729fc095b2a

在awd中, 如果要批量杀死某个进程, 我们可以用

ps -ef|grep python|awk '{print $2}'|xargs kill -9

效果如下

如果有相关命令不太理解的话, 可以看一下我前面的文章

https://cjm00n.top/Linux/linux-command-learning.html

我们也可以通过

killall python3

来杀死匹配到的进程, 例如awd中我们常用

killall -9 apache2

来杀死所有Apache2的进程, 可以加上-I忽略大小写, 加上-v打印日志信息

还有一个相关命令是pkill, 这个用于比较骚的情况, 例如我们拿到了某个服务器的ssh, 用来把别人踢下线, 可以用pkill, 先用

w

看一下登录信息

然后通过

pkill -u username

踢掉即可, 当然还是不太建议这样断人后路, 我们要做个善良的人

tcpdump

tcpdump的话也是常用的命令, 可以用来捕获数据包

需要root权限

常用的话一般是

tcpdump -i eth0 -w flow.pcap

-i过滤网卡, -w表示将流量写到文件中, 或者使用-vv来打印详细的流量信息, 但是一起用的话不会打印

我们可以加上一些过滤

tcpdump host 0.0.0.0

来过滤主机地址, 或者用

tcpdump net 192.168.1.0/24

来过滤一个网段

也可以加上协议进行过滤, 例如过滤http协议

tcpdump http

我们可以捕获包后用wireshark之类的软件进行流量分析, 当然在ctf中, 如果有流量包, 一般都是主办方给的2333

这里顺带提一下, 如果我们是https的通信方式, tcpdump捕获的包是tls加密的, 这和我们用wireshark抓包是一致的

参考链接

  1. https://linux.cn/article-4743-1.html
  2. https://juejin.im/post/5d75b6d5e51d453b5c121938#heading-0
  3. https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/lsof.html


作者: cjm00n
地址: https://cjm00n.top/Linux/system-command-learning.html
版权声明: 除特别说明外,所有文章均采用 CC BY 4.0 许可协议,转载请先取得同意。

HFCTF2020 writeup linux基础命令学习

评论