برنامه نویسی

برنامه EBPF برای استخراج داده ها از ترافیک HTTPS با استفاده از Proxy MITM و Java – Dev Community

استفاده از EBPF (فیلتر بسته بسته برکلی) برای استخراج داده ها از ترافیک HTTPS یک کار بسیار تخصصی و پیشرفته است که شامل چند مرحله و فناوری کلیدی است. EBPF به طور معمول برای نظارت و فیلتر کردن بسته های شبکه در سطح بسیار کم در هسته لینوکس استفاده می شود و می توان آن را برای ضبط ترافیک شبکه گسترش داد.

با این حال ، ترافیک HTTPS رمزگذاری شده است ، بنابراین حتی اگر شما با EBPF ترافیک را ضبط کنید ، بار بازپرداخت هنوز رمزگذاری می شود مگر اینکه کلید رمزگشایی را داشته باشید (مانند کلید جلسه یا کلید خصوصی سرور ، که به طور کلی در دسترس نیست مگر اینکه انجام دهید. یک حمله مردانه در یک محیط کنترل شده).

بیانیه مشکل و استفاده می کند
برای تولید سیاههها بدون نیاز به نوشتن کد برنامه جداگانه. فقط نصب این سیاههها باعث ایجاد سیاههها می شود.

مفاهیم کلیدی:
EBPF: یک چارچوب قدرتمند برای اجرای برنامه های سفارشی در داخل هسته لینوکس که می تواند به رویدادهای مختلف شبکه (به عنوان مثال ، ضبط بسته ، تماس های سیستم و غیره) متصل شود.

https: ارتباط ایمن از طریق HTTP با استفاده از رمزگذاری SSL/TLS. ترافیک ضبط شده در سطح شبکه رمزگذاری می شود مگر اینکه توسط یک نهاد که به کلیدهای رمزگذاری دسترسی داشته باشد رمزگشایی شود.

جریان سطح بالا برای استخراج ترافیک HTTPS با استفاده از EBPF و جاوا:

ترافیک HTTPS را با EBPF ضبط کنید:
EBPF قادر به رهگیری ترافیک شبکه است ، اما در سطح هسته فعالیت می کند. این در درجه اول برای تجزیه و تحلیل بسته های شبکه ، تماس با سیستم ردیابی و نظارت بر رفتار سیستم سطح پایین استفاده می شود. هرچند ، ترافیک HTTPS رمزگذاری شده است (با استفاده از SSL/TLS) ، بنابراین شما فقط می توانید بسته های رمزگذاری شده را مشاهده کنید مگر اینکه بتوانید آنها را رمزگشایی کنید. که نیاز به دسترسی به کلیدهای رمزگشایی دارد.

 ترافیک را رمزگشایی کنید:
برای رمزگشایی ترافیک HTTPS در زمان واقعی ، شما باید هر دو:
از رهگیری SSL/TLS (Man-in-the-Middle) استفاده کنید که در آن شما گواهی و مبادله کلیدی را کنترل می کنید. یا در صورت کنترل سیستم ، از ورود به سیستم برای ضبط کلیدهای جلسه استفاده کنید و می توانید ورود به سیستم را در مرورگر یا مشتری فعال کنید.

 استخراج داده ها در جاوا:
پس از رمزگشایی ترافیک ، می توانید از یک ابزار ضبط بسته برای گرفتن درخواست/پاسخ و هدر HTTP استفاده کنید. می توانید از کتابخانه هایی مانند PCAP4J برای گرفتن بسته ها در جاوا استفاده کنید.

اجزای:
برنامه EBPF: بسته های شبکه را ضبط می کند.
برنامه جاوا: با خروجی EBPF تعامل دارد (به عنوان مثال ، با استفاده از یک کتابخانه برای خواندن و پردازش ترافیک شبکه).
رمزگشایی ترافیک (اختیاری): شما نیاز به رمزگشایی ترافیک با استفاده از کتابخانه های SSL/TLS یا ابزارهایی مانند MITMProxy ، OpenSSL یا سایر روش های رمزگشایی دارید.

نحوه استخراج داده ها با استفاده از روش زیر
روش پروکسی انسان در وسط (MITM)
می توانید از یک پروکسی MITM مانند Mitmproxy یا Burp Suite استفاده کنید. این پروکسی ها به عنوان واسطه بین مشتری و سرور عمل می کنند و از طریق آن می توانند ترافیک HTTPS را رمزگشایی کنند.

مراحل استفاده از mitmproxy:

  1. MITMProxy را نصب کنید: می توانید آن را با استفاده از PIP Python نصب کنید:
