Analisis kontes Bypass IDS di Positive Hack Days 9

Forum internasional Positive Hack Days 2019 menjadi tuan rumah kontes IDS Bypass pertama. Peserta harus memeriksa segmen jaringan lima node, kemudian mengeksploitasi kerentanan layanan, atau memenuhi persyaratan yang ditentukan (misalnya, mengirim respons HTTP tertentu) dan dengan demikian mendapatkan bendera. Menemukan eksploit itu mudah, tetapi IDS mempersulit tugas: sistem berdiri di antara peserta dan node dan memeriksa setiap paket jaringan. Penyerang melihat di dashboard jika tanda tangan memblokir koneksi mereka. Di bawah ini saya akan memberi tahu Anda secara rinci tentang tugas-tugas itu sendiri dan menganalisis solusinya.



100.64.0.11 - Struts


Node pertama dalam jumlah orang yang menyelesaikan tugas adalah Struts. Setelah memindai port Nmap, kami menemukan layanan Apache Struts di port 8080.

# nmap -Pn -sV -p1-10000 100.64.0.11 631/tcp open ipp CUPS 2.1 8005/tcp open mxi? 8009/tcp open ajp13 Apache Jserv (Protocol v1.3) 8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1 



Kerentanan untuk Apache Struts mati pada tahun 2017: menggunakan injeksi OGNL, penyerang dapat mengeksekusi kode apa pun pada Struts tanpa otorisasi. Ada exploit, misalnya, di GitHub , tetapi IDS ditangkap:

[Drop] [**] [1:1001:1] Apache Struts2 OGNL inj in header (CVE-2017-5638) [**]

