まず、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 呼び出しで問題なく動作しますが、標準の msgpack ライブラリを使用せず、バイナリ解析自体を行う C 拡張であることに注意してください。
stringbuffer の代わりにリターンから生データをファイルに書き込むと、手動で調べると、正しい msgpack 形式のように見えます。
ここで何がうまくいかないのですか?gdb を使用して問題を追跡し、Ruby C 拡張機能を使用できるライブラリに変えることを検討します。うまくいけば、それは単純なものであり、あなたの1人がそれを理解するでしょう!