EĞİTİM HAKKINDA
Merhabalar değerli forumdaşlarım. Bu eğitim serisiyle sizlere MITM Proxy'nin işinize yarayacak her şeyini öğretmekle geçecek. Eğitimi tamamladığımızda edineceğimiz kazanımlardan kısaca bahsetmek gerekirse: Cihazımızdan giden internet verilerini (requestleri) değiştimek. Cihazımıza gelen verileri değiştirmek ve düzenlemek. Uzaktan karşı bir cihaz ile aynı ağda olmadan internet trafiğini dinleyebilmek. Zayıf lisans API'lerine sahip programların lisanslarını kırmak. Uzaktan karşı bir cihaz ile aynı ağda olmadan facebook.com, instagram.com gibi sitelerden uzaktan çıkış yaptırabilemek vs. Yorumlarınıza tamamen açığız eğer aklınıza takılan, acaba MITM Proxy ile buda yapılır mı dediğiniz şeyleri yoruma yazmanızı bekliyorum. Fikirlerinizi de eğitim serisine eklemek çok isterim.
Önemli Bir Not: Eğitim serisini çok daha anlayabilmeniz için temel düzeyde python daha doğrusu temel düzeyde programlamanın mantığını bilmeniz yeterli olacaktır. (Koşul durumlar, fonksiyonlar, sınıflar vs.)
REHBER #1 HAKKINDA
Bu rehber MITMProxy (Ortadaki Adam Vekili) kullanarak, web isteği (request) işlemlerini manipüle etmeyi size öğretir. Bu manipülasyon ile HTTP requestlerimizin başlığını, içeriğini, form verilerini ve gideceği hosta kadar (örneğin facebook.com üzerinden giriş yapıyorsunuz ancak giriş yapa bastığınızda sizi TurkHackTeam'de giriş yapmanızı sağlayacak bir şeye dönüştürebilirsiniz veya tarayıcıda facebook.com alan adına gittiğinizde turkhackteam.org'un açılmasını sağlayabilirsiniz). Bu eğitimde bir HTTP request'in header alanında bulunan user-agent (user agent nedir?) verisini değiştireceğiz. İlerleyen derslerimizde request içerisindeki form verileri nasıl okunur. Bu veriler nasıl bir yere kaydedilir bunları göreceğiz. Bu rehberimiz genellikli olarak gerekli ortamın kurulması, proxy ve sertifika ayarlarının yapılması ve temel mantığı ve sonuçları göstermeye yönelik olcak.
EĞİTİMDE KULLANACAĞIMIZ ÖRNEĞİ TANIYALIM
Konu içerisindede örneğin kaynak kodlarını vereceğim ancak MITMProxy'nin Python API kısmını yüklemek bazen sancılı olabilyor. Bu nedenle içerisinde requirements.txt'si de bulunan örneğin github sayfasını veriyorum. Burada hazırladığım requirements.txt Python 3.8.6 sürümde stabil olarak çalışmakta, bir virtualenv oluşturarak ve daha sonra virtualenv'i aktif ederek requirements.txt'yi yüklemeniz yeterli olacaktır.
Örneğin GitHub sayfasına gitmek için tıkla.
Python:
import asyncio
from mitmproxy import options, http
from mitmproxy.tools import dump
from rich.console import Console
launcher_version = "0.0.1"
console = Console(width=100)
console.print(f"[bold dark_orange]THT UA CHANGER v{launcher_version}[/bold dark_orange]", no_wrap=True)
console.print("[bold cyan1](...) Your actions are expected.[/bold cyan1]", no_wrap=True)
class RequestLogger:
async def request(self, flow: http.HTTPFlow):
url = flow.request.url
flow.request.headers["User-Agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_2) AppleWebKit/617.26.6 (KHTML, like Gecko) Version/15.3.26 Safari/617.26.6" # Manipülasyon sonrası isteklerimizin yapılacağı USER-AGENT.
console.print(f"Client: {url}") # Cihazımızın istek gönderdiği bağlantılar.
async def start_proxy(host, port):
opts = options.Options(listen_host=host, listen_port=port)
master = dump.DumpMaster(
opts,
with_termlog=False,
with_dumper=False,
)
master.addons.add(RequestLogger())
await master.run()
return master
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
async def create_tasks_func(host, port):
tasks = []
tasks.append(asyncio.create_task(start_proxy(host, port)))
await asyncio.wait(tasks)
def main():
try:
loop.run_until_complete(create_tasks_func('127.0.0.1', 1881)) # MITM clientimizin dinleyeceği IP adresi ve Port.
loop.close()
except Exception as e:
print(e)
if __name__ == '__main__':
main()
ÖRNEĞİN ÇALIŞMA MANTIĞI
PROJENİN CİHAZDA ÇALIŞTIRILMASI
1. Proje Dosyalarını İndirmek
GitHub - oniyevski/tht-ua-changer: MITM proxy UA changer script. adresinden proje dosyaları ve gereksinim dosyaları indirilir ve projeyi barındırmak istediğiniz alana proje klasörü atılır.
2. Python Sanal Ortamını (VENV) oluşturmak ve Aktif Etmek
MITMProxy'nin python apisi biraz sıkıntılıdır. Bazı kendi alt modülleriyle çakışır veya eğer pythonla başka projelerde çalışıtıyor, geliştiriyor iseniz pythonun ana kütüphanesiyle çakışabilir. Bu nedenle özellikle MITMProxy projelerini Virtual Env (sanal python ortamında gerçekleştiririz). Eğer bir VENV oluşturmayı bilmiyorsanız sağ tarafta bulunan videolu kaynak işinizi tam anlamıyla görecektir.
3. Gerekli Modülleri Yüklemek
Evet şimdi geldik gerekli modülleri yüklemeye. GitHub Reposu (projesi) içerisinde size requirements.txt dosyasını vermiş bulunuyorum. Bu dosyayı VENV'i aktif konuma getirdikten sonra yükleme işlemimizi gerçekleştireceğiz.
4. Kodu Başlatmak
Bu adımda ise kodumuzu başlatmamız gerekiyor. Oluşturduğumuz VENV aktif iken konsola aşağıdaki komut girilir ve çalıştırılır. Sonucunda sağ taraftaki gibi bir çıktının ekranınıza gelmesi gerekir.
5. Cihazınızı MITM Proxy'e Bağlamak
Evet kodumuzu başlattık ancak cihazımızın intenet trafiği MITM Proxy üzerinden geçirmemiz gerekiyor. Size vermiş olduğum kodun
satırındaki "127.0.0.1" hostunu ve "1881" portunu sistemimizde aktifleştirmemiz gerekiyor. Eğer nasıl yapılacağını bilmiyorsanız alt kısımda Andorid, Windows ve Linux üzerinden nasıl yapılacağını gösterdiğim bir video mevcut (videoda linux ve android emulatör bir dış cihaz olduğu için alttaki 5.1 işlem basamağına göre host ve port ayarları yapılmıştır). Eğer kendi cihazınızın dışında veya emulatör üzerinde çalışan bir cihazdan MITM Proxy üzerinden trafik geçirmek istiyorsan alttaki 5.1 Dış Cihazlar için işlem basamağını okuman gerekecek. (Aynı internet ağında olmanız veya dış port açmanız gerekir)
5.1 Dış Cihazlar için İşlem
MITM Proxy scriptini ana cihazımızda, trafiğini manipüle etmek istediğimiz cihaz farklı olabilir. Bunun işlemi gerçekleştirmek için kodumuzu düzenlememiz gerekecek. Merak etmeyin bu ufak bir değişiklik sadece scriptte ve alt kısımda alıntıladığım satırda ki bulunan "127.0.0.1" ksımını değiştireceğiz ve kaydedeceğiz. Peki hangi değerle değiştireceğiz.
1. Olarak CMD, PowerShell veya Terminali açıyoruz ve aşağıdaki komutu giriyoruz:
2. Olarak ekrana gelen çıktıdan External bir adaptör arıyoruz örneğin bende alttaki şekilde gözüküyor. Daha sonra buradaki cihazımızın modem IP adresini alıyoruz ve kodumuzu alttaki şekile getiriyoruz:
6. MITM Proxy Sertifikasını Yüklemek
Evet proxymizide sistemde aktif hale getirdiğimize göre. Verileri manipüle etmek istediğimiz cihaza MITM Proxy sertfikasını yüklememiz gerekiyor (5.1 basamağındaki gibi dış bir cihazı üzerinde işlem gerçekleştirecekseniz, sertifikayı bu cihaza yüklemeniz gerekir). Sertifikayı indirme sayfasını görebilmek için 4. işlem basamağındaki kod çalıştırma işlemi ve 5. işlem basamağındaki proxy ayarları yapılandırılmaldır. Aksi takdirde sertifika indirme sayfası açılmayacaktır.
1. Olarak yukarıda bahsettiğpim ayarları yaptıktan sonra aşağıdaki web sitesine giriyoruz ve kendi platformumuza uygun olan sertifikayı indiriyoruz:
Tıkla ve Sertifikayı İndirme Bağlantısına Git!
2. Olarak aşağıdaki videolu kaynakta anlattığım gibi sertifikayı manipüle edeceğimiz cihazımıza kuruyoruz:
Sertifikayı kuramıyorsanız veya yardıma ihtiyacınız var ise alt kısımda verdiğim videolu kaynağa ba kabilirsin:
3. Eğer her şeyi doğru olarak ayarladıysak MITM Proxy konsolumuzda, manipüle ettiğimiz cihazda bir web siteisne girdiğimizde aşağıdaki gibi çıktılar görmemiz gerekir, eğer görüyorsanız kurulum işlemleri burada bitmiştir:
SONUÇLAR
Evet artık manipüle edeceğimiz cihazın hangi bağlantılara istek yolladığını konsolumuz üzerinden görebiliyoruz... Peki bizim bu projedeki hedefimiz olan (MITM Proxy mantığı anlamak için) User-Agent değiştirmek ne durumda. Şimdi sonuçlara göz atalım.
User Agent Kontrol (tıkla ve git) sitesine gidiyoruz ve gördüğünüz gibi daha önceden farklı olan User-Agentimiz scriptin içerisine girmiş olduğumuz User-Agent olarak değişmiş.
Öncesi
Sonrası
Evet bu rehberimizin amacına yani MITM Proxy ortamının kurulumu, çalıştırılması sertifika yüklenmesi ve proxy ayarlama işlemlerini tamamladık. Üstüne üstlük birde basit ve diğer derslerimize ön hazırlık olamak niteliğinde temel bir örnek çalıştırdık.
Konumu Okuduğunuz için Teşekkürler...
BONUS
Şimdi sadece konu içerisinde vereceğim (GitHub projesi içerisinde yok). Örneğin her isteğe random User-Agent veren bir kod yazmak istiyoruz
(2024 yılında çoğu site WAF gibi ya da sitenin scripti içerisinde bazen User-Agent - IP kontrolcüsü oluyor, bu nedenle sistem sizin sürekli User-Agent değiştirdiğinizi anlayabilir ancak sitede bunu kontrol etmeyen bir açık varsa Apache, Nginx vb. sistemlerin Acces Loglarında sürekli rastgele User-Agent kullanarak kafa karışıklığı yaratabilirsiniz).
PROJENİN CİHAZDA ÇALIŞTIRILMASI
1. Proje Dosyalarını İndirmek
GitHub - oniyevski/tht-ua-changer: MITM proxy UA changer script. adresinden proje dosyaları ve gereksinim dosyaları indirilir ve projeyi barındırmak istediğiniz alana proje klasörü atılır.
2. Python Sanal Ortamını (VENV) oluşturmak ve Aktif Etmek
MITMProxy'nin python apisi biraz sıkıntılıdır. Bazı kendi alt modülleriyle çakışır veya eğer pythonla başka projelerde çalışıtıyor, geliştiriyor iseniz pythonun ana kütüphanesiyle çakışabilir. Bu nedenle özellikle MITMProxy projelerini Virtual Env (sanal python ortamında gerçekleştiririz). Eğer bir VENV oluşturmayı bilmiyorsanız sağ tarafta bulunan videolu kaynak işinizi tam anlamıyla görecektir.
3. Gerekli Modülleri Yüklemek
Evet şimdi geldik gerekli modülleri yüklemeye. GitHub Reposu (projesi) içerisinde size requirements.txt dosyasını vermiş bulunuyorum. Bu dosyayı VENV'i aktif konuma getirdikten sonra yükleme işlemimizi gerçekleştireceğiz.
Kod:
pip install -r requirements.txt
4. Kodu Başlatmak
Bu adımda ise kodumuzu başlatmamız gerekiyor. Oluşturduğumuz VENV aktif iken konsola aşağıdaki komut girilir ve çalıştırılır. Sonucunda sağ taraftaki gibi bir çıktının ekranınıza gelmesi gerekir.
Kod:
python main.py
5. Cihazınızı MITM Proxy'e Bağlamak
Evet kodumuzu başlattık ancak cihazımızın intenet trafiği MITM Proxy üzerinden geçirmemiz gerekiyor. Size vermiş olduğum kodun
Python:
loop.run_until_complete(create_tasks_func('127.0.0.1', 1881)) # MITM clientimizin dinleyeceği IP adresi ve Port.
5.1 Dış Cihazlar için İşlem
MITM Proxy scriptini ana cihazımızda, trafiğini manipüle etmek istediğimiz cihaz farklı olabilir. Bunun işlemi gerçekleştirmek için kodumuzu düzenlememiz gerekecek. Merak etmeyin bu ufak bir değişiklik sadece scriptte ve alt kısımda alıntıladığım satırda ki bulunan "127.0.0.1" ksımını değiştireceğiz ve kaydedeceğiz. Peki hangi değerle değiştireceğiz.
Python:
loop.run_until_complete(create_tasks_func('127.0.0.1', 1881)) # MITM clientimizin dinleyeceği IP adresi ve Port.
1. Olarak CMD, PowerShell veya Terminali açıyoruz ve aşağıdaki komutu giriyoruz:
Kod:
Windows için: ipconfig
Kod:
Linux için: ifconfig
Python:
loop.run_until_complete(create_tasks_func('192.168.1.37', 1881)) # MITM clientimizin dinleyeceği IP adresi ve Port.
6. MITM Proxy Sertifikasını Yüklemek
Evet proxymizide sistemde aktif hale getirdiğimize göre. Verileri manipüle etmek istediğimiz cihaza MITM Proxy sertfikasını yüklememiz gerekiyor (5.1 basamağındaki gibi dış bir cihazı üzerinde işlem gerçekleştirecekseniz, sertifikayı bu cihaza yüklemeniz gerekir). Sertifikayı indirme sayfasını görebilmek için 4. işlem basamağındaki kod çalıştırma işlemi ve 5. işlem basamağındaki proxy ayarları yapılandırılmaldır. Aksi takdirde sertifika indirme sayfası açılmayacaktır.
1. Olarak yukarıda bahsettiğpim ayarları yaptıktan sonra aşağıdaki web sitesine giriyoruz ve kendi platformumuza uygun olan sertifikayı indiriyoruz:
Tıkla ve Sertifikayı İndirme Bağlantısına Git!
2. Olarak aşağıdaki videolu kaynakta anlattığım gibi sertifikayı manipüle edeceğimiz cihazımıza kuruyoruz:
Sertifikayı kuramıyorsanız veya yardıma ihtiyacınız var ise alt kısımda verdiğim videolu kaynağa ba kabilirsin:
SONUÇLAR
Evet artık manipüle edeceğimiz cihazın hangi bağlantılara istek yolladığını konsolumuz üzerinden görebiliyoruz... Peki bizim bu projedeki hedefimiz olan (MITM Proxy mantığı anlamak için) User-Agent değiştirmek ne durumda. Şimdi sonuçlara göz atalım.
User Agent Kontrol (tıkla ve git) sitesine gidiyoruz ve gördüğünüz gibi daha önceden farklı olan User-Agentimiz scriptin içerisine girmiş olduğumuz User-Agent olarak değişmiş.
Öncesi
Sonrası
Evet bu rehberimizin amacına yani MITM Proxy ortamının kurulumu, çalıştırılması sertifika yüklenmesi ve proxy ayarlama işlemlerini tamamladık. Üstüne üstlük birde basit ve diğer derslerimize ön hazırlık olamak niteliğinde temel bir örnek çalıştırdık.
Konumu Okuduğunuz için Teşekkürler...
BONUS
Şimdi sadece konu içerisinde vereceğim (GitHub projesi içerisinde yok). Örneğin her isteğe random User-Agent veren bir kod yazmak istiyoruz
(2024 yılında çoğu site WAF gibi ya da sitenin scripti içerisinde bazen User-Agent - IP kontrolcüsü oluyor, bu nedenle sistem sizin sürekli User-Agent değiştirdiğinizi anlayabilir ancak sitede bunu kontrol etmeyen bir açık varsa Apache, Nginx vb. sistemlerin Acces Loglarında sürekli rastgele User-Agent kullanarak kafa karışıklığı yaratabilirsiniz).
Python:
import asyncio[/I][/I][/B]
[SIZE=4][B][I]from mitmproxy import options, http
from mitmproxy.tools import dump
from rich.console import Console
from fake_useragent import UserAgent
launcher_version = "0.0.1"
console = Console(width=100)
console.print(f"[bold dark_orange]THT UA CHANGER v{launcher_version}[/bold dark_orange]", no_wrap=True)
console.print("[bold cyan1](...) Your actions are expected.[/bold cyan1]", no_wrap=True)
class RequestLogger:
async def request(self, flow: http.HTTPFlow):
url = flow.request.url
ua = UserAgent()
flow.request.headers["User-Agent"] = ua.random # Manipülasyon sonrası isteklerimizin yapılacağı rastgele user agent USER-AGENT.
console.print(f"Client: {url}") # Cihazımızın istek gönderdiği bağlantılar.
async def start_proxy(host, port):
opts = options.Options(listen_host=host, listen_port=port)
master = dump.DumpMaster(
opts,
with_termlog=False,
with_dumper=False,
)
master.addons.add(RequestLogger())
await master.run()
return master
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
async def create_tasks_func(host, port):
tasks = []
tasks.append(asyncio.create_task(start_proxy(host, port)))
await asyncio.wait(tasks)
def main():
try:
loop.run_until_complete(create_tasks_func('127.0.0.1', 1881)) # MITM clientimizin dinleyeceği IP adresi ve Port.
loop.close()
except Exception as e:
print(e)
if __name__ == '__main__':
main()
[I]
Bu kodun çalışması için bir modül indirmemiz gerekiyor, virtualenv aktif iken aşağıdaki komut terminale yazılır ve random User-Agent'i bize sağlayacak olan modül virtualenv içerisinde kurulur. Daha sonrasında eğer script çalışıyorsa yeniden başlatılır. Kapalı ise tekrardan açılır. Kodumuzun bize sağladığı yeni özelliğin öncesi ve sornası aşağıdaki gibidir.
Kod:
pip install fake-useragent
Öncesi
Sonrası
Son düzenleme:




