# CVE-2019-13132 lab — CURVE INITIATE stack overflow → RCE.
#
# Build:  docker build --platform linux/amd64 -t cve-2019-13132-lab .
# Run  :  docker run --rm -it --platform linux/amd64 --privileged \
#                   -p 5556:5556 cve-2019-13132-lab
#
# --privileged — needed to flip /proc/sys/kernel/randomize_va_space

FROM --platform=linux/amd64 debian:12

RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential cmake git ca-certificates pkg-config \
        python3 python3-pip python3-venv \
        binutils procps netcat-openbsd less vim gdb \
    && rm -rf /var/lib/apt/lists/*

RUN python3 -m venv /opt/venv && /opt/venv/bin/pip install pynacl
ENV PATH="/opt/venv/bin:$PATH"

ENV LAB_ROOT=/opt/zmq-curve-rce
WORKDIR /opt

COPY server-curve.c      /opt/lab/
COPY exploit.py          /opt/lab/
COPY calibrate.sh        /opt/lab/
COPY compute_offsets.py  /opt/lab/
COPY start_server.sh     /opt/lab/
COPY run_lab_test.sh     /opt/lab/
COPY entrypoint.sh       /opt/lab/

RUN chmod +x /opt/lab/*.sh /opt/lab/*.py

# Clone vulnerable libzmq 4.3.0
RUN git clone --depth 1 --branch v4.3.0 \
        https://github.com/zeromq/libzmq.git $LAB_ROOT/src

# Build libzmq: no canary, executable stack for shellcode
RUN mkdir -p $LAB_ROOT/src/build && cd $LAB_ROOT/src/build && \
    cmake .. \
        -DCMAKE_C_FLAGS="-O0 -g -fno-stack-protector" \
        -DCMAKE_CXX_FLAGS="-O0 -g -fno-stack-protector" \
        -DCMAKE_SHARED_LINKER_FLAGS="-z execstack" \
        -DBUILD_TESTS=OFF \
        -DBUILD_STATIC=OFF \
        -DENABLE_DRAFTS=OFF \
        -DWITH_PERF_TOOL=OFF \
    && make -j$(nproc)

# Build vulnerable server: no canary, no PIE, executable stack
RUN gcc -O0 -g -fno-stack-protector -fno-pie -no-pie -z execstack \
        /opt/lab/server-curve.c \
        -I $LAB_ROOT/src/include \
        -L $LAB_ROOT/src/build/lib \
        -lzmq -Wl,-rpath,$LAB_ROOT/src/build/lib \
        -o $LAB_ROOT/server-curve

# Pre-compute static offsets from the build artifacts
RUN python3 /opt/lab/compute_offsets.py $LAB_ROOT/build_offsets.json

RUN cp /opt/lab/exploit.py      $LAB_ROOT/ && \
    cp /opt/lab/calibrate.sh    $LAB_ROOT/ && \
    cp /opt/lab/start_server.sh $LAB_ROOT/ && \
    cp /opt/lab/run_lab_test.sh $LAB_ROOT/ && \
    cp /opt/lab/entrypoint.sh   $LAB_ROOT/

EXPOSE 5556
ENTRYPOINT ["/opt/zmq-curve-rce/entrypoint.sh"]