bash
pip install mitmproxy
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. MITMProxy را شروع کنید: پروکسی را روی یک درگاه شروع کنید (به عنوان مثال ، 8080):
bash
mitmproxy -p 8080
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. مشتری خود را پیکربندی کنید: مشتری یا مرورگر خود را برای استفاده از پروکسی تنظیم کنید. به عنوان مثال ، در Chrome ، می توانید این کار را با پیکربندی تنظیمات پروکسی HTTP/HTTPS انجام دهید تا به LocalHost اشاره کنید: 8080.

  2. به گواهی MITMProxy اعتماد کنید: MITMProxy یک گواهی خود امضا شده برای رمزگشایی HTTPS ایجاد می کند. برای جلوگیری از خطاهای SSL ، گواهی تولید شده (~/.mitmproxy/mitmproxy-ca-cert.pem) را به عنوان یک گواهی معتبر در مشتری (مرورگر یا برنامه) نصب کنید.

  3. شروع به رهگیری ترافیک: پس از تنظیم پروکسی و ترافیک از طریق آن جریان می یابد ، Mitmproxy ترافیک HTTPS را رمزگشایی می کند و شما قادر خواهید بود از داده های ساده استفاده کنید.
    بنابراین ، برنامه یا متعادل کننده بار شما باید تمام ترافیک را از طریق Proxy MITM IE ، به درگاه باز شده توسط MITM Proxy هدایت کند. بنابراین پروکسی به آن بندر گوش می دهد و پس از دریافت ترافیک توسط پروکسی ، درخواست را با استفاده از کلید اصلی استخراج می کند. پس از رمزگشایی پیام ، می توانید آن را به یک پرونده ورود به سیستم بنویسید و درخواست را به نقطه پایان برنامه واقعی ارسال کنید. بنابراین جریان به صورت زیر LB خواهد بود/برنامه ترافیک را به پورت پروکسی MITM ارسال می کند – MITM به آن درگاه گوش می دهد و پیام را استخراج می کند – به پورت برنامه واقعی Backend. و برنامه درخواست را دریافت می کند و آن را پردازش می کند.

پردازش و خروجی در جاوا:
هنگامی که برنامه EBPF در حال ضبط ترافیک است ، برای پردازش و خروجی باید داده های ضبط شده را به جاوا تغذیه کنید. این کار را می توان با استفاده از یک برنامه فضای کاربر (به عنوان مثال ، BCC ، LIBBPF یا BPFTOOL) برای تعامل با برنامه EBPF انجام داد. ارسال داده های بسته به جاوا از طریق ارتباطات بین فرآیند (IPC) ، مانند استفاده از سوکت ، پرونده یا حافظه مشترک.

مثال در جاوا برای ضبط خروجی EBPF:
می توانید یک برنامه جاوا بنویسید که یک سوکت را باز می کند یا به پرونده ای گوش می دهد که برنامه EBPF بسته های ضبط شده را حذف می کند.
کد جاوا برای رسیدگی به ترافیک:

import java.io.*;
import java.net.*;

public class MITMAppProxy {
    public static void main(String[] args) throws IOException {
        int port = 9090; // Example listening port
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("MITM App Proxy Listening on port " + port);

        // Handle incoming traffic
        while (true) {
            Socket clientSocket = serverSocket.accept();
            handleClient(clientSocket);
        }
    }

