Linux常用工具

说完Windows,哪能不提Linux~

工具多多,不容错过的干货哦~

01

日志工具

1

logdissect

    logdissect用于分析日志文件和其他数据的 CLI 实用程序和 Python API。它可以解析、融合、过滤和导出数据(日志文件或json格式)

2

安装

安装有两种方法,通过github和PyPI

github

需要:python, python-setuptools 

    (and/or python3, python3-setuptools)

wget https://github.com/dogoncouch/logdissect/archive/v3.1.1.tar.gztar -xzf v3.1.1.tar.gzcd logdissect-3.1.1sudo make all

注:笔者在测试时,发现当电脑只存在python2时,需要将logdissect/Makefile文件中以下关于python3的几行注释掉,才能正常安装,否则会报错


 

PyPI

 需要:pip

sudo pip install logdissect

3

选项介绍

用法: 

logdissect.py [-h] [--dhost DHOST] [--grep PATTERN][--last LAST][--process PROCESS][--protocol PROTOCOL][--range RANGE]              [--utc][--rdhost DHOST][--rgrep PATTERN][--rprocess PROCESS] [--rprotocol PROTOCOL][--rshost SHOST][--rsource SOURCE]              [--shost SHOST][--source SOURCE][--linejson LINEJSON] [--outlog OUTLOG][--label LABEL][--sojson SOJSON][--pretty][--version]              [--verbose] [-s] [--list-parsers][-p PARSER][-z]              [-t TZONE][file [file ...]]

位置参数:

file    指定输入文件

选项参数:

-h, --help    查看帮助信息--version     查看程序版本号--verbose     设置详细的终端输出-s            静默输出--list-parsers查看可用的解析器-p PARSER     选择解析器 (default: syslog)-z, --unzip   包含gzip压缩文件-t TZONE      指定UTC时区偏移量 (例如 '+0500')

 过滤选项:

--grep PATTERN     匹配目的主机--grep PATTERN     匹配模式--last LAST        匹配前一个时间段 (例如 5m/3h/2d/etc)--process PROCESS  匹配源进程--protocol PROTOCOL匹配协议--range RANGE      匹配事件范围 (YYYYMMDDhhmm-YYYYMMDDhhmm)(年月日时分)--utc              使用UTC进行范围匹配--rdhost DHOST     过滤掉目标主机--rgrep PATTERN    过滤掉模式--rprocess PROCESS 过滤掉源进程--rprotocol PROTOCOL过滤掉协议--rshost SHOST     过滤掉源主机--rsource SOURCE   过滤掉日志源--shost SHOST      匹配源主机--source SOURCE    匹配日志源

输出选项:

--linejson LINEJSON   设置逐行JSON输出的输出文件--outlog OUTLOG       设置标准日志输出的输出文件--label LABEL         设置输出日志的标签类型 (fname|fpath)--sojson SOJSON       设置单个对象JSON输出的输出文件--pretty              对sojson输出美化格式

4

解析器

--list-parsers    输出==== 可用解析模块: ====ciscoios:思科ios解析模块emerge:gentoo emerge日志解析模块linejson:logdissect每行对象JSON解析模块sojson:logdissect单个对象JSON解析模块syslog: syslog (标准时间戳)解析模块syslogiso:syslog (ISO时间戳)解析模块syslognohost:syslog (没有主机的标准时间戳)解析模块tcpdump:tcpdump终端输出解析模块webaccess:web访问日志解析模块windowsrsyslog:windows rsyslog代理日志解析模块

5

简单用法

查看过去一小时的登录日志:

logdissect --last 1h secure


 

查看过去30分钟systemd和cron进程的日志:

logdissect --last 30m --process systemd --process CRON messages


 

结合详细查看指定时间范围的messages和dmesg日志

logdissect --verbose --range 20190428120000-20190428121000 --label fpath messages dmesg


 

输出过去30天183.238.151.209的访问记录的文件

logdissect -s --outlog myaccess.log --grep 183.238.151.209 --last 30d --label fname /var/log/secure


 

02

进程工具

1

Linux Rootkit (vfs hook) 

    隐藏进程检测工具,一个linux内核模块,是用于检测rootkit的一个小demo。通过读取此内核模块创建的虚拟文件,可检测通过Hook vfs 函数来隐藏的进程。

下载链接:

https://security.tencent.com/index.php/opensource/down/16

2

安装方法

unzip process_list.zipcd process_listmakemake install www.gendan5.com

使用效果:


 

03

网络分析工具

1

Tcpdump

  Tcpdump作为Linux下一款经典的抓包工具有必要进行讲解。

注:抓包只是一个数据包捕获过程,最重要的是对结果的分析。分析过程中,需要掌握主流协议的包结构,否则一切都是徒劳。

2

基础

常用选项:

-i:指定网络接口(如eth0,eth1。网络接口使用ifconfig命令查看)-nn:不对IP地址进行DNS反解析,并且不将端口转换为字符-vv:详细输出数据包信息-w:将捕获的结果存入指定文件,-w后接自定义文件名-r:将存入文件的结果读取出来以便分析

    重要:在抓包过程中,个人强烈建议使用 -n 选项。如果不加-n 选项,tcpdump程序就会对IP地址进行DNS反解析,反解析的过程会耗费相当部分时间。因为这里牵涉到libcap缓冲区,tcpdump捕获的数据包首先会放入缓冲区,然后上层提取。但是上层在尝试做DNS反解析的时间里,缓冲区会由于数据包过多而导致缓冲区溢出,溢出的直接结果就是部分数据包被drop,数据包被drop会对我们的分析过程造成极大影响——实际不丢包,但是数据显示却“丢包”。为了不影响我们的分析结果,个人建议加上-n选项

限定符:

    过滤器表达式由一个或多个基元组成,原语通常由id(名称或数字)前面加一个或多个限定符),tcpdump提供了3种限定符,分别为type、direction、protocol

type(类型):

host    //host 192.168.1.1net     //net 192.168port    //port 80portrange    //portrange 22-801.2.2 direction(数据包方向)srcdstsrc or dstsrc and dst1.2.3 protocal(协议)etheriparprarptcpudpicmp

3

基本语法

过滤主机:

tcpdump -i ehtN -n host IPADDRtcpdump -n -i eth1 host 192.168.1.1  抓取所有经过eth1,目标或源地址是192.168.1.1的数据包tcpdump -i eth1 -n src host 192.168.1.1  指定源地址tcpdump -i eth1 -n dst host 192.168.1.1  指定目标地址

过滤端口:

tcpdump -i eth1 -n port PortNumtcpdump -i eth1 -n port 25 抓取所有经过eth1,目的或源端口是25的网络数据tcpdump -i eth1 -n src port 25    指定源端口

网络过滤:

tcpdump -i eth1 -n net 192.168tcpdump -i eth1 -n src net 192.168

协议过滤:

tcpdump -i ethN -n Protocoltcpdump -i eth1 -n icmptcpdump -i eth1 -n ip

常用表达式:

非:!或者 not

与:&& 或者 and

或:|| 或者 or

tcpdump -i eth1 tcp and port 80 and (dst host 192.168.1.254 or dst host 192.168.1.200)  抓取所有经过eth1,目的地址是192.168.1.254或192.168.1.200;端口是80的TCP数据或者tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'  //前面一个的写法括号需要转义,后一种写法是将表达式用引号引起来

4

包头过滤

    如何从包头过滤信息了?首先要熟悉IP、TCP等协议的包头结构,此处不做赘述。包头过滤的语法如下:

'protocol[x:y]':这里表示的是以protocol协议的第x字节起始,取后面的y字节(字节从0开始编号)'proto[x:y] & z = 0'  : proto[x:y]和z的与操作为0'proto[x:y] & z !=0'  : proto[x:y]和z的与操作不为0'proto[x:y] & z = z'  : proto[x:y]和z的与操作为z'proto[x:y] = z'      : proto[x:y]等于z操作符 : >, <, >=, <=, =, !=

IP协议抓包:

tcpdump-i -n eth1'((ip[2:2] = 1024) and (src host 192.168.1.1'))  抓取经过eth1网卡、数据包大小为1024并且源IP为192.168.1.1的数据包tcpdump -i -n eth1'((ip[2:2] > 1024) and (src host 192.168.1.1))'抓取经过eth1网卡、数据包字节大于1024并且源IP为192.168.1.1的数据包

TCP协议抓包:

抓TCP包:tcpdump -i eth3 -nn -vv tcp and host 218.8.51.194tcpdump: listening on eth3, link-type EN10MB (Ethernet), capture size 65535 bytes17:41:00.159396 IP (tos 0x0, ttl 54, id 2335, offset 0, flags [DF], proto TCP (6), length 60)218.8.51.194.51003 > 182.118.126.96.80: Flags [S], cksum 0xe729 (correct), seq 3087933325, win 14600, options [mss 1460,sackOK,TS val 796071570 ecr 0,nop,wscale 7], length 017:41:00.159427 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)182.118.126.96.80 > 218.8.51.194.51003: Flags [S.], cksum 0xce85 (correct), seq 1946096042, ack 3087933326, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 017:41:00.190017 IP (tos 0x0, ttl 54, id 2336, offset 0, flags [DF], proto TCP (6), length 40)218.8.51.194.51003 > 182.118.126.96.80: Flags [.], cksum 0x47ed (correct), seq 1, ack 1, win 115, length 017:41:00.190354 IP (tos 0x0, ttl 54, id 2337, offset 0, flags [DF], proto TCP (6), length 40)218.8.51.194.51003 > 182.118.126.96.80: Flags [F.], cksum 0x47ec (correct), seq 1, ack 1, win 115, length 017:41:00.190402 IP (tos 0x0, ttl 64, id 57183, offset 0, flags [DF], proto TCP (6), length 40)182.118.126.96.80 > 218.8.51.194.51003: Flags [F.], cksum 0x47eb (correct), seq 1, ack 2, win 115, length 017:41:00.221104 IP (tos 0x0, ttl 54, id 2338, offset 0, flags [DF], proto TCP (6), length 40)218.8.51.194.51003 > 182.118.126.96.80: Flags [.], cksum 0x47eb (correct), seq 2, ack 2, win 115, length 0

结果分析:

上面的结果中,2-3行信息为TCP三次握手的过程,offset 表示偏移量

Flags 后面的标识含义:

S (SYN)

F (FIN)

P (PUSH)

R (RST)

W (ECN CWR)

E (ECN-Echo)

. (no flags)

cksum 表示校验和,其中correct表示校验和正确

抓取目的端口等于80的报文:

tcpdump -i eth1 -nn -vv '((tcp[2:2] = 80))'  //TCP头部的3-4字节为目的端口

抓取源端口等于80的报文:

tcpdump -i eht1 -nn -vv '((tcp[0:2] = 80))'  //TCP头部的1-2字节为源端口

** TCP的8种标记,这些标记在TCP头部的14字节——tcp[13]。TCP使用哪个标记,就会将这个标记的值置为1,如SYN包的二进制表示为: 00000010,十进制就是2

 +-+-+-+-+-+-+-+-+

 |C|E|U|A|P|R|S|F|

 |W|C|R|C|S|S|Y|I|

 |R|E|G|K|H|T|N|N|

 +-+-+-+-+-+-+-+-+

只抓TCP握手过程中的SYN包:

tcpdump -i eth1 -nn -vv '((tcp[13] = 2))'  这个时候标识位的值为 00000010

抓标记为SYN、ACK的包:

tcpdump -i eth3 -nn -vv '((tcp[13] = 18))'  此时标识位的至为 00010010

其他标识位抓包方法一次类推。这种通过数字计算的或许会比较麻烦,因此tcpdump支持了另一种写法,上面两种写法分别如下:

tcpdump -i eth3 -n -vv "tcp[tcpflags] & (tcp-syn) != 0"

tcpdump -i eth3 -nn -vv '((tcp[tcpflags] & tcp-syn != 0) and (tcp[tcpflags] & tcp-ack != 0 ))'

[root@tw13c150 ~]# tcpdump -i eth3 -n -vv "tcp[tcpflags] & (tcp-ack) != 0" and (host 218.8.51.194)

tcpdump: listening on eth3, link-type EN10MB (Ethernet), capture size 65535 bytes

13:46:26.019271 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)

    182.118.126.96.http > 218.8.51.194.58137: Flags [S.], cksum 0xfbc7 (correct), seq 769939001, ack 1488795467, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0

13:46:26.049499 IP (tos 0x0, ttl 56, id 34444, offset 0, flags [DF], proto TCP (6), length 40)

    218.8.51.194.58137 > 182.118.126.96.http: Flags [.], cksum 0x752f (correct), seq 1488795467, ack 769939002, win 115, lengt

其他协议抓包(DNS、HTTP等)

HTTP:tcpdump -i eth3 -nn -vv 'tcp[20:2]=0x4745 or tcp[20:2]=0x4854'//tcp[20:2]=0x4745 表示'GET'的'GE',tcp[20:2]=0x4854 表示HTTP的 'HT'DNS:tcpdump -i eth1 udp dst port 53

    最后,如果需要查看数据内容,可使用tcpdump -s 0 -w filename把数据包都保存下来(-s 0是抓取完整数据包,否则默认只抓68字节。),然后用wireshark分析。

网络丢包分析抓包技巧:

    我们公司的服务器上有很多ping程序,抓包时为了避免其它数据包的影响,我们可以抓特定长度的包。

以ICMP为例:

A端指定数据字节为 1024 bytes pingping -c 400 -i 0.01 -s 1024 -f tw04008s2.sandai.net//那么B端抓IP数据包的长度应为1024(数据长度)+8(8字节ICMP首部)+20(字节IP首部)tcpdump -i eth1 "(ip[2:2]=1052) and src host 123.59.127.2" -w loss.cap//这里的 ip[2:2] 指的是过滤从第三字节开始的两个字节数,因此我过滤出的就是3、4字节

    其实捕获数据包不难,但是我们要学会分析、清洗数据,这就需要十分熟悉各类协议,尤其是TCP,IP,HTTP等

04

内存服务工具

1

Volatility 

volatility 是一款内存取证和分析工具,可以对 dump 出来的内存进行分析,并提取内存中的文件。支持多平台运行(需要python环境),该工具支持 Windows 和 Linux,Kali 下面默认已经安装。

    下载地址:http://www.volatilityfoundation.org/#!releases/component_71401

2

使用方法

要查看可用选项,请运行“python vol.py -h”或“python vol.py —info”

root@kali:~/volatility-master# python vol.py -hVolatility Foundation Volatility Framework 2.6.1Usage: Volatility - A memory forensics analysis platform.

Options:

-h, --help  //list all available options and their default values.Default values may be set in the configuration file(/etc/volatilityrc)--conf-file=/root/.volatilityrc  //User based configuration file-d, --debug  //Debug volatility--plugins=PLUGINS    //Additional plugin directories to use (colon separated)--info  //Print information about all registered objects--cache-directory=/root/.cache/volatility    //Directory where cache files are stored--cache    //Use caching--tz=TZ    //Sets the (Olson) timezone for displaying timestamps.using pytz (if installed) or tzset-f FILENAME, --filename=FILENAME    //Filename to use when opening an image--profile=WinXPSP2x86    //Name of the profile to load (use --info to see a list of supported profiles)-l LOCATION, --location=LOCATION    //A URN location from which to load an address space-w, --write    //Enable write support--dtb=DTB    //DTB Address--shift=SHIFT    //Mac KASLR shift address--output=text    //Output in this format (support is module specific, see the Module Output Options below)--output-file=OUTPUT_FILE    //Write output in this file-v, --verbose    //Verbose information--physical_shift=PHYSICAL_SHIFT    //Linux kernel physical shift address--virtual_shift=VIRTUAL_SHIFT    //Linux kernel virtual shift address-g KDBG, --kdbg=KDBG  //Specify a KDBG virtual address (Note: for 64-bit Windows 8 and above this is the address of KdCopyDataBlock)--force    //Force utilization of suspect profile-k KPCR, --kpcr=KPCR    //Specify a specific KPCR address--cookie=COOKIE    //Specify the address of nt!ObHeaderCookie (valid for Windows 10 only)

支持以下插件:

linux_apihooks  - 检查userland apihookslinux_arp  - 打印ARP表linux_aslr_shift  - 自动检测Linux ASLR转换linux_banner  - 打印Linux横幅信息linux_bash  - 从bash进程内存中恢复bash历史记录linux_bash_env  - 恢复进程的动态环境变量linux_bash_hash  - 从bash进程内存中恢复bash哈希表linux_check_afinfo  - 验证网络协议的操作函数指针linux_check_creds  - 检查是否有任何进程共享凭证结构linux_check_evt_arm  - 检查异常向量表以查找syscall表挂钩linux_check_fop  - 检查rootkit修改的文件操作结构linux_check_idt  - 检查IDT是否已被更改linux_check_inline_kernel  - 检查内联内核挂钩linux_check_modules  - 将模块列表与sysfs信息进行比较(如果有)linux_check_syscall  - 检查系统调用表是否已被更改linux_check_syscall_arm  - 检查系统调用表是否已被更改linux_check_tty  - 检查tty设备的挂钩linux_cpuinfo  - 打印有关每个活动处理器的信息linux_dentry_cache  - 从dentry缓存中收集文件linux_dmesg  - 收集dmesg缓冲区linux_dump_map  - 将选定的内存映射写入磁盘linux_dynamic_env  - 恢复进程的动态环境变量linux_elfs  - 在进程映射中查找ELF二进制文件linux_enumerate_files  - 列出文件系统缓存引用的文件linux_find_file  - 列出并恢复内存中的文件linux_getcwd  - 列出每个进程的当前工作目录linux_hidden_modules  - 刻录内存以查找隐藏的内核模块linux_ifconfig  - 收集活动接口linux_info_regs  - 就像GDB中的'info registers'。它打印出所有的linux_iomem  - 提供类似于/ proc / iomem的输出linux_kernel_opened_files  - 列出从内核中打开的文件linux_keyboard_notifiers  - 解析键盘通知程序调用链linux_ldrmodules  - 将proc映射的输出与libdl中的库列表进行比较linux_library_list  - 列出加载到进程中的库linux_librarydump  - 将进程内存中的共享库转储到磁盘linux_list_raw  - 列出具有混杂套接字的应用程序linux_lsmod  - 收集加载的内核模块linux_lsof  - 列出文件描述符及其路径linux_malfind  - 查找可疑的进程映射linux_memmap  - 转储linux任务的内存映射linux_moddump  - 提取加载的内核模块linux_mount  - 收集已安装的fs /设备linux_mount_cache  - 从kmem_cache收集已安装的fs / deviceslinux_netfilter  - 列出Netfilter挂钩linux_netscan  - 用于网络连接结构linux_netstat  - 列出打开的套接字linux_pidhashtable  - 通过PID哈希表枚举进程linux_pkt_queues  - 将每个进程的数据包队列写入磁盘linux_plthook  - 扫描ELF二进制文件的PLT以挂钩到非NEEDED图像linux_proc_maps  - 收集进程内存映射linux_proc_maps_rb  - 通过映射红黑树收集linux的进程映射linux_procdump  - 将进程的可执行映像转储到磁盘linux_process_hollow  - 检查进程空洞的迹象linux_psaux  - 收集进程以及完整的命令行和开始时间linux_psenv  - 收集进程及其静态环境变量linux_pslist  - 通过遍历task_struct->任务列表来收集活动任务linux_pslist_cache  - 从kmem_cache中收集任务linux_psscan  - 扫描进程的物理内存linux_pstree  - 显示进程之间的父/子关系linux_psxview  - 查找包含各种流程列表的隐藏流程linux_recover_filesystem  - 从内存中恢复整个缓存的文件系统linux_route_cache  - 从内存中恢复路由缓存linux_sk_buff_cache  - 从sk_buff kmem_cache中恢复数据包linux_slabinfo  - 正在运行的机器上的Mimics / proc / slabinfolinux_strings  - 将物理偏移与虚拟地址匹配(可能需要一段时间,非常详细)linux_threads  - 打印进程的线程linux_tmpfs  - 从内存中恢复tmpfs文件系统linux_truecrypt_passphrase  - 恢复缓存的Truecrypt密码linux_vma_cache  - 从vm_area_struct缓存中收集VMAlinux_volshell  - 内存映像中的Shelllinux_yarascan  -  Linux内存映像中的shell

下面简单介绍以Linux dump出来的内存文件分析

查看网络连接信息:


 

查看进程信息


 

05

信息收集工具

1

FastIR Collector

   FastIR Collector Linux,可以快速完成Linux服务器各项数据的信息收集,无需掌握linux各种复杂的命令与参数。该工具可以收集:系统信息(内核版本、内核模块、网络接口、主机名、发行版本),用户登录信息,网络连接,用户数据,自动进程,磁盘信息,文件系统信息等,并将结果输出为csv文件。FastIRcollector同样也有Windows的版本,可以用来收集Windows系统信息。

下载地址:git clone https://github.com/SekoiaLab/Fastir_Collector_Linux.git

运行环境:代码运行在python2环境下,python 2.4以上版本。必须以root账户运行

2

使用方法

cd Fastir_Collector_Linuxpython fastIR_collector_linux.py

命令执行后,会生成output目录,收集的所有数据会打包放在该目录下。

使用sz命令下载该压缩包到本地环境。(yum install -y lszrz,可安装rz与sz)

也可以使用ftp或sftp传输


 

 

参数:


 
原文地址:https://www.cnblogs.com/gendan5/p/11526209.html