基础设施推荐:HTTP上传下载服务器
2024-4-16 14:32:30 Author: mp.weixin.qq.com(查看原文) 阅读量:6 收藏

△△△点击上方“蓝字”关注我们了解更多精彩
0x00 前言

在渗透测试过程中,主要是有以下几种情况会用到HTTP服务器。
1、扫描工具的测试,记录请求记录。2、托管远程下载服务,下载测试工具、shellcode等数据。3、托管远程上传服务器,回传测试数据。
对于场景1,一般都会选择使用专门的HTTPlog服务器。
一般方案是使用burpsuite和yakit自带的Log服务器,或自己配置HTTPLog服务器。
对于场景2,一般是直接使用Python等环境自带模块启动HTTP服务。
使用自带的模块,优点就是便捷,但是在认证功能、下载速度、错误处理等方面都存在较多限制。并且一般需要用完即关,不然会泄露服务器数据。
对于场景3,需要在常规HTTP服务器的基础上对代码进行修改,支持保存上传数据包。
后续内容会附带笔者自己写的http服务器和推荐的开源HTTP服务器。
0x01 需要什么样的HTTP服务器
对于渗透测试而言,对于HTTP服务器,一般需要如下的基础需求:
1、能够添加授权功能,防止未授权访问导致数据泄漏。2、能够支持Curl、Wget等常见工具的上传和下载。3、默认不开启目录浏览功能,防止绕过授权后,目录下所有数据泄漏。
为了满足常用的认证、下载和上传需求,使用python编写了一个简单的HTTP服务器。经过一段时间的使用,发现由于代码比较简单,在大文件的上传上存在很多可以优化的地方。
因此,又提出了新的需求:
4、打包运行、没有依赖、稳定运行,不容易崩溃。5、支持中断继续上传、中断继续下载等功能。6、能够兼容curl、wget程序的上传下载功能。
翻开收藏夹,找到了已有功能比较接近的Go语言项目 UpDownFile。
作者@jan-bar已经实现好了复杂的断点上传、下载功能,只需要再实现简单的认证功能、关闭目录浏览,
秉承着不重复开发活跃项目的原则,在Github和@jan-bar和提上需求,作者回复的很快,至今已完整实现了对应的需求。

0x02 Python一句话启动HTTP服务器
# Python >= 2.4python -m SimpleHTTPServer 8000# Python 3.xpython -m http.server 8000
0x03 基于参数认证的HTTP上传下载服务器
这是由笔者编写的简单HTTP服务器,与常见服务器不同的是,本程序更注重下载程序的兼容性。通过实现基于参数值的认证方式,基本适用于所有的下载程序,如bitadmin.exe等不支持添加设置请求头认证的程序。
import osimport timefrom flask import Flask, request, send_file
ROOT_PATH = os.path.abspath(os.path.dirname(__file__))BASE_PATH = None
basic_path = BASE_PATH if BASE_PATH else ROOT_PATHupload_path = os.path.join(basic_path, 'uploads')download_path = os.path.join(basic_path, 'download')
AUTH_PARAM = "auth"  # 自定义认证参数AUTH_CUSTOMS = "passpass" # 自定义认证参数值AUTH_DEFAULT = time.strftime("%Y%m%d%H")
app = Flask(__name__)

def auth_check(request_context): request_auth_info = str(request_context.args.get(AUTH_PARAM)) print(f"auth_info: {request_auth_info} <-> AUTH_PARAM:{AUTH_PARAM} <-> AUTH_VALUE:{AUTH_CUSTOMS} <-> AUTH_DEFAULT:{AUTH_DEFAULT}") return request_auth_info == AUTH_DEFAULT if AUTH_CUSTOMS is None else request_auth_info == AUTH_CUSTOMS

@app.route("/download/<filename>", methods=["GET"])def download_file(filename): try: # 获取查询参数 if not auth_check(request): return "Unauthorized", 401 # Download ing if not os.path.exists(download_path): os.makedirs(download_path) file_path = os.path.join(download_path, filename) return send_file(file_path, as_attachment=True) except Exception as e: # return str(e) return "error"

