2011-08-05 10:30:10 +02:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# capture.sh, Copyright © 2011 Matteo Cypriani <mcy@lm7.fr>
|
|
|
|
#
|
|
|
|
########################################################################
|
|
|
|
# This program is licensed under the terms of the Expat license.
|
|
|
|
#
|
|
|
|
# Permission is hereby granted, free of charge, to any person obtaining
|
|
|
|
# a copy of this software and associated documentation files (the
|
|
|
|
# "Software"), to deal in the Software without restriction, including
|
|
|
|
# without limitation the rights to use, copy, modify, merge, publish,
|
|
|
|
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
|
|
# permit persons to whom the Software is furnished to do so, subject to
|
|
|
|
# the following conditions:
|
2011-08-06 12:26:59 +02:00
|
|
|
#
|
2011-08-05 10:30:10 +02:00
|
|
|
# The above copyright notice and this permission notice shall be
|
|
|
|
# included in all copies or substantial portions of the Software.
|
2011-08-06 12:26:59 +02:00
|
|
|
#
|
2011-08-05 10:30:10 +02:00
|
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
|
|
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
|
|
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
|
|
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
|
|
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
########################################################################
|
|
|
|
#
|
|
|
|
# Captures a few packets on a Wi-Fi interface, using Tcpdump, and
|
2011-08-05 14:41:14 +02:00
|
|
|
# writes them to a Pcap file along with some information about the
|
|
|
|
# system. A tarball containing all these files is finally created.
|
2011-08-05 10:30:10 +02:00
|
|
|
|
|
|
|
#set -x
|
|
|
|
set -e
|
|
|
|
|
2011-08-07 20:07:11 +02:00
|
|
|
# Displays the message in argument and exits
|
2011-08-05 10:30:10 +02:00
|
|
|
error()
|
|
|
|
{
|
|
|
|
echo "$1"
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
2011-08-07 20:07:11 +02:00
|
|
|
# Switches the capture interface on the channel in argument
|
|
|
|
set_channel()
|
|
|
|
{
|
|
|
|
echo -n "Setting interface $IFACE on channel $1... "
|
|
|
|
case $OS in
|
|
|
|
Linux)
|
|
|
|
[ -x /sbin/iwconfig ] \
|
|
|
|
|| error "iwconfig is required to run this program on Linux!"
|
|
|
|
iwconfig $IFACE channel $1
|
|
|
|
;;
|
|
|
|
NetBSD)
|
|
|
|
ifconfig $IFACE chan $1
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
error "Your OS is not supported."
|
|
|
|
;;
|
|
|
|
esac \
|
|
|
|
&& echo "OK." \
|
|
|
|
|| error "Cannot set the channel!"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Invokes tcpdump and returns the number of packets captured
|
|
|
|
invoke_tcpdump()
|
|
|
|
{
|
|
|
|
return $(tcpdump -i $IFACE -c $NB_PKT -w "$FILE" 2>&1 \
|
|
|
|
| sed -n 's/ packets captured$//p')
|
|
|
|
}
|
|
|
|
|
|
|
|
# Waits for a number of seconds, then kills any tcpdump process
|
|
|
|
wait_tcpdump()
|
|
|
|
{
|
|
|
|
sleep $1
|
|
|
|
pkill tcpdump
|
|
|
|
}
|
|
|
|
|
2011-08-05 10:30:10 +02:00
|
|
|
[ $# -eq 1 ] \
|
|
|
|
|| error "Usage: $0 <wifi_interface>"
|
|
|
|
|
|
|
|
which tcpdump >/dev/null \
|
|
|
|
|| error "tcpdump is required to run this program!"
|
|
|
|
|
2011-08-05 14:41:14 +02:00
|
|
|
## Parameters (tune them if you want) ##
|
|
|
|
# Number of packet to capture:
|
2011-08-05 10:30:10 +02:00
|
|
|
NB_PKT=10
|
2011-08-07 20:07:11 +02:00
|
|
|
# Maximal time of a capture on a given channel:
|
|
|
|
TIMEOUT=15
|
2011-08-05 14:41:14 +02:00
|
|
|
# Temporary directory:
|
|
|
|
TMP=/tmp
|
|
|
|
# Name of the capture file:
|
|
|
|
FILE=capture.pcap
|
2011-08-07 20:07:11 +02:00
|
|
|
# First channel to scan:
|
2011-08-06 12:01:40 +02:00
|
|
|
CHANNEL=1
|
2011-08-05 14:41:14 +02:00
|
|
|
|
|
|
|
## Generated parameters ##
|
|
|
|
# Interface to capture from:
|
|
|
|
IFACE=$1
|
|
|
|
# Machine information:
|
|
|
|
OS=`uname`
|
2011-08-06 12:30:39 +02:00
|
|
|
OS_RELEASE=`uname -r`
|
2011-08-05 14:41:14 +02:00
|
|
|
HOSTNAME=`uname -n`
|
2011-08-06 15:49:43 +02:00
|
|
|
# Current date:
|
|
|
|
DATE=`date +%FT%H%M%S`
|
2011-08-05 10:30:10 +02:00
|
|
|
|
|
|
|
echo -n "Shuting down interface $IFACE... "
|
|
|
|
ifconfig $IFACE down && echo "OK." \
|
|
|
|
|| error "Cannot shut down the interface!"
|
|
|
|
|
|
|
|
echo -n "Switching interface $IFACE to monitor mode... "
|
2011-08-05 14:41:14 +02:00
|
|
|
case $OS in
|
2011-08-05 10:30:10 +02:00
|
|
|
Linux)
|
|
|
|
[ -x /sbin/iwconfig ] \
|
2011-08-05 14:41:14 +02:00
|
|
|
|| error "iwconfig is required to run this program on Linux!"
|
2011-08-07 20:07:11 +02:00
|
|
|
iwconfig $IFACE mode monitor
|
2011-08-06 12:26:59 +02:00
|
|
|
;;
|
|
|
|
NetBSD)
|
2011-08-07 20:07:11 +02:00
|
|
|
ifconfig $IFACE media autoselect mediaopt monitor
|
2011-08-05 14:41:14 +02:00
|
|
|
;;
|
2011-08-05 10:30:10 +02:00
|
|
|
*)
|
2011-08-05 14:41:14 +02:00
|
|
|
error "Your OS is not supported."
|
|
|
|
;;
|
2011-08-06 12:26:59 +02:00
|
|
|
esac \
|
|
|
|
&& echo "OK." \
|
|
|
|
|| error "Cannot configure the interface!"
|
2011-08-05 10:30:10 +02:00
|
|
|
|
|
|
|
echo -n "Turning up interface $IFACE... "
|
|
|
|
ifconfig $IFACE up && echo "OK." \
|
|
|
|
|| error "Cannot turn the interface up!"
|
|
|
|
|
2011-08-07 20:07:11 +02:00
|
|
|
echo "Trying to capture $NB_PKT packets..."
|
2011-08-06 15:49:43 +02:00
|
|
|
DIR=$(mktemp -d \
|
|
|
|
"$TMP"/capture_${OS}-${OS_RELEASE}_${IFACE}_${HOSTNAME}_${DATE}_XX)
|
2011-08-05 14:41:14 +02:00
|
|
|
FILE="$DIR/$FILE"
|
2011-08-07 20:07:11 +02:00
|
|
|
CAPTURED=0
|
|
|
|
while [ $CAPTURED -eq 0 -a $CHANNEL -le 14 ] ; do
|
|
|
|
set_channel $CHANNEL
|
|
|
|
wait_tcpdump $TIMEOUT &
|
|
|
|
invoke_tcpdump
|
|
|
|
CAPTURED=$?
|
|
|
|
[ $CAPTURED -eq 0 ] \
|
|
|
|
&& echo "No packet captured on channel $CHANNEL."
|
|
|
|
CHANNEL=`expr $CHANNEL + 1`
|
|
|
|
done
|
|
|
|
|
|
|
|
[ $CAPTURED -gt 0 ] \
|
|
|
|
&& echo "Capture file \"$FILE\" created with $CAPTURED packets." \
|
|
|
|
|| error "Failed to capture any packet!"
|
2011-08-05 14:41:14 +02:00
|
|
|
|
|
|
|
echo -n "Gathering system information... "
|
|
|
|
# Kernel & other information:
|
|
|
|
uname -a >"$DIR"/uname-a
|
|
|
|
# Wi-Fi interface information:
|
|
|
|
ifconfig $IFACE >"$DIR"/ifconfig_$IFACE
|
|
|
|
# PCI devices:
|
|
|
|
which lspci >/dev/null \
|
|
|
|
&& lspci >"$DIR"/lspci \
|
|
|
|
|| echo "lspci not available! Please install pciutils. "
|
|
|
|
# Loaded kernel modules & USB devices:
|
|
|
|
case $OS in
|
|
|
|
Linux)
|
|
|
|
lsmod >"$DIR"/lsmod
|
|
|
|
which lsusb >/dev/null \
|
|
|
|
&& lsusb >"$DIR"/lsusb \
|
|
|
|
|| echo "lsusb not available! Please install usbutils. "
|
|
|
|
;;
|
2011-08-06 12:26:59 +02:00
|
|
|
NetBSD)
|
|
|
|
modstat >"$DIR"/modstat
|
|
|
|
which usbstats >/dev/null \
|
|
|
|
&& usbstats >"$DIR"/usbstats \
|
|
|
|
|| echo "usbstats not available! Please install usbutil. "
|
|
|
|
;;
|
2011-08-05 14:41:14 +02:00
|
|
|
DragonFly)
|
|
|
|
kldstat >"$DIR"/kldstat
|
|
|
|
which usbstats >/dev/null \
|
|
|
|
&& usbstats >"$DIR"/usbstats \
|
|
|
|
|| echo "usbstats not available! Please install usbutil. "
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
echo "OK."
|
2011-08-05 10:30:10 +02:00
|
|
|
|
2011-08-05 14:41:14 +02:00
|
|
|
FILE="${DIR}.tar.gz"
|
|
|
|
DIR=`basename "$DIR"`
|
|
|
|
tar -C "$TMP" -czf "$FILE" "$DIR"
|
|
|
|
echo "Archive \"$FILE\" created."
|
|
|
|
rm -fr "$TMP/$DIR"
|
2011-08-05 10:30:10 +02:00
|
|
|
|
|
|
|
echo
|
|
|
|
echo "You can now shut down the interface $IFACE if you want:"
|
|
|
|
echo " ifconfig $IFACE down"
|