首先,我使用了如何使用 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 扩展转换为我可以使用的库,因为它似乎可以使用。但希望它很简单,你们中的一个人会抓住它!