Langkau ke kandungan
Semua kupasan
PEMBINAAN SEMULA SELEPAS ACARAWeb

V1T CTF 2026

Duck Nettool Revenge

Bagaimana pengembangan wildcard shell melepasi penapis aksara yang ketat.

Diterbitkan
Kategori
Keselamatan Web

Duck Nettool Revenge membungkus utiliti rangkaian yang biasa digunakan dengan penapis input yang ketat. Penapis itu kelihatan keras: hanya digit, tanda baca, ruang putih, dan satu huruf berguna dibenarkan. Namun, arahan itu masih dijalankan melalui shell, maka peraturan pengembangan shell membekalkan perkataan yang cuba disekat oleh penapis tersebut.

Gabungan yang berbahaya

Tingkah laku terasnya setara dengan:

command = f"ping -c 1 {target}"
output = subprocess.check_output(
    command,
    shell=True,
    stderr=subprocess.STDOUT,
)

target disemak dengan allowlist sebelum diselitkan. Semakan itu tidak menjadikan arahan selamat kerana shell=True memberi makna kepada tanda baca yang masih dibenarkan:

  • ; menamatkan arahan ping yang dimaksudkan lalu memulakan arahan lain;
  • / memisahkan segmen laluan;
  • ? memadankan satu aksara ketika pengembangan nama laluan;
  • ruang memisahkan perkataan yang telah dikembangkan.

Allowlist boleh mengehadkan aksara, tetapi ia tidak mengehadkan tatabahasa shell yang masih boleh dibentuk oleh aksara tersebut.

Menukar wildcard menjadi perkataan

Pembinaan semula menggunakan corak ? dengan panjang segmen yang tepat. Jika hanya satu laluan terpasang sepadan dengan corak itu, shell menggantikan corak tersebut dengan laluan sebenar sebelum pelaksanaan. Maka, secara skematik, payload boleh difahami begini:

benign-address ; globbed-interpreter globbed-file-reader globbed-source

Satu huruf yang dibenarkan sudah cukup untuk membezakan modul pembaca fail pustaka standard daripada nama fail bersebelahan. Panjang segmen dan sistem fail kontena yang kecil menyelesaikan selebihnya. Ketika proses dilancarkan, shell sudah mengembangkan ketiga-tiga ungkapan wildcard menjadi laluan kepada fail boleh laksana serta fail sasaran yang sah.

Inilah perbezaan pentingnya: aplikasi tidak pernah menerima huruf terlarang, tetapi proses anak tetap menerimanya. Pengembangan berlaku selepas pengesahan dan sebelum pelaksanaan.

Mengapa pembaca fail diperlukan

Sebuah pembantu dalam pustaka standard Python boleh menerima nama fail daripada argumennya dan mencetak baris-baris fail tersebut. Memanggil pembantu itu melalui interpreter yang ditemui mengelakkan keperluan menggunakan nama arahan yang ditapis, seperti utiliti paparan fail yang lazim.

Rantaian serangan itu ialah:

  1. hantar alamat yang tidak berbahaya supaya arahan asal bermula dengan sah;
  2. tamatkan arahan itu menggunakan pemisah arahan yang dibenarkan;
  3. kenal pasti interpreter melalui segmen wildcard dengan panjang tetap;
  4. kenal pasti pembaca fail pustaka standard menggunakan wildcard bersama satu huruf yang tersedia;
  5. kenal pasti sumber aplikasi dengan satu lagi corak wildcard yang unik;
  6. biarkan pengembangan shell membina perkataan terlarang dan mencetak sumber tersebut.

Arahan yang telah dikembangkan mencetak sumber aplikasi, lalu mendedahkan jawapan acara yang dibenamkan.

Pengajaran pertahanan

  • Elakkan shell=True bagi input yang dikawal pengguna. Hantar tatasusunan argumen terus kepada API proses.
  • Sahkan nilai semantik, seperti alamat IP atau nama hos, dan bukannya menapis aksara.
  • Jalankan utiliti dengan persekitaran dan paparan sistem fail yang minimum; keunikan laluan menjadikan pengembangan wildcard itu boleh diharap.
  • Jangan letakkan rahsia dalam sumber aplikasi, komen, argumen proses, atau respons ralat.
  • Anggap pengembangan wildcard, pemisah, pengalihan, penggantian arahan, dan pemboleh ubah persekitaran sebagai primitif pelaksanaan kod apabila shell terlibat.

Halaman acara: V1T CTF 2026 di CTFtime.