

                       NPING NEW ECHO MODE PROPOSAL
                               June 2010

                           Luis MartinGarcia
                         (luis.mgarc@gmail.com)


 TABLE OF CONTENTS
 
     0x01. Introduction
     0x02. Input
     0x03. Output
     0x04. Results
     0x05. Protocol

== 0x01: INTRODUCTION ==

    Troubleshooting routing and firewall issues is a common task nowadays.
    The scenario is generally that some network traffic should be flowing
    but isn't. The causes of problem can range from routing issues to
    network firewall to host-based firewalls to all sorts of other strange
    things.  It is usually the "middle box" problem that is the hardest to
    find.     

    Suppose there is some host with a TCP service listening that you can't
    connect to for an unknown reason.  If a Nmap -sS scan doesn't show the
    port as open there are a multitude of possible problems.  Maybe the SYN
    packet never made it because of some firewall in the middle.  Maybe the
    SYN did make it but the SYN+ACK got dropped on it's way back to you.
    Maybe the TTL expired in transit but the ICMP message got blocked by
    another firewall before making it back to you.  Maybe the SYN made it
    but some intermediate host forged a reset packet to snipe the connection
    before the SYN+ACK made it back to you.

    When things like the above are going on, it is often the case that one
    has to turn to Wireshark/tcpdump on one station and Nping on the other.
    However, this is usually difficult to coordinate, specially when the
    person at the remote host does not even know what an IP address is.

    To solve this problem, Nping will have a new mode, called "Echo mode"
    that will give it the power of a combination like hping + tcpdump.
    This echo mode turns Nping into a client/server application. One station
    runs Nping in server mode and the other in client mode. The way it works
    is: the Nping client performs an initial handshake with the server over some
    standard port (creating a side-channel). Then it notifies the server
    what packets are about to be sent. The server sets up a liberal BPF
    filter that captures those packets, and starts listening. When the server
    receives a packet it encapsulates it into a packet of our own protocol,
    the Nping Echo Protocol (NEP), and sends it back to the client.    
    This would be essentially like running tcpdump on the remote machine
    and having it report back the packets you sent to it with Nping.

    By having the side-channel to talk to the server, things like NAT would
    become immediately apparent because you'd see your source IP (and
    sometimes port) change.  Things like "packet shapers" that change TCP
    window sizes transparently between hosts would turn up.  It would be 
    easy to tell if the traffic is being dropped in transit and never gets 
    to the box.  It would also be easy to tell if the traffic does make it 
    to the box but the reply never makes it back to you.

    In general, it would be like sending a postal package to someone and
    having them email you a photo of the package when they get it. If you
    think your packages are being abused by the parcel service then having
    someone on the other end to send information back is a great way to
    uncover what is going on.



== 0x02: INPUT ==

 From a user's perpective, this new mode would be set up from the command line.
 Here's a possible interface:

 SERVER 
    Users may start the server, using the default parameters, running:
        nping --echo-server "Squemmish Ossifrage"

    where the parameter passed to the --echo-server argument is the passphrase
    that is used to derive encryption keys.

    Obvioulsy it would be possible to override defaults running something like:
        nping --echo-server "SquemmishOssifrage" --echo-port 9999 -vvv 

 CLIENT

    Users would need to supply "--echo-client <passphrase>" and the usual
    parameters used in Nping's normal operation mode.

    For example, the next command tells nping to connect to the echo server at
    echo.insecure.org, and send one TCP-SYN packet to the echo server.
    
        nping --echo-client "SquemmishOssifrage" --tcp --flags syn --win 0 -c1 echo.insecure.org

== 0x03: OUTPUT ==

 About the output, Nping will print three types of packets: sent packets,
 received reply packets, and echoed packets received through the side channel.
 For captured packets, only the fields that differ from the original packet will
 be displayed. This makes it easier to spot the fields that changed in transit.
 Here's a sample output.

 SENT (0.0980s) TCP 192.168.1.99:33856 > 74.207.254.18:80 S ttl=64 id=60467 iplen=40  seq=1754993861 win=0
 CAPT (0.4504s) TCP 10.1.2.158:33856 > 10.0.23.56:80 ttl=53
 RCVD (0.1000s) TCP 74.207.254.18:80 > 192.168.1.99:33856 SA ttl=128 id=11746 iplen=44  seq=3230736912 win=16384 <mss 1460>

 Output would be more detailed if verbosity mode is incremented. For example,
 the IP checksum, which is expected to change in virtually all cases (as it is
 recomputed in transit for every TTL decrement operation), would only be printed
 when the level of verbosity is higher than the default. Here's another example:

 SENT (0.0760s) TCP [192.168.1.99:33856 > 74.207.254.18:80 S seq=3835079997 ack=0 off=5 res=0 win=0 csum=0x807E urp=0] IP [ver=4 ihl=5 tos=0x00 iplen=40 id=63460 foff=0 ttl=64 proto=6 csum=0x2d6b]
 CAPT (0.4504s) TCP [10.1.2.158:33856 > 10.0.23.56:80 csum=34fd] [IP ttl=53 csum=f43d]
 RCVD (0.0850s) TCP [74.207.254.18:80 > 192.168.1.99:18367 SA seq=507544695 ack=3835079998 off=6 res=0 win=16384 csum=0x85F9 urp=0 <mss 1460>] IP [ver=4 ihl=5 tos=0x00 iplen=44 id=17102 foff=0 ttl=128 proto=6 csum=0xa27d]

 Note that the displayed time for the CAPT packet is higher than RCVD's. This is
 because Nping will hold the RCVD packet information until it gets the echoed
 packet. The reason for this behaviour is that it may be less confusing for end
 users to see the differences between the SENT and the CAPT packets if they
 are printed one after the other. Typically, network stacks will respond to
 SENT packets before the Nping Server has time to capture them, encapsulate them
 in a Nping Echo Protocol message and send them back to the client, so in order
 to display SENT and CAPT packets together, the RCVD output needs to be delayed
 for a bit.

== 0x04: RESULTS ==

 Apart from displaying the packets that were sent and the ones that were
 captured, Nping should, if possible, give hints about what may have happened
 in transit. For example, if the original source address does not match the
 source address of the received packet, Nping could inform that with high
 probability there is a NAT device close to the client. Nping could detect
 things like variation of TCP window size and warn about possible transparent
 proxies, etc.

 Starting Nping 0.5.30BETA1 ( https://nmap.org/nping ) at 2010-06-30 17:20 CEST
 
 SENT (0.0980s) TCP 192.168.1.99:33856 > 74.207.254.18:80 S ttl=64 id=60467 iplen=40  seq=1754993861 win=0
 CAPT (0.4504s) TCP 10.1.2.158:33856 > 10.0.23.56:80 ttl=53
 RCVD (0.1000s) TCP 74.207.254.18:80 > 192.168.1.99:33856 SA ttl=128 id=11746 iplen=44  seq=3230736912 win=16384 <mss 1460>

 Packet Echo Analysis:
  |_Source IP and Destination IP differ: possible NAT device on both ends.
  |_TTL values differ by 11 units. Network distance between both hosts: 11 hops.
 
 Max rtt: 8.509ms | Min rtt: 8.509ms | Avg rtt: 8.509ms
 Raw packets sent: 1 (40B) | Rcvd: 1 (46B) | Lost: 0 (0.00%)
 Echoed packets recv: 1 (40B) | Lost: 0 (0.00%)
 Tx time: 0.00020s | Tx bytes/s: 202020.20 | Tx pkts/s: 5050.51
 Rx time: 0.99984s | Rx bytes/s: 46.01 | Rx pkts/s: 1.00
 Nping done: 1 IP address pinged in 1.08 seconds


   
== 0x05: PROTOCOL ==

 The side channel will be run over a custom application layer protocol called
 NEP, Nping Echo Protocol. The protocol itself is described in a separate
 document: "Nping Echo Protocol Specification", available from:
    <https://nmap.org/svn/nping/nping-dev/EchoProtoRFC.txt>
    
 The following flow diagram describes a typical client/server interaction.
 Please refer to the document cited above for more information.


                        C                          S
                        |                          |
                        |       TCP Handshake      |
Establish regular TCP   |------------------------->|
connection              |<-------------------------|
                        |------------------------->|
                        |                          |
                        |                          |
                        |                          |
Check that both         |                          |
understand each other   |  NEP Handshake and Auth  |
and authenticate the    |<------------------------>|
client                  |<------------------------>|
                        |<------------------------>|
                        |                          |
                        |                          |
                        |                          |
Client tells the server |  PacketType={IP/TCP/Syn} |
which kind of packet is |------------------------->|
going so send           |                          |    S
                        |                          |    | /* Server starts    */
                        |                          |    | /* capturing packets*/
                        |      ServerReadyToGo     |    | /* here.            */
Server indicates its    |<-------------------------|    |
sniffing engine is      |                          |    |
readty to capture the   | C                        |    |
packet                  | |                        |    |
                        | |                        |    |
                        | |                        |    |
                        | |                        |    |
Client sends the pkt    | |    IP/TCP/Syn Packet   |    |
via raw sockets         | |---------------------------->| 
                        | |                        |    | /* Server receives  */
                        |                          |    | /* the packet       */
                        |    Echo of the packet    |....| 
Server echoes the       |<-------------------------|
packet via the NEP      |                          |
session they have.      |          .               |
                        |          .               |
                        |          .               |
                        |    More raw pkt/echo     |
                        |        exchanges         |
                        |          .               |
                        |          .               |
                        |          .               |
                        |                          |
                        |                          |
                        |  TCP Connection Close    |
TCP connection closed   |<------------------------>|
                        |                          |






