Payload dumper

data carving tcpflow

Introduction

This tutorial discusses the plugin payloadDumper, a tcpflow replacement. A plugin which does not match with the T2 traffic mining philosophy. You select first the relevant flows and then look into more detail. But a good lad we know wanted it badly, so we wrote it. In future it will do much more than tcpflow, e.g., layer 2, etc

Preparation

First, restore T2 into a pristine state by removing all unnecessary or older plugins from the plugin folder ~/.tranalyzer/plugins:

t2build -e -y

Are you sure you want to empty the plugin folder '/home/wurst/.tranalyzer/plugins' (y/N)? yes
Plugin folder emptied

Then compile the following plugins:

t2build tranalyzer2 basicFlow payloadDumper txtSink

...
BUILD SUCCESSFUL

If you did not create a separate data and results directory yet, please do it now in another bash window, that facilitates your workflow:

mkdir ~/data ~/results

The PCAP used in this tutorial can be downloaded here: faf-exercise.pcap.

Please save it in your ~/data folder.

Now you are all set for dumping payload!

payloadDumper

Let’s look at the plugin default configuration first:

payloadDumper

vi src/payloadDumper.h

...
/* ========================================================================== */
/* ------------------------ USER CONFIGURATION FLAGS ------------------------ */
/* ========================================================================== */

#define PLDUMP_L2          0 // Extract payload for layer 2 flows (require ETH_ACTIVATE > 0)
#define PLDUMP_TCP         1 // Extract payload for TCP flows
#define PLDUMP_UDP         1 // Extract payload for UDP flows
#define PLDUMP_SCTP        0 // Extract payload for SCTP stream flows (require SCTP_ACTIVATE > 0)

#define PLDUMP_ETHERTYPES {} // Only extract L2 payloads for those ethertypes, e.g., {0x2000,0x2003}
#define PLDUMP_TCP_PORTS  {} // Only extract TCP payloads on those ports, e.g., {80,8080}
#define PLDUMP_UDP_PORTS  {} // Only extract UDP payloads on those ports, e.g., {80,8080}
#define PLDUMP_SCTP_PORTS {} // Only extract SCTP payloads on those ports, e.g., {80,8080}

#define PLDUMP_MAX_BYTES   0 // Max number of bytes per flow to dump (use 0 for no limits)
#define PLDUMP_START_OFF   0 // Start dumping bytes at a specific offset (L2 and UDP only)

#define PLDUMP_NAMES       0 // Format for filenames:
                             //    0: flowInd '_' [AB]
                             //    1: srcIP.srcPort-dstIP.dstPort-l4Proto[_sctpStream],
                             //       srcMac-dstMac-etherType
                             //    2: Same as 1, but prefixed with timestampT

/* +++++++++++++++++++++ ENV / RUNTIME - conf Variables +++++++++++++++++++++ */

#define PLDUMP_RMDIR     1                     // Empty PLDUMP_FOLDER before starting
#define PLDUMP_FOLDER    "/tmp/payloadDumper"  // output folder
#define PLDUMP_PREFIX    ""                    // prefix for output files
#define PLDUMP_SUFFIX    ""                    // suffix for output files

/* ========================================================================== */
/* ------------------------- DO NOT EDIT BELOW HERE ------------------------- */
/* ========================================================================== */
...

You can choose whether layer 2, TCP, SCTP and/or UDP is your target. You can also choose to only extract data for specific ports or ethertypes, set a maximum for the payload length to be extracted and choose the name of the files and their location. By default the plugin extracts all payload from TCP and UDP.

Note that the following core switches found in networkHeaders.h must be activated for layer 2 and SCTP respectively:

  • For layer 2: ETH_ACTIVATE must be 1 or 2.
  • For SCTP, SCTP_ACTIVATE must be 1.

The PLDUMP_START_OFF defines the offset to start the extraction, this is experimental currently.

Let’s say we are only interested in FTP and SMTP packets to be extracted. So the appropriate t2conf command is the following:

t2conf payloadDumper -D PLDUMP_TCP_PORTS="{25,21}"

t2build payloadDumper

Note that the port row value has to be enclosed by ".

Now run t2 on the supplied pcap.

t2 -r ~/data/faf-exercise.pcap -w ~/results/ -s

tawk -V pldStat=0x03

The pldStat column with value 0x03 is to be interpreted as follows:

   bit | pldStat | Description
   =============================================================================
     0 | 0x01    | Match for this flow
     1 | 0x02    | dump payload for this flow

Let’s show only the flows which extract content:

tawk 'bitsanyset($pldStat, 0x02)' ~/results/faf-exercise_flows.txt | tcol

%dir  flowInd  flowStat            timeFirst          timeLast           duration   numHdrDesc  numHdrs  hdrDesc       srcMac             dstMac             ethType  ethVlanID  srcIP          srcIPCC  srcIPOrg           srcPort  dstIP          dstIPCC  dstIPOrg           dstPort  l4Proto  pldStat
A     12       0x0400000000004000  1258563573.941668  1258563576.594009  2.652341   1           3        eth:ipv4:tcp  00:0b:db:63:5b:d4  00:19:e3:e7:5d:23  0x0800              192.168.1.103  07       "Private network"  1397     192.168.1.1    07       "Private network"  25       6        0x03
B     12       0x0400000000004001  1258563573.941709  1258563576.594045  2.652336   1           3        eth:ipv4:tcp  00:19:e3:e7:5d:23  00:0b:db:63:5b:d4  0x0800              192.168.1.1    07       "Private network"  25       192.168.1.103  07       "Private network"  1397     6        0x03
A     13       0x0400000000004000  1258565030.304653  1258565030.420837  0.116184   1           3        eth:ipv4:tcp  00:0b:db:63:5b:d4  00:19:e3:e7:5d:23  0x0800              192.168.1.103  07       "Private network"  1749     192.168.1.1    07       "Private network"  25       6        0x03
B     13       0x0400000000004001  1258565030.304696  1258565030.420877  0.116181   1           3        eth:ipv4:tcp  00:19:e3:e7:5d:23  00:0b:db:63:5b:d4  0x0800              192.168.1.1    07       "Private network"  25       192.168.1.103  07       "Private network"  1749     6        0x03
A     14       0x0400000000004000  1258565174.919134  1258565175.037809  0.118675   1           3        eth:ipv4:tcp  00:0b:db:63:5b:d4  00:19:e3:e7:5d:23  0x0800              192.168.1.103  07       "Private network"  1755     192.168.1.1    07       "Private network"  25       6        0x03
B     14       0x0400000000004001  1258565174.919179  1258565175.037828  0.118649   1           3        eth:ipv4:tcp  00:19:e3:e7:5d:23  00:0b:db:63:5b:d4  0x0800              192.168.1.1    07       "Private network"  25       192.168.1.103  07       "Private network"  1755     6        0x03
...
B     32       0x0400000000004001  1258583614.298161  1258583615.323218  1.025057   1           3        eth:ipv4:tcp  00:19:e3:e7:5d:23  00:0b:db:63:58:a6  0x0800              192.168.1.1    07       "Private network"  25       192.168.1.102  07       "Private network"  1911     6        0x03
A     35       0x0400000000004000  1258594162.928342  1258594185.618346  22.690004  1           3        eth:ipv4:tcp  00:08:74:38:01:b4  00:19:e3:e7:5d:23  0x0800              192.168.1.105  07       "Private network"  49329    143.166.11.10  us       "Dell"             21       6        0x03
B     35       0x0400000000004001  1258594163.008594  1258594185.427515  22.418921  1           3        eth:ipv4:tcp  00:19:e3:e7:5d:23  00:08:74:38:01:b4  0x0800              143.166.11.10  us       "Dell"             21       192.168.1.105  07       "Private network"  49329    6        0x03

In the packet file we select now the packets which are dumped or only matched the rule.

tawk 'bitsanyset($pldStat, 0x03)' ~/results/faf-exercise_packets.txt | tcol

%pktNo  flowInd  flowStat            time               pktIAT     pktTrip    flowDuration  numHdrs  hdrDesc       ethVlanID  srcMac             dstMac             ethType  srcIP          srcIPCC  srcIPOrg         srcPort  dstIP          dstIPCC  dstIPOrg         dstPort  l4Proto  pldStat  l7Content
247     12       0x0400000000004000  1258563573.941668  0.000000   0.000000   0.000000      3        eth:ipv4:tcp             00:0b:db:63:5b:d4  00:19:e3:e7:5d:23  0x0800   192.168.1.103  07       Private network  1397     192.168.1.1    07       Private network  25       6        0x01
248     12       0x0400000000004001  1258563573.941709  0.000000   0.000041   0.000000      3        eth:ipv4:tcp             00:19:e3:e7:5d:23  00:0b:db:63:5b:d4  0x0800   192.168.1.1    07       Private network  25       192.168.1.103  07       Private network  1397     6        0x01
249     12       0x0400000000004000  1258563573.942161  0.000493   0.000452   0.000493      3        eth:ipv4:tcp             00:0b:db:63:5b:d4  00:19:e3:e7:5d:23  0x0800   192.168.1.103  07       Private network  1397     192.168.1.1    07       Private network  25       6        0x01
250     12       0x0400000000004001  1258563574.317353  0.375644   0.375192   0.375644      3        eth:ipv4:tcp             00:19:e3:e7:5d:23  00:0b:db:63:5b:d4  0x0800   192.168.1.1    07       Private network  25       192.168.1.103  07       Private network  1397     6        0x03     220 domex ESMTP Postfix\r\n
251     12       0x0400000000004000  1258563574.319182  0.377021   0.001829   0.377514      3        eth:ipv4:tcp             00:0b:db:63:5b:d4  00:19:e3:e7:5d:23  0x0800   192.168.1.103  07       Private network  1397     192.168.1.1    07       Private network  25       6        0x03     EHLO m57pat\r\n
252     12       0x0400000000004001  1258563574.319211  0.001858   0.000029   0.377502      3        eth:ipv4:tcp             00:19:e3:e7:5d:23  00:0b:db:63:5b:d4  0x0800   192.168.1.1    07       Private network  25       192.168.1.103  07       Private network  1397     6        0x01
253     12       0x0400000000004001  1258563574.319380  0.000169   0.000198   0.377671      3        eth:ipv4:tcp             00:19:e3:e7:5d:23  00:0b:db:63:5b:d4  0x0800   192.168.1.1    07       Private network  25       192.168.1.103  07       Private network  1397     6        0x03     250-domex\r\n250-PIPELINING\r\n250-SIZE 10485760\r\n250-VRFY\r\n250-ETRN\r\n250-AUTH LOGIN PLAIN CRAM-MD5 GSSAPI\r\n250-STARTTLS\r\n250-ENHANCEDSTATUSCODES\r\n250-8BITMIME\r\n250 DSN\r\n
254     12       0x0400000000004000  1258563574.319928  0.000746   0.000548   0.378260      3        eth:ipv4:tcp             00:0b:db:63:5b:d4  00:19:e3:e7:5d:23  0x0800   192.168.1.103  07       Private network  1397     192.168.1.1    07       Private network  25       6        0x03     STARTTLS\r\n
255     12       0x0400000000004001  1258563574.319950  0.000570   0.000022   0.378241      3        eth:ipv4:tcp             00:19:e3:e7:5d:23  00:0b:db:63:5b:d4  0x0800   192.168.1.1    07       Private network  25       192.168.1.103  07       Private network  1397     6        0x01
...
1279    35       0x0400000000004001  1258594163.407582  0.080461   0.079737   0.398988      3        eth:ipv4:tcp             00:19:e3:e7:5d:23  00:08:74:38:01:b4  0x0800   143.166.11.10  us       Dell             21       192.168.1.105  07       Private network  49329    6        0x03     227 Entering Passive Mode (143,166,11,10,251,78)\r\n
1283    35       0x0400000000004000  1258594163.487490  0.159645   0.079908   0.559148      3        eth:ipv4:tcp             00:08:74:38:01:b4  00:19:e3:e7:5d:23  0x0800   192.168.1.105  07       Private network  49329    143.166.11.10  us       Dell             21       6        0x03     SIZE /video/R79733.EXE\r\n
1284    35       0x0400000000004001  1258594163.565990  0.158408   0.078500   0.557396      3        eth:ipv4:tcp             00:19:e3:e7:5d:23  00:08:74:38:01:b4  0x0800   143.166.11.10  us       Dell             21       192.168.1.105  07       Private network  49329    6        0x03     213 4255056\r\n
1285    35       0x0400000000004000  1258594163.566694  0.079204   0.000704   0.638352      3        eth:ipv4:tcp             00:08:74:38:01:b4  00:19:e3:e7:5d:23  0x0800   192.168.1.105  07       Private network  49329    143.166.11.10  us       Dell             21       6        0x03     RETR /video/R79733.EXE\r\n
1286    35       0x0400000000004001  1258594163.644188  0.078198   0.077494   0.635594      3        eth:ipv4:tcp             00:19:e3:e7:5d:23  00:08:74:38:01:b4  0x0800   143.166.11.10  us       Dell             21       192.168.1.105  07       Private network  49329    6        0x03     125 Data connection already open; Transfer starting.\r\n
1303    35       0x0400000000004000  1258594163.838277  0.271583   0.194089   0.909935      3        eth:ipv4:tcp             00:08:74:38:01:b4  00:19:e3:e7:5d:23  0x0800   192.168.1.105  07       Private network  49329    143.166.11.10  us       Dell             21       6        0x01
5898    35       0x0400000000004001  1258594185.427515  21.783327  21.589237  22.418921     3        eth:ipv4:tcp             00:19:e3:e7:5d:23  00:08:74:38:01:b4  0x0800   143.166.11.10  us       Dell             21       192.168.1.105  07       Private network  49329    6        0x03     226 Transfer complete.\r\n
5900    35       0x0400000000004000  1258594185.618346  21.780069  0.190831   22.690004     3        eth:ipv4:tcp             00:08:74:38:01:b4  00:19:e3:e7:5d:23  0x0800   192.168.1.105  07       Private network  49329    143.166.11.10  us       Dell             21       6        0x01
5902    37       0x0400000000004001  1258594491.683288  0.000000   0.000000   0.000000      3        eth:ipv4:tcp             00:19:e3:e7:5d:23  00:08:74:38:01:b4  0x0800   143.166.11.10  us       Dell             21       192.168.1.105  07       Private network  49329    6        0x01

Note that packet 247-249,252,255… 1303,5900,5902 match our rule, but were not extracted due to no payload. You may load basicStat to verify that fact. Now look under /tmp/ for the extracted payload:

ls /tmp/payloadDumper

12_A  13_A  14_A  15_A  16_A  17_A  18_A  19_A  20_A  21_A  22_A  23_A  24_A  25_A  26_A  27_A  28_A  29_A  30_A  31_A  32_A  35_A
12_B  13_B  14_B  15_B  16_B  17_B  18_B  19_B  20_B  21_B  22_B  23_B  24_B  25_B  26_B  27_B  28_B  29_B  30_B  31_B  32_B  35_B

Let’s have a look at one of the files:

cat /tmp/payloadDumper/35_A

USER anonymous
PASS IEUser@
TYPE I
PASV
SIZE /video/R79733.EXE
RETR /video/R79733.EXE

Oups, what is that? Murky….

As homework try look into file 28_A and then change PLDUMP_NAME to 1, recompile and rerun T2, now the file names look like tcpflow. Play around with PLDUMP_TCP_PORTS extract some ports, e.g., 80 traffic.

Conclusion

Another method to extract the content and display it like Wireshark’s Follow TCP/UDP stream is to use tawk and the follow_stream() function on the packet file. Refer to the packet mode tutorial for a practical example.

Don’t forget to reset the plugin configuration for the next tutorial.

t2conf payloadDumper --reset && t2build payloadDumper

Have fun analyzing.