0

首先,我使用了如何使用 msgpack-c 正确解包和提取数据?弄清楚如何正确解包数据,因为 MessagePack 自己的 C API 文档不是很好。不过,http ://wiki.msgpack.org/display/MSGPACK/QuickStart+for+C+Language 也可以。

我想指出,对于大多数对 metasploit 的 API 调用来说,代码都可以正常工作,只有大的(module.exploits大约 16KB 返回)失败了。

就像我的最后一个问题一样,我在工作,所以无法发布实际代码。我将尝试在下面的代码片段中准确地展示我的代码在做什么。

// Function declaration from msgpack headers
bool msgpack_unpack_next(msgpack_unpacked* result, const char* data, size_t len, size_t* off);

// Called by curl after request
size_t unpack_result(char *ptr, size_t size, size_t nmemb, void *userdata){
    size_t real_size = size * nmemb;

    msgpack_unpacked msg;
    msgpack_unpacked_init(&msg);
    // Fails [returns false] when used on "module.exploits" return, not when
    // "module.payloads" is called nor "auth.login".
    msgpack_unpack_next(&msg, ptr, real_size, 0); 


}

msgpack_sbuffer* pack_payload(char **data, size_t size){
    // Code that actually packs payload, pretty standard with nothing special
    // Definitely works, have not had any problems with my payloads
}


int main(void)
{
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();

    char *auth_payload_array[3] = {"auth.login", "<username>", "<password>"};

    msgpack_sbuffer *auth_payload = pack_payload(auth_payload_array, 3);
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://<IP Address>/api/");
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, auth_payload->data);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, auth_payload->size);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);

        // Add custom content type header
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: binary/message-pack");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, unpack_result);

        res = curl_easy_perform(curl);
        if (res != CURLE_OK){
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                        curl_easy_strerror(res));
            return 1;
        }

        char *exploit_payload_array[2] = {"module.exploits", AUTH_TOKEN};
        msgpack_sbuffer *exploit_payload = pack_payload(exploit_payload_array,2);

        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, exploit_payload->data);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, exploit_payload->size);

        res = curl_easy_perform(curl);
        if (res != CURLE_OK){
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                        curl_easy_strerror(res));
            return 1;
        }
    }
}

我知道上面有内存泄漏,我不想输入所有正确的销毁/释放,因为这只是一个例子。我省略了AUTH_TOKEN实际抓取方式的部分,因为它不应该是错误,因为我在代码中没有问题。我也知道一些 curl 请求代码可以优化为函数。

重要的一点是,ruby gem 可以很好地与这个相同的 API 调用一起工作,但它是一个 C 扩展,不使用标准的 msgpack 库,而是自己进行二进制解析。

当我将返回的原始数据写入文件而不是字符串缓冲区时,手动检查它表明它似乎是正确的 msgpack 格式。

任何想法这里出了什么问题?我将开始使用 gdb 来尝试追踪问题,同时考虑将 ruby​​ c 扩展转换为我可以使用的库,因为它似乎可以使用。但希望它很简单,你们中的一个人会抓住它!

4

1 回答 1

1

写回调没有返回正确的返回码。

于 2013-08-22T15:08:53.463 回答