如何使用libtins捕获HTTPS数据包?

时间:2019-06-18 09:47:12

标签: c++ https

我正在使用 libtins 库进行嗅探。  给定的示例 http_requests.cpp 适用于HTTP请求。 捕获我尝试使用

的https数据包

config.set_filter("tcp port 443");

但是没用

完整代码:

#include <string>
#include <iostream>
#include <stdexcept>
#include <boost/regex.hpp>
#include "tins/tcp_ip/stream_follower.h"
#include "tins/sniffer.h"

using std::string;
using std::cout;
using std::cerr;
using std::endl;
using std::exception;

using boost::regex;
using boost::match_results;

using Tins::PDU;
using Tins::Sniffer;
using Tins::SnifferConfiguration;
using Tins::TCPIP::Stream;
using Tins::TCPIP::StreamFollower;



const size_t MAX_PAYLOAD = 3 * 1024;

regex request_regex("([\\w]+) ([^ ]+).+\r\nHost: ([\\d\\w\\.-]+)\r\n");

regex response_regex("HTTP/[^ ]+ ([\\d]+)");

void on_server_data(Stream& stream) {
    match_results<Stream::payload_type::const_iterator> client_match;
    match_results<Stream::payload_type::const_iterator> server_match;
    const Stream::payload_type& client_payload = stream.client_payload();
    const Stream::payload_type& server_payload = stream.server_payload();

    bool valid = regex_search(server_payload.begin(), server_payload.end(),
                              server_match, response_regex) &&
                 regex_search(client_payload.begin(), client_payload.end(),
                              client_match, request_regex);

    if (valid) {
        // Extract all fields
        string method = string(client_match[1].first, client_match[1].second);
        string url = string(client_match[2].first, client_match[2].second);
        string host = string(client_match[3].first, client_match[3].second);
        string response_code = string(server_match[1].first, server_match[1].second);
        // Now print them
        cout << method << " http://" << host << url << " -> " << response_code << endl;

        // Once we've seen the first request on this stream, ignore it
        stream.ignore_client_data();
        stream.ignore_server_data();
    }

    // Just in case the server returns invalid data, stop at 3kb
    if (stream.server_payload().size() > MAX_PAYLOAD) {
        stream.ignore_server_data();
    }
}

void on_client_data(Stream& stream) {
    // Don't hold more than 3kb of data from the client's flow
    if (stream.client_payload().size() > MAX_PAYLOAD) {
        stream.ignore_client_data();
    }
}

void on_new_connection(Stream& stream) {
    stream.client_data_callback(&on_client_data);
    stream.server_data_callback(&on_server_data);

    stream.auto_cleanup_payloads(false);
}

int main(int argc, char* argv[]) {
    if (argc != 2) {
        cout << "Usage: " << argv[0] << " <interface>" << endl;
        return 1;
    }

    try {

        SnifferConfiguration config;

        config.set_immediate_mode(true);
         // Only capture TCP traffic sent from/to port 80
        config.set_filter("tcp port 443");
        // Construct the sniffer we'll use
        Sniffer sniffer(argv[1], config);

        cout << "Starting capture on interface " << argv[1] << endl;

        // Now construct the stream follower
        StreamFollower follower;

        follower.new_stream_callback(&on_new_connection);

        sniffer.sniff_loop([&](PDU& packet) {
            follower.process_packet(packet);
            return true;
        });
    }
    catch (exception& ex) {
        cerr << "Error: " << ex.what() << endl;
        return 1;
    }
}

我如何配置它以适用于https协议?

1 个答案:

答案 0 :(得分:2)

仅更改端口实际上无济于事。

虽然它将抓取数据包,但由于它们将被加密,因此将无法对其进行任何处理,因此任何正则表达式都将不匹配。

除非您有权从服务器访问私钥以解密内容,否则此代码将永远无法工作。