渗透测试2:HTB之Obscurity

介绍

Obscurity几乎没有公共漏洞和暴露(Common Vulnerabilities & Exposures),所以kali的msf基本不起作用,对经常使用工具的人来说可能不适应。但却可以学到很多编程的知识。

前期工作

1.改hosts文件和nmap扫端口,在上一个博客已经细说过,这里不再重复。上一篇博客:渗透测试:HTB之OpenAdmin
2.扫出来的端口如下图
nmap
扫出来的端口只有22和8080,感觉事情并不那么简单。

搜集信息

1.使用dirb http://obscurity:8080/ > Webscann命令扫描Web目录并将结果放在Webscann文件内,趁扫目录的时间看下Web主页。
主页信息1
这里是Obscura,我们研究了独一无二的安全方法;如果黑客不了解你使用的软件,你就不会被黑。
这就是为什么我们主页的标题是‘Security Through Obscurity,我们从scratch编写了所有我们自制的软件,甚至正在运行的这个Web服务也是。这意味着不会有暴露漏洞存在,它是完全安全的’

分析:要渗透此服务器必须要了解他们的软件甚至源代码,怎么拿源代码是个大问题。不存在已知的暴露的漏洞,所以扔下手中的一堆工具吧。

在这里插入图片描述
我们自制的软件内容包含如下:
一个特制的Web服务器
目前正在解决一个小的不稳定问题;Web服务在启动30s后会重启
一个牢不可破的加密算法
更安全的SSH代替软件

分析:介绍里说有一个小bug,Web服务启动后30s会重启,不知道能不能利用。

联系方式
这一页是联系方式,注意到了邮箱,猜想服务器user用户可能也为secure

开发
开发者注意:当前Web服务的源代码文件是‘SuperSecureServer.py’,在一个隐藏的目录下

分析:说的很明显了,我们要找到这个隐藏目录并找到这个源代码。

2.扫Web目录完毕,但结果只有一个index.html。这时想到了既然是自己开发的可能存在注入漏洞,URL栏输入”http://obscurity:8080/'“(唉?不是说好的找隐藏目录嘛)
错误
果然出错了,之后又发现在返回404页面的时候存在XSS漏洞http://obscurity:8080/<script>alert(1);</script>,但是这个XSS对当下来说没有太大意义,找人社工才能用。
XSS
在充足的收集了页面信息后,有用的就只有找隐藏目录这一条路了。
既然是隐藏的文件,那么其链接格式应该是http://obscurity:8080/隐藏目录/SuperSecureServer.py,可以使用ffuf工具进行枚举。
下载ffuf:ffuf下载地址
使用教程:ffuf教程
使用命令

./ffuf -w /usr/share/dirb/wordlists/common.txt -u http://obscurity:8080/FUZZ/SuperSecureServer.py

结果如下
ffuf结果
隐藏目录名为develop。访问http://obscurity:8080/develop/SuperSecureServer.py
得到Web服务的源码,wget http://obscurity:8080/develop/SuperSecureServer.py将源码下载到本地,准备分析代码。

代码审计

1.为方便大家看,代码就不放百度网盘了,粘贴在下面。为了看懂Web服务代码,特意学了一晚上的socket和网络编程。一些重要的代码会注释,主要是Server类。(英文注释是原有的)
可能需要的资料:
socket编程详细介绍
在我其他博客有使用socket进行内网IP和端口扫描的小demo

import socket
import threading
from datetime import datetime
import sys
import os
import mimetypes
import urllib.parse
import subprocess

respTemplate = """HTTP/1.1 {statusNum} {statusCode}
Date: {dateSent}
Server: {server}
Last-Modified: {modified}
Content-Length: {length}
Content-Type: {contentType}
Connection: {connectionType}

{body}
"""
DOC_ROOT = "DocRoot"

CODES = {
   "200": "OK", 
        "304": "NOT MODIFIED",
        "400": "BAD REQUEST", "401": "UNAUTHORIZED", "403": "FORBIDDEN", "404": "NOT FOUND", 
        "500": "INTERNAL SERVER ERROR"}

MIMES = {
   "txt": "text/plain", "css":"text/css", "html":"text/html", "png": "image/png", "jpg":"image/jpg", 
        "ttf":"application/octet-stream","otf":"application/octet-stream", "woff":"font/woff", "woff2": "font/woff2", 
        "js":"application/javascript","gz":"application/zip", "py":"text/plain", "map": "application/octet-stream"}


class Response:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
        now = datetime.now()
        self.dateSent = self.modified = now.strftime("%a, %d %b %Y %H:%M:%S")
    def stringResponse(self):
        return respTemplate.format(**self.__dict__)
#Request是将Http请求头进行了拆分和归类
class Request:
    def __init__(self, request):
        self.good = True
        try:
            request = self.parseRequest(request)
            self.method = request["method"]
            self.doc = request["doc"]
            self.vers = request["vers"]
            self.header = request["header"]
            self.body = request["body"]
        except:
            self.good = False

    def parseRequest(self, request):        
        req = request.strip("\r").split("\n")
        method,doc,vers = req[0].split(" ")
        header = req[1:-3]
        body = req[-1]
        headerDict = {
   }
        for param in header:
            pos = param.find(": ")
            key, val = param[:pos], param[pos+2:]
            headerDict.update({
   key: val})
        return {
   "method": method, "doc": doc, "vers": vers, "header": headerDict, "body": body}

#以下涉及大量的socket编程,没有接触过的同学在CSDN里搜相关教程
class Server:
    def __init__(self, host, port): 
        #设置Web服务器的IP地址和端口号   
        self.host = host
        self.port = port
        #tcp/ip套接字
        self.sock = socket.socket(socket
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值