[LINUX] Comment pirater un terminal

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.

Exemple d'opération

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.

ttycopy

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.

  1. Découvrez le PID du processus de connexion tty
  2. Regardez dans les appels système à l'aide de la commande strace sur le PID
  3. Formatez et affichez la sortie de la chaîne d'appel système lue par strace

Dans ttycopy, je l'ai implémenté dans le shell selon la procédure ci-dessus.

Implémentation en shell (Bash)

1. Découvrez le PID du processus de connexion tty

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.

2. Regardez dans les appels système à l'aide de la commande strace sur le PID

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.

3. Formatez et affichez la sortie de la chaîne d'appel système lue par strace

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`.

Résumé

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

Comment pirater un terminal
Comment appeler une fonction
Comment créer un bot slack
Comment créer un package Conda
Comment créer un robot - Avancé
Comment créer une fonction récursive
Comment créer un pont virtuel
Comment créer un Dockerfile (basique)
[Blender] Comment créer un plug-in Blender
Comment supprimer un conteneur Docker
Comment créer un robot - Basic
Comment créer un fichier de configuration
Comment créer un clone depuis Github
Comment diviser et enregistrer un DataFrame
Comment créer un environnement de traduction sphinx
Comment créer un dossier git clone
Qiita (1) Comment écrire un nom de code
Comment ajouter un package avec PyCharm
[Python] Comment rendre une classe itérable
Comment dessiner un graphique avec Matplotlib
[Python] Comment convertir une liste bidimensionnelle en liste unidimensionnelle
[Colab] Comment copier un vaste ensemble de données
[Python] Comment inverser une chaîne de caractères
Comment installer un package à l'aide d'un référentiel
Comment obtenir stacktrace en python
Comment créer un référentiel à partir d'un média
Comment créer un indicateur personnalisé Backtrader
Comment choisir une palette de couleurs Seaborn
Comment tester sur une page authentifiée par Django
Comment créer un plan de site Pelican
Comment exécuter des scripts Maya Python
Comment créer un système de dialogue dédié aux débutants
Comment calculer la volatilité d'une marque
Comment lire un fichier CSV avec Python 2/3
Comment partager un environnement virtuel [About requirements.txt]
Comment envoyer un message à LINE avec curl
Comment coder un drone en utilisant la reconnaissance d'image
Comment ouvrir un navigateur Web à partir de python
Comment effacer un taple dans une liste (Python)
Comment organiser un concours au Coda Lab
Comment dessiner un graphique à 2 axes avec pyplot
Comment incorporer des variables dans des chaînes python
Comment créer un objet fonction à partir d'une chaîne
Comment dessiner un graphique 3D avant l'optimisation
Comment créer un fichier JSON en Python
Comment créer un dictionnaire avec une structure hiérarchique.
Comment générer un objet Python à partir de JSON
Comment déployer une application Streamlit sur GCP (GAE)
Comment implémenter un sélecteur de dégradé dans Houdini
Comment ajouter un chemin de recherche de module Python
Comment créer un plug-in QGIS (génération de package)
Comment extraire le coefficient de la formule minute
Comment écrire une instruction ShellScript Bash for
Comment se souvenir quand on oublie un mot
Comment mesurer la vitesse de la ligne depuis le terminal
Comment notifier les canaux Discord en Python