HTTP Redirection

Home Forums Discussions Support Portal HTTP Redirection

This topic contains 5 replies, has 2 voices, and was last updated by  Vadim Smirnov 11 years, 3 months ago.

Viewing 6 posts - 1 through 6 (of 6 total)
  • Author
    Posts
  • #5045

    Jaze
    Participant

    Subject is to catch client request to http://www.google.com for example and redirect it to another site. I detect if ip is google.com and change it, then I recalculate checksum of IP header and send packet to adapter. And it does not works. I have tried to indicate modified packet to MCTCP instead of sending to adapter – same result. The trick is that ping redirects normally and HTTP not 🙁 And Ethreal does not even indicate that packet is going out. But SendPacketToAdapter(MSTCP) returns true. As for MAC it does not need to be changed.

    #6106

    Vadim Smirnov
    Moderator

    When you change IP address in the TCP packet you must also recalculate TCP checksum (IP address is included in the pseudo header). Other things are similar to ICMP if you have managed to get it working already.

    #6107

    Jaze
    Participant

    I have recalculated TCP checksum also. When sending packet I change desination IP and when recieving I change source IP(as was described in some topic here). Redirection of telnet, ping works fine and http redirection is not(( here is code


    void filter()
    {
    WaitForSingleObject ( hEvent, INFINITE );
    ResetEvent(hEvent);
    while (api->ReadPacket(request))
    {

    if (buffer->m_dwDeviceFlags == PACKET_FLAG_ON_SEND)
    {
    printf("Attemp to send...n");
    parsePacketHeaders(buffer);
    api->SendPacketToAdapter(request);
    }
    if (buffer->m_dwDeviceFlags == PACKET_FLAG_ON_RECEIVE)
    {
    printf("Recieved...n");
    parsePacketHeaders(buffer);
    api->SendPacketToMstcp(request);
    }

    }

    }

    PINTERMEDIATE_BUFFER parsePacketHeaders ( PINTERMEDIATE_BUFFER pBuffer )
    {
    ether_header_ptr pEthernet = (ether_header_ptr)&pBuffer->m_IBuffer;

    if(ntohs(pEthernet->h_proto) == ETH_P_IP)
    {
    iphdr_ptr pIp = NULL;
    tcphdr_ptr pTcp = NULL;
    pIp = (iphdr_ptr)&pBuffer->m_IBuffer[sizeof(ether_header)];
    UCHAR IpProto = pIp->ip_p;

    if(IpProto == IPPROTO_TCP)
    {
    //pTcp = (tcphdr_ptr)(((PUCHAR)pIp) + sizeof(DWORD)*pIp->ip_hl);
    }//tcp??

    //redirection here
    if ((pIp->ip_dst.S_un.S_un_b.s_b3 == 32) & (pIp->ip_dst.S_un.S_un_b.s_b4 == 14))
    {
    pIp->ip_dst.S_un.S_un_b.s_b4 = 9;
    pIp->ip_dst.S_un.S_un_b.s_b3 = 32;
    recalculateIPChecksum(pBuffer);
    recalculateTCPChecksum(pBuffer);
    }
    if ((pIp->ip_src.S_un.S_un_b.s_b3 == 32) & (pIp->ip_src.S_un.S_un_b.s_b4 == 9))
    {
    pIp->ip_src.S_un.S_un_b.s_b4 = 14;
    pIp->ip_src.S_un.S_un_b.s_b3 = 32;
    recalculateIPChecksum(pBuffer);
    recalculateTCPChecksum(pBuffer);
    }
    }


    return pBuffer;

    }

    SerpentFly – ты русский? Если да – то пиши по-русски)) А то я думал тут все из-за бугра.
    Еще ethreal ом посмотрел – модифицированные http пакеты не выходят(( просто Ip(ping) telnet – нормально.

    #6108

    Vadim Smirnov
    Moderator

    SerpentFly – ты русский? Если да – то пиши по-русски)) А то я думал тут все из-за бугра.
    Еще ethreal ом посмотрел – модифицированные http пакеты не выходят(( просто Ip(ping) telnet – нормально.

    Странно это все, разницы между телнетом и HTTP на этом уровне нет никакой, ты например можешь телнетом приконектится на 80 порт. Единственное, в HTTP GET запросе по хорошему нужно править еще и имя хоста, иначе сервер может не ответить.

    Сам пакет разумеется никуда деться сам по себе не может. В сеть можно полный мусор слать при желании. Может быть стоит что-то (типа фаервола) что пакеты режет по каким-то своим таинственным критериям, в общем так посоветовать что-то сложно, нужно разбираться с данной конкретной системой. Могу посоветовать только попробовать все на чистой системе и сравнить.

    #6109

    Jaze
    Participant

    Ну все – разобрался)) Outpost резал – воспринимал подмену как атаку. Еще один вопрос – не подскажешь где найти простенький алгоритм NAT на С++?

    #6110

    Vadim Smirnov
    Moderator

    На WinpkFilter здесь есть http://www.ntkernel.com/w&p.php?id=31

Viewing 6 posts - 1 through 6 (of 6 total)

You must be logged in to reply to this topic.