mirror of https://github.com/hak5/shark-files.git
Files: Initial commit of Shark files
commit
49cbd4460d
|
@ -0,0 +1,4 @@
|
||||||
|
[submodule "www"]
|
||||||
|
path = www
|
||||||
|
url = git@github.com:hak5/unified-ui.git
|
||||||
|
branch = master
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
\_____)\_____ Shark Jack _____/(_____/
|
||||||
|
/--v____ __°< by Hak5 >°__ ____v--\
|
||||||
|
)/ \(
|
|
@ -0,0 +1,14 @@
|
||||||
|
|
||||||
|
config interface 'loopback'
|
||||||
|
option ifname 'lo'
|
||||||
|
option proto 'static'
|
||||||
|
option ipaddr '127.0.0.1'
|
||||||
|
option netmask '255.0.0.0'
|
||||||
|
|
||||||
|
config interface 'lan'
|
||||||
|
option ifname 'eth0'
|
||||||
|
option proto 'static'
|
||||||
|
option ipaddr '172.16.24.1'
|
||||||
|
option netmask '255.255.255.0'
|
||||||
|
option ip6assign '60'
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/sh /etc/rc.common
|
||||||
|
|
||||||
|
START=99
|
||||||
|
|
||||||
|
start() {
|
||||||
|
logger -t Shark "[*] Starting Hak5 Shark Jack"
|
||||||
|
/usr/bin/shark_framework
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
logger -t Shark "[*] Stopping Hak5 Shark Jack"
|
||||||
|
sync
|
||||||
|
/usr/bin/LED OFF
|
||||||
|
halt
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Hak5 Packages
|
||||||
|
src/gz 1907_shark http://downloads.hak5.org/packages/shark/1907/
|
|
@ -0,0 +1,4 @@
|
||||||
|
PermitRootLogin yes
|
||||||
|
PubkeyAuthentication yes
|
||||||
|
AuthorizedKeysFile .ssh/authorized_keys
|
||||||
|
Subsystem sftp internal-sftp
|
|
@ -0,0 +1,39 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Firstboot setup script for the Shark Jack by Hak5
|
||||||
|
|
||||||
|
|
||||||
|
# Change root password
|
||||||
|
echo -e "hak5shark\nhak5shark\n" | passwd
|
||||||
|
|
||||||
|
# Change the hostname
|
||||||
|
uci set system.@system[0].hostname=shark
|
||||||
|
uci commit system
|
||||||
|
echo $(uci get system.@system[0].hostname) > /proc/sys/kernel/hostname
|
||||||
|
|
||||||
|
# Disable Telnet server
|
||||||
|
/etc/init.d/telnet disable
|
||||||
|
/etc/init.d/telnet stop
|
||||||
|
|
||||||
|
# Disable AutoSSH
|
||||||
|
/etc/init.d/autossh disable
|
||||||
|
/etc/init.d/autossh stop
|
||||||
|
|
||||||
|
# Disable SSH server
|
||||||
|
/etc/init.d/sshd disable
|
||||||
|
/etc/init.d/sshd stop
|
||||||
|
|
||||||
|
# Disable odhcpd
|
||||||
|
/etc/init.d/odhcpd disable
|
||||||
|
/etc/init.d/odhcpd stop
|
||||||
|
|
||||||
|
# Disable uHTTPd web server
|
||||||
|
/etc/init.d/uhttpd disable
|
||||||
|
/etc/init.d/uhttpd stop
|
||||||
|
|
||||||
|
# Enable Shark service
|
||||||
|
/etc/init.d/shark enable
|
||||||
|
/etc/init.d/shark start
|
||||||
|
|
||||||
|
|
||||||
|
# Ensure the script is deleted after execution
|
||||||
|
exit 0
|
|
@ -0,0 +1 @@
|
||||||
|
1.1.0
|
|
@ -0,0 +1,82 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Title: Sample Nmap Payload for Shark Jack
|
||||||
|
# Author: Hak5
|
||||||
|
# Version: 1.0
|
||||||
|
#
|
||||||
|
# Scans target subnet with Nmap using specified options. Saves each scan result
|
||||||
|
# to loot storage folder.
|
||||||
|
#
|
||||||
|
# Red ...........Setup
|
||||||
|
# Amber..........Scanning
|
||||||
|
# Green..........Finished
|
||||||
|
#
|
||||||
|
# See nmap --help for options. Default "-sP" ping scans the address space for
|
||||||
|
# fast host discovery.
|
||||||
|
|
||||||
|
NMAP_OPTIONS="-sP --host-timeout 30s --max-retries 3"
|
||||||
|
LOOT_DIR=/root/loot/nmap
|
||||||
|
SCAN_DIR=/etc/shark/nmap
|
||||||
|
|
||||||
|
|
||||||
|
function finish() {
|
||||||
|
LED CLEANUP
|
||||||
|
# Kill Nmap
|
||||||
|
wait $1
|
||||||
|
kill $1 &> /dev/null
|
||||||
|
|
||||||
|
# Sync filesystem
|
||||||
|
echo $SCAN_M > $SCAN_FILE
|
||||||
|
sync
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
LED FINISH
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
# Halt system
|
||||||
|
halt
|
||||||
|
}
|
||||||
|
|
||||||
|
function setup() {
|
||||||
|
LED SETUP
|
||||||
|
# Create loot directory
|
||||||
|
mkdir -p $LOOT_DIR &> /dev/null
|
||||||
|
|
||||||
|
# Create tmp scan directory
|
||||||
|
mkdir -p $SCAN_DIR &> /dev/null
|
||||||
|
|
||||||
|
# Create tmp scan file if it doesn't exist
|
||||||
|
SCAN_FILE=$SCAN_DIR/scan-count
|
||||||
|
if [ ! -f $SCAN_FILE ]; then
|
||||||
|
touch $SCAN_FILE && echo 0 > $SCAN_FILE
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Find IP address and subnet
|
||||||
|
NETMODE DHCP_CLIENT
|
||||||
|
while [ -z "$SUBNET" ]; do
|
||||||
|
sleep 1 && find_subnet
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function find_subnet() {
|
||||||
|
SUBNET=$(ip addr | grep -i eth0 | grep -i inet | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}[\/]{1}[0-9]{1,2}" | sed 's/\.[0-9]*\//\.0\//')
|
||||||
|
}
|
||||||
|
|
||||||
|
function run() {
|
||||||
|
# Run setup
|
||||||
|
setup
|
||||||
|
|
||||||
|
SCAN_N=$(cat $SCAN_FILE)
|
||||||
|
SCAN_M=$(( $SCAN_N + 1 ))
|
||||||
|
|
||||||
|
LED ATTACK
|
||||||
|
# Start scan
|
||||||
|
nmap $NMAP_OPTIONS $SUBNET -oN $LOOT_DIR/nmap-scan_$SCAN_M.txt &>/dev/null &
|
||||||
|
tpid=$!
|
||||||
|
|
||||||
|
finish $tpid
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Run payload
|
||||||
|
run &
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function setup() {
|
||||||
|
echo $1 > /sys/class/gpio/export 2>/dev/null
|
||||||
|
echo in > /sys/class/gpio/gpio$1/direction 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_gpio() {
|
||||||
|
if [ ! -d /sys/class/gpio/gpio$1 ]; then
|
||||||
|
setup $1
|
||||||
|
fi
|
||||||
|
state=$(cat /sys/class/gpio/gpio$1/value)
|
||||||
|
echo $state
|
||||||
|
}
|
||||||
|
|
||||||
|
gpio40=$(check_gpio 40)
|
||||||
|
gpio41=$(check_gpio 41)
|
||||||
|
|
||||||
|
if [ $gpio40 -eq "0" ] && [ $gpio41 -eq "0" ]; then
|
||||||
|
echo "discharging"
|
||||||
|
elif [ $gpio40 -eq "0" ]; then
|
||||||
|
echo "full"
|
||||||
|
elif [ $gpio41 -eq "0" ]; then
|
||||||
|
echo "charging"
|
||||||
|
fi
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
while true;do LED R;LED Y;LED G;LED C;LED B;LED M;done > /dev/null 2>&1 &
|
|
@ -0,0 +1,243 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
RED_LED="/sys/class/leds/shark:red:system/brightness"
|
||||||
|
GREEN_LED="/sys/class/leds/shark:green:system/brightness"
|
||||||
|
BLUE_LED="/sys/class/leds/shark:blue:system/brightness"
|
||||||
|
|
||||||
|
colors=(0 0 0)
|
||||||
|
pattern=(1 0 0 0 0 0)
|
||||||
|
|
||||||
|
function convert() {
|
||||||
|
echo $([[ $1 -lt 20 ]] && echo 0.02 || echo $1 1000 | awk '{ print $1/$2 }')
|
||||||
|
}
|
||||||
|
|
||||||
|
function parse_color() {
|
||||||
|
case $1 in
|
||||||
|
"R")
|
||||||
|
colors=(1 0 0)
|
||||||
|
;;
|
||||||
|
"G")
|
||||||
|
colors=(0 1 0)
|
||||||
|
;;
|
||||||
|
"B")
|
||||||
|
colors=(0 0 1)
|
||||||
|
;;
|
||||||
|
"Y")
|
||||||
|
colors=(1 1 0)
|
||||||
|
;;
|
||||||
|
"C")
|
||||||
|
colors=(0 1 1)
|
||||||
|
;;
|
||||||
|
"M")
|
||||||
|
colors=(1 0 1)
|
||||||
|
;;
|
||||||
|
"W")
|
||||||
|
colors=(1 1 1)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
function parse_pattern() {
|
||||||
|
local INVERTED="0"
|
||||||
|
[[ "$(echo $1 | head -c1)" == "I" ]] && {
|
||||||
|
INVERTED="1"
|
||||||
|
}
|
||||||
|
case $1 in
|
||||||
|
"SLOW")
|
||||||
|
pattern=(0 0 1 $(convert 1000) $(convert 1000) 1)
|
||||||
|
;;
|
||||||
|
"FAST")
|
||||||
|
pattern=(0 0 1 $(convert 100) $(convert 100) 1)
|
||||||
|
;;
|
||||||
|
"VERYFAST")
|
||||||
|
pattern=(0 0 1 $(convert 10) $(convert 10) 1)
|
||||||
|
;;
|
||||||
|
"ISINGLE" | "SINGLE")
|
||||||
|
pattern=(0 $INVERTED 1 $(convert 100) $(convert 1000) 1)
|
||||||
|
;;
|
||||||
|
"IDOUBLE" | "DOUBLE")
|
||||||
|
pattern=(0 $INVERTED 2 $(convert 100) $(convert 1000) 1)
|
||||||
|
;;
|
||||||
|
"ITRIPLE" | "TRIPLE")
|
||||||
|
pattern=(0 $INVERTED 3 $(convert 100) $(convert 1000) 1)
|
||||||
|
;;
|
||||||
|
"IQUAD" | "QUAD")
|
||||||
|
pattern=(0 $INVERTED 4 $(convert 100) $(convert 1000) 1)
|
||||||
|
;;
|
||||||
|
"IQUIN" | "QUIN")
|
||||||
|
pattern=(0 $INVERTED 5 $(convert 100) $(convert 1000) 1)
|
||||||
|
;;
|
||||||
|
"SUCCESS")
|
||||||
|
pattern=(0 0 1 $(convert 10) $(convert 10) 0)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
[[ $1 =~ ^-?[0-9]+$ ]] && pattern=(0 0 1 $(convert $1) $(convert $1) 1) || pattern=(1 0 0 0 0 0)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function parse_state() {
|
||||||
|
|
||||||
|
local STATENUM="1"
|
||||||
|
[[ $1 =~ ^[A-Z]+[1-5]$ ]] && {
|
||||||
|
STATENUM="${1: -1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
"SETUP")
|
||||||
|
parse_color "M"
|
||||||
|
parse_pattern "SOLID"
|
||||||
|
;;
|
||||||
|
"FAIL" | FAIL[1-3])
|
||||||
|
parse_color "R"
|
||||||
|
parse_pattern "SLOW"
|
||||||
|
pattern[3]=$(convert $(echo -n 1000 | head -c $((5-$STATENUM))))
|
||||||
|
;;
|
||||||
|
"ATTACK" | STAGE[1-5])
|
||||||
|
parse_color "Y"
|
||||||
|
parse_pattern "SINGLE"
|
||||||
|
pattern[2]=$STATENUM
|
||||||
|
;;
|
||||||
|
"SPECIAL" | SPECIAL[1-5])
|
||||||
|
parse_color "C"
|
||||||
|
parse_pattern "ISINGLE"
|
||||||
|
pattern[2]=$STATENUM
|
||||||
|
;;
|
||||||
|
"CLEANUP")
|
||||||
|
parse_color "W"
|
||||||
|
parse_pattern "FAST"
|
||||||
|
;;
|
||||||
|
"FINISH")
|
||||||
|
parse_color "G"
|
||||||
|
parse_pattern "SUCCESS"
|
||||||
|
;;
|
||||||
|
"OFF")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function clear_led() {
|
||||||
|
echo 0 > $RED_LED 2>&1
|
||||||
|
echo 0 > $GREEN_LED 2>&1
|
||||||
|
echo 0 > $BLUE_LED 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
function light_led() {
|
||||||
|
echo ${colors[0]} > $RED_LED 2>&1
|
||||||
|
echo ${colors[1]} > $GREEN_LED 2>&1
|
||||||
|
echo ${colors[2]} > $BLUE_LED 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
function blink_loop() {
|
||||||
|
local sc=1
|
||||||
|
until [[ "$sc" == "10" ]]; do
|
||||||
|
for i in $(seq 1 ${pattern[2]}); do
|
||||||
|
[[ "${pattern[1]}" == "0" ]] && light_led || clear_led
|
||||||
|
sleep ${pattern[3]}
|
||||||
|
[[ "${pattern[1]}" == "0" ]] && clear_led || light_led
|
||||||
|
sleep ${pattern[3]}
|
||||||
|
done
|
||||||
|
sleep ${pattern[4]}
|
||||||
|
[[ "${pattern[5]}" == "0" ]] && sc=$((sc+1))
|
||||||
|
done
|
||||||
|
[[ "${pattern[5]}" == "0" ]] && light_led
|
||||||
|
}
|
||||||
|
|
||||||
|
function run_led() {
|
||||||
|
parse_state $1 || {
|
||||||
|
parse_color $1 || return 1
|
||||||
|
[[ "$#" == "2" ]] && parse_pattern $2
|
||||||
|
}
|
||||||
|
|
||||||
|
[[ "${pattern[0]}" == "1" ]] && {
|
||||||
|
light_led &
|
||||||
|
return 0
|
||||||
|
} || {
|
||||||
|
blink_loop &
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_usage() {
|
||||||
|
cat << EOF
|
||||||
|
Usage: LED [COLOR] [PATTERN] or LED [STATE]
|
||||||
|
|
||||||
|
COLORS:
|
||||||
|
R Red
|
||||||
|
G Green
|
||||||
|
B Blue
|
||||||
|
Y, R G Yellow (Commonly known as Amber)
|
||||||
|
C, G B Cyan (Commonly known as Light Blue)
|
||||||
|
M, R B Magenta (Commonly known as Violet or Purple)
|
||||||
|
W, R G B White (Combination of R + G + B)
|
||||||
|
|
||||||
|
PATTERNS:
|
||||||
|
SOLID *Default. No blink. Used if pattern argument is omitted
|
||||||
|
SLOW Symmetric 1000ms ON, 1000ms OFF, repeating
|
||||||
|
FAST Symmetric 100ms ON, 100ms OFF, repeating
|
||||||
|
VERYFAST Symmetric 10ms ON, 10ms OFF, repeating
|
||||||
|
|
||||||
|
SINGLE 1 100ms blink(s) ON followed by 1 second OFF, repeating
|
||||||
|
DOUBLE 2 100ms blink(s) ON followed by 1 second OFF, repeating
|
||||||
|
TRIPLE 3 100ms blink(s) ON followed by 1 second OFF, repeating
|
||||||
|
QUAD 4 100ms blink(s) ON followed by 1 second OFF, repeating
|
||||||
|
QUIN 5 100ms blink(s) ON followed by 1 second OFF, repeating
|
||||||
|
|
||||||
|
ISINGLE 1 100ms blink(s) OFF followed by 1 second ON, repeating
|
||||||
|
IDOUBLE 2 100ms blink(s) OFF followed by 1 second ON, repeating
|
||||||
|
ITRIPLE 3 100ms blink(s) OFF followed by 1 second ON, repeating
|
||||||
|
IQUAD 4 100ms blink(s) OFF followed by 1 second ON, repeating
|
||||||
|
IQUIN 5 100ms blink(s) OFF followed by 1 second ON, repeating
|
||||||
|
|
||||||
|
SUCCESS 1000ms VERYFAST blink followed by SOLID
|
||||||
|
# Custom value in ms for continuous symmetric blinking
|
||||||
|
|
||||||
|
STATES:
|
||||||
|
In addition to the combinations of COLORS and PATTERNS listed above,
|
||||||
|
these standardized LED STATES may be used to indicate payload status:
|
||||||
|
|
||||||
|
SETUP M SOLID Magenta solid
|
||||||
|
|
||||||
|
FAIL R SLOW Red slow blink
|
||||||
|
FAIL1 R SLOW Red slow blink
|
||||||
|
FAIL2 R FAST Red fast blink
|
||||||
|
FAIL3 R VERYFAST Red very fast blink
|
||||||
|
|
||||||
|
ATTACK Y SINGLE Yellow single blink
|
||||||
|
STAGE1 Y SINGLE Yellow single blink
|
||||||
|
STAGE2 Y DOUBLE Yellow double blink
|
||||||
|
STAGE3 Y TRIPLE Yellow triple blink
|
||||||
|
STAGE4 Y QUAD Yellow quadruple blink
|
||||||
|
STAGE5 Y QUIN Yellow quintuple blink
|
||||||
|
|
||||||
|
SPECIAL C ISINGLE Cyan inverted single blink
|
||||||
|
SPECIAL1 C ISINGLE Cyan inverted single blink
|
||||||
|
SPECIAL2 C IDOUBLE Cyan inverted double blink
|
||||||
|
SPECIAL3 C ITRIPLE Cyan inverted triple blink
|
||||||
|
SPECIAL4 C IQUAD Cyan inverted quadruple blink
|
||||||
|
SPECIAL5 C IQUIN Cyan inverted quintuple blink
|
||||||
|
|
||||||
|
CLEANUP W FAST White fast blink
|
||||||
|
FINISH G SUCCESS Green very fast blink followed by SOLID
|
||||||
|
|
||||||
|
OFF Turns the LED off
|
||||||
|
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
LED Y SINGLE
|
||||||
|
LED M 500
|
||||||
|
LED SETUP
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
ps | grep LED | grep -v grep | awk '{print $1}' | grep -v $$ | xargs kill -9 &> /dev/null
|
||||||
|
run_led $@ || show_usage
|
|
@ -0,0 +1,23 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function show_usage() {
|
||||||
|
echo "Usage: $0 [DHCP_CLIENT|DHCP_SERVER]"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
"DHCP_CLIENT")
|
||||||
|
uci set network.lan.proto='dhcp'
|
||||||
|
;;
|
||||||
|
"DHCP_SERVER")
|
||||||
|
uci set network.lan.proto='none'
|
||||||
|
/etc/init.d/odhcpd start
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
show_usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
uci commit network
|
||||||
|
/etc/init.d/network restart
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function setup() {
|
||||||
|
echo $1 > /sys/class/gpio/export
|
||||||
|
echo in > /sys/class/gpio/gpio$1/direction
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_gpio() {
|
||||||
|
if [ ! -d /sys/class/gpio/gpio$1 ]; then
|
||||||
|
setup $1
|
||||||
|
fi
|
||||||
|
state=$(cat /sys/class/gpio/gpio$1/value)
|
||||||
|
echo $state
|
||||||
|
}
|
||||||
|
|
||||||
|
gpio0=$(check_gpio 0)
|
||||||
|
gpio2=$(check_gpio 2)
|
||||||
|
|
||||||
|
if [ $gpio0 -eq "0" ] && [ $gpio2 -eq "0" ]; then
|
||||||
|
echo "switch1"
|
||||||
|
elif [ $gpio0 -eq "0" ]; then
|
||||||
|
echo "switch3"
|
||||||
|
elif [ $gpio2 -eq "0" ]; then
|
||||||
|
echo "switch2"
|
||||||
|
fi
|
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# List of directories to clean
|
||||||
|
DIRS=(
|
||||||
|
~/.ssh
|
||||||
|
/root/loot
|
||||||
|
)
|
||||||
|
|
||||||
|
# Clean up each directory
|
||||||
|
for d in ${DIRS[@]}; do
|
||||||
|
[[ -d $d ]] && rm -rf $d
|
||||||
|
done
|
|
@ -0,0 +1,248 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
LOG="logger -t Shark [*]"
|
||||||
|
LOG_ERR="logger -t Shark -p 3 [!]"
|
||||||
|
|
||||||
|
MODE="OFF"
|
||||||
|
SWITCH_POSITION=$(/usr/bin/SWITCH)
|
||||||
|
|
||||||
|
function upgrade_leds() {
|
||||||
|
/usr/bin/LED OFF
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
echo 1 > /sys/class/leds/shark:red:system/brightness
|
||||||
|
sleep 0.2
|
||||||
|
echo 0 > /sys/class/leds/shark:red:system/brightness
|
||||||
|
echo 1 > /sys/class/leds/shark:blue:system/brightness
|
||||||
|
sleep 0.2
|
||||||
|
echo 0 > /sys/class/leds/shark:blue:system/brightness
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# $1: Upgrade file
|
||||||
|
# $2: MD5 file
|
||||||
|
# $3: Upgrade file size in bytes
|
||||||
|
function extract_md5() {
|
||||||
|
dd if=$1 of=$2 skip=$3 bs=1 count=33
|
||||||
|
}
|
||||||
|
|
||||||
|
# $1: Upgrade file
|
||||||
|
# $2: MD5 file
|
||||||
|
function verify_md5() {
|
||||||
|
expected=$(cat $2)
|
||||||
|
checksum=$(md5sum $1 | awk '{print $1}')
|
||||||
|
[[ $expected = $checksum ]] && {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# $1: Upgrade file
|
||||||
|
# $2: Upgrade file size in bytes
|
||||||
|
function truncate_upgrade() {
|
||||||
|
dd if=/dev/null of=$1 bs=1 seek=$2
|
||||||
|
}
|
||||||
|
|
||||||
|
function execute_upgrade() {
|
||||||
|
# Check for upgrade file in default location
|
||||||
|
$LOG "Checking for firmware upgrade"
|
||||||
|
upgrade_file=$(ls /root/upgrade-*.bin 2>/dev/null | tail -n1)
|
||||||
|
|
||||||
|
[[ -f $upgrade_file ]] && {
|
||||||
|
# Upgrade file found
|
||||||
|
$LOG "Firmware upgrade found"
|
||||||
|
|
||||||
|
$LOG "Verifying firmware upgrade"
|
||||||
|
upgrade_file_size=$(( $(ls -l $upgrade_file | awk '{print $5}') - 33 ))
|
||||||
|
|
||||||
|
# Extract md5sum from upgrade file
|
||||||
|
extract_md5 $upgrade_file /tmp/upgrade.md5 $upgrade_file_size
|
||||||
|
|
||||||
|
cp $upgrade_file /tmp/upgrade.bin
|
||||||
|
truncate_upgrade /tmp/upgrade.bin $upgrade_file_size
|
||||||
|
|
||||||
|
# Verify upgrade file
|
||||||
|
verify_md5 /tmp/upgrade.bin /tmp/upgrade.md5 || {
|
||||||
|
# Upgrade file not verified; exit
|
||||||
|
$LOG "Firmware upgrade not verified. File may be corrupt"
|
||||||
|
LED FAIL &
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
$LOG "Firmware upgrade verified"
|
||||||
|
LED OFF && LED SUCCESS
|
||||||
|
|
||||||
|
# Check battery state first
|
||||||
|
$LOG "Checking device power state"
|
||||||
|
battery_state=$(/usr/bin/BATTERY)
|
||||||
|
[[ $battery_state = "discharging" ]] && {
|
||||||
|
# Device is not plugged in
|
||||||
|
$LOG "Device is not powered. Do not attempt firmware upgrade"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
$LOG "Device is powered"
|
||||||
|
|
||||||
|
# Remove upgrade file
|
||||||
|
rm -rf $upgrade_file
|
||||||
|
sync
|
||||||
|
|
||||||
|
# Upgrade file verified; run upgrade
|
||||||
|
$LOG "Executing UPGRADE"
|
||||||
|
sleep 2 && upgrade_leds &
|
||||||
|
echo "sysupgrade -n /tmp/upgrade.bin" | at now
|
||||||
|
|
||||||
|
exit
|
||||||
|
} || {
|
||||||
|
# Upgrade file not found; enter arming mode
|
||||||
|
$LOG "Firmware upgrade not found"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function execute_payload() {
|
||||||
|
$LOG "Executing PAYLOAD"
|
||||||
|
|
||||||
|
if [ ! -d /root/loot ]; then
|
||||||
|
mkdir -p /root/loot;
|
||||||
|
fi
|
||||||
|
|
||||||
|
payload_path="/root/payload"
|
||||||
|
payload=$(ls $payload_path/payload* 2>/dev/null | tail -n1)
|
||||||
|
|
||||||
|
case $(basename $payload) in
|
||||||
|
"payload.py")
|
||||||
|
echo "python $payload &> /dev/null" | at now
|
||||||
|
;;
|
||||||
|
"payload.php")
|
||||||
|
echo "php-cli $payload &> /dev/null" | at now
|
||||||
|
;;
|
||||||
|
"payload" | "payload.sh" | "payload.txt")
|
||||||
|
sed -i 's/\r//g' $payload
|
||||||
|
echo "bash -C '$payload'" | at now
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
/usr/bin/LED FAIL
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
function configure_network() {
|
||||||
|
cp /usr/lib/config/${SWITCH_POSITION}/network /etc/config/network
|
||||||
|
/etc/init.d/network restart
|
||||||
|
}
|
||||||
|
|
||||||
|
function start_http() {
|
||||||
|
/etc/init.d/uhttpd start
|
||||||
|
}
|
||||||
|
|
||||||
|
function stop_http() {
|
||||||
|
/etc/init.d/uhttpd stop
|
||||||
|
}
|
||||||
|
|
||||||
|
function start_ssh() {
|
||||||
|
/etc/init.d/sshd start
|
||||||
|
}
|
||||||
|
|
||||||
|
function stop_ssh() {
|
||||||
|
/etc/init.d/sshd stop
|
||||||
|
}
|
||||||
|
|
||||||
|
function enter_attack_mode() {
|
||||||
|
$LOG "Entering ATTACK mode"
|
||||||
|
MODE="ATTACK"
|
||||||
|
/usr/bin/LED OFF
|
||||||
|
|
||||||
|
configure_network
|
||||||
|
stop_http
|
||||||
|
stop_ssh
|
||||||
|
|
||||||
|
execute_payload
|
||||||
|
|
||||||
|
enter_idle_mode
|
||||||
|
}
|
||||||
|
|
||||||
|
function enter_arming_mode() {
|
||||||
|
$LOG "Entering ARMING mode"
|
||||||
|
MODE="ARMING"
|
||||||
|
/usr/bin/LED OFF
|
||||||
|
|
||||||
|
configure_network
|
||||||
|
start_http
|
||||||
|
start_ssh
|
||||||
|
|
||||||
|
enter_idle_mode
|
||||||
|
}
|
||||||
|
|
||||||
|
function enter_off_mode() {
|
||||||
|
$LOG "Entering OFF mode"
|
||||||
|
MODE="OFF"
|
||||||
|
/usr/bin/LED OFF
|
||||||
|
|
||||||
|
stop_http
|
||||||
|
stop_ssh
|
||||||
|
|
||||||
|
enter_idle_mode
|
||||||
|
}
|
||||||
|
|
||||||
|
function enter_idle_mode() {
|
||||||
|
$LOG "Entering IDLE mode"
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
if [[ $MODE = "ARMING" ]] || [[ $MODE = "OFF" ]]; then
|
||||||
|
BATTERY_STATE=$(/usr/bin/BATTERY)
|
||||||
|
case $BATTERY_STATE in
|
||||||
|
"charging")
|
||||||
|
/usr/bin/LED B SLOW
|
||||||
|
;;
|
||||||
|
"full")
|
||||||
|
/usr/bin/LED B
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
/usr/bin/LED Y SLOW
|
||||||
|
if [[ $MODE = "OFF" ]]; then
|
||||||
|
sleep 2 && halt
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
SWITCH_POSITION=$(/usr/bin/SWITCH)
|
||||||
|
case $SWITCH_POSITION in
|
||||||
|
"switch3")
|
||||||
|
if [[ $MODE != "ATTACK" ]]; then
|
||||||
|
enter_attack_mode
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"switch2")
|
||||||
|
if [[ $MODE != "ARMING" ]]; then
|
||||||
|
execute_upgrade || enter_arming_mode
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [[ $MODE != "OFF" ]]; then
|
||||||
|
enter_off_mode
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function run() {
|
||||||
|
case $SWITCH_POSITION in
|
||||||
|
"switch3")
|
||||||
|
enter_attack_mode
|
||||||
|
;;
|
||||||
|
"switch2")
|
||||||
|
execute_upgrade || enter_arming_mode
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
enter_off_mode
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Start framework after a short wait
|
||||||
|
sleep 2
|
||||||
|
run &> /dev/null &
|
|
@ -0,0 +1,14 @@
|
||||||
|
|
||||||
|
config interface 'loopback'
|
||||||
|
option ifname 'lo'
|
||||||
|
option proto 'static'
|
||||||
|
option ipaddr '127.0.0.1'
|
||||||
|
option netmask '255.0.0.0'
|
||||||
|
|
||||||
|
config interface 'lan'
|
||||||
|
option ifname 'eth0'
|
||||||
|
option proto 'static'
|
||||||
|
option ipaddr '172.16.24.1'
|
||||||
|
option netmask '255.255.255.0'
|
||||||
|
option ip6assign '60'
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
config interface 'loopback'
|
||||||
|
option ifname 'lo'
|
||||||
|
option proto 'static'
|
||||||
|
option ipaddr '127.0.0.1'
|
||||||
|
option netmask '255.0.0.0'
|
||||||
|
|
||||||
|
config interface 'lan'
|
||||||
|
option ifname 'eth0'
|
||||||
|
option proto 'none'
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 4094356dec25ea2dafd8b385887be0fe16a7d282
|
Loading…
Reference in New Issue