    private static void handleClient(Socket clientSocket) {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

            String requestLine;
            while ((requestLine = in.readLine()) != null) {
                System.out.println("Received from client: " + requestLine);
                // Process the request here (e.g., modify packets if needed)
                out.println("HTTP/1.1 200 OK");
                out.println("Content-Type: text/plain");
                out.println("");
                out.println("MITM App Proxy Response");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. قرار دادن همه اینها: برنامه EBPF در قسمت هسته اجرا می شود ، بسته ها را ضبط می کند و آنها را وارد می کند یا آنها را اصلاح می کند. پروکسی برنامه MITM ترافیک رهگیری شده را برای پردازش بیشتر به جاوا منتقل می کند.

برای بسته بندی پروژه خود (از جمله برنامه EBPF ، کد جاوا و تنظیم پروکسی) به یک شیشه (برای جاوا) یا RPM (برای استقرار در سیستم های لینوکس) ، باید مراحل خاصی را برای هر نوع بسته دنبال کنید.

  1. بسته نرم افزاری به عنوان یک فایل شیشه ای (پروژه جاوا) می توانید برنامه جاوا خود را (Proxy MITM ، که ترافیک شبکه ضبط شده توسط EBPF را پردازش می کند) را به یک پرونده شیشه (بایگانی جاوا) بچسبانید. در اینجا چگونه: **** ** راهنمای گام به گام برای ایجاد یک شیشه: ** 1. سازماندهی پروژه خود: اطمینان حاصل کنید که پروژه شما به شرح زیر است:
graphql
my-mitm-proxy/
├── src/
│   ├── Main.java
│   ├── MITMAppProxy.java
├── lib/
├── eBPF/                # If you have a directory for eBPF code
└── build.gradle (or pom.xml)    # For build configuration if using Gradle or Maven
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. با استفاده از Maven (یا Gradle): اگر از Maven استفاده می کنید ، در اینجا یک الگوی POM.xml برای ساخت یک شیشه وجود دارد:

    4.0.0

    com.example
    mitm-proxy
    1.0-SNAPSHOT
    jar

    
        
    

    
        
            
                org.apache.maven.plugins
                maven-jar-plugin
                3.1.0
                
                    
                        
                            jar
                        
                    
                
            
        
    
`
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

برای Gradle:

plugins {
    id 'java'
}

group 'com.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.apache.logging.log4j:log4j-api:2.14.1'
}

jar {
    archiveBaseName="mitm-proxy"
    archiveVersion = '1.0.0'
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. شیشه را بسازید: برای Maven: موارد زیر را در فهرست پروژه اجرا کنید:
mvn clean package

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این یک پرونده .jar در هدف/ فهرست ایجاد می کند.
برای Gradle: موارد زیر را در فهرست پروژه اجرا کنید:

gradle clean build

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

.jar در ساخت/ libs/ دایرکتوری یافت می شود.

  1. اجرای شیشه: برای اجرای شیشه تولید شده ، از دستور زیر استفاده کنید:
java -jar target/mitm-proxy-1.0-SNAPSHOT.jar

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. برنامه EBPF بسته و Proxy MITM را به یک بسته RPM برای بسته بندی برنامه EBPF و Proxy Java MITM در یک بسته RPM برای توزیع در سیستم های لینوکس ، این مراحل را دنبال کنید: راهنمای گام به گام برای ایجاد RPM:
  2. برنامه EBPF را آماده کنید: اگر برنامه EBPF را در C نوشته شده اید (مانند مثال قبلی نشان داده شده است) ، ابتدا آن را در یک فایل شی (.o) کامپایل کنید.
gcc -o capture.o -c capture.c

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. ساختار دایرکتوری خود را برای RPM آماده کنید: یک ساختار دایرکتوری برای بسته RPM ایجاد کنید: Perl

my-mitm-proxy-rpm/
├── BUILD/
├── RPMS/
├── SOURCES/
├── SPECS/
│   └── mitm-proxy.spec
└── SRPMS/
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. ایجاد یک فایل مشخصه (mitm-proxy.spec): یک پرونده .spec را در داخل مشخصات/ دایرکتوری ایجاد کنید تا فرآیند ساخت بسته RPM خود را توصیف کنید. در زیر یک MITM-Proxy.spec مثال: Spec

نام: mitm-proxy
نسخه: 1.0
انتشار: 1 ٪ {؟ dist}
خلاصه: پروکسی MITM با استفاده از EBPF

مجوز: GPL
URL: http://example.com
منبع 0: MITM-Proxy-1.0.tar.gz

BuildRequires: Java-11-Openjdk-Devel ، GCC
نیاز دارد: Java-11-OpenJDK

%description
A man-in-the-middle proxy application that uses eBPF to capture and log network traffic.
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

%prep
%setup -q
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

%build
gcc -o capture.o -c eBPF/capture.c
javac src/*.java
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

%install
mkdir -p %{buildroot}/usr/local/bin
cp capture.o %{buildroot}/usr/local/bin/capture.o
cp target/mitm-proxy-1.0-SNAPSHOT.jar %{buildroot}/usr/local/bin/mitm-proxy.jar
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

%files
/usr/local/bin/capture.o
/usr/local/bin/mitm-proxy.jar
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

%changelog
* Thu Feb 17 2025 Your Name  - 1.0-1
- Initial release
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. منابع را آماده کنید: بایگانی منبع MITM-Proxy-1.0.tar.gz را در منابع/ فهرست قرار دهید. این باید شامل کد جاوا ، برنامه EBPF و هر پرونده لازم دیگر باشد. می توانید با استفاده از بایگانی تار ایجاد کنید:
bash
tar czf mitm-proxy-1.0.tar.gz my-mitm-proxy/
mv mitm-proxy-1.0.tar.gz SOURCES/
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. RPM را بسازید: پس از نصب پرونده مشخصات و منابع ، از دستور RPMBuild برای ایجاد بسته RPM استفاده کنید:
bash
rpmbuild -ba SPECS/mitm-proxy.spec
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. RPM را نصب کنید: پس از ساخت ، بسته RPM در RPMS/ Directory قرار خواهد گرفت. می توانید آن را با استفاده از سیستم لینوکس نصب کنید:
bash
sudo rpm -ivh RPMS/x86_64/mitm-proxy-1.0-1.x86_64.rpm
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. مراحل نهایی: پس از بسته بندی برنامه EBPF و پروکسی MITM خود در یک کوزه یا RPM ، می توانید: JAR را توزیع کنید: کاربران می توانند پروکسی MITM را مستقیماً با Java -jar اجرا کنند. RPM را در Linux نصب کنید: RPM همه چیز را نصب می کند ، از جمله برنامه EBPF کامپایل شده ، Java Jar و هر پرونده پیکربندی که باید ارائه دهید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا