Codebase list 0trace / master 0trace.sh
master

Tree @master (Download .tar.gz)

0trace.sh @masterraw · history · blame

#!/bin/bash

umask 077

T=`mktemp "$HOME/.0trace-XXXXXX"`

if [ "$2" = "" ]; then
  echo "Usage: $0 iface target_ip [ target_port ]" 1>&2
  exit 1
fi

if [ ! -x /bin/usleep ]; then
  echo "[-] /bin/usleep not found on this system, sorry." 1>&2
  exit 1
fi

if [ ! "`uname`" = "Linux" ]; then
  echo "[-] WARNING: Only Linux is believed to work fine with this utility." 1>&2
fi

make sendprobe >/dev/null
test -f ./sendprobe || exit 1

echo "0trace v0.01 PoC by <[email protected]>"

RULE="(tcp[13] & 0x17 == 0x10) and src host $2"
test "$3" = "" || RULE="$RULE and src port $3"

echo "[+] Waiting for traffic from target on $1..."

/usr/sbin/tcpdump -c 1 -s 200 -S -q -i "$1" -n -x "$RULE" >"$T" 2>/dev/null

if [ ! -s "$T" ]; then
  echo "[-] Something went wrong with tcpdump (check parameters)."
  rm -f "$T"
  exit 1
fi

echo "[+] Traffic acquired, waiting for a gap..."

WAITING=0
WAITTIME=0

while [ "$WAITTIME" -lt "80" ]; do
  /usr/sbin/tcpdump -c 1 -s 200 -S -q -i "$1" -n -x "$RULE" >"$T-2" 2>/dev/null &
  TPID="$!"
  usleep 100000

  while kill -0 "$TPID" 2>/dev/null; do
    WAITING=$[WAITING+1]
    if [ "$WAITING" -gt "20" ]; then
      kill "$TPID" 2>/dev/null
      break
    fi
    usleep 100000
  done
  
  test -s "$T-2" || break
  WAITING=0
  cat "$T-2" >"$T"
  WAITTIME=$[WAITTIME+1]
  
done

if  [ "$WAITTIME" -ge "80" ]; then
  echo "[-] Couldn't find a sufficient period of no activity."
  exit 1
fi

cat "$T" | head -3 | tail -1 | sed 's/0x[0-9]*:/ /g' | cut -b25- >"$T-2"
read A1 A2 S1 S2 <"$T-2"
cat "$T" | head -1 | sed 's/IP //' | cut -d' ' -f2,4 | sed  's/\.\([0-9]*\)[: ]/ \1 /g' >"$T-2"
read DADDR DPORT SADDR SPORT <"$T-2"
rm -f "$T-2"

SEQ=`printf "%u" 0x$S1$S2`
ACK=`printf "%u" 0x$A1$A2`

echo "[+] Target acquired: $SADDR:$SPORT -> $DADDR:$DPORT ($SEQ/$ACK)."

echo "[+] Setting up a sniffer..."

/usr/sbin/tcpdump -l -s 200 -S -q -i "$1" -n -x "icmp or ($RULE)" >"$T" 2>/dev/null &
TPID="$!"

echo "[+] Sending probes..."

./sendprobe $SADDR $DADDR $SPORT $DPORT $SEQ $ACK
sleep 2
kill "$TPID" 2>/dev/null

echo 
echo "TRACE RESULTS"
echo "-------------"

cat "$T" | sed 's/ IP//g;s/^[ 	]*0x[0-9]*: //g' | grep -vE '45.0 00' | grep -iA1 'time.excee' | \
  grep -vE '^--' | cut -d' ' -f2 | \
  sed 's/\([0-9a-f][0-9a-f]\)[0][0]$/\1/g' | \
  awk '{if (NR%2) {SAVE=$0} else {print $0 " " SAVE}}' | \
  grep -v '[0-9a-f][0-9a-f][0-9a-f][0-9a-f]' | \
  while read -r num dat; do echo "$[0x$num] $dat"; done | sort -n -u

if grep -qF ': tcp 0' "$T"; then
  echo "Target reached."
else
  echo "Probe rejected by target."
fi

echo

rm -f "$T"

exit 1