Future Advent Calendar 2019 Ceci est l'article du 17ème jour.
Je suis accro à Go ces jours-ci, mais cette fois je vais changer d'avis. Je voudrais vous présenter un outil appelé ttycopy qui partage des terminaux que j'ai utilisés occasionnellement dans le projet précédent.
Il y a une scène comme ~~ Je veux pirater ~~ Je veux voir ...! Quand un super ingénieur est en train de fouiller sur le serveur et fait quelque chose. Après cela, vérifiez l'écran en revérifiant si la commande est correctement saisie sur le serveur. S'il y a une distance physique, il est difficile d'afficher l'écran sur le moniteur. [^ 1]
[^ 1]: Bien sûr, lorsque vous l'utilisez, refusez-le avant de l'utiliser.
Une façon est d'afficher l'écran, mais ce serait intelligent si vous pouviez vous y référer avec un petit outil. En Perl, il existe un outil appelé ttylog. Inspiré par ttylog, j'ai créé un [ttycopy] alimenté par le shell (https://github.com/d-tsuji/ttycopy). Cela fonctionne dans le shell, vous pouvez donc copier et coller l'implémentation ttycopy et l'exécuter en passant.
Cela fonctionne comme suit. C'est un peu déroutant, mais je suis connecté à un serveur en tant qu'utilisateur root et tsuji et j'exécute ttycopy en tant qu'utilisateur root. Vous pouvez voir que le terminal connecté en tant qu'utilisateur tsuji est affiché à partir du milieu du terminal.
Le fonctionnement de ttylog est également présenté dans Partager l'écran du terminal sans autorisation et jeter un œil au travail des autres. , Le flux de traitement de base est le suivant.
Dans ttycopy, je l'ai implémenté dans le shell selon la procédure ci-dessus.
La mise en œuvre dans le shell est la suivante.
pid=`ps fauwwx | grep sshd.*${tty} | grep -v grep | sed -e 's/^[a-zA-Z0-9]\+[ \n\r\f\t]\+\([0-9]\+\).*/\1/'`
Il capture le PID de l'arbre de processus, qui peut être obtenu par grep, en utilisant une expression régulière. C'est rafraîchissant avec les expressions régulières.
[tsuji@localhost ~]$ ps fauwwx | grep sshd.
root 1531 0.0 0.1 82568 6236 ? Ss 15:29 0:00 /usr/sbin/sshd -D
root 2830 0.0 0.2 149824 8916 ? Ss 15:29 0:01 \_ sshd: root@pts/0
root 13315 0.0 0.2 158980 10280 ? Ss 18:58 0:00 \_ sshd: root@notty
root 14956 0.0 0.2 154512 9352 ? Ss 20:10 0:00 \_ sshd: tsuji [priv]
tsuji 14959 0.0 0.1 154512 4092 ? S 20:10 0:00 \_ sshd: tsuji@pts/1
tsuji 15012 0.0 0.0 112672 2268 pts/1 S+ 20:11 0:00 \_ grep --color=auto sshd.
L'implémentation dans le shell est la partie suivante.
strace -e read -s16384 -q -xx -p ${pid} 2>&1
Ce que nous faisons, c'est utiliser strace pour faire un appel système de lecture émis par le PID associé au tty que nous avons obtenu précédemment. Obtenir Puisque divers appels système autres que l'appel système de lecture sont appelés, seul l'appel système de lecture est extrait avec l'option «-e read» de strace.
L'appel système de lecture était l'appel système défini ci-dessous. Les résultats qui peuvent être obtenus avec strace sont également les suivants.
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
Par exemple, supposons que vous exécutiez la commande suivante dans le terminal référencé.
[tsuji@localhost gomi]$ hoge
bash: hoge:Commande non trouvée...
[tsuji@localhost gomi]$
À ce moment, si vous faites référence à l'appel système read avec strace -p $ {PID} -e read
, la sortie suivante sera sortie.
--Trace terminal
[root@localhost ttycopy]# strace -p 14959 -e read
strace: Process 14959 attached
read(3, "\0\0\0\20\356\202\375C&&\357q\276\210pZ)\300\26M\357T\313\303k\6p\232\351\263\32\224"..., 16384) = 36
read(11, "h", 16384) = 1
read(3, "\0\0\0\20\235\230\204Ud\36)\370\266\233\362\305\2219\253g\335M\23\212\374h\250i@\235/\216"..., 16384) = 36
read(11, "o", 16384) = 1
read(3, "\0\0\0\20\324\357\304\vn\357BbW\241m\220yS\236\362\301\337\337\237c\203\245\223\221\253;,"..., 16384) = 36
read(11, "g", 16384) = 1
read(3, "\0\0\0\20\344\215\235\300\226\236\0\323\376\r\217,\257\322\326w\323R\264\3}\266\7q\315\215\344\346"..., 16384) = 36
read(11, "e", 16384) = 1
read(3, "\0\0\0\20^``\333\263h\372Z\336\335Y2\250\203\335\221\372faj\177\260f\302Sb\35\354"..., 16384) = 36
read(11, "\r\n", 16384) = 2
read(11, "bash: hoge: \343\202\263\343\203\236\343\203\263\343\203\211\343\201\214\350\246\213\343\201"..., 16384) = 62
read(11, "\33]0;tsuji@localhost:~/gomi\7[tsuj"..., 16384) = 51
^Cstrace: Process 14959 detached
Dans l'exemple ci-dessus, les chaînes «strace: processus 14959 attaché» et «strace: processus 14959 détaché» sont affichées, mais l'option strace «-q» est utilisée pour supprimer cette sortie. Nous utilisons également l'option -x
pour convertir la chaîne en hexadécimal pour faciliter l'affichage.
Le but est d'afficher le contenu du deuxième argument de l'appel système de lecture obtenu à l'étape 2. La mise en œuvre dans le shell est la suivante.
sed -une "s/^read([0-9]\+, \"\(.*\)\".*/echo -n \$'\1'/p" | bash
La première moitié est sed -une" s / ^ read ([0-9] \ +, \ "\ (. * \) \". * / Echo -n \ $ '\ 1' / p "
. L'expression capture le deuxième argument de l'appel système de lecture et lui donne les chaînes ʻecho -net
$ ''`, donc vous pouvez obtenir une chaîne comme celle-ci:
[tsuji@localhost gomi]$ cat hoge
hoge
[tsuji@localhost gomi]$
echo -n $'\x00\x00\x00\x10\xc6\x1e\x56\xc6\x1f\x11\x7e\x57\x11\xaf\xdb\x2a\x91\x32\x84\x8e\x6e\x5b\x12\xc1\x72\x94\x36\x17\x12\xbb\x7c\xab\x4b\xdd\x19\x33'
echo -n $'c'
echo -n $'\x00\x00\x00\x10\x5d\x68\x72\x7c\x74\xca\x3c\xd1\x57\xfc\x14\x7d\x55\x34\x66\x15\x03\xcb\x26\x7c\x17\xbc\x7f\x7a\xf5\x25\x40\xed\xa8\x21\x39\xb3'
echo -n $'a'
echo -n $'\x00\x00\x00\x10\x05\x3d\x4a\xc2\x76\x1c\xd4\x23\x2a\x17\xc6\xa1\x1c\xf2\xdb\x14\x75\x1c\x7d\xb7\x21\xfb\xfc\xcd\x2d\x5c\xef\x06\x6c\x97\x01\x28'
echo -n $'t'
echo -n $'\x00\x00\x00\x10\x66\xb0\x8c\x40\x10\xa6\xf3\x9b\x36\x75\xd5\xc1\x65\x63\x94\x4f\x77\xd9\x10\x6d\xcf\xbb\x48\xed\x8b\x43\x58\x20\x54\x08\xde\x9b'
echo -n $' '
echo -n $'\x00\x00\x00\x10\x60\x6e\xb6\x06\x43\x16\xf5\x75\x89\x90\xb6\x42\x2c\xfe\x8b\x97\xae\xad\x47\x26\xf9\x39\xfc\xd2\x84\x37\xde\x0d\xe5\x32\xbc\x80'
echo -n $'h'
echo -n $'\x00\x00\x00\x10\x00\xe4\x3d\xb7\xd9\x79\x2e\x46\x80\xd5\xa5\xc2\xa7\x9a\xc7\x0c\xe1\x58\x7b\xd5\x97\xff\x00\xab\x72\x51\xa4\xbb\xab\x7d\xd1\xaf'
echo -n $'o'
echo -n $'\x00\x00\x00\x10\xf8\x1d\xce\xe6\x7f\x1a\x43\x94\xa2\xde\x3d\x3c\xb5\xe9\xb9\x94\x39\x43\x63\xfd\xa9\x1f\x45\x83\x64\x5c\x3a\xdf\xa8\x1a\xa4\x86'
echo -n $'g'
echo -n $'\x00\x00\x00\x10\x90\x69\x42\xa9\x48\x99\x0c\x52\xe9\x49\xbd\x4e\xa5\x17\x01\xff\xac\xec\x29\x75\x2c\xc0\x2b\x7c\x07\x85\xf2\x2f\xce\x71\x8f\x46'
echo -n $'e'
echo -n $'\x00\x00\x00\x10\xd9\x91\x38\x08\x0b\x95\x78\xd4\x80\x51\xa2\xe8\xef\x20\x06\x45\xa9\x3c\xf0\xa3\x10\x7d\x06\x32\x2d\x31\x53\x57\x40\x77\x1b\x29'
echo -n $'\r\n'
echo -n $'\x68\x6f\x67\x65\x0d\x0a\x1b\x5d\x30\x3b\x74\x73\x75\x6a\x69\x40\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x3a\x7e\x2f\x67\x6f\x6d\x69\x07'
echo -n $'[tsuji@localhost gomi]$ '
L'option -n
de ʻecho -n` est d'empêcher les pauses lors de l'interprétation. Le format Bash $ ''
a les effets suivants: Extrait de la page Man. [^ 2]
Les mots de la forme $ 'string' sont traités spécialement. Ce mot se développe en chaîne et est ensuite remplacé par le caractère échappé par une barre oblique inverse, comme spécifié par la norme ANSI C. La séquence d'échappement anti-slash est décodée (le cas échéant) comme suit:
En utilisant cela, il est possible d'élargir la signification de la chaîne de caractères.
Après cela, vous pouvez afficher la chaîne de caractères en laissant le shell interpréter la chaîne de caractères de ʻechoavec
| bash`.
J'ai pu partager le terminal avec désinvolture en récupérant la chaîne de l'argument de l'appel système de lecture avec strace et en la restaurant en temps réel. Je pense que c'est un outil pédagogique car vous pouvez voir le travail des autres en temps réel. Si vous souhaitez pirater le terminal, veuillez l'utiliser.
Si vous le souhaitez, vous pouvez vous motiver en ajoutant une étoile à ttycopy: v:
Recommended Posts