You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

167 lines
3.8 KiB

#compdef hydra
tokens=(${(z)LBUFFER})
if [[ "${LBUFFER[-1]}" == " " ]]; then
previousArg="${tokens[-1]}"
else
previousArg="${tokens[-2]}"
fi
services=(
"adam6500"
"asterisk"
"afp"
"cisco"
"cisco-enable"
"cvs"
"firebird"
"ftp"
"ftps"
"http-head"
"https-head"
"http-get"
"https-get"
"http-post"
"https-post"
"http-get-form"
"https-get-form"
"http-post-form"
"https-post-form"
"http-proxy"
"http-proxy-urlenum"
"icq"
"imap"
"imaps"
"irc"
"ldap2"
"ldap2s"
"ldap3"
"ldap3s"
"ldap3-crammd5"
"ldap3-crammd5s"
"ldap3-digestmd5"
"ldap3-digestmd5s"
"mssql"
"mysql"
"nntp"
"oracle-listener"
"oracle-sid"
"pcanywhere"
"pcnfs"
"pop3"
"pop3s"
"postgres"
"radmin2"
"redis"
"rexec"
"rlogin"
"rpcap"
"rsh"
"rtsp"
"s7-300"
"sip"
"smb"
"smtp"
"smtps"
"smtp-enum"
"snmp"
"socks5"
"ssh"
"sshkey"
"svn"
"teamspeak"
"telnet"
"telnets"
"vmauthd"
"vnc"
"xmpp"
)
min_max_charset(){
_message -r "$(hydra -x -h)"
}
service_help(){
_message -r "${hydra -U $previousArg}"
}
service_list(){
_describe "Services" services
}
args=(
"-R[restore a previous aborted/crashed session]"
"-I[ignore an existing restore file (don't wait 10 seconds)]"
"-S[perform an SSL connect]"
"-s[if the service is on a different default port, define it here]:value"
"-l[login with LOGIN name]:value"
"-L[load several logins from a file]:filename:_files"
"-p[try password PASS]:value"
"-P[load several passwords from a file]:filename:_files"
"-C[colon separated \"login:pass\" format, instead of -L/-P options]:filename:_files"
"-x[MIN:MAX:CHARSET password bruteforce generation, type \"-x -h\" to get help]:min-max:min_max_charset"
"-y[disable use of symbols in bruteforce, see above]"
"-e[Extra passowrds to try options (nsr)]:nsr:_values -s '' \"Options\" \"n[Null Password]\" \"s[Login as Password]\" \"r[Reversed Login as Password]\""
"-u[loop around users, not passwords (effective! implied with -x)]"
"-M[list of servers to attack, one entry per line, ':' to specify port]:filename:_files"
"-o[write found login/password pairs to FILE instead of stdout]:filename:_files"
"-b[specify the format for the -o FILE]:format:_values \"Ouptut type\" text json jsonv1"
"-f[exit when a login/pass pair is found (-M: -f per host)]"
"-F[exit when a login/pass pair is found (-M: -F global)]"
"-t[run X number of connects in parallel per target (default: 16)]:value"
"-T[run X connects in parallel overall (for -M, default: 64)]:value"
"-w[wait x time for a response (32)]:value"
"-W[wait x time between connects per thread (0)]"
"-c[wait x time per login attempt over all threads (enforces -t 1)]"
"-4[use IPv4 (default)]"
"-6[use IPv6 addresses (put always in \[\] also in -M)]"
"-v[verbose mode]"
"-V[show login+pass for each attempt]"
"-d[debug mode]"
"-O[use old SSL v2 and v3]"
"-q[do not print messages about connection errors]"
"-U[service module usage details]:services:service_list"
"-h[COMPLETE HELP]"
)
declare -a delete
if (( ${tokens[(I)-l]} )); then
delete=("-L" "-C")
elif (( ${tokens[(I)-L]} )); then
delete=("-l" "-C")
elif (( ${tokens[(I)-p]} )); then
delete=("-P" "-C")
elif (( ${tokens[(I)-P]} )); then
delete=("-p" "-C")
elif (( ${tokens[(I)-C]} )); then
delete=("-l" "-L" "-p" "-P")
fi
for target in "${delete[@]}"; do
args=("${(f)$(echo -e "${(pj:\n:)args}" | grep -v "^${target}")}")
done
#&& fzf_dirs "$current" || fzf_files "$current"
local -a line expl
local -i ret=1
typeset -A opt_args
_arguments -C -s "${args[@]}" ':service:->hydra_service' && return
case $state in
hydra_service)
if compset -P "(${(j:|:)services})://"; then
notify-send "Line" "$line"
notify-send "Expl" "$expl"
_wanted servers expl 'server' _hosts && ret=0
else
notify-send "Line" "$line"
notify-send "Expl" "$expl"
_wanted services expl $state_descr compadd -S '://' -q -a services && ret=0
fi
;;
esac