【Linux应急响应】护网防守方自救指南

admin 2024年7月21日09:37:27评论30 views字数 8462阅读28分12秒阅读模式

下周一 一年一度的护网即将开始,不同以往,据传今年开始常态化护网,时长2个月之久。作为蓝队如何快速排查入侵?

本文总结了一些Linux常用的命令,可帮助新手快速排查入侵痕迹

【Linux应急响应】护网防守方自救指南

隐藏进程排查

ps -ef | awk '{print}' | sort | uniq > 1 && ps -ef | awk '{print}' | sort | uniq > 2  && diff 1 2

进程资源排查

使用top命令查看所有进程消耗资源的情况,并未发现异常进程,没有预期的CPU或MEM占用过高的进程。

top

查看进程路径

lsof -p PID

进程模块查看

pmap 【PID】

【Linux应急响应】护网防守方自救指南

查看进程的子进程

pstree -asp 【PID】

查看进程启动目录和启动程序(内存程序路径查看)

ls -l /proc/【PID】/cwd /proc/【PID】/exe

进程跟踪

strace -p 【PID】  跟踪一个已经存在的进程

strace 【cmd】 跟踪命令执行过程

额外参数

-t  打印时间

-T  打印时间消耗

【Linux应急响应】护网防守方自救指南

抓包

tcpdump -i eth0 (host 93.240.52.232 and port 3389) or (host 139.99.125.38 and port 443) -w dhpcd.pcap

计划任务排查

排查计划任务

find /etc/*cron* ! -type d -exec ls -lctr --full-time {} + 2>/dev/nullfind /var/spool/cron -type f -exec ls -lctr --full-time {} + 2>/dev/null

启动项

find /etc/rc.d/ -type f -exec ls -lctr --full-time {} + 2>/dev/null

自启动服务

chkconfig --list
service --status-all

命令别名

alias

排查别名命令

find / -name *bashrc* -type f -exec ls -lctr --full-time {} + 2>/dev/null

二、文件及敏感目录排查

文件查看

-a:查看所有文件  -l:按照时间顺序列出  -t:倒序

ls -alt

【Linux应急响应】护网防守方自救指南

排查临时目录

find /tmp ! -type d -exec ls -lctr --full-time {} + 2>/dev/null

排查Home目录

find $HOME ! -type d -exec ls -lctr --full-time {} + 2>/dev/null

特权文件排查

find / -perm 2000 2>/dev/null

按照时间文件排查

find / -newerct '2024-01-24 08:10:00' ! -newerct '2024-01-24 09:10:00' ! -path '/proc/*' ! -path /'sys/*' ! -path '/run/*' -type f -exec ls -lctr --full-time {} + 2>/dev/null

文件创建及修改时间查询

stat 【文件名路径/文件名】

查看文件被哪个进程使用

lsof 【文件路径/文件名】

找到的文件可放入在线沙箱中分析,如微步、

三、后门账户排查

SSH登录账户

排查可以登录SSH的账户

cat /etc/passwd | grep -v nologin$

排查UID是0的超级权限账户

cat /etc/passwd | awk -F: '$3==0 {print $1}'

排查有口令的SSH账户

cat /etc/shadow | awk -F: 'length($2)>2 {print $1}'

排查空口令账户

cat /etc/shadow | awk -F: 'length($2)==0 {print $1}'

SSH登录密钥

cat /root/.ssh/authorized_keys

四、后门程序排查

Linux后门启动方式

【Linux应急响应】护网防守方自救指南

开机启动脚本文件

/etc/rc.local

【Linux应急响应】护网防守方自救指南

服务启动脚本文件

/ect/init.d/

【Linux应急响应】护网防守方自救指南

crond 计划任务

查看计划任务列表

cat /etc/crontabcrontab -l

【Linux应急响应】护网防守方自救指南

【Linux应急响应】护网防守方自救指南

环境变量设置

包括 :

/etc/profile  .bash_profile .bash_login .bash_logout

/etc/profile

此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜

集shell的设置。影响所有用户。

~/.bash_profile

每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置

一些环境变量,执行用户的.bashrc文件。

~/.bashrc

该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。

~/.bash_logout

当每次退出系统(退出bash shell)时,执行该文件。

文件修改

文件替换

一般使用恶意程序替换常用程序,例如:ls、ps、lsof、netstat等

文件别名

临时设置:alias 自定义命令=‘命令或脚本语句‘,例如:alias show= 'ls -al’

永久设置:修改配置文件~/.bashrc,命令与上面相同

SSHD软连接后门

建立sshd的软连接方法,开启其它的端口例如

【Linux应急响应】护网防守方自救指南

【Linux应急响应】护网防守方自救指南

Linux后门关键技术

预加载技术

我们以劫持系统execve和open函数为例讲解:

假设有个正常程序(使用execve和open函数),openfile.c:

【Linux应急响应】护网防守方自救指南

劫持程序源码(重写了系统标准库内的execve和open函数)hack.c

【Linux应急响应】护网防守方自救指南

编译:

gcc -o openfile openfile.cgcc -fpic -c -ldl hack.cgcc -shared -lc -o hack.so hack.o

测试执行(未预加载时):

【Linux应急响应】护网防守方自救指南

测试执行(预加载后):

【Linux应急响应】护网防守方自救指南

SUID权限位

SUID 是 Set User ID 。SUID的作用:当运行被设置了SUID属性的程序时,无论是谁,只要拥有程序的执

行权,即可以该程序所有者身份访问系统资源。例如passwd、ping等:

【Linux应急响应】护网防守方自救指南

【Linux应急响应】护网防守方自救指南

进程注入

使用ptrace向已运行进程中注入.so并执行相关函数,其中的“注入”二字的真正含义为:此.so被link

到已运行进程空间中,从而.so中的函数在目标进程空间中有对应的地址,然后通过此地址便可在目

标进程中进行调用

方法

Ø 1、在目标进程中找到存放“加载.so的实现代码“的空间(通过mmap实现)

Ø 2、把“加载.so的实现代码“写入目标进程指定的空间

Ø 3、启动执行

Linux 后门排查方法

RPM包可信校验

rpm -Vf [可执行文件路径]

【Linux应急响应】护网防守方自救指南

校验所有安装包

rpm -V -a

【Linux应急响应】护网防守方自救指南

系统升过级,使用该命令也会提示被修改

别名查询

alias

【Linux应急响应】护网防守方自救指南

网站后门排查

排查上传文件目录PHP文件

find ./ -name "*.php"

排查web目录下新创建文件

find / -ctime -l

批量过滤关键字如:eval等

grep eval /var/www/html/* find ./ | xargs grep eval

条件允许情况下使用D盾等工具查杀

五、日志分析

Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。本文简介一下Linux系统日志及日志分析技巧。

日志默认存放位置:/var/log/

查看日志配置情况:more /etc/rsyslog.conf

日志文件

说明

/var/log/cron

记录了系统定时任务相关的日志

/var/log/cups

记录打印信息的日志

/var/log/dmesg

记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息

/var/log/mailog

记录邮件信息

/var/log/message

记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件

/var/log/btmp

记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看

/var/log/lastlog

记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看

/var/log/wtmp

永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看

/var/log/utmp

记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询

/var/log/secure

记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中

比较重要的几个日志:

登录失败记录:/var/log/btmp     //lastb

最后一次登录:/var/log/lastlog  //lastlog

登录成功记录: /var/log/wtmp     //last

登录日志记录:/var/log/secure  

历史命令记录:history

仅清理当前用户:history -c

系统日志

安全日志secure

查看最近登录IP

cat /var/log/secure* | grep Accepted | awk '{print $11}' | sort | uniq -c | sort -nr

查询IP登录失败次数

cat /var/log/secure* | grep 8.219.176.16 | grep Failed | wc -l

查询IP登录成功次数

cat /var/log/secure* | grep 222.186.16.186 | grep Accepted | wc -l

查询IP登录时间

cat /var/log/secure* | grep 8.219.176.16

查询IP登录时间

cat /var/log/secure* | grep 222.186.16.18

定位有多少IP在爆破主机的root帐号

grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

定位有哪些IP在爆破

grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

爆破用户名字典是什么

grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1n";}'|uniq -c|sort -nr

登录成功的IP有哪些

grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

登录成功的日期、用户名、IP

grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'

软件升级卸载日志

/var/log/yum.log

more /var/log/yum.log

用户日志分析

wtmp日志记录了用户的登录、退出、重启等情况,可以查看系统是否存在异常

用户登录,判断攻击者是否已经登录服务器,由于wtmp日志为二进制文件,所

以利用last命令查看,last -t 20210111120950 ,可查看这个时间之前的日志

last -t 20210111120950

查看用户最后登录系统的信息

它根据UID排序显示登录名、端口号(tty )和上次登录时间

如果一个用户从未登录过,lastlog 显示Never logged。

lastlog

【Linux应急响应】护网防守方自救指南

查看用户正在登录系统的信息

utmp日志记录当前用户的一些信息,由于utmp日志文件同样为二进制文件,可通过w、who命令查看

w

Cron日志分析

tail -f /var/log/cron

记录是否执行了定时任务的脚本

【Linux应急响应】护网防守方自救指南

具体执行是否正确以及脚本执行过程中的信息,

linux会发邮件到此用户/var/spool/mail/路径下。使用less、more等命令均可查看

命令日志history

history(/root/.bash_history)

中间件日志

Apache 日志分析

路径配置文件在http.conf中

Linux日志文件默认位置

/usr/local/apache/logs/access_log 或者位于/var/log/http

列出当天访问次数最多的IP

cut -d- -f 1 access_log|uniq -c | sort -rn | head -20

【Linux应急响应】护网防守方自救指南

查看每一个IP访问了多少个页面

awk '{++S[$1]} END {for (a in S) print a,S[a]}' access_log

【Linux应急响应】护网防守方自救指南

将每个IP访问的页面数进行从小到大排序:

awk '{++S[$1]} END {for (a in S) print S[a],a}' log_file | sort -n

查看2018年6月21日14时这一个小时内有多少IP访问

awk '{print $4,$1}' log_file | grep 21/Jun/2018:14 | awk '{print $2}'| sort | uniq | wc -l

HTTP Status:

cat  /www/logs/access.log |awk '{print $9}'|sort|uniq -c|sort -rn|more

URL 统计:

cat  access.log |awk '{print $7}'|sort|uniq -c|sort -rn|more      

文件流量统计

cat access.log |awk '{sum[$7]+=$10}END{for(i in sum){print sum[i],i}}'|sort -rn|more

URL访问量统计

cat /www/logs/access.log | awk '{print $7}' | egrep '?|&' | sort | uniq -c | sort -rn | more

查看某一个IP访问了哪些页面

grep ^172.17.0.1 log_file| awk '{print $1,$7}'

查看某一个页面被访问的次数

grep "/index.php" log_file | wc -l

在对日志进行安全分析时,可以按照三种思路展开,逐步深入,还原整个攻击过程。

第一种:登录事件。重点关注登录事件,特别是异常时间节点对远程登录(深更半夜)

第二种:时间定位法。确定入侵的时间范围,以此为线索,查找这个时间范围内可疑的日

志,进一步排查,最终确定攻击者,还原攻击过程。

第三种:后门文件、后门账号反查。攻击者在入侵网站后,通常会留下后门维持权限,以

方便再次访问,我们可以找到该文件,并以此为线索来展开分析。

数据库日志

常见的数据库攻击包括弱口令、SQL注入、提升权限、窃取备份等。对数据库日志进行分析,可以发现攻击行为,进一步还原攻击场景及追溯攻击源。

MySQL日志分析

general query log能记录成功连接和每次执行的查询,我们可以将它用作安全布防的一部分,为故障分析或黑客事件后的调查提供依据。

查看log配置信息

开启日志

SET GLOBAL general_log = 'On';

指定日志文件路径

SET GLOBAL general_log_file = '/var/lib/mysql/mysql.log';

日志分析

比如,当我访问 /test.php?id=1,此时我们得到这样的日志:

190604 14:46:14   14 Connect    root@localhost on                   14 Init DB    test                  14 Query    SELECT * FROM admin WHERE id = 1                  14 Quit  `

我们按列来解析一下:

第一列:Time,时间列,前面一个是日期,后面一个是小时和分钟,有一些不显示的原因是因为这些sql语句几乎是同时执行的,所以就不另外记录时间了。第二列:Id,就是show processlist出来的第一列的线程ID,对于长连接和一些比较耗时的sql语句,你可以精确找出究竟是那一条那一个线程在运行。第三列:Command,操作类型,比如Connect就是连接数据库,Query就是查询数据库(增删查改都显示为查询),可以特定过虑一些操作。第四列:Argument,详细信息,例如 Connect    root@localhost on 意思就是连接数据库,如此类推,接下面的连上数据库之后,做了什么查询的操作。

登录成功/失败

使用我以前自己开发的弱口令工具来扫一下,字典设置比较小,2个用户,4个密码,共8组

MySQL中的log记录是

Time                 Id        Command         Argument190601 22:03:20     98          Connect  root@192.168.204.1 on                    98          Connect  Access denied for user 'root'@'192.168.204.1' (using password: YES)                   103         Connect  mysql@192.168.204.1 on                    103         Connect  Access denied for user 'mysql'@'192.168.204.1' (using password: YES)                  104          Connect  mysql@192.168.204.1 on                   104          Connect  Access denied for user 'mysql'@'192.168.204.1' (using password: YES)                  100          Connect  root@192.168.204.1 on                   101          Connect  root@192.168.204.1 on                   101          Connect  Access denied for user 'root'@'192.168.204.1' (using password: YES)                   99          Connect  root@192.168.204.1 on                    99          Connect  Access denied for user 'root'@'192.168.204.1' (using password: YES)                  105          Connect  mysql@192.168.204.1 on                   105          Connect  Access denied for user 'mysql'@'192.168.204.1' (using password: YES)                  100          Query  set autocommit=0                  102          Connect  mysql@192.168.204.1 on                   102          Connect  Access denied for user 'mysql'@'192.168.204.1' (using password: YES)                  100          Quit  `

但是,如果你是用其他方式,可能会有一点点不一样

Navicat for MySQL登录:

190601 22:14:07    106 Connect  [email protected] on              106 Query  SET NAMES utf8             106 Query  SHOW VARIABLES LIKE 'lower_case_%'             106 Query  SHOW VARIABLES LIKE 'profiling'             106 Query  SHOW DATABASES

命令行登录:

190601 22:17:25    111 Connect  root@localhost on                   111 Query  select @@version_comment limit 1190601 22:17:56    111 Quit

这个差别在于,不同的数据库连接工具,它在连接数据库初始化的过程中是不同的。通过这样的差别,我们可以简单判断出用户是通过连接数据库的方式。

另外,不管你是爆破工具、Navicat for MySQL、还是命令行,登录失败都是一样的记录。

登录失败的记录:

102 Connect  mysql@192.168.204.1 on 102 Connect  Access denied for user 'mysql'@'192.168.204.1' (using password: YES)

利用shell命令进行简单的分析:2

有哪些IP在爆破

grep  "Access denied" mysql.log |cut -d "'" -f4|uniq -c|sort -nr

爆破用户名字典都有哪些

grep  "Access denied" mysql.log |cut -d "'" -f2|uniq -c|sort -nr

日志分析中,特别需要注意一些敏感的操作行为,比如删表、备库,读写文件等。关键词:drop table、drop function、lock tables、unlock tables、load_file() 、into outfile、into dumpfile。

敏感数据库表:SELECT * from mysql.user、SELECT * from mysql.func

原文始发于微信公众号(网络安全透视镜):【Linux应急响应】护网防守方自救指南

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月21日09:37:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【Linux应急响应】护网防守方自救指南https://cn-sec.com/archives/2979835.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息