MaviAyGames | Metin2 P2P Açığını Kapatmak

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 72

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Merhaba arkadaşlar,
Hala bazı paylaşılan fileslerde p2p açığı bulunuyor. Bunu nasıl kapatacağınızı anlatacağım. Kendim kullandığım ve başarılı bi koruma sağladığından dolayı paylaşıyorum.
Bunu yapmak için Metin2 kaynak kodlarınızın olması gerekecek.

game/desc_p2p.cpp dosyasını açın ve importların bulunduğu kısımı bunu ekleyin. (Sizde varsa eklemeyin)

Kod:
#include "config.h"

Arat:
Kod:
m_iMinInputBufferLen = 1024 * 1024;

Altına ekle;
Kod:
if (strcmp(host, g_szPublicIP))     {         sys_log(0, "SYSTEM: new p2p connection from [%s] to [%s] fd: %d BLOCKED", host, g_szPublicIP, m_sock);         SetPhase(PHASE_CLOSE);         return true;     }

game/input.cpp açın ve aratın;
Kod:
if (bHeader == HEADER_CG_TEXT)     {

Altına ekle;
Kod:
if (IsEmptyAdminPage() || !IsAdminPage(inet_ntoa(d->GetAddr().sin_addr))) // block if adminpage is not set or if not admin         {             sys_log(0, "SOCKET_CMD: BLOCK FROM(%s)", d->GetHostName());             return -1;         }


Burada size anlatacağım şey oyunun güvenliği için Config dosyalarına neler eklemeliyiz.

Konu içinde anlatacağım şeyleri channel1, channel2, channel3, channel4 ve game99 klasörlerinin içindeki CONFIG isimli dosyaya ekleyiniz.

1. İlk önce serveri test serverden çıkartmakla başlayalım. Eğer test server aktif ise gmlerin kullandığı bir çok komutları oyuncularda kullanacaktır.

Kod:
TEST_SERVER = 0

2. P2P ile serverinize dışarıdan sızmaları engellemek için adminpage (metin2 api) şifresini değiştirmek ve ip atamak gerekiyor.
Kod:
ADMINPAGE_IP: ip1 ip2 ip3 ip4 ADMINPAGE_PASSWORD: parola

Gördüğünüz gibi 4 farklı ipyi atayabilirsiniz. Mesela web sitenizde p2p ile çalışan şey varsa web sitenizin ipsini ekleyebilirsiniz.

Örnek kullanım;

Kod:
ADMINPAGE_IP: 192.168.16.1 127.0.0.1 192.168.16.130 192.168.16.130 ADMINPAGE_PASSWORD: SHOWMETHEMONEY

Not: PASSWORD kısmını değiştirmeyi unutmayın.

Şu şekilde de kullanımı mevcut;


Kod:
adminpage_ip1: 192.168.16.1 adminpage_ip2: 127.0.0.1

Config tokenlerini öğrenmek için. Sourcenizde "game/src/config.cpp" dosyasını açarsanız hepsini görebilirsiniz.


3. Server key oluşturmak
Tam olarak ne işe yaradığını çözemedim lakin kodlara baktığımda bir çeşit lisans gibi bir şey. PUBLIC_IP değerine eklenen ipyi şifreleyerek bir key oluşturuyor. Eğer bu key config dosyasınıza atanmışsa ve PUBLIC_IP ipsi ile uyuşuyorsa server açılıyor. Aksi halde açılmıyor.

Kendi keyinizi oluşturmak için Metin2'nin vanilla sourcesinde "tools/ServerKeyGenerator" dosyasını kullanmanız gerekiyor. Daha sonra CONFIG dosyamıza bu keyi ekliyoruz.

Vanilla srcde tanımlanan örnek;

Kod:
SERVER_KEY: 05ZaBj/aGbMOABojQuwpzicUVsVkPLiTVMW15o85kjA2iVgR1VtmER1bchgAmqzZKaRq2ObVKcNeJgDbj6TOxjrQZlyuuyBJLQ3QskRVR64O0r+Wl290uPmAPe7KQUL1I0e4CMA2W/XRAZebjPjnDupQRlGIGveyvYI9zJNEwFQ*

4. GM ip kontrolü
Bunun için gmlerinizin interneti sabit ip olmalı. Bunun şöyle bir güzel yanı var. Ola ki GM karakteri çalındı ve başka bilgisayardan girildi. Sistem ipyi farklı göreceği için GM yetkisini vermiyecektir.
Bunun için CONFIG dosyamıza şunu ekleyin;
Kod:
GM_HOST_CHECK: 1

İp kontrolünü kapatmak isterseniz 0 yapınız. Şöyle;
Kod:
GM_HOST_CHECK: 0

5. Server - Client bütünlüğünü sağlamak
Orijinal Metin2'ye eski clientle girmeye çalıştığınızda size versiyon hatası verir ve oyundan atar. Bizde bu özelliği aktif hale getireceğiz. Oyuncuların farklı client kullanarak oyuna bağlanmasını engellerseniz hem hilelerin önüne geçmiş olursunuz hemde server güvenliğini arttırmış olursunuz.
İlk önce Config dosyamıza ekleyeceğimiz kodun detaylarını öğrenelim.

CHECK_VERSION_SERVER: 0/1 devredışı bırakır. / Aktif eder.
CHECK_VERSION_VALUE: Clientte tanımlanan zaman damgası. Öğrenmek veya değiştirmek için: "ClientSrc/UserInterface/PythonNetworkStreamPhaseGame.cpp" dosyasını açıp şunu aratın;

Kod:
bool CPythonNetworkStream::SendClientVersionPacket()

Şuna benzer bir satır göreceksiniz;
Kod:
strncpy(kVersionPacket.timestamp, "1215955205", sizeof(kVersionPacket.timestamp)-1); // # python time.time 앞자리

Çift tırnak arasında yazılı olan sayı. O zaman build edildiğindeki timestamp değeridir. Bunu değiştirip kendi CONFIG dosyalarınza şunları ekleyin. Vanilla hali ile şöyle;
Kod:
CHECK_VERSION_SERVER: 1 CHECK_VERSION_VALUE: 1215955205

6. Bazı GM komutlarını engelleyin.
Olaki birisi serverinize p2p ile bağlandı veya birisi gm charınıza girdi. Oyunu test servere sokmaması için bazı kodları engelleyebilirsiniz. Bunun dışında bazı ch çökerten komutları da kapatabilirsiniz.

Yapımı;
filesinizin kanal klasörlerine (channel1, channel2, channel3, channel4 ve game99) girin için CMD diye bir dosya olacak. Onu açtığınızda şuna benzer bir şeyler göreceklersiniz.

15591_a34b34d43ddc7200fb76648db30e5043.jpg

Bu dosyada 2 sütun var. 1 sütuna kodun kendisini yazıyoruz. Aynı satırın 2. sütununa ise hangi gm rütbesinin kullanacağını yazıyorsunuz.

Örnek;

Kod:
item IMPLEMENTOR

Fakat bunu yapmadan önce gm rütbelerini öğrenmeniz gerekiyor. Sırasıyla
  1. <li data-xf-list-type="ol">IMPLEMENTOR =&gt; En yüksek gm yetkisi. <li data-xf-list-type="ol">HIGH_WIZARD <li data-xf-list-type="ol">GOD <li data-xf-list-type="ol">LOW_WIZARD =&gt; En düşük gm yetkisi <li data-xf-list-type="ol">PLAYER =&gt; Oyuncu. Gm değil.

Not: Normalde kodların hangi rütbede kullanılacağı. "serverSrc/game/src/cmd.cpp" dosyasında belirtilmiştir.

Örnek;

Kod:
{ "who",        do_who,            0,            POS_DEAD,    GM_IMPLEMENTOR    },

CMD dosyası kaynak kodlara müdahale etmeden tekrardan yetkilendirme içindir.
Resimde fark edeceksiniz. Bazı şeylerde DISABLE var.

Kod:
test DISABLE
Aynen öyle eğer kimsenin komutu kullanmasını istemiyorsanız DISABLE yaparak ekstra güvenlik önlemi alabilirsiniz. Dice komutunu da bu şekilde kapatabilirsiniz.

---------------------------------------------------------------------------------------
Evet arkadaşlar bildiğim her yöntemi size aktardım. Bunlar oyunun bizlere sunduğu güvenliği seçenekleri. DDOS gibi saldırıları önlemek için sunucuda ekstra güvenlik önlemleri almanız gerekiyor.
MaviAyGames | Metin2 P2P Açığını Kapatmak


Metin2 özel sunucularında güvenlik, oyuncuların deneyimini korumanın ve sunucu bütünlüğünü sağlamanın kritik bir parçasıdır. Özellikle PvP sistemlerinin yoğun olduğu sunucularda, bazı açıklar kötü niyetli kullanıcılar tarafından istismar edilebilir. Bu yazıda, MaviAyGames tarafından tanımlanan ve Metin2 P2P (Player to Player) sisteminde meydana gelen güvenlik açığının nasıl kapatılacağına dair teknik detaylara değineceğiz.

Metin2 P2P Sistemi Nedir?
P2P, oyuncuların doğrudan birbirleriyle etkileşime girebildiği bir sistemdir. Özellikle özel sunucularda (private server), PvP savaşları, eşya transferleri ve diğer etkileşimler bu sistem üzerinden gerçekleşebilir. Ancak bu sistem bazı durumlarda kötüye kullanım potansiyeli taşır. Örneğin, bir oyuncu başka bir oyuncuya öldürme veya soygun gibi eylemleri izinsiz olarak uygulamaya çalışabilir. Bu da oyun içi haksız avantaj yaratır.

P2P Açığının Belirtileri
Oyuncuların normal dışı davranışlar sergilediğini fark etmek genellikle ilk adımdır. Şunlar örnek alınabilir:
- Oyuncuların izinsiz şekilde birbirlerini öldürebilmesi
- Eşya aktarımı gibi işlemlerin kontrolsüz yapılması
- Karakterlerin uzaktan saldırı alması veya saldırıda bulunması
Bu gibi durumlar, sunucu geliştiricileri tarafından log dosyaları üzerinden takip edilmelidir. Game server log analizleri, bu tür istismarların tespitinde kilit rol oynar.

P2P Açığını Kapatmak İçin Gerekli Adımlar
Açığı kapatmak için öncelikle sunucu tarafında değişiklik yapılması gerekir. İşte adım adım önerilen yöntemler:

1. P2P Kontrol Fonksiyonlarını Geliştirmek
Sunucu kaynak kodlarında (C++) yer alan P2P kontrol fonksiyonları gözden geçirilmelidir. Özellikle char_manager.cpp, battle.cpp gibi dosyalardaki sınıflar incelenmelidir. Burada hedeflenen, bir oyuncunun başka bir oyuncuya izin verilen mesafeden daha fazla etki kurmasını engellemektir.

2. Mesafe Kontrolleri
PvP sırasında iki karakter arasındaki mesafe, saldırı geçerliliği için önemli bir kriterdir. Bu kontrolü Python tarafında da yapabilirsiniz. Py Root içindeki uiscript dosyalarında, client tarafından gönderilen veriler sunucu tarafında tekrar kontrol edilmelidir. Böylece hileli mesafe verileri engellenir.

3. Yetki Kontrolleri
Her karakterin, diğerine saldırabilme veya eşya aktarımı yapabilmesi için belirli koşulları sağlaması gerekir. Sunucu tarafında faction kontrolleri, guild ilişkileri, PK seviyesi gibi veriler kontrol edilmelidir. Bu kontroller, auth server ve game server arasında senkronize olmalıdır.

MartiSama ve Diğer Kaynaklardan Yardım Almak
Metin2 geliştirme konusunda uzman kaynaklar, özellikle MartiSama gibi topluluklar, P2P sistemlerine yönelik patch veya script sunabilir. Bu tür kaynaklar sayesinde, güvenlik açıklarını kapatmak için zaman kazanabilirsiniz. Ancak bu tür çözümler dikkatli şekilde test edilmelidir.

Sunucu Performansını Etkileyebilecek Durumlar
Yapılan her değişiklikten sonra compile işlemi yapılmalı ve sunucu test ortamında çalıştırılmalıdır. DB Core ile Game Core senkronizasyonu sağlanmalı. Auth ve Game sunucuları arasındaki veri akışı kontrol edilmelidir. Bu sayede hem güvenlik artırılır hem de performans düşüklüğü önlenir.

Sonuç
Metin2 özel sunucularında güvenlik, sürekli gelişen tehditlere karşı sürekli olarak güncellenmeli ve test edilmelidir. P2P açıklarının kapatılması, oyuncuların adil bir ortamda oynamasını sağlar. Bu süreçte C++ ve Python bilgisi büyük önem taşır. Metin2 Lobby olarak, geliştiricilere destek vermeye devam ediyoruz.


MaviAyGames | How to Close the Metin2 P2P Exploit


In Metin2 private servers, security is critical for preserving the player experience and ensuring server integrity. Especially on servers with active PvP systems, certain exploits can be misused by malicious users. In this article, we will discuss technical details about how to close the security exploit identified by MaviAyGames in the Metin2 P2P (Player to Player) system.

What is the Metin2 P2P System?
P2P is a system that allows players to directly interact with each other. On private servers, PvP battles, item transfers, and other interactions may occur through this system. However, this system can sometimes be exploited. For instance, a player might attempt to kill or loot another player without permission, creating unfair advantages in-game.

Signs of the P2P Exploit
Recognizing unusual player behavior is often the first step. Examples include:
- Players being able to kill each other without permission
- Uncontrolled item transfers
- Characters taking damage or attacking from long distances
Such events should be monitored via log files. Game server logs play a key role in identifying these kinds of exploits.

Steps to Close the P2P Exploit
Closing the exploit requires modifications on the server-side. Here are the recommended steps:

1. Enhance P2P Control Functions
The P2P control functions within the server source code (C++) must be reviewed. Files such as char_manager.cpp and battle.cpp should be examined. The goal is to prevent a player from affecting another beyond an allowed distance.

2. Distance Checks
Distance between two characters during PvP is crucial for attack validation. These checks can also be performed on the Python side. Data sent by the client in uiscript files inside Py Root should be re-validated on the server to prevent cheated distance values.

3. Authority Checks
Every character must meet specific conditions before they can attack or transfer items to another. Server-side checks should include faction status, guild relations, and PK level. These checks must be synchronized between the auth server and game server.

Using Resources like MartiSama
Expert sources in the Metin2 development community, such as MartiSama, may offer patches or scripts targeting P2P exploits. These resources can help save time when closing vulnerabilities, but solutions must be carefully tested.

Performance Impact Considerations
After every modification, a compile process must be carried out, and the server should be run in a test environment. Synchronization between DB Core and Game Core must be ensured. Data flow between the auth and game servers should be checked to maintain both security and performance.

Conclusion
Security in Metin2 private servers must continuously evolve against emerging threats. Closing P2P exploits ensures a fair gaming environment for all players. This process heavily relies on knowledge of C++ and Python. As Metin2 Lobby, we continue to support developers.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt