介绍
Obscurity几乎没有公共漏洞和暴露(Common Vulnerabilities & Exposures),所以kali的msf基本不起作用,对经常使用工具的人来说可能不适应。但却可以学到很多编程的知识。
前期工作
1.改hosts文件和nmap扫端口,在上一个博客已经细说过,这里不再重复。上一篇博客:渗透测试:HTB之OpenAdmin
2.扫出来的端口如下图
扫出来的端口只有22和8080,感觉事情并不那么简单。
搜集信息
1.使用dirb http://obscurity:8080/ > Webscann
命令扫描Web目录并将结果放在Webscann文件内,趁扫目录的时间看下Web主页。
这里是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对当下来说没有太大意义,找人社工才能用。
在充足的收集了页面信息后,有用的就只有找隐藏目录这一条路了。
既然是隐藏的文件,那么其链接格式应该是http://obscurity:8080/隐藏目录/SuperSecureServer.py
,可以使用ffuf工具进行枚举。
下载ffuf:ffuf下载地址
使用教程:ffuf教程
使用命令
./ffuf -w /usr/share/dirb/wordlists/common.txt -u http://obscurity:8080/FUZZ/SuperSecureServer.py
结果如下
隐藏目录名为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