Introduction aux
Langages scripts sur CLI
(Interface de lignes de
commandes)
Cours
Ing. Gael Simon MOUSSOUNGOU
(
[email protected])
1ère année Licence ‐ GITEL
Université de Loango – République du Congo
Introduction
Les scripts sur CLI peuvent être utiles dans beaucoup de domaine notamment dans les tests
d'intrusion, l'administration des systèmes, les réseaux, et dans la plupart des secteurs qui
dépendent de la technologie informatique pour fonctionner. Les scripts sur CLI nous
permettent d’enchaîner des ensembles complexes de commandes, développer des outils,
d’automatiser des processus, manipuler des fichiers, et plus encore, tout en utilisant un
ensemble de développement très basique de ressource. La capacité d'écrire des scripts sur
CLI peut être une compétence nécessaire lorsque nous n'arrivons pas toujours à choisir les
outils dont nous disposons, et nous pourrions très bien nous retrouver dans une situation où
nous ne pouvons pas, ou ne sommes pas autorisés à installer des outils ou des utilitaires sur
un système. Dans de tels cas, la possibilité de créer nos propres outils à partir des ressources
de script déjà à notre disposition peut finalement faire la différence. Nous aborderons
certaines des bases des scripts sur CLI. Nous parlerons sur la façon d'utiliser les shells qui
existent dans les systèmes d'exploitation tels que UNIX, Linux, OS X d'Apple et Windows.
Qu'est-ce que le shell ?
Un shell est l'interface entre l'utilisateur et le système d'exploitation, nous permettant
d'exécuter des programmes, manipuler des fichiers et effectuer un certain nombre
d'opérations. Tous les systèmes utilisent un shell d'un type ou d'un autre, certains
graphiques et d'autres à base de texte. De nombreux systèmes d'exploitation offrent un
accès à la fois graphique et non graphique et chacun est utile à sa manière.
Un shell peut consister d’une interface utilisateur graphique (GUI), comme dans le cas de
l’interface de bureau sur Microsoft Windows et Gnome ou KDE sous Linux. Sur un tel
graphique les shells sont pratiques, car ils nous permettent d'utiliser des menus graphiques
sophistiqués, des icônes colorées pour représenter les fichiers et nous permettent d'interagir
avec les éléments en cliquant dessus avec une souris.
Les shells textuels, nous permettent de communiquer avec le système d'exploitation via une
variété de commandes et de fonctionnalités intégrées au shell, ainsi que l'exécution d'autres
programmes ou utilitaires. Les shells textuels sont ancestraux dans de nombreux systèmes
d'exploitation et jouissent encore aujourd'hui d'un grand nombre d’adeptes.
Sur les systèmes d'exploitation de type UNIX, tels que les nombreux variétés d'UNIX et Linux,
ou OS X, nous pouvons trouver une grande variété de shells graphiques et shells textuels.
Cependant, nous trouverons au moins Gnome ou KDE en tant que shell graphique, et Bash
en tant que shell basé sur le texte.
Qu'est-ce qu'un script ?
Un script, abréviation de langage de script, est un langage de programmation comme un
autre, et peut être de nature similaire à d'autres langages tels que C++ ou Java. La différence
primaire entre un langage de script et d'autres langages de programmation est qu’un
programme écrit dans un langage de script est interprété plutôt que compilé.
Lorsque nous regardons un langage de programmation traditionnel, tel que C++, le code que
nous écrivons qui définit les commandes que nous voulons exécuter est traité via un
compilateur et transformé en code machine directement exécutable par le kernel/CPU.
Dans les langues interprétées, le code que nous créons qui contient nos commandes est lu
par un interpréteur qui effectue lui-même la conversion en code machine, car il exécute le
script.
Normalement, les langages de script ont leurs propres interprètes, nous devons donc
installer un interpréteur séparé pour Python, un autre pour Ruby, et ainsi de suite. Les
scripts sur shell sont un cas particulier, car les scripts sont interprétés à l'aide du shell lui-
même, et l'interpréteur est déjà présent dans le cadre du shell.
Les langages de script sont utilisés quotidiennement dans l'exécution de nombreuses tâches
différentes. Nous pouvons citer des langages de scripts comme AJAX, JavaScript, ActiveX et
d’autres qui sont utilisés pour générer les pages Web riches en fonctionnalités que nous
apprécions aujourd'hui, et dans les jeux vidéo, tels que « Civilization Van » et « World of
Warcraft » qui utilisent Lua.
Un grand nombre de langages de script sont disponibles sur le marché et certains des plus
utiles sont largement adoptés et bénéficient d'un développement continu et d'un soutien
communautaire, tandis que d'autres sont voués à être adopté par seulement quelques
développeurs fidèles et s'estompe tranquillement.
Script shell
L'un des outils les plus basiques et les plus couramment disponibles que nous puissions
ajouter à notre arsenal de développement est le script shell. Un script shell est un
programme, écrit dans un langage de script, qui est utilisé pour s'interfacer d'une manière
ou d'une autre avec le shell du système d'exploitation que nous utilisons. Le terme script
shell est couramment utilisé pour désigner les programmes qui interagissent avec des shells
textuels.
Comme nous l'avons vu plus haut, les scripts sont traités et exécutés par un utilitaire appelé
interpréteur. Dans le cas des scripts shell, notre script est interprété directement par le shell
et, en fait, il n'y a souvent aucune différence dans les outils utilisés pour traiter nos scripts
shells et ceux utilisés pour gérer des commandes uniques.
Dans la plupart des cas, bien qu'ils ne soient généralement pas classés comme un « vrai »
langage de programmation, les scripts shell possèdent un ensemble de fonctionnalités très
similaire à celui de tout autre langage.
Ils incluent souvent des capacités identiques ou très similaires à celles que nous pourrions
utiliser pour stocker des données (des variables) ou d'autres structures de données, créer
des sous-programmes, contrôler le flux du programme, inclure des commentaires, etc. Il est
tout à fait possible de développer de grands et des programmes complexes sur les scripts
shell, et de nombreux exemples de codes peuvent être trouvés avec une brève recherche sur
Internet. Dans de tels cas, nous pouvons en fait être mieux en termes d'efficacité
d'utilisation des ressources et de facilité de maintenance, en utilisant un langage de script
riche en fonctionnalités tel que Ruby ou Perl, ou même un langage compilé comme C++.
Où les scripts shell sont utiles
Lorsque nous assemblons un programme ou un utilitaire, nous pouvons choisir de créer un
script shell plutôt que d'utiliser un autre langage de script ou un langage compilé, pour une
variété de raisons. Par exemple, nous pourrions vouloir parcourir rapidement l'ensemble du
fichier système sur un serveur utilisé pour le stockage afin de trouver et de supprimer les
fichiers MP3 stockés par les utilisateurs afin de libérer un peu d'espace disque.
Autre exemple, si nous voulons créer une liste de toutes les imprimantes de notre PC et les
numéros de série qui les accompagnent.
Ce ne serait certainement pas la méthode la plus élégante ou la plus efficace à utiliser, mais
elle est parfois rapide dans l’exécution de ce dont nous avons besoin.
Une étape courante dans le renforcement d'un serveur consiste à supprimer tous les outils
non nécessaires au fonctionnement du serveur, nous ne trouverons donc pas nécessaire
d’utilisé un langage de choix tel que Perl, Python, etc. L'une des fonctionnalités intéressantes
des langages de scripts est que les fichiers du code source sont en texte brut et n'ont pas
besoin d'être compilés avant de pouvoir les exécuter.
MS OS SHELL SCRIPTING
Lorsque nous examinons les outils dont nous disposons pour développer des scripts shell, il
existe deux Catégories principales : shells de type UNIX et shells Microsoft.
Dans cette section, nous allons discuter des shells de type Microsoft, et nous couvrirons les
shells UNIX plus tard.
Les systèmes d'exploitation Microsoft détiennent 75 % du marché des systèmes
d'exploitation. En tant qu’informaticien, nous serions stupides d'ignorer les capacités des
scripts de cette énorme part de marché. Heureusement, les systèmes Microsoft ont
actuellement une capacité très bien développée et solide pour mener les opérations
administratives depuis la ligne de commande et nous fournir des outils tels que PowerShell.
Disponibilité et choix des shells
Sur les systèmes d'exploitation Microsoft, Command.com et CMD.exe sont les deux
principaux shells disponibles dans la plupart des systèmes d'exploitation Microsoft. Dans les
nouvelles versions 64 bits de ces systèmes d'exploitation, command.com n'est pas
disponible au moment de la rédaction de ce document, et peut continuer à être indisponible
à l'avenir.
En fin de compte, command.com et CMD.exe sont deux outils différents.
Command.com est en fait une version de DOS 16 bits s'exécutant dans un shell et offrant un
ensemble de fonctionnalités similaire à CMD.exe mais non identique.
L'une des différences les plus notables lors de l'utilisation des deux shells est que
command.com ne prend pas en charge les noms de fichiers longs, forçant ainsi l'utilisation
de constructions tels que Progra~1 pour s’adresser à des répertoires tels que Program Files.
Les fichiers batch
Les fichiers batch existent depuis les premiers jours de MS-DOS et ont continué via les
systèmes d'exploitation Microsoft les plus récents. Ces scripts, désignés par une extension
.bat, sont utilisés pour une variété de tâches, nous pouvons les trouver réellement dans les
parties de démarrage du système d'exploitation.
Les scripts de fichiers batch ont leur propre langage qui, bien que pas terrible et complexe,
peut toujours être utile pour certaines choses.
COMMANDES WINDOWS
Windows est toujours la plate-forme de système d'exploitation la plus répandue déployée
dans les entreprises. Être capable de naviguer dans le système d'exploitation Windows à
partir de la ligne de commande est une exigence pour les IT spécialistes. Nous devons être
en mesure d’enquêter sur les services en cours d'exécution, déterminer les informations
réseau et manipuler les utilisateurs.
System info
• wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE%
• systeminfo
• wmic service get name,displayname,pathname,startmode |findstr /i "Auto"
• wmic qfe get Caption,Description,HotFixID,InstalledOn
• Hostname
• DRIVERQUERY
Info disks
• (wmic logicaldisk get caption 2>nul | more) || (fsutil fsinfo drives 2>nul)
• wmic logicaldisk get caption,description,providername
AV
• WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct
Get displayName /Format:List
• sc query windefend
Recycle Bin
• dir C:\$Recycle.Bin /s /b
Processus, Services & Software
• schtasks /query /fo LIST /v
• schtasks /query /fo LIST 2>nul | more
• tasklist /V #List processes
• tasklist /SVC
• net start
• wmic service list brief
• sc query
• dir /a "C:\Program Files"
• dir /a "C:\Program Files (x86)"
• reg query HKEY_LOCAL_MACHINE\SOFTWARE
Misc
• cd #Get current dir
• cd C:\path\to\dir #Change dir
• dir #List current dir
• dir /a:h C:\path\to\dir #List hidden files
• dir /s /b #Recursive list without shit
• time #Get current time
• date #Get current date
• shutdown /r /t 0 #Shutdown now
• type <file> #Cat file
• #Hide
• attrib +h file #Set Hidden
• attrib -h file #Quit Hidden
• #Give full control over a file that you owns
• icacls <FILE_PATH> /t /e /p <USERNAME>:F
• icacls <FILE_PATH> /e /r <USERNAME> #Remove the permision
• #Recursive copy
• xcopy /hievry C:\Users\security .
• #ADS
• dir /r #Detect ADS
• more file.txt:ads.txt #read ADS
• powershell (Get-Content file.txt)
Wifi
netsh wlan show profile #AP SSID
netsh wlan show profile <SSID> key=clear #Get Cleartext Pass
Users & Groups
Users
• whoami /all #All info about me, take a look at the enabled tokens
• whoami /priv #Show only privileges
• net users #All users
• dir /b /ad "C:\Users"
• net user %username% #Info about a user (me)
• net accounts #Information about password requirements
• qwinsta #Anyone else logged in?
• cmdkey /list #List credential
• net user /add [username] [password] #Create user
Groups
• net localgroup #All available groups
• net localgroup Administrators #Info about a group (admins)
• net localgroup administrators [username] /add #Add user to administrators
Firewall
• netsh firewall show state # FW info, open ports
• netsh advfirewall firewall show rule name=all
• netsh firewall show config # FW info
• Netsh Advfirewall show allprofiles
• NetSh Advfirewall set allprofiles state off #Turn Off
• NetSh Advfirewall set allprofiles state on #Trun On
• netsh firewall set opmode disable #Turn Off
• How to open ports
• netsh advfirewall firewall add rule name="NetBIOS UDP Port 138" dir=out
action=allow protocol=UDP localport=138
• netsh advfirewall firewall add rule name="NetBIOS TCP Port 139" dir=in action=allow
protocol=TCP localport=139
• netsh firewall add portopening TCP 3389 "Remote Desktop"
• netsh firewall add portopening TCP 3389 "Remote Desktop"
• netsh firewall set service remotedesktop enable #I found that this line is not needed
• sc config TermService start= auto #I found that this line is not needed
• net start Termservice #I found that this line is not needed
• netsh firewall set service remoteadmin enable
• Ninja combo
• net user hacker Hacker123! /add && net localgroup administrators hacker /add
Network
Interfaces, Routes, Ports, Hosts and DNSCache
• ipconfig /all #Info about interfaces
• route print #Print available routes
• arp -a #Know hosts
• netstat -ano #Opened ports?
• type C:\WINDOWS\System32\drivers\etc\hosts
• ipconfig /displaydns | findstr "d’enregistrement"
Password Hunting
• findstr /si password *.txt *.ini *.config (try searching 1 in differe
• dir /s *pass* == *cred* == *vnc* == *.config*
• dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc*
• where /R C:\ user.txt
• where /R C:\ *.ini
PowerShell
PowerShell est un ajout relativement récent au monde d'exploitation de Microsoft, avec la
version 1.0 publiée en 2006 et 2.0 en 2009. PowerShell est un shell textuel très polyvalent,
prenant en charge un grand nombre de fonctions accessibles à partir de la ligne de
commande, sous la forme d'applets de commande, et via l'utilisation de scripts. PowerShell a
également accès à la majorité des fonctionnalités auquel n'importe quel langage compatible
.NET de Microsoft peut accéder. Du point de vue du shell, PowerShell est une grande
amélioration par rapport aux command.com et CMD.exe. Ces deux shells sont conçues en
grande partie pour la compatibilité descendante, avec un ensemble commun de
commandes, beaucoup de qui remontent aux versions originales de Microsoft DOS sur
lesquelles ils sont basés.
L'une des caractéristiques qui deviendra rapidement évidente pour les utilisateurs habitués
aux commandes des systèmes d'exploitation de type UNIX, et sont régulièrement ennuyés
par le message d'erreur « n'est pas reconnu comme une commande interne ou externe »
lorsque la commande ls est tapé dans un shell Microsoft, c'est que des alias ont été inclus
pour la plupart des commandes courantes. Dans PowerShell, nous pouvons exécuter des
commandes telles que ls, cp et mv, et le shell exécutera la commande appropriée attendue.
Nous pouvons aussi trouver l'équivalent de la commande man dans l'applet de commande
get-help, avec un alias.
Du point de vue des scripts, PowerShell est une grande amélioration par rapport aux
précédents efforts de Microsoft. Dans le passé, divers efforts ont été déployés pour nous
donner un outil raisonnable pour l'écriture de scripts sur les plates-formes Windows, allant
des fichiers batch à VBScript. Bien que tous ces outils soient effectivement utiles dans un
endroit ou un autre, aucun d'eux ne nous a vraiment donné accès aux capacités d’UNIX tel
que le Bash.
Dans PowerShell, nous pouvons utiliser un certain nombre de fonctions utilitaires intégrées,
appelées applets de commande, que nous pouvons utiliser sous forme de commandes
simples directement depuis le shell, ou inclure dans nos scripts afin de permettre l'accès à
des fonctionnalités complexes via l'utilisation de commandes simples, comme celles que
nous pourrions utiliser pour communiquer sur des réseaux.
Le langage de script utilisé par PowerShell est également assez robuste, permettant le
développement des simples outils aux applications complexes.
CONCLUSION
Les scripts shell peuvent être un outil très utile à avoir dans notre arsenal de compétences.
Être capable de créer des outils et des utilitaires à partir des composants fournis par le
système d'exploitation peut faire la différence entre succès et échec lors d'un test
d'intrusion par exemple. L'un des shells les plus courants actuellement pour les systèmes de
type UNIX est le shell Bourne-again, ou bash. Les systèmes d'exploitation Microsoft tels que
les différentes versions de Windows ont également une part équitable d'outils de script
shell. Sous Windows, nous pouvons exécuter des commandes et écrire des scripts à l'aide
des shells notamment command.com et CMD.exe, le PowerShell et des outils
complémentaires tels que Cygwin pour nous donner accès à Bash sur Windows, pour n'en
nommer que quelques-uns. PowerShell fournit l'une des plus complètes installations pour
les scripts Windows et l'utilisation du shell. PowerShell aussi nous permet d'effectuer des
activités beaucoup plus complexes qui correspondent à ce qui peut être fait avec des
langages de programmation compilés, en raison de sa capacité à s'interfacer avec les outils
.NET de Microsoft. De cette façon, PowerShell peut jouer un rôle important dans la
conception des codes des plus simples à des codes complexes.