Pour le plaisir seulement : Connection: keep-alive
Introduction
Mon but était de construire un bash environnement où le script actuel pourrait traiter de manière interactive avec une session https authentifiée. Cela pourrait être utilisé pour répondre à de nombreuses cibles IOT, à toute plateforme de fournisseur pour surveiller un compte personnel, etc.
Malheureusement, cela pourrait être mal utilisé pour stresser ou pirater des plates-formes web (en ciblant n'importe qui) ou même pour cibler L'insigne de fanatique de SO (sale tricheur !).
Mes excuses pour toute mauvaise utilisation de ceci, de toute façon je ne suis pas responsable de ce que les gens font.
Près de pure bash : exiger seulement openssl
:
... et gpg
mais vous êtes libre de stocker votre lettre de créance d'une autre manière.
Préparer quelques valeurs :
#!/bin/bash
shopt -s extglob
URL='https://stackoverflow.com/'
IFS=: read -r user pass < <(gpg -qd <socred.gpg)
IFS=/ read -r _ _ hst _ <<<"$URL"
Running openssl
comme tâche de fond :
exec {wwwE}<> <(: - O)
exec {wwwI}<> <(: - b)
exec {wwwO}< <(
exec stdbuf -o0 openssl s_client -quiet -connect "$hst":443 <&$wwwI 2>&$wwwE)
osslpid=$!
Alors maintenant, il y a un peu doReq
pour créer 2 variables : $cookie
et $htstatus
et 3 réseaux : $hthead
, $htbody
y $hterr
:
doReq() {
hthead=() htbody=() hterr=()
local target=$1 method=${2:-GET} head=true line cookies
printf >&$wwwI '%s\r\n' "$method $target HTTP/1.1" "Host: $hst" \
"User-Agent: aobs/0.01" "Connection: keep-alive" "Accept: */*"
[ "$cookie" ] && printf >&$wwwI '%s' "$cookie"
if [ "$method" = "POST" ];then
printf >&$wwwI '%s\r\n%s\r\n\r\n%s' "Content-Length: ${#3}" \
'Content-Type: application/x-www-form-urlencoded' "$3"
else printf >&$wwwI '\r\n'
fi
read -t 10 -ru $wwwO line
htstatus=${line%$'\r'} ; hthead=("$htstatus")
while read -t .3 -ru $wwwO line;do
[ "${line%$'\r'}" ] || head=false;
if $head ;then
hthead+=("${line%$'\r'}");
case $line in
[sS]et-[cC]ookie:* ) line=${line#*: };
cookies+=("${line%%;*}");;
esac
else htbody+=("${line%$'\r'}") ;fi
done
if read -t 0 -ru $wwwE;then
while read -t .1 -ru $wwwE line;do
hterr+=("${line%$'\r'}")
case $line in
depth* | verify* ) ;;
* ) echo "ERR: $line" ;;
esac ; done ; fi
[ ! -v "cookie" ] && [ "${cookies[0]}" ] &&
printf -v cookie 'Cookie: %s\r\n' "${cookies[@]}"
}
Utilisation : doReq /file_part_of_URL [method] [post datas]
On se connecte :
doReq /users/login POST "email=$user&password=$pass"
Maintenant, montrez mes badges :
doReq /
for ((i=${#htbody[@]};i--;)) ;do
line="${htbody[i]}"
case $line in
*badge1* ) line="${htbody[i-1]}${htbody[i]}${htbody[i+1]}"
line=${line//>+([0-9])</><} line=${line//<*([^>])>}
printf '%b\n' "${line//●/ \\U25cf }" ;;
esac ; done
Sur mon bureau, avec mon compte, cette empreinte :
13 gold badges 88 silver badges 112 bronze badges
(à l'instant).
Bien sûr, vous êtes maintenant prêt à courir. doReq
quand vous le souhaitez, car la connexion reste ouverte. Nous sommes maintenant dans environnement/condition cité dans le Introduction . (La version sur mon site fait une boucle perpétuelle, demandant ceci d'une manière plus efficace, toutes les 20 secondes, jusqu'à l'interaction de l'utilisateur. Voir au bas de cette page).
...
Une fois que vous avez terminé, avant de sortir, vous pourriez arrêter openssl
et fermez votre fd :
(J'ai ajouté ls
y ps
comme déboguer commandes)
ls -l /dev/fd/ ; ps --tty $(tty) ufw
kill $osslpid
exec {wwwE}<&-
exec {wwwI}>&-
exec {wwwO}<&-
ls -l /dev/fd/ ; ps --tty $(tty) ufw
Cette émission :
total 0
lrwx------ 1 user user 64 jui 2 13:52 0 -> /dev/pts/2
l-wx------ 1 user user 64 jui 2 13:52 1 -> /dev/pts/2
lrwx------ 1 user user 64 jui 2 13:52 10 -> pipe:[940266653]
lrwx------ 1 user user 64 jui 2 13:52 11 -> pipe:[940266654]
lr-x------ 1 user user 64 jui 2 13:52 12 -> pipe:[940266655]
lrwx------ 1 user user 64 jui 2 13:52 2 -> /dev/pts/2
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user 28110 0.0 0.0 11812 7144 pts/7 Ss jui01 0:02 bash
user 14038 30.0 0.0 9116 4228 pts/7 S+ 13:52 0:00 \_ /bin/bash ./getSo.sh
user 14045 0.5 0.0 9356 5856 pts/7 S+ 13:52 0:00 \_ openssl s_client -quiet -connect stackoverflow.com:443
user 14048 0.0 0.0 12404 3400 pts/7 R+ 13:52 0:00 \_ ps --tty /dev/pts/7 ufw
total 0
lrwx------ 1 user user 64 jui 2 13:52 0 -> /dev/pts/2
l-wx------ 1 user user 64 jui 2 13:52 1 -> /dev/pts/2
lrwx------ 1 user user 64 jui 2 13:52 2 -> /dev/pts/2
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user 28110 0.0 0.0 11812 7144 pts/7 Ss jui01 0:02 bash
user 14038 30.0 0.0 9632 4756 pts/7 S+ 13:52 0:00 \_ /bin/bash ./getSo.sh
user 14051 0.0 0.0 12404 3332 pts/7 R+ 13:52 0:00 \_ ps --tty /dev/pts/7 ufw
El openssl
Le processus est terminé et les 3 FDs sont fermés.
Vous pourriez trouver ce script (moins condensé), avec des extensions boucle principale à l'adresse getSo.sh.txt , getSo.sh