freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

Linux入侵检测:一篇实用的应急响应教程[三]
zero1234 2025-02-26 08:40:44 32123
所属地 海外

前言

相信各个师傅都收到了消息,今年的护网将是常态化护网,周期非常的长。在这几天,已经有各大厂商开始陆续的收集简历了吧,相信以护网的薪酬,大家都想分一杯羹。那么我们学会应急响应是必不可少的!让我们也马上卷起来吧!

引用文献

应急响应篇之Linux入侵排查_哔哩哔哩_bilibili

正式开始

知识点一:应急准备

uname -a -->查看内核详细信息

例如:Linux ip-10-0-10-3 4.19.0-25-cloud-amd64 #1 SMP Debian 4.19.289-1 (2023-07-24) x86_64 GNU/Linux

这个内核信息,就是版本:

RHEL/CentOS:/var/log/secure

Debian/Ubuntu:/var/log/auth.log

像这个就Debian版本,只有版本找对了,我们才能知道对应的存储条件。所以

知识点二:系统进行排查

命令:top,它可以展示进程的占用

1740493795_67bdd3e3d828a0655ef15.png!small?1740493758787

1.表示总占用率,如果占用满了就算百分之一百,也就是100us

2.表示这个应用占用进程的占用率,这里是占用0.2中的占用率的百分之1.7

通过这些,如果我们发现cpu总占用率很高,但缺没有占用高的应用,说明这个进程可能被隐藏了!


进程隐藏

which top

1740493800_67bdd3e8d06955d4dd0af.png!small?1740493772538

mkdir "         ",我们创建一个这样的目录

1740493806_67bdd3ee6579682fcf2ce.png!small?1740493772538

mkdir "TAB-> mkdir "         ",这样就能快速的进入这个目录不用空格

mv /usr/bin/top ./"         ",移动该top文件夹到该目录下

1740493811_67bdd3f38f6c441101311.png!small?1740493774508

返回到~目录下后,vim /usr/bin/top -->新建了一个/usr/bin/top文件

1740493817_67bdd3f9d175baaf95f95.png!small?1740493780392

在vim中

#!/bin/bash

/自己的为准/"         "/top | grep -v  "dockerd"

#grep用于筛选,例如:grep "dockerd" 这就是将USER为docker的命令展示出来,

加上 -v则将dockerd的命令隐藏起来

这里以我的mysql进程为例

1740493825_67bdd401d7627b77b4d55.png!small?1740493788392

保存退出

chmod +x /usr/bin/top

top -->展示进程,这下就没有mysql进程了,我们就成功隐藏了mysql的进程

1740493833_67bdd40960b7c4817479e.png!small?1740493796178

如何排查这类文件呢?

进程隐藏file类型

1740493839_67bdd40ff38730beb5102.png!small?1740493802826

可以看到真正的top文件的类型和假冒的文件类型是不一致的,所以使用top前可以先查看一下文件类型就能排查了

还可以使用PS进行查看

1740493846_67bdd416e52c377362651.png!small?1740493809395

ps -ef就可以查看出详细的信息:

1740493851_67bdd41bb826d686837ac.png!small?1740493814304

非常的好用。

losf就是看进程所打开的文件

1740493858_67bdd422a36787101a909.png!small?1740493822657

ps -ef I grep mysql

用来查看你想查看的进程,根据中间的进程号

lsof -p 进程号

1740493864_67bdd4280a75e0a450c7d.png!small?1740493827234

就能看到对应的应用了

1740493869_67bdd42d39a7fe0d640cd.png!small?1740493831698

进而进行快速的排查

为了防止命令被篡改,建议上传busybox,这就是一个linux的命令箱子,能保证你查询的命令不被篡改

如何关闭可疑进程?

总结:

top --》查看各种进程

ps -ef --》查看进程号

kill -9 进程号 --》删除进程

知识点三:系统网络排查

netstat -pantu

1740494004_67bdd4b499afe1a01a596.png!small?1740493967550

这个就很好记住了,和windowsnetstat -ano的效果是一样的

当然你看它的提示,我们需要切换到root用户使用最佳

1740494009_67bdd4b9b399706d2b08a.png!small?1740493972442

这一段就是进程id了。

这样的可以根据进程的id,快速锁定恶意连接的进程。

知识点四:恶意账号排查

etc/password

1740494091_67bdd50bf346f55055544.png!small?1740494054467

以:为分割,我一一解释

1 用户名

2 密码 -> X代替了,现在

3 uid 系统内核分配权限的时候,根据UID来进行分配的,例如uid=0 超级管理员 root,注意这个用户只能有一个,这是规定。

如果有其他用户为0,那么它就是恶意用户。

Windows中查看的命令为:

1740494096_67bdd510f40628e5a5dd1.png!small?1740494059604

1740494102_67bdd5161be15f62b1c55.png!small?1740494074945

windows中被称为SID,结尾的最后一个-后面的数字就是SID。

而在Linux中UID>=1000一般是新创建的用户。

用户的唯一数字标识符(UID):

0 表示 root 用户(超级用户)。

1-999 通常为系统保留的 UID。

1000+ 分配给普通用户。


4  主组 ID

5 用户的描述信息

6 用户的家目录

7 用户的解释器

bin/bash --》支持编程、定义变量、定义for循环

bin/sh --》 不行

usr/sbin/nologin -->不允许登录,会有提示

usr/sbin/false -->不允许登录,不会提示

创建账号:

useradd mirageuser

passwd mirageuser

1740494188_67bdd56c710567a65fae2.png!small?1740494150941

然后我们通过vim /etc/passwd -- 将uid改为0

1740494203_67bdd57b1b2b3a564fca6.png!small?1740494166728

1740494221_67bdd58dbf59581507c80.png!small?1740494184126

然后登录mirageuser,可以看到这就是root的权限:

1740494247_67bdd5a7147482d3d93cf.png!small?1740494209546

成功查询到是root权限,这里名字变了:/home/mirage,因为文章不是一个时间写的所以图有出入不碍事。

思路:当我们用root权限的时候,为了保持root权限,保证root账号密码不会更改,那么我们就需要创建一个新的超级管理员账户,进行一个维权

当然可能有人觉得这个用户太明显了,一查就能查到

1740494344_67bdd608b007785ae1c8d.png!small?1740494307478

如果是这样的一条用户呢?你能看出来是恶意的账户吗?

但这样的一个用户我们是连接不上的,为什么呢?因为它不是管理员账户,只有管理员账户才能远程登录。

那我们应该怎么做呢?

首先,我们看sudo systemctl这类的命令。

1740494351_67bdd60fec2ec9c36886f.png!small?1740494314552

不知道你们发现了没有,当我们使用一个普通用户的时候,使用sudo,会要求我们输入密码,因为要使用管理员权限。

这个密码是谁的?管理员账号的密码吗?当然不是,是普通用户的密码!!!

逻辑是不是很奇怪,我使用管理员权限,但用的却是普通用户的密码进行一个验证,说不通啊!

要明白这里面的道理,我们要了解一个文件,/etc/sudoers

这个文件规定了,哪些用户允许去执行sudo这个指令的。

1740494358_67bdd6161dc2580c00fa0.png!small?1740494320664

可以发现这是一个440权限的文件,就是默认情况下,它是一个只读的文件,不能修改

1740494362_67bdd61a7790443c1cc70.png!small?1740494324954

所以我们要给他增加一些权限,再做修改

1740494367_67bdd61fdb56267543324.png!small?1740494330721

这四个ALL=(ALL:ALL) ALL分别是什么意思呢?
1 表示在什么连接的情况下可以使用sudo命令,比如ssh连接,这里写ALL就是所有连接

23:表示以哪些用户或哪些用户组执行sudo命令。例如:ALL=(user1) ALL,这样就会以user1的权限去执行。这里ALL就是所有用户,包括root的权限

4 表示哪些sudo命令可以进行提取。例如我设置为ALL=(ALL:ALL) ls 那么只有sudo ls 是可以使用管理员权限的,而其他的sudo命令就无法使用管理员权限了


所以我们这里给systemd-evetlog ALL=(ALL:ALL) ALL,来保证它拥有sudo命令的使用权~

1740494373_67bdd6255a0b95966d774.png!small?1740494335818

修改完成后要将权限进行一个改回

1740494379_67bdd62b2cf45255469b0.png!small?1740494341967

这就是我们要去关注排查的一个点。

总结:

1.通过/etc/passwd去查看有无两个0权限的账户,来排查恶意的用户

2.通过/etc/sudoers去查看有无账户的权限为四个ALL


知识点五:环境变量排查

cat /etc/profile