Kode tanda tangan itu sendiri tidak tersedia untuk peserta, tetapi dari pesan di log Anda dapat memahami mekanisme operasinya. Dalam hal ini, tanda tangan mendeteksi injeksi OGNL dalam HTTP:

 GET /showcase.action HTTP/1.1 Accept-Encoding: identity Host: 100.64.0.11:8080 Content-Type: %{(#_='multipart/form-data')... 

Jika kita memeriksa perilaku IDS, itu akan menjadi jelas bahwa ia menangkap kombinasi% {di awal header Tipe-Konten. Ada beberapa solusi:

  1. Peserta @empty_jack mencoba untuk memecah kombinasi karakter% {dengan kamusnya sendiri untuk fuzzing dan kemudian datang ke solusi dengan baris Content-Type:% $ {.
  2. Fuzz permintaan HTTP itu sendiri. Anggota @ c00lhax0r menemukan bahwa karakter nol pada awal header juga akan memotong IDS: Content-Type: \ 0 $ {.
  3. Sebagian besar eksploitasi untuk CVE-2017-5638 melakukan injeksi dengan simbol persen. Tetapi beberapa peneliti ini dan kerentanan Apache Struts sebelumnya menulis bahwa injeksi dapat dimulai dengan% dan $. Dengan demikian, kombinasi $ {akan mem-bypass tanda tangan IDS dan mengeksekusi kode pada sistem. Keputusan seperti itu dikandung pada awalnya.

Tugas ini adalah yang termudah, diputuskan oleh delapan peserta.

100.64.0.10 - Solr


Pada port 8983 adalah server Apache Solr, ditulis dalam Java.

 $ nmap -Pn -sV -p1-10000 100.64.0.10 22/tcp open ssh (protocol 2.0) 8983/tcp open http Jetty 



Eksploitasi untuk Apache Solr 5.3.0 mudah ditemukan - CVE-2019-0192 . Penyerang bisa menipu alamat server RMI dalam koleksi. Operasi membutuhkan kerangka kerja ysoserial, yang menghasilkan rantai objek Java (gadget) dan mengirimkannya dengan berbagai cara. Misalnya, dari server JRMP.

Tentu saja, dengan menggunakan eksploitasi dahi di dahi, peserta akan melihat tanda tangan IDS yang memicu:

[Drop] [**] [1:10002700:3001] ATTACK [PTsecurity] Java Object Deserialization RCE POP Chain (ysoserial Jdk7u21) [**]

Jdk7u21 hanya satu dari tiga puluh muatan, dan pilihan mereka tergantung pada perpustakaan yang digunakan dalam layanan rentan. Rantai gadget Jdk7u21 hanya menggunakan kelas standar dari Java Development Kit versi 7u21, dan rantai CommonsCollections1 berisi kelas dari Apache Common Collections 3.1 yang banyak digunakan.

Penyerang mengganti alamat server RMI di koleksi Solr dengan miliknya, dan kemudian memulai server JRMP. Solr meminta objek di alamat dan menerima objek Java berbahaya. Setelah deserialisasi, kode dijalankan di server.

Tanda tangan menyala pada urutan kelas di objek Java serial. Ini ditransmisikan dari mesin penyerang dan lalu lintas dimulai seperti ini:



Solusi untuk masalah ini sederhana. Tanda tangan secara eksplisit mengacu pada Jdk7u21. Untuk menyiasatinya, Anda harus mencoba rantai gadget lainnya. Misalnya, salah satu dari CommonsCollections. Tidak ada tanda tangan untuk rantai lain di IDS. Peserta akan menerima shell pada sistem dan membaca benderanya. Lima peserta menyelesaikan tugas.

100.64.0.12 - SAMR


Salah satu tugas kompetisi yang paling sulit dan menarik. Ini adalah mesin Windows dengan port 445 terbuka. Bendera dibagi menjadi nama-nama dua pengguna sistem, dan untuk menyelesaikan tugas itu perlu mendapatkan daftar semua pengguna pada node Windows.

Tentu saja, MS17-010 dan eksploitasi lainnya tidak berfungsi pada mesin ini. Menghitung pengguna bisa, misalnya, skrip dari Nmap atau kerangka impacket :

 $ python samrdump.py 100.64.0.12 Impacket v0.9.15 - Copyright 2002-2016 Core Security Technologies [*] Retrieving endpoint list from 100.64.0.12 [*] Trying protocol 445/SMB… Found domain(s): . SAMR . Builtin [*] Looking up users in domain SAMR [-] The NETBIOS connection with the remote host timed out. [*] No entries received. 

Kedua skenario membuat permintaan DCERPC ke mesin pada port 445. Tapi tidak semuanya begitu sederhana: beberapa paket diblokir oleh IDS, dan kali ini dua tanda tangan dipicu:

[**] [1:2001:2] SAMR DCERPC Bind [**]
[Drop] [**] [1:2002:2] SAMR EnumDomainUsers Request [**]

Yang pertama mendeteksi koneksi ke layanan SAMR dan hanya menandai koneksi TCP dengan flag. Dan yang kedua dipicu oleh permintaan EnumDomainUsers untuk layanan SAMR. Layanan ini memiliki cara lain untuk mendapatkan pengguna: QueryDisplayInfo, QueryDisplayInfo2, QueryDisplayInfo3. Semuanya juga diblokir oleh tanda tangan.

Protokol DCERPC dan layanan Windows memberikan peluang luar biasa untuk manajemen situs jarak jauh. Protokol ini digunakan oleh sebagian besar alat yang terkenal, seperti PsExec atau BloodHound. Layanan SAMR, yaitu SAM Remote Protocol, memungkinkan Anda untuk bekerja dengan akun di host, termasuk daftar pengguna.

Untuk meminta EnumDomainUsers Impacket lakukan hal berikut:



Koneksi DCERPC ke layanan SAMR dibuat melalui SMB, dan semua permintaan lebih lanjut dilakukan dalam konteks layanan ini. Tanda tangan bekerja pada paket pertama dan terakhir dari tangkapan layar.

Saya memberi dua petunjuk untuk tugas itu:

  • Upaya Anda menyebabkan IDS menghasilkan 2 peringatan. Perhatikan baik-baik pada yang pertama.
  • Perintah koneksi mana untuk protokol ini yang Anda ketahui?

Ini tentang protokol DCERPC dan cara membuat koneksi. Dalam daftar PDU yang tersedia, perintah Konteks Bind dan Alter bertanggung jawab untuk menghubungkan dan mengubah konteks, dan yang kedua memungkinkan mengubah konteks saat ini tanpa memutus koneksi.

Untuk menyelesaikannya, kami harus menulis ulang logika skrip samrdump:

  1. Buat Bind ke layanan lain, misalnya dengan UUID 3919286a-b10c-11d0-9ba8-00c04fd92ef5.
  2. Gunakan Alter Context untuk beralih ke SAMR.
  3. Kirim permintaan ke EnumDomainUsers.

Perubahan sesuai pada tiga baris:

 < dce.bind(samr.MSRPC_UUID_SAMR) --- > dce.bind(uuid.uuidtup_to_bin(("3919286a-b10c-11d0-9ba8-00c04fd92ef5", "0.0"))) > dce.alter_ctx(samr.MSRPC_UUID_SAMR) > dce._ctx = 1 

Solusi alternatif diusulkan oleh pemenang kontes @ psih1337. Kueri EnumDomainUsers mengembalikan daftar pengguna bukan berdasarkan nama, tetapi oleh SID (ID Keamanan). SID bukan angka acak. Misalnya, akun LocalSystem memiliki SID S-1-5-18, dan untuk pengguna yang dibuat secara manual, mulai dari 1000.

Jadi, secara manual menyortir benih dari 1000 hingga 2000, sangat mungkin untuk menemukan akun yang diinginkan dalam sistem. Mereka ditemukan di bawah sids 1008 dan 1009.

Solusi untuk tugas ini membutuhkan pemahaman tentang protokol dan pengalaman DCERPC dalam meneliti infrastruktur Windows. @ psih1337 adalah satu-satunya yang memutuskannya.

100.64.0.13 - DNSCAT


Pada port 80 ada halaman web dengan formulir untuk alamat IP.



Jika Anda menentukan IP Anda, maka UDP tiba di port 53:

 17:40:45.501553 IP 100.64.0.13.38730 > 100.64.0.187: 61936+ CNAME? dnscat.d2bc039ce800000000d6eae8eae3bf81fd84d1695f5888aba8dcec06d071.a73b3f0561ca4906d268214f4b70da1bdb50f75739ae0577139096732bf8.0d0a987ce23408bac15426a22e. (173) 17:40:45.501639 IP 100.64.0.187 > 100.64.0.13: ICMP 100.64.0.187 udp port domain unreachable, length 209 17:40:46.520457 IP 100.64.0.13.38730 > 100.64.0.187: 21842+ TXT? dnscat.7f4e039ce800000000d6eae8eae3bf81fd84d1695f5888aba8dcec06d071.a73b3f0561ca4906d268214f4b70da1bdb50f75739ae0577139096732bf8.0d0a987ce23408bac15426a22e. (173) 17:40:46.520546 IP 100.64.0.187 > 100.64.0.13: ICMP 100.64.0.187 udp port domain unreachable, length 209 


Jelas, ini adalah DNSCAT, alat untuk terowongan DNS. Setelah menentukan alamat IP dalam formulir, klien DNSCAT mencoba membuat koneksi ke sana. Jika ini berhasil, maka server (yaitu, peserta) akan menerima shell pada mesin kompetitif dan mengeluarkan bendera.

Tentu saja, jika kita hanya menaikkan server DNSCAT dan mencoba menerima koneksi, kita akan gagal:

[Drop] [**] [1:4001:1] 'dnscat' string found in DNS response [**]

Tanda tangan IDS dipicu pada jalur dnscat dalam lalu lintas dari server kami - ini dengan jelas dinyatakan dalam pesan. Mengaburkan atau mengenkripsi lalu lintas juga tidak akan berfungsi.

Melihat kode klien, kami menemukan bahwa cek di dalamnya tidak cukup ketat. Artinya, garis dnscat mungkin tidak muncul sama sekali dalam respons! Tetap hanya untuk menghapusnya dari kode atau menggantinya dengan cepat dengan utilitas NetSED. Mengganti segera jauh lebih mudah, tetapi saya masih akan memberikan patch untuk kode server:

 diff -r dnscat2/server/libs/dnser.rb dnscat2_bypass/server/libs/dnser.rb < segments << unpack("a#{len}") > segments << [unpack("a#{len}")[0].upcase] < name.split(/\./).each do |segment| > name.upcase.split(/\./).each do |segment| diff -r dnscat2/server/tunnel_drivers/driver_dns.rb dnscat2_bypass/server/tunnel_drivers/driver_dns.rb < response = (response == "" ? "dnscat" : ("dnscat." + response)) > response = (response == "" ? "dnsCat" : ("dnsCat." + response)) 

Ada lima solusi untuk tugas ini di kompetisi.

100.64.0.14 - POST


Bendera dari kendaraan kontes ini tidak diterima oleh siapa pun.



Kami melihat formulir yang dikenal dengan alamat IP. Seseorang menawarkan kita untuk berpartisipasi dalam menguji malware baru. Di antara inovasinya adalah melewati IDS dengan cara yang tidak diketahui. Untuk bendera, Anda hanya perlu mengirimkannya tajuk HTTP "Server: ng1nx" sebagai tanggapan. Ini akan panas.

Seperti yang diharapkan: kami mendapatkan permintaan GET ke IP kami dan mengirim respons yang diblokir oleh IDS.

[Drop] [**] [1:5002:1] 'ng1nx' Server header found. Malware shall not pass [**]

Ada sebuah petunjuk:

Terkadang, tugas yang terlihat sulit adalah yang paling sederhana. Jika tidak ada yang tampak rentan, mungkin Anda kehilangan sesuatu tepat di bawah hidung Anda?

Sesuatu yang rentan tepat di depan hidung kita adalah IDS. Dari halaman respons, Anda dapat menemukan bahwa kami memiliki Suricata IDS terbuka.



Tautan pertama pada kueri "Suricata IDS Bypass" mengarah ke CVE-2018-6794 . Kerentanan ini memungkinkan untuk memotong inspeksi paket jika komunikasi normal TCP (handshake TCP) dilanggar dan data dikirim sebelum proses selesai. Ini terlihat seperti ini:

 Client -> [SYN] [Seq=0 Ack=0] -> Evil Server # 1/2 Client <- [SYN, ACK] [Seq=0 Ack=1] <- Evil Server # 2/2 Client <- [PSH, ACK] [Seq=1 Ack=1] <- Evil Server # Data here Client <- [FIN, ACK] [Seq=83 Ack=1] <- Evil Server Client -> [ACK] [Seq=1 Ack=84] -> Evil Server # 3/2 Client -> [PSH, ACK] [Seq=1 Ack= 4] -> Evil Server 

Unduh exploit, ubah baris menjadi "ng1nx", matikan paket kernel RST dan jalankan.

Seperti yang telah disebutkan, tidak ada yang menerima bendera dari mesin ini, meskipun beberapa peserta sudah dekat dengan solusi.

Kesimpulan


49 peserta terdaftar dalam kompetisi, 12 melewati setidaknya satu bendera. Sangat menarik bahwa tugas kompetitif dapat memiliki beberapa solusi sekaligus, terutama tugas dengan protokol SMB dan DCERPC. Mungkin Anda punya ide sendiri untuk menyelesaikan beberapa tugas?

Hadiah:

  • Juara 1: @ psih1337
  • Posisi Kedua: @ webr0ck
  • Posisi Ketiga: @empty_jack

Statistik respons tanda tangan:



Terima kasih untuk semua peserta! Tahun depan akan ada lebih banyak lagi tugas dengan tingkat kesulitan yang berbeda.

Diposting oleh Kirill Shipulin, Positive Technologies

Source: https://habr.com/ru/post/id457932/


All Articles