Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
ctf_thc_toulouse_hacking_convention [2018/04/09 23:46] M0N5T3R créée |
ctf_thc_toulouse_hacking_convention [2018/04/10 00:03] (Version actuelle) M0N5T3R |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | |||
* web 1 (202pts) : le writeup de BFF ici : https://github.com/Beers4Flags/writeups/tree/master/2018/Thcon/Web/200 | * web 1 (202pts) : le writeup de BFF ici : https://github.com/Beers4Flags/writeups/tree/master/2018/Thcon/Web/200 | ||
Ligne 9: | Ligne 10: | ||
* web 2 : une page web d’encyclopédie de cactus avec recherche. Personne n'a résolu ce chall durant le ctf. On l'a tourné dans tous les sens, mais pas moyen d'en sortir quoi que ce soit. C'était apparemment une sqli via un cookie encodé en b64 dont le contenu d'origine était ".;.;.". Mais on a beau avoir try hard ce cookie, se doutant bien qu'il y avait quelque chose rien n'est ressortit. En discutant avec d'autres team, plusieurs ont fait pareil sans succès. Bref, l'auteur du chall nous a dit qu'il diffuserait un write up, je suis curieux de la lire car ce cactus m'a fait mal au c.. | * web 2 : une page web d’encyclopédie de cactus avec recherche. Personne n'a résolu ce chall durant le ctf. On l'a tourné dans tous les sens, mais pas moyen d'en sortir quoi que ce soit. C'était apparemment une sqli via un cookie encodé en b64 dont le contenu d'origine était ".;.;.". Mais on a beau avoir try hard ce cookie, se doutant bien qu'il y avait quelque chose rien n'est ressortit. En discutant avec d'autres team, plusieurs ont fait pareil sans succès. Bref, l'auteur du chall nous a dit qu'il diffuserait un write up, je suis curieux de la lire car ce cactus m'a fait mal au c.. | ||
* web 3 : le writeup de BFF ici : https://github.com/Beers4Flags/writeups/tree/master/2018/Thcon/Web/300 | * web 3 : le writeup de BFF ici : https://github.com/Beers4Flags/writeups/tree/master/2018/Thcon/Web/300 | ||
- | Honnêtement, on avait tout sur ce chall, sauf que le répo git récupéré via gitTools était corrompu. Du coup pas moyen de pouvoir récupérer les fichiers. | + | Honnêtement, on avait tout sur ce chall, sauf que le répo git récupéré via gitTools était corrompu. Du coup pas moyen de pouvoir récupérer les fichiers. |
- | On a passé du temps a essayer de réparer le répo sans succès. Alors qu'au final on a apprit après que cela aurait dut fonctionner nickel. Bref leçon à retenir, des fois aller poser une question aux orgas, ça fait gagner du temps et des points :/ | + | On a passé du temps a essayer de réparer le répo sans succès. Alors qu'au final on a apprit après que cela aurait dut fonctionner nickel. Bref leçon à retenir, des fois aller poser une question aux orgas, ça fait gagner du temps et des points :/ |
Ligne 16: | Ligne 17: | ||
* On arrive d'abord sur une page web toute simple avec pas grand chose à l'intérieur, juste un formulaire RESTRICTED ACCESS avec un champ à submit. | * On arrive d'abord sur une page web toute simple avec pas grand chose à l'intérieur, juste un formulaire RESTRICTED ACCESS avec un champ à submit. | ||
- | [[https://forum.zenk-security.com/attachment.php?thumbnail=685]] | + | {{ :forensic.png?nolink&200 |}} |
* On découvre un répo .git (présence du fichier .git/HEAD) | * On découvre un répo .git (présence du fichier .git/HEAD) | ||
Ligne 23: | Ligne 24: | ||
* le répo pour récupérer les sources | * le répo pour récupérer les sources | ||
* Config.py | * Config.py | ||
- | URL = 'https://vault:8200' | ||
- | CERT = './cert/client.crt' | ||
- | KEY = './cert/client.key' | ||
- | CA = './cert/vault_ca.crt' | ||
- | * code_check.py | ||
- | from flask import Flask, request, render_template | ||
- | import hvac | ||
- | app = Flask(__name__) | + | 'https://vault:8200' |
- | app.config.from_object('config') | + | CERT = './cert/client.crt' |
- | vault = hvac.Client(url=app.config['URL'], cert=(app.config['CERT'], app.config['KEY']), verify=app.config['CA']) | + | KEY = './cert/client.key' |
+ | CA = './cert/vault_ca.crt' | ||
+ | * code_check.py | ||
- | # @app.route('/') | + | from flask import Flask, request, render_template |
- | def get_index(): | + | import hvac |
- | return app.send_static_file('index.html') | + | app = Flask(__name__) |
- | + | app.config.from_object('config') | |
- | + | vault = hvac.Client(url=app.config['URL'], cert=(app.config['CERT'], app.config['KEY']), verify=app.config['CA']) | |
- | # @app.route('/code_check', methods=['POST']) | + | # @app.route('/') |
- | def check_code(): | + | def get_index(): |
- | user_code = "code" #request.form.get('code') | + | return app.send_static_file('index.html') |
- | vault.auth_tls() | + | # @app.route('/code_check', methods=['POST']) |
- | value = vault.read('secret/auth') | + | def check_code(): |
- | + | user_code = "code" #request.form.get('code') | |
- | if value is not None and user_code is not None: | + | vault.auth_tls() |
- | if str(value['data']['code']) == str(user_code): | + | value = vault.read('secret/auth') |
- | value = vault.read('secret/vulnerability') | + | if value is not None and user_code is not None: |
- | if value is not None: | + | if str(value['data']['code']) == str(user_code): |
- | return render_template('success.html', content=value['data']['vuln']), 200, {'ContentType': 'text/html'} | + | value = vault.read('secret/vulnerability') |
- | return app.send_static_file('error.html'), 401, {'ContentType': 'text/html'} | + | if value is not None: |
+ | return render_template('success.html', content=value['data']['vuln']), 200, {'ContentType': 'text/html'} | ||
+ | return app.send_static_file('error.html'), 401, {'ContentType': 'text/html'} | ||
+ | if __name__ == '__main__': | ||
+ | check_code() | ||
- | if __name__ == '__main__': | ||
- | check_code() | ||
* Il s'agit donc d'un formulaire d'authentification en python utilisant vault | * Il s'agit donc d'un formulaire d'authentification en python utilisant vault | ||
* Les logs du git nous apprennent qu'une ancienne version a existé sous mysql. Et au passage on récupère les credentials mysql dans les sources. | * Les logs du git nous apprennent qu'une ancienne version a existé sous mysql. Et au passage on récupère les credentials mysql dans les sources. | ||
* Test du 3306, puis Nmap pour trouver un mysql open sur un autre port, et au final dirb nous a trouvé un folder phpMyAdmin | * Test du 3306, puis Nmap pour trouver un mysql open sur un autre port, et au final dirb nous a trouvé un folder phpMyAdmin | ||
- | * Connection au phpMyAdmin et à partir de là on récupère les fichiers sur le serveur via un | + | * Connection au phpMyAdmin et à partir de là on récupère les fichiers sur le serveur via un |
- | select LOAD_FILE('/etc/passwd') | + | select LOAD_FILE('/etc/passwd') |
* /etc/nginx/nginx.conf pour trouver le full path web | * /etc/nginx/nginx.conf pour trouver le full path web | ||
* récupération du contenu du dossier cert/ afin de récup la clé, le certificat et l'autorité de certification | * récupération du contenu du dossier cert/ afin de récup la clé, le certificat et l'autorité de certification |