본문 바로가기
Develop

[C++] LibTins를 통한 802.11 Decrypt(무선패킷 복호화 하기)

by Dork94 2017. 11. 30.

오늘은 802.11 패킷을 LibTIns를 통해 복호화 하는 간단한 예제를 알아보도록 하겠습니다.


LibTins에 대한 기초적인 예시가 많이 존재하지 않으므로, 알아가는것을 차츰차츰 포스팅 하도록 하겠습니다.



 
#include <iostream>
#include <tins/tins.h>
#include "printdata.h"

using namespace Tins;
using namespace std;

void usage();
bool chkArgc(int argc);
bool foo(PDU& packet)
{
    

    const TCP& tcp = packet.rfind_pdu<TCP>();
//    const TCP* tcp1 = packet.find_pdu<TCP>(); reference find

//    if(tcp.dport()!=80&&tcp.sport()!=80) return true; //parsing HTTP Packet

    cout<<"TCP Source Port : "<<tcp.sport()<<endl;
    cout<<"TCP Destination Port : " << tcp.dport()<<endl;
    const RawPDU& rawPDU = packet.rfind_pdu<RawPDU>();
    if(rawPDU.size()>0){
        printByHexData((uint8_t*) rawPDU.payload().data(),rawPDU.size());
        cout<<"Payload Size : "<<rawPDU.size()<<endl;
    }
    return true;
}


int main(int argc, char* argv[])
{
    if(!chkArgc(argc))
        exit(1);

    //init 802.11 Sniffer by Promiscuous Modes

    SnifferConfiguration config;
    config.set_filter("port 80");
    config.set_promisc_mode(true);

    Sniffer sniffer(argv[1],config);


    auto decrypt_proxy = Crypto::make_wpa2_decrypter_proxy(&foo);

    decrypt_proxy.decrypter().add_ap_data("dorkdork","HanBin");

    return 0;
}

void usage()
{
    cout<<"Usage : ./IamU <Monitor mode Interface> <Channel>"<<endl;
}
bool chkArgc(int argc)
{
    if(argc!=3)
    {
        usage();
        return false;
    }

    return true;
}


먼저 Sniffer객체를 이용해 Sniff할 장치를 지정하고, config 객체를 이용해 필터 및 설정을 할 수 있습니다.


그리고 decrypt_proxy 객체를 이용해 패킷이 수신되면 Decrypt를 진행합니다. 


이때, 객체의 해당 Password(dorkdork) 및 SSID(HanBin)을 주어야 정상적으로 Decrypt가 진행되므로 알고 있어야 합니다(LibTIns는 패스워드 크래킹을 지원하지 않습니다).


패킷이 수신되고 정상적으로 패킷이 복호화가 되면 지정해준 함수(foo)로 가서 원하는 프로세스를 동작 시킬 수 있으며, 이때 패킷은 PDU의 형태로 지정됩니다.


그리고 foo함수에서 보시는 바와 같이 간단하게 패킷을 parsing하여 이용할 수 있습니다.


위의 예제는 80번 포트의 패킷을 수신(Decrypt)하여 포트를 출력하고 뒤의 데이터가 있다면 해당 데이터를 출력 하는 프로그램입니다.


위의 printByHexData는 제가 작성한 외부 함수(printdata.h)이므로 혼동없으시길 바랍니다. 해당 함수는 아래의 포스팅을 참조하시길 바랍니다.


2017/09/22 - [Develop] - 16진수로 값 출력 및 mac address 출력하기 (C++)



댓글0