@app.route('/upload', methods=["GET","POST"])def upload_file(): try: if not auth_check(request): return "Unauthorized", 401
# Download ing if not os.path.exists(upload_path): os.makedirs(upload_path) if 'file' not in request.files: return "No file part" file = request.files['file'] if file.filename == '': return "No selected file" if file: filename = os.path.join(upload_path, file.filename) file.save(f"{filename}.{time.time()}") return "File Uploaded success!" else: return "File Uploaded failure!" except Exception as e: # return str(e) return "error"

if __name__ == "__main__": app.run(host="0.0.0.0", port=8888)
使用方法:
首先配置 自定义认证参数和自定义认证参数值,如:

AUTH_PARAM = "auth"  

AUTH_CUSTOMS = "passpass"

文件下载和上传时,在请求URL后添加 ?auth=passpass.
# curl 下载curl http://127.0.0.1/download/xxx?auth=passpass -o xxx# 上传curl -X POST -F '[email protected]' http://example.com/upload?auth=passpasscurl -F "[email protected]" http://example.com/upload?auth=passpass
注: 由于文件是一次性写入内存,因此存在性能上的限制,单个文件不建议超过500MB。
0x04 UpDownFile 开源HTTP上传下载服务器

UpDownFile是@jan-bar使用Go编写的简易上传下载文件服务器,经过这几天不断地Issue,目前已经很适合渗透测试小伙们的体质。

1、完美支持Curl、wget等常见工具的断点上传和断点下载。
2、-auth参数 支持http base 认证
3、-deny参数 支持关闭目录浏览功能

下载安装

# 项目地址jan-bar/UpDownFile: 简易上传下载文件服务器https://github.com/jan-bar/UpDownFile
# 安装go install github.com/jan-bar/UpDownFile@latest
# 编译 需要Go 1.22build.bat

常用命令

# 启动服务upDownFile.exe -s :8080 
# 启动认证服务 且关闭目录浏览 (建议)upDownFile.exe -s :8080 -auth "user:pass" -deny
# 下载文件# upDownFile cli 下载upDownFile cli -c -auth "user:pass" -o example.txt "http://xxx/example.txt"
# curl等程序下载wget --user "user" --password "pass" --content-disposition "http://xxxx/example.txt"curl -u "user:pass" -C - -OJ "http://xxxx/example.txt"
# 上传文件# upDownFile.exe cli 上传upDownFile.exe cli -c -auth "user:pass" -d @example.txt "http://xxxx/example.txt"
 # curl等程序上传 curl -u "user:pass" -C - -T example.txt "https://xxxx/example.txt"

服务端启动时,会输出常用的命令和参数值,更多使用方式可以查看ReadMe文件。

0x05 总结
虽然目前很多C2都自带了HTTP服务,但还是会有很多场景下需要用到自定义的HTTP服务器。
文主要是分享笔者自身对于HTTP服务的额外需求和实现,如有雷同,纯属打工。

0x99 免责声明

在学习本文技术或工具使用前,请您务必审慎阅读、充分理解各条款内容。

1、本团队分享的任何类型技术、工具文章等文章仅面向合法授权的企业安全建设行为与个人学习行为,严禁任何组织或个人使用本团队技术或工具进行非法活动。

2、在使用本文相关工具及技术进行测试时,您应确保该行为符合当地的法律法规,并且已经取得了足够的授权。如您仅需要测试技术或工具的可行性,建议请自行搭建靶机环境,请勿对非授权目标进行扫描。

3、如您在使用本工具的过程中存在任何非法行为,您需自行承担相应后果,我们将不承担任何法律及连带责任。

4、本团队目前未发起任何对外公开培训项目和其他对外收费项目,严禁任何组织或个人使用本团队名义进行非法盈利。

5、本团队所有分享工具及技术文章,严禁不经过授权的公开分享。

如果发现上述禁止行为,我们将保留追究您法律责任的权利,并由您自身承担由禁止行为造成的任何后果。

END

如您有任何投稿、问题、需求、建议

NOVASEC公众号后台留言

或添加 NOVASEC 联系人

感谢您对我们的支持、点赞和关注

加入我们与萌新一起成长吧!

本团队任何技术及文件仅用于学习分享,请勿用于任何违法活动,感谢大家的支持!


文章来源: https://mp.weixin.qq.com/s?__biz=MzUzODU3ODA0MA==&mid=2247489474&idx=1&sn=65afce4c04628dc28cae3ab016623b1e&chksm=fad4cad5cda343c33a632597aabb32c216e6dfe3adc33682952f6d3c719bac4ab258f8a5757e&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh