HTTP Redirection

Home Forums Discussions Support HTTP Redirection

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
      Keymaster

        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
          Keymaster

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

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

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

            #6109
            Jaze
            Participant

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

              #6110
              Vadim Smirnov
              Keymaster

                На 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.