cat /etc/bash.bashrc

这两个文件都是属于一个环境变量的持久化

就是登录后就会自己启动的东西

如果我们在这两个文件中放入一个一句话,或者是一个木马文件的后门。

那么每次用户登录的时候就会去执行他们,从而变成一个持久化的后门。

1740494526_67bdd6be4338f0a13f49f.png!small?1740494489217

1740494529_67bdd6c1b110d9275cbd6.png!small?1740494492608

进入攻击队的视角--建议给被攻击机先创建一个快照再进行实验:

1740494536_67bdd6c87f0bba93900c2.png!small?1740494500277

F是小写的,图片错了

1740494594_67bdd7021a17fa463a466.png!small?1740494560889

然后将这个文件上传到被攻击机上。

1740494598_67bdd7064dd96b7c4e796.png!small?1740494560889

1740494603_67bdd70b23da7369bb625.png!small?1740494566244

1740494613_67bdd71552f4dcc16d425.png!small?1740494576342

1740494618_67bdd71acb095db0f2f41.png!small?1740494581804

启用一个监听的服务

1740494624_67bdd7202902779485404.png!small?1740494587330

这样就成功启动了服务,然后我们那边双击即可。

1740494627_67bdd723c93053c5ad468.png!small?1740494590670

1740494632_67bdd728db9dcb2674e61.png!small?1740494596730

这样就成功了。

我们先使用ctrl+c退出监听,然后再run开启监听,这样刚刚的连接就断了

1740494643_67bdd73336184211f3942.png!small?1740494606932

首先chmod 777 /etc/profile修改文件权限。(stat 文件名可以查看文件权限)

然后在/etc/profile文件下添加

1740494650_67bdd73a35e5fbba92e95.png!small?1740494613160

让他后台运行

模拟一下用户登录,或者直接重启再登录

1740494654_67bdd73eddefd598254a1.png!small?1740494617350

1740494658_67bdd742aef6e6b30525a.png!small?1740494621242

1740494663_67bdd7476ceb1fb5a095d.png!small?1740494626920

成功的获取到了shell

而其他的环境变量的文件还有许多,例如:

1740494669_67bdd74dac695881759d7.png!small?1740494632178

关于路径的区别

/etc/profile -- 所有用户登录下

/root/.profile -- 只有root用户

/user/.profile -- 只有user用户

&符号,非常必要,否则可能会执行不了进程,这个符号代表后台运行,对于执行进程有稳定性的作用

nobup 的补充。

nobup 新起一个进程去执行它,对内网穿透的代理有用。

nohup /root/apache.tar.gz &


总结:

我们要着重的去排查我们的环境变量文件是否被人动过手脚

/etc/profile

/etc/bash.bashrc

/用户名/.profile

/用户名/bash.bashrc


知识点六:服务排查

systemctl start ssh

1740494760_67bdd7a813c7d193281ac.png!small?1740494722639

相信大家对这个命令并不陌生。

就是开启ssh的命令

但有没有人想过systemctl start为什么可以开启,而systemctl statusssh为什么又可以看见服务状态

1740494763_67bdd7ab7be1f4b2cb523.png!small?1740494726129

这都是由原因的,systemctl到底是一个什么东西?

我们可以通过该文件进行查看

1740494768_67bdd7b0e4fb34c4f6cdd.png!small?1740494731647

分别解释一下:

Unit

1740494774_67bdd7b6a8ea45084a1c6.png!small?1740494737228

其他两个不用管,可有可无

Service

1740494778_67bdd7ba2e0486bdb9215.png!small?1740494740698

1 systemctl startssh

2 systemctl stop ssh

其实从这里就能看出来,本质上systemctl执行的东西就是类似一个提前写好的脚本。

Install

这块内容最重要,没有这块内容就无法启动一个服务

1740494782_67bdd7bebe2c90dd62bef.png!small?1740494745162

上面的表示启动模式,这里就是多用户的一个模式,多用户好理解的,比如rootuser这两个用户就叫多用户。

下面的是一个别名,这个更好理解,外号嘛

那么我们复制一个文件

1740494786_67bdd7c2c798ab300361c.png!small?1740494749446

修改它

1740494789_67bdd7c5a88147a2fef89.png!small?1740494752491

1740494801_67bdd7d196f2a52103b22.png!small?1740494764206

最重要的是这一段,改完以后,那么我们的

systemctl start是不是就成了启动木马文件了???

1740494809_67bdd7d9464370affcd4d.png!small?1740494771897

1740494814_67bdd7de6d63ee0f38d73.png!small?1740494777008

enable 你刚刚创建的服务文件名称。

重新载入配置服务文件

systemctl enable test使得我们刚刚的test开机启动,

这就是如何利用配置服务文件进行持久化了。

这里图片不一样没关系,mirage就是test

1740494822_67bdd7e6d7683e69ad9a8.png!small?1740494785536

总结:

1.如果说你知道恶意文件的名称:gerp "apache.tar.gz" -Rn . 从当前目录下开始寻找

也可以更简单一些:ls | grep "apache.tar.gz" 方式虽然不一样,但效果差不多。

gerp "apache.tar.gz" -Rn / 从根目录下开始寻找

2.确认时间通过find命令去找

知识点七:计划任务排查

1740494925_67bdd84d44b8775283505.png!small?1740494887703

通过这个去编辑一个计划任务

crontab -e

然后我们输入2

1740494933_67bdd855f2dfdc774fe38.png!small?1740494896688

就这样编辑:

这五个* 呢分别代表,分钟,小时,天,后面两个可以暂时不用管。然后指定我们要运行的木马文件,记得加上&

1740494945_67bdd861603e01a65d9f3.png!small?1740494908136

这里就让他每一分钟运行一次这个木马

1740494954_67bdd86a339f761d8ee53.png!small?1740494916689

设置完成后,就会每一分钟接收到一次反弹的shell

1740494965_67bdd8754cabf5ded24c1.png!small?1740494928891

很神奇~

这就是计划任务。

如何去排查呢?

crontab -l

1740494982_67bdd886f1a8192a597e6.png!small?1740494945474

就会显示当前的用户的计划任务

往下滑就能看到了

或者可以直接去目录中寻找

1740494994_67bdd892204a4515eaec5.png!small?1740494958758

1740529725_67be603d367debd00877e.png!small?1740529687562

使用cat root就能看到了

所以我们只需要前往/var/spool/cron/crontabs#进行一个计划任务的排查即可。

最后删除即可rm -rf root

1740529729_67be60410c8eebe38620e.png!small?1740529691091

不仅是刚刚的哪些,还有分时间来放置的计划任务。这些都要进行排查

输入cd etc/cr ,然后进行一个Tab键的补全,就可以看到这些计划任务了

1740529732_67be6044dd7849d082326.png!small?1740529694916

cat /etc/crontab,这个也是计划任务,也可以在其中进行一个编写

1740529735_67be6047809f5c5ba097a.png!small?1740529698037

还有一个计划任务的配置文件比较特殊,默认是不开启的,但在一些版本会开启

/lib/systemd/system

1740529739_67be604bd508b45453bc1.png!small?1740529701878

这个文件我们看看就知道为什么特殊了

1740529743_67be604f7b8beeb7df12b.png!small?1740529705797

因为服务文件里面它没有[Install]

前面说过,这块内容最重要,没有这块内容就无法启动一个服务

所以它是没有开启的,如果这个开启的话,你就需要对vim /etc/rc.local 进行查看,因为这里是恶意配置的重灾区。

总结:

对于计划任务我们需要排查的地方

  1. crontab -l
  2. /var/spool/cron/crontabs查看该目录下的文件
  3. cat /etc/crontab
  4. cd etc/cr->使用Tab键补全,即可看到
  5. /etc/rc.local

这五个地方!!!!


知识点八:恶意文件排查

suid 777是否等于最高?

想要知道如何排查恶意文件,就要先知道,777是否是最高权限。

答案:不是文件的最高权限

一个问题:进程被执行被运行什么身份。一般的理解来说,是执行进程的用户。

但是如果你这个进程被赋予了SUID那么就会以SUID所有者的用户去执行这个进程。

1740529793_67be60813a0b7b9b23db4.png!small?1740529756007

首先我们创建了一个文件,赋予它权限为000

那么我们使用cat查看,普通账户

1740529797_67be6085bbae8cd34fea6.png!small?1740529759878

使用root账户

1740529801_67be60899f430de37e71e.png!small?1740529771719

因为root权限即使文件是最小权限,root也是可以读写的,记住这个关键点。。。

1740529806_67be608ea10444cc66e10.png!small?1740529773080

首先,我们把cat命令拷贝一个到当前目录下

然后给他加上所有者的权限

u+s

1740529808_67be60906ce21c943663b.png!small?1740529773081

用之前的cat还是不够,用当前目录下的cat命令呢?

1740529812_67be60948ae82335e1796.png!small?1740529775000

可以了,注意这里的用户就是普通用户。

值得注意的是这个SUID只作用于二进制文件,如果给其他的文件例如txt其实是没有用的。

1740529816_67be6098041e1c0cd0451.png!small?1740529778440

所以最高的权限应该是7777,而不是777


而黑客是怎么利用的呢?find命令可以作为提权的命令

find /etc/passwd -exec whoami \;

比如这条命令

1740529820_67be609c9910d49f54af7.png!small?1740529782840

root来运行显示root账户权限

那么以普通用户就是普通用户权限

1740529823_67be609fa4ff5bc48aa4f.png!small?1740529785719

如果我给find赋予SUID呢????

which find查找find所属位置。

1740529826_67be60a264f1ef7b782c3.png!small?1740529788926

明白了嘛,这就是SUID提权。

简单来说find命令支持去执行其他的命令。

如何排查呢?

find/usr/bin-perm-4000 -type f

这条命令用来筛选包含4000权限的文件。例如2000也能找到只要是4000权限以下的都能找到。而且4755也包含在内。

1740529832_67be60a818dcd87cb4b3f.png!small?1740529794281

总结:

这个我们就需要知道文件的权限,一般来说SUID的权限都是4755,所以使用命令:

find/usr/bin-perm-4000 -type f即可。


知识点九:应急响应技巧

使用find命令,按照时间去排查文件

首先我们可以通过stat 文件名,对文件进行查看

1740529854_67be60be2aed7b5ef7385.png!small?1740529816313

中文版

1740529857_67be60c1dd2545ce7aa30.png!small?1740529820042

英文版

使用命令:

find . -type f -newermt "2025-01-01 16:00" -a -not -newermt "2025-02-25 16:05"

find + 目录 + -type f -newermt 找寻的开始时间 -a -not -newermt 找寻的截止时间

1740529879_67be60d729fa8095b6f1a.png!small?1740529841811

就可以快速锁定了木马文件了~

如果报错的话可以加上 2>/dev/null

总结:

find . -type f -newermt "2025-01-01 16:00" -a -not -newermt "2025-02-25 16:05"  2>/dev/null


恶意文件的名称

名称:gerp "apache.tar.gz" -Rn . 从当前目录下开始寻找

也可以更简单一些:ls | grep "apache.tar.gz" 方式虽然不一样,但效果差不多。

gerp "apache.tar.gz" -Rn / 从根目录下开始寻找

这样的全局搜索,可以让我们快速排查

总结

Linux的排查相比Windows来说是相对复杂的,因为要记很多的命令,且版本的不同会导致一些日志、计划任务等文件存储的位置不同。

所以在Linux的排查中:

1.首先保证命令不会被篡改

2.保证Linux的版本信息

3.多收集信息,将进程ID、时间、名称

免责声明

  • 本文所包含的内容仅用于教育和研究目的,旨在提高信息安全意识,帮助用户了解网络安全防护的重要性。

  • 文章中提及的任何渗透测试技巧、工具或方法,仅供合法授权的安全研究和测试使用。在进行任何渗透测试或安全测试之前,请确保您已获得相关系统或网络所有者的明确授权。

  • 本文作者不对任何因使用文章内容而导致的非法活动、损害或其他不良后果承担任何责任。读者在实施任何技术之前应确保遵守所有适用的法律法规。

  • 本文内容不支持或鼓励任何形式的恶意攻击、未授权的入侵或网络犯罪。

  • 本文内容仅限于教育用途,不得以任何方式用于未经授权的网络安全攻击或破坏行为。




# 应急响应 # 安全应急响应 # 应急响应检测阶段
本文为 zero1234 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
应急响应
zero1234 LV.4
希望大家每天都开开心心,快快乐乐,坚持学习网络安全~
  • 30 文章数
  • 50 关注者
红队APT基础 | 钓鱼邮件的制作与SPF绕过(一)
2025-04-14
SQL注入绕waf姿势:sleep被过滤了怎么办?
2025-04-10
渗透测试基础|信息收集——框架识别&框架漏洞利用
2025-04-07
文章目录