Friday 13 November 2015

Question about TCP raw-socket programming.

I am trying some basic socket programming in node js. Below is some code to send a TCP SYN packet. It does send the packet, and the target will respond accordingly. I used wireshark to capture the packets, and confirmed that a correct packet was sent and a SYN + ACK or RST + ACK is received. However, the s.on("message", func) never prints anything to the output. I cannot figure out why.var raw = require('raw-socket'); var crypto = require('crypto'); var ip = require('ip'); var s = raw.createSocket({ protocol: raw.Protocol.TCP, generateChecksums: true }); // source port 20 to destination port 80. Packet length 20 with SYN flag set. Other flags are zeroed. var p = new Buffer('0014005000000000000000005002200000000000', 'hex'); // generate four random bytes for the packet sequence. crypto.randomBytes(4).copy(p, 4); //build pseudo TCP header. var genPseudoHeader = function (srcIp, dstIp, tcpPacketLength) { var pseudoHeader = new Buffer(12); pseudoHeader.fill(0); pseudoHeader.writeUIntBE(ip.toLong(srcIp), 0, 4); pseudoHeader.writeUIntBE(ip.toLong(dstIp), 4, 4); pseudoHeader.writeUIntBE(6, 9, 1); pseudoHeader.writeUIntBE(tcpPacketLength, 10, 2); return pseudoHeader; }; // this gets absolutely nothing. s.on('message', function (buffer, address) { console.log("received " + buffer.length + " bytes from " + address + ": " + buffer.toString("hex")); }); // calculate checksum using utility function. var sum = raw.createChecksum(genPseudoHeader('192.168.40.100', '192.168.40.1', p.length), p); // writing checksum to TCP packet. p.writeUIntBE(sum, 16, 2); console.log(p); function afterSend(error, bytes) { if (error) { console.log (error.toString ()); } else { console.log ("sent " + bytes + " bytes"); } } // send packet s.send(p, 0, p.length, "192.168.40.1", function () {}, afterSend);

Submitted November 13, 2015 at 04:43AM by zachary87921

No comments:

Post a Comment