Upload

The upload API call provides a simple mechanism for remotely uploading files to the CloudShark appliance. The upload call returns the associated capture session which can then be used to link directly to the decode session. The capture session is returned in JSON format.

Optional parameters include filename, tags, comments and an tls keylog file. If filename is not specified, the file will be named after the browser’s User Agent and a unique timestamp. The additional_tags is a comma separated list of tags the file will be saved with. File comments may also be added at upload time by sending the comments parameter. See the curl examples below for a demonstration. NOTE that when using the PUT method, optional parameters must be appended to the URL rather than being specified as multipart/form-encoded data.

POST Usage

POST /api/v1/<token>/upload

Required parameters: the upload method requires either a url or file parameter. The form will either indicate url=http://some-host/some-file.cap or file= File contents must be encoded as multipart/form-data.

PUT Usage

Support for the PUT method was introduced in CloudShark 1.5.

PUT /api/v1/<token>/upload

Upload with PUT supports receiving a binary stream of data that is the contents of the file.

The optional keylog parameter cannot be specified when using the PUT method.

Response

CloudShark returns the result of the upload call in JSON. It is an object representing the newly created capture session, or containing any errors that prevented the file from being imported.

{"filename":"traffic-2011-08-16-104829.cap","id":"f27d1494400c"}

Here is the full HTTP response with headers.

HTTP/1.1 200 OK
Server: nginx/0.9.4
Date: Tue, 16 Aug 2011 14:48:34 GMT
Content-Type: text/javascript; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive

40
{"filename":"traffic-2011-08-16-104829.cap","id":"f27d1494400c"}
0

The session id can be used to build a URL directly to the decode session.

https://www.cloudshark.org/captures/f27d1494400c

If the upload fails for any reason, the HTTP response may be either 4xx or 5xx. In this case the JSON body will contain the HTTP status along with an array of exceptions explaining the failure.

{"status":404,"exceptions":["API Token is missing or invalid"]}

Additional Parameters

Optional parameters can be set at the time of upload via the API:

  • additional_tags - a comma-separated list of tags to apply to the capture file
  • filename - specify the filename of the capture in CloudShark
  • comments - file-level comments
  • keylog - tls keylog file

Examples

Below are some examples of calling the upload API in a few different languages. We are big fans of Ruby here at CloudShark, but we wanted to show how this can be implemented a variety of ways.

Curl

Curl can be used to upload local files and files available at specific URLs with a CloudShark API token. One of the nice things about curl is that it will do all the form encoding for you with the handy -F flag. A few simple examples are shown below.

Curl with a local file:

curl -F file=@filename.cap https://www.cloudshark.org/api/v1/<api-key>/upload

Curl with a URL:

curl -F url=http://path/to/capture/file https://www.cloudshark.org/api/v1/<api-key>/upload

Curl with a URL and HTTP authentication:

curl -F url=http://username:password@path/to/capture/file https://www.cloudshark.org/api/v1/<api-key>/upload

Include additional tags and change the filename:

curl -F file=@filename.cap -F additional_tags=tag1,tag2,tag3 -F filename=new_filename.cap https://www.cloudshark.org/api/v1/<api-key>/upload

Curl using POST and TLS Keylog file:

curl -F file=@filename.cap -F keylog=@keylogfile https://www.cloudshark.org/api/v1/<api-key>/upload

Curl using PUT instead of POST:

curl --upload-file filename.cap https://www.cloudshark.org/api/v1/<api-key>/upload

Curl using PUT and adding comments:

curl --upload-file filename.cap https://www.cloudshark.org/api/v1/<api-key>/upload?comments=captured+from+NOC+23

Gotchas:

Be careful to URL-encode all your parameter values when using curl. For example anything that includes spaces should be sent with + (plus-sign) instead. Also if specifying multiple URL parameters separated with the & sign, be sure to escape it so bash doesn’t interpret it as the end of the command.

Bash

While bash is not the best language to invoke a web API, it is possible to write simple scripts to upload files. Here is an example of using tcpdump to generate a capture file and then upload it to CloudShark.

#!/bin/sh
#
# bash script to use CloudShark Token API
#

UPLOAD=traffic-`date +%F-%H%M%S`.cap
CLOUDSHARKURL=https://cloudshark.myhost.example/api/v1/6d4ca6e11916dfc64c4d98c0c9fcea72/upload

# -- generate a capture file using tcpdump
echo "Generate a capture file"
tcpdump -i eth0 -c 100 -w $UPLOAD

# -- build a curl command
JSONID=`curl -F "file=@$UPLOAD" -F "additional_tags=script" $CLOUDSHARKURL | python -mjson.tool | grep id`

if [ "$JSONID" != "" ]; then

   # -- find the CloudShark ID for this session
   ID=`echo $JSONID | sed 's/:/ /1' | awk -F" " '{ print $2 }'| sed 's/\"//g'`

   echo "Uploaded $UPLOAD to CloudShark"

   # -- show a URL using the capture session in CloudShark
   echo "Please visit https://cloudshark.myhost.example/captures/$ID"
else
   echo "Could not upload capture to CloudShark"

Ruby

For Ruby, Net::HTTP can be used to generate a POST. There is also a multipart form gem ‘multipart-post’ that makes it easy to POST. You will need to install the ‘mulipart-post’ gem first.

gem install multipart-post

Here is a simple example uploading an existing capture file.

#!/usr/bin/env ruby

require 'rubygems'
require 'json'
require 'net/http/post/multipart'

cloudshark = "cloudshark.xyz.example"
apikey = "6d4ca6e11916dfc64c4d98c0c9fcea72"

url = URI.parse('http://' + cloudshark + '/api/v1/' + apikey + '/upload/')

# -- upload traffic.cap
File.open("./traffic.cap") do |cap|
  req = Net::HTTP::Post::Multipart.new url.path,
    "file" => UploadIO.new(cap, "application/octet-stream", "traffic.cap")
  res = Net::HTTP.start(url.host, url.port) do |http|
    http.request(req)
  end

  puts "Received response #{res.body}"

  # -- parse the JSON response
  result = JSON.parse(res.body)

  # -- check for the session id
  if result.has_key? 'id'
    id = result["id"]
    puts "New capture uploaded with session id #{id}"
    puts "Access URL http://#{cloudshark}/captures/#{id}"
  else
    puts "Capture file was not uploaded"
  end

end

Windows PowerShell

Windows 8 users can natively capture packets using the netsh capture interface. With the Microsoft Message Analyzer tool, this proprietary format can be converted back into a pcap file and then uploaded using all native powershell cmdlets. With this one additional Microsoft download, a Windows 8 system is capable of pure packet capture and upload to CloudShark.

# CloudShark PowerShell Demo Script
# Free to distribute; Send us improvements and we'll credit and post!
# To use this script you must:
# (1) be in an Admin PowerShell
# (2) you must allow unsigned scripts: run
#     Set-ExecutionPolicy RemoteSigned
# (3) You must have Message Analyzer installed
# (Restart the Admin PowerShell after installing Message Analyzer
#     to load the New-PefTraceSession cmdlets)

# Set this to your CloudShark host
$cloudshark="edge.lan"
# Set this to your CloudShark upload API token
$tok="4fc5d18f2ae74f2c3b75f1879d343d00"

# Size of the capture file, in megabytes.
$maxsize=1

# Clean up any previous session data
If (Test-Path "C:\Users\$env:username\Desktop\OutFile.Cap"){
    Remove-Item "C:\Users\$env:username\Desktop\OutFile.Cap"
}

If (Test-Path "C:\Users\$env:username\Desktop\trace.etl"){
    Remove-Item "C:\Users\$env:username\Desktop\trace.etl"
}
netsh trace stop

# Start a new capture
netsh trace start capture=yes traceFile=C:\Users\$env:username\Desktop\trace.etl maxSize=$maxsize

$s = New-PefTraceSession -Path "C:\Users\$env:username\Desktop\OutFile.Cap" -SaveOnStop
$s | Add-PefMessageProvider -Provider "C:\Users\$env:username\AppData\Local\Temp\NetTraces\NetTrace.etl"
$s | Start-PefTraceSession

Invoke-RestMethod -uri http://$cloudshark/api/v1/$tok/upload -method PUT -inFile C:\Users\$env:username\Desktop\OutFile.Cap