[TOC]
Linux三剑客 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 文本分析AWK # awk是一种编程语言,是一个文本处理工具,是一个强大的命令行解释器,用于在linux/unix下对文本和数据进行处理 ;awk 可以执行一系列的操作,包括从文件或管道中读取文本数据、解析文本中的字段和行、过滤和转换数据、执行计算和打印结果等。它是一种灵活的工具,可以通过编写脚本来控制其行为和操作。 awk 的名称来自于它的创建者 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏的首字母。 数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出; 它支持用户自定义函数和动态正则表达式; awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势 基本语法: # awk [options] 'Pattern{Action}' filename command [选项 参数] '模式{动作}' 文件 其中: pattern:是一个正则表达式,用于匹配文本中的特定行或数据。 action:是在匹配到 pattern 时要执行的一组命令。 file:是要处理的文本文件的名称或从标准输入读取的数据。 常用命令选项: # -F fs #fs指定命令分隔符,如 -F: 如果没有指定分割符,默认使用空格作为分隔符(或使用-v FS,FS是内置变量) -v var=value #赋值一个用户定义变量,将外部变量传递给awk,比如使用-v OFS="+" ,指定输出分隔符 -f script #从脚本文件中读取awk命令 最简单的用法:只用action # $ echo "hello world" > test $ awk '{print}' test hello world $ awk '{print $0}' test #$0 表示所有域(默认用空格当作分隔符) hello world $ awk '{print $1}' test #$1 表示第一个域,两个域用逗号隔开$1 ,$2 ,去掉逗号或换为空格输出时会没有分隔符显示在一列 hello ############################## df -h | awk '{print $5}' #df显示磁盘使用情况,这里使用awk只打印每行的第五列,$NF可以只输出每行的最后一列 特殊模式的用法: # BEGIN 模式指定了处理文本之前需要执行的操作:(BEGIN开始);不指定文件也能输出(但是后边指定操作也会卡住) END 模式指定了处理完所有行之后所需要执行的操作:(END结束);不指定文件会卡住 $ awk 'BEGIN{print "wintrysec"} {print $0} END{print "1080"}' test wintrysec hello world 1080 AWK变量: # 常用内置变量: FS #输入字段分隔符, 默认为空白字符 OFS #输出字段分隔符, 默认为空白字符 RS #输入记录分隔符(默认输入是换行符), 指定输入时的换行符 ORS #输出记录分隔符(输出换行符),输出时用指定符号代替换行符 NF #number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量 NR #行号,当前处理的文本行的行号。 FNR #各文件分别计数的行号,另一个文件从1 开始计行数 ARGC #命令行参数的个数 ARGV #数组,保存的是命令行所给定的各参数,AGRV[0 ]是awk FILENAME#当前文件名 自定义变量的两种用法: $ awk -v name="wintrysec" ,age=19 'BEGIN{print name}' #第一种方法用-v选项,多个参数用逗号分隔 不加BENGIN会卡住 wintrysec $ awk 'BEGIN{name="wintrysec";age=18;print name,age}' #第二种方法,直接在程序中定义,多个参数用分号分隔 wintrysec 18 举例 # 例如,如果你想要从一个名为 example.txt 的文件中提取第二列(使用空格作为分隔符),可以使用以下命令: awk '{print $2}' example.txt 如果您想要计算文件中第一列的总和,则可以使用以下命令: awk '{sum += $1} END {print sum}' example.txt 这将把第一列的值相加,并在处理完整个文件后输出总和。 文本批量处理sed # sed -- Stream EDitor 主要用来自动编辑一个或多个文件;简化对文件的反复操作; 命令格式: # sed [options] 'command' file(s) sed [options] -f scriptfile file(s) 常用选项: # -e<script> #以选项中的指定的script来处理输入的文本文件; -f<script文件> #以选项中指定的script文件来处理输入的文本文件; -n #仅显示script处理后的结果; 替换标记: # g #表示行内全面替换;即替换每一行中的所有匹配 p #表示打印行。 w #表示把行写入一个文件。 x #表示互换模板块中的文本和缓冲区中的文本。 y #表示把一个字符翻译为另外的字符(但是不用于正则表达式) \1 #子串匹配标记 & #已匹配字符串标记 常用命令: # d 删除,删除选择的行。 s 替换指定字符 p 打印模板块的行。 P (大写) 打印模板块的第一行。 常见用法: # 替换文本中的字符串 (如linux日志处理,伪造IP) sed -i 's/192.168.1.3/192.168.1.4/g' xxx.log #-i选项表示直接编辑文件 定界符: 以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符: sed 's|test|TEXT|g' 定界符出现在样式内部时,需要进行转义: sed 's/\/bin/\/usr\/local\/bin/g' 删除操作(d命令): sed '/^$/d' file #删除空白行 sed '2d' file #删除文件的第二行 sed '2,$d' file #删除文件的第2 行到末尾所有行 sed '$d' file #删除文件最后一行 sed '/^test/' d file #删除文件中所有开头是test的行 常见面试题 # 把/oldboy目录以及子目录下所有以扩展名为.sh结尾的文件包含oldboy的字符串全部替换为oldgirl find /oldboy -type f -name "*.sh" |xargs sed "s#oldboy#oldgirl#g" grep文本正则匹配 # grep #正则匹配,搜索文本."Global Regular Expression Print" 这是一个用于在文本中查找和过滤匹配字符串或正则表达式的命令.帮助用户快速定位关键信息。 常见用法: grep "text" file_name #返回一个包含text的文本行 grep "text" file1 file2 #在多个文件中查找 grep -v "text" file_name #-v选项,输出排除text之外的所有行 grep -E "[1-9]+" #-e选项,使用正则表达式 grep -c "text" file_name #统计文件中匹配字符串的行数
Linux基础命令 1 2 3 4 5 6 7 8 9 10 11 12 pwd 、cd 、ls -al、touch 、mkdir cp 、mv 、rm 、find / -name xx* 、du (计算目录容量)cat 、more (逐页阅读,空格下一页,b返回上一页)head -n 2 xx.txt tail -n 3 ca.* echo ln -s 源文件 目标文件 wc Vim工作模式:普通模式、插入模式(i)、命令模式(:) Vim查找替换:普通模式下-> /向下查找 ?向上查找 n跳到下一个匹配处
账户管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 id passwd -l -d -S useradd groupadd usermod userdel groupdel root:x:0:0:root:/root:/bin/bash 用户名:密码:用户ID:组ID:用户说明(描述):用户主(家)目录:缺省shell(登陆后的shell) 注意:无密码只允许本机登陆,远程不允许登陆 root:$Gs1qhL2p3ZetrE4 .kMHx6qgbTcjQSt.Ft7ql1WpkopY/:16809:0:99999:7::: 用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔: 密码有效期:密码到期的警告天数:密码过期宽限天数:账号失效时间:保留 root:x:0: 组名:口令:组标识号:组内用户列表 who w uptime
文件和目录权限管理 1 2 3 4 5 drwx-rwx-rwx chmod chown chmod +x Test.sh chmod -x Test.sh
计划任务 都是以当前用户的权限去执行计划任务的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ## at一次性计划任务 [#](https: //wiki.wgpsec.org/knowledge/base/linux-cmd.html#at一次性计划任务)需要开启`atd`服务(需要root权限) ```bash sudo /etc/init.d/atd restart ``` **at的运行方式** 事实上我们仅使用at命令来生成所要运行的工作,并将这个工作以文本文件的方式写入/var/spool/at目录内 该工作就可以被`atd`服务取用并执行,at的实际工作情况是这样的: > 1 :先查找`/etc/at.allow`文件,写在这个文件中的用户才可以使用at,没有在`at.allow`文件中的用户就不可以使用,即使`at.deny`中也没有 > > 2 :如果`at.allow`不存在,就查找`/etc/at.deny`,写在这个文件中的用户都不能使用at,而其他用户都可以使用at > > 3 :如果两个文件都不存在,那么就只有root用户可以执行at **选项参数: -l #相当于atq,列出系统上该用户的所有at调度 -d #相当于atrm,取消一个在at中调度的工作 -v #使用较明显的时间格式列出at调度中的任务列表 -c #查看at计划任务的具体内容,后接job名 $ at 18: 00 at>sh cmd.sh at>(输入ctrl+d)
crontab 周期性计划任务 (user权限不能查看www-data
权限的任务)
1 2 3 4 5 6 7 8 9 10 11 12 -u -e -l -r -i 0 12 * * * sh shell.sh
前面5个字段分别表示分钟 ,小时 ,日期 ,月份 ,周 ,后面接的是命令
代表意义
分钟
小时
日期
月份
周
命令
数字范围
0-59
0-23
0-31
0-12
0-7
要执行的命令
其中周里面的0和7都代表周日,注意周与日月不可并存
特殊字符:
特殊字符
代表意义
*(星号)
任意时刻,如0 12 * * * sh shell.sh
的*代表每个月的每个周中的每一天
,(逗号)
代表分割时段,例如0 3,6 * * * command,表示在3点和6点时执行任务,注意不要有空格符
-(减号)
代表时间段范围,例如在凌晨1点到6点的30分的时候执行command命令则应该是 30 1-6 * * * command
/n
表示每隔n个单位间隔执行一次的意思,*/11-23 * * * command表示凌晨1到晚上23点时间段内每隔1分钟执行一次
网络监控netstat 1 2 3 4 5 6 7 8 9 netstat -a -n -t -p -l -u -s
查看当前端口连接
ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。
Windows平台netstat详解 #
netstat 用于显示与IP 、TCP 、UDP 和ICMP 协议相关的统计数据,一般用于检验本机各端口的网络连接情况.
1 2 3 4 5 6 -a 显示所有连接和监听端口 -n 以数字形式显示地址和端口号,显示所有已建立的有效连接 -o 显示进程 PID -p proto ,指定协议TCP、UDP -r 打印路由表,通route print
状态列表
1 2 3 4 5 LISTEN ESTABLISHED TIME_WAIT CLOSE_WAIT FIN_WAIT_2
对外发包还是被连接? 高端口连接低端口
进程监控 PS # 1 2 3 4 5 6 7 8 ps aux | grep amoeba kill -s 9 pid a u x
Linux上进程有5种状态:
运行 (正在运行或在运行队列中等待)
中断 (休眠中, 受阻, 在等待某个条件的形成或接受到信号)
不可中断 (收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
僵死 (进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
停止 (进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
ps aux
输出格式:
1 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1
格式说明:
USER
: 行程拥有者
%CPU
: 占用的 CPU 使用率
%MEM
: 占用的记忆体使用率
VSZ
: 占用的虚拟记忆体大小
RSS
: 占用的记忆体大小
TTY
: 终端的次要装置号码 (minor device number of tty)
STAT
: 该行程的状态,linux
的进程有5种状态:
D 不可中断 uninterruptible
sleep (usually IO)
R 运行 runnable (on run queue)
S 中断 sleeping
T 停止 traced or stopped
Z 僵死 a defunct (”zombie”) process
注: 其它状态还包括W(无驻留页), <(高优先级进程), N(低优先级进程), L(内存锁页)
START: 行程开始时间
TIME: 执行的时间
COMMAND:所执行的指令
wget和curl命令 # wget
1 2 3 4 wget命令用来从指定URL下载文件,稳定、支持断点续传。 -O -c
curl
1 2 3 4 5 6 7 8 9 10 curl命令是一个利用URL规则在命令行下工作的文件传输工具 -O -L -i -I -v -X -H -d
Linux后台执行命令 # 1 2 3 4 5 6 7 8 9 1、ctrl + z 2、bg 3、& 4、nohup ./task 5、jobs 6、fg
获取/proc目录信息 #
其中的部分文件分别对应正在运行的进程,可用于访问当前进程的地址空间。
它是一个非常特殊的虚拟文件系统,其中并不包含“实际的”文件,而是可用以引用当前运行系统的系统信息,
如CPU、内存、运行时间、软件配置以及硬件配置的信息,这些信息是在内存中由系统自己产生的。
/proc/net
其中的文件分别表示各种网络协议(如TCP、UDP以及ARP等)的状态与统计信息。 /proc/sys
这个目录不仅存有各种系统信息,而且也包含系统内核与TCP/IP网络的可调参数。
其中的kernel子目录含有共享内存和消息队列的可调参数,net子目录中含有TCP/IP的各种可调参数。
Centos系统设置 # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 yum provides ifconfig yum -y install net-tools vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO=dhcp/static IPADDR=192.168.1.11 NETMASK=255.255.255.0 GATEWAY=192.168.1.255 vi /etc/resolv.conf nameserver 114.114.114.114 service network restart
防火墙 FireWall 和 SELinux 打开和关闭 # 1 2 3 4 firewall-cmd --state systemctl start firewall.service systemctl stop firewall.service systemctl disable firewall.service
SELinux是「Security-Enhanced Linux」的简称,是Linux的一个扩张强制访问控制安全模块
1 2 3 4 5 6 7 8 setenforce 0 vim /etc/selinux/config/ --> SELINUX=disabled
systemctl 命令使用详解 # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 systemctl list-units systemctl list-units-files systemctl status sshd systemctl restart sshd systemctl enable sshd systemctl set-default multi-user.target systemctl set-default graphical.target
配置防火墙 # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 firewall-cmd --query-port=80/tcp firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --remove-port=80/tcp firewall-cmd --reload 1、firwall-cmd:是Linux提供的操作firewall的一个工具; 2、--permanent:表示设置为持久; 3、--add-port:标识添加的端口; firewall-cmd --permanent --add-rich-rule="rule family=" ipv4" source address=" 192.168.189.128" port protocol=" tcp" port=" 80" accept" firewall-cmd --permanent --remove-rich-rule="rule family=" ipv4" source address=" 192.168.189.128" accept" firewall-cmd --permanent --add-rich-rule="rule family=" ipv4" source address=" 192.168.0.0/16" accept" firewall-cmd --permanent --add-rich-rule="rule family=" ipv4" source address=" 192.168.1.0/24" port protocol=" tcp" port=" 9200" accept" firewall-cmd --reload
iptables工作在TCPIP模型中的第七层,应用层 #
目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关。
对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。
但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查。
所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。
所以市面上通常的防火墙方案,都是两者结合的。
而又由于我们都需要从防火墙所控制的这个口来访问
所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制
配置的不好甚至有可能成为流量的瓶颈。
linux应急响应 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 账号安全 先查看基础用户信息文件(/etc/passwd,/etc/shadow,/etc/group) 1、查询特权用户特权用户(uid 为0) awk -F: '$3==0{print $1}' /etc/passwd 2、查询可以远程登录的帐号信息 awk '/\$1|\$6/{print $1}' /etc/shadow 3、除root帐号外,其他帐号是否存在sudo 权限。如非管理需要,普通帐号应删除sudo 权限 more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)" 4、禁用或删除多余及可疑的帐号 usermod -L user userdel -r user 查看历史命令 cat ~/bash_history >> history.txt检查网络连接 netstat -antlp|more file /proc/$PID /exe 检查异常进程 ps aux | grep pid 检查开机启动项 系统运行级别示意图: 运行级别 含义 0 关机 1 单用户模式,可以想象为windows的安全模式,主要用于系统修复 2 不完全的命令行模式,不含NFS服务 3 完全的命令行模式,就是标准字符界面 4 系统保留 5 图形模式 6 重启动 vi /etc/inittab id =3:initdefault 当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在/etc/init.d目录下,然后在/etc/rc.d/rc*.d中建立软链接即可 ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh 检查定时任务 ls -al /var/spool/cron/* cat /etc/crontab/etc/cron.d/* /etc/cron.daily/* /etc/cron.hourly/* /etc/cron.monthly/* /etc/cron.weekly/ more /etc/cron.d/* /etc/anacrontab /var/spool/anacron/* 检查服务 chkconfig --list /user/local/ 检查异常文件 1、查看敏感目录,如/tmp目录下的文件,同时注意隐藏文件夹,以“..”为名的文件夹具有隐藏属性 2、针对可疑文件可以使用stat 查看创建修改时间 3、发现WebShell、远控木马的创建时间 如何找出同一时间范围内创建的文件? find ./ -iname "*" -atime 1 -type f 检查系统日志 日志默认存放位置:/var/log/ 查看日志配置情况:more /etc/rsyslog.conf 日志文件 说明 /var/log/cron 记录系统定时任务相关的日志 /var/log/message 记录Linux操作系统常见的系统和服务错误信息(首要检查对象) /var/log/btmp 记录错误登录(登陆失败)日志;使用lastb命令查看 /var/log/lastlog 记录系统中所有用户最后一次成功登录时间,使用lastlog命令查看 /var/log/wtmp 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件;用last命令来查看 /var/log/utmp 只记录当前登录用户的信息;使用w,who ,users 等命令来查询 /var/log/secure 记录验证和授权方面的信息,如SSH登录,su切换用户,sudo 授权,甚至添加用户和修改用户密码 more /var/log/secure /var/log/yum.log /var/log/apt/ /var/log/syslog:只记录警告信息,常常是系统出问题的信息; syslog是Linux系统默认的日志守护进程 默认的syslog配置文件是/etc/sysctl.conf文件 syslog不可以使用vi等工具直接查看,它是二进制文件,使用 lastlog 查看 默认Centos,Fedora不生成该日志文件,但可以配置让系统生成该日志文件 /etc/rsyslog.conf文件中加上:*.warning /var/log/syslog 该日志文件能记录当用户登录时login记录下的错误口令、Sendmail的问题、su命令执行失败等信息 正确清空syslog日志的方式 cat /dev/null > /etc/init.d/syslog
Windows应急响应 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 检查系统账号 query user logoff ID 打开lusrmgr.msc,查看是否有新增/可疑的账号 用D盾 -> 查看服务器是否存在隐藏账号、克隆账号 查看网络连接 netstat -ano route print REG QUERY "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" 检查进程 tasklist taskkill /T /F /PID 检查启动项 net statistics workstation schtasks /query /fo LIST /v wmic startup get command ,caption wmic service list brief 检查浏览器访问记录 直接打开浏览器查看 杀软工具 火绒-火绒剑:https://www.huorong.cn/ 卡巴斯基:http://devbuilds.kaspersky-labs.com/kvrt/latest/full/ 系统日志审计 运行框输入eventvwr.msc,打开事件查看器 系统日志 记录操作系统组件产生的事件,主要包括驱动程序、系统组件和应用软件的崩溃以及数据丢失错误等。 系统日志中记录的时间类型由Windows NT/2000操作系统预先定义。 默认位置:%SystemRoot%System32WinevtLogsSystem.evtx 应用程序日志 包含由应用程序或系统程序记录的事件,主要记录程序运行方面的事件 例如数据库程序可以在应用程序日志中记录文件错误,程序开发人员可以自行决定监视哪些事件。 如果某个应用程序出现崩溃情况,那么我们可以从程序事件日志中找到相应的记录,也许会有助于你解决问题。 默认位置:%SystemRoot%System32WinevtLogsApplication.evtx 安全日志 记录系统的安全审计事件,包含各种类型的登录日志、对象访问日志、进程追踪日志、特权使用、帐号管理、策略变更、系统事件。 安全日志也是调查取证中最常用到的日志。 默认设置下,安全性日志是关闭的,管理员可以使用组策略来启动安全性日志 或者在注册表中设置审核策略,以便当安全性日志满后使系统停止响应。 默认位置:%SystemRoot%System32WinevtLogsSecurity.evtx 系统和应用程序日志存储着故障排除信息,对于系统管理员更为有用。 安全日志记录着事件审计信息,包括用户验证(登录、远程访问等)和特定用户在认证后对系统做了什么,对于调查人员而言,更有帮助。 事件日志分析 对于Windows事件日志分析,不同的EVENT ID代表了不同的意义 事件ID 说明 4624 登录成功 4625 登录失败 4634 注销成功 4647 用户启动的注销 4672 使用超级用户(如管理员)进行登录 4720 创建用户 每个成功登录的事件都会标记一个登录类型,不同登录类型代表不同的方式: 登录类型 描述 说明 2 c(Interactive) 用户在本地进行登录。 3 网络(Network) 最常见的情况就是连接到共享文件夹或共享打印机时。 4 批处理(Batch) 通常表明某计划任务启动。 5 服务(Service) 每种服务都被配置在某个特定的用户账号下运行。 7 解锁(Unlock) 屏保解锁。 8 网络明文(NetworkCleartext) 登录的密码在网络上是通过明文传输的,如FTP。 9 新凭证(NewCredentials) 使用带/Netonly 参数的RUNAS命令运行一个程序。 10 远程交互,(RemoteInteractive) 通过终端服务、远程桌面或远程协助访问计算机。 11 缓存交互(CachedInteractive) 以一个域用户登录而又没有域控制器可
Slogan:
Do you believe in DESTINY ?