TL; DR
Artefak Maven Central diterbitake minangka io.github.davidtimur:c2-lab ngirim sangang rilis, wolung ing antarane nglakokake payload akses jarak jauh sajrone kompilasi proyek hilir apa wae sing nyelehake jar ing jalur prosesor anotasi. Ora ana kode aplikasi sing kudu ngimpor. Ora ana jalur sumber sing kudu ngrujuk. Ora ana skrip instalasi, ora ana sing padha karo pascainstalasi, lan ora ana pengait siklus urip apa wae sing bisa dipriksa dening tooling.
Vektor eksekusi iku file tunggal 46-byte ing njero toples: registrasi panyedhiya layanan Java sing menehi jeneng kelas sing ngimplementasikake javax.annotation.processing.ProcessorKompiler Java nemokake registrasi kasebut kanthi otomatis. Sawise ditemokake, javac nginstansiasi lan mbukak kelas minangka bagean normal saka kompilasi. Tegese lingkungan runtime payload yaiku mesin build, ing wektu iki mesin build lagi nindakake siji bab sing kudu ditindakake.
Ing sangang rilis, saluran command-and-control dibangun maneh kaping telu: URL callback sing disedhiyakake operator, banjur shell reverse liwat trowongan TCP ngrok, banjur saluran polling HTTP sing jalure ganti kaping pindho maneh. Rilis pungkasan nginstal manajer kepercayaan TLS no-op minangka standar JVM, nampa sertifikat apa wae sajrone kompilasi.
Artefak kasebut nduweni tulisan "C2 Lab Payload" ing POM dhewe lan lisensi MIT. Artefak kasebut wis aktif ing Maven Central sajrone periode pengamatan lan wis dibusak, bebarengan karo kabeh io.github.davidtimur grup.
Anatomi: kompiler minangka mesin eksekusi
Kerangka kerja pangolahan anotasi Java ana supaya pustaka bisa ngasilake kode nalika wektu kompilasi — mekanisme ing mburi Lombok, Dagger, lan dhaptar dawa piranti ORM lan serialisasi. Prosesor ngumumake awake dhewe nganggo file teks biasa ing njero toples:
META-INF/layanan/javax.annotation.processing.Processor
Isi berkas kasebut ing saben rilis sing kena pengaruh, kanthi lengkap lan langsung:
io.github.davidtimur.c2lab.C2Processor
Berkas iki identik karo byte ing rilis 1.0.1 nganti 1.0.8, md5 7d2a08a5c8869a47eea9fa62487dfbe4. Rilis 1.0.0 ora ngemot iku.
Kapan jawac Nalika mlaku, JavacDoor bakal mindhai jalur prosesor-anotasi kanggo entri layanan iki lan mbukak apa sing ditemokake. Ora ana ing proyek sing lagi dikompilasi sing perlu nyebutake prosesor, menehi anotasi apa wae, utawa ngonfigurasi apa wae. Anane ing jalur kasebut wis cukup. Iki minangka properti sing misahake JavacDoor saka pola rantai pasokan sing paling akeh dibangun ing piranti:
| pola | Pemicu | Katon minangka |
|---|---|---|
| npm instal hook | npm install | scripts.postinstall ing manifes |
| Muatan wektu impor Python | impor pisanan saka modul | pernyataan tingkat modul ing sumber |
| JavacDoor | javac ing sembarang proyek hilir | jeneng berkas registrasi layanan |
Hook instalasi kuwi deklarasi ing manifes, lan manifes kuwi bab pisanan sing diwaca wong. Payload wektu impor paling ora ana ing sumber sing bisa diwaca. Registrasi layanan dudu loro-lorone: kuwi jeneng file ditambah siji baris sing menehi jeneng kelas, lan prilaku kasebut ana ing bytecode sing dikompilasi sak direktori adoh.
Kelas payload dhewe nindakake pengintaian host kanthi shelling out. Kumpulan konstanta saka kelas sing dikompilasi ngemot /bin/sh, sopo aku, melu aku, pwd ing jalur Unix lan dhaptar tugas ing jalur Windows, bebarengan karo pangalihanStreamKesalahan kanggo nggabungake output kesalahan proses anak menyang stream sing dijupuk. Rong template JSON nggawa asil saka host — beacon registrasi:
{"host":"%s","os":"%s","user":"%s","dir":"%s"}
penduduk saka hostname prentah lan jeneng.os, jeneng panganggo, Lan panganggo.dir properti sistem, lan asil panggilan balik:
{"version":"%s","host":"%s","time":"%s","output":"%s"}
Tandha kemajuan sing ditinggalake ing output kompiler dhewe pancen ora jelas: [C2] eksekusi wektu kompilasi rampung, [C2] panggilan balik dikirim → HTTP , Cangkang [C2] disambungake menyang .
Sangang rilis, telung generasi C2
Rilis-rilis kasebut dudu sangang salinan saka siji payload. Rilis-rilis kasebut minangka log iterasi, lan maca kanthi urutan nuduhake saluran sing dibangun maneh nalika vektor pangiriman tetep tetep.
| release | Otomatis dieksekusi nalika kompilasi | Saluran |
|---|---|---|
1.0.0 | ora ana (ora ana file layanan) | URL panggilan balik sing diwenehake operator wae |
1.0.1 | ya (vektor dikenalake) | URL panggilan balik sing diwenehake operator |
1.0.2 | ya | Shell terbalik, terowongan TCP ngrok |
1.0.3 | ya | Saluran HTTP, /register /cmd /out |
1.0.4 | ya | Saluran HTTP, /register /cmd /out |
1.0.5 | ya | Saluran HTTP, /register /poll /out |
1.0.6 | ya | Saluran HTTP, /register /poll /out |
1.0.7 | ya | Saluran HTTP, /register /cmd |
1.0.8 | ya | Validasi saluran HTTP + TLS dipateni |
Telung rincian ing tabel kuwi pantes digambarake, amarga saben rincian ngowahi cara maca set artefak kasebut.
Vektor kasebut tekan ing 1.0.1, dudu 1.0.2. Rilis 1.0.0 nggawa logika pengintaian lan panggilan balik sing padha nanging ora duwe file layanan lan ora ana impor pangolahan anotasi; mung mlaku yen ana sing nyeluk. Saka 1.0.1 file layanan ana lan kelas sing dikompilasi diimpor javax.annotation.processing.Versi Sumber sing DidhukungSembarang penilaian sing mbandhingake rong rilis tiket — 1.0.0 lan 1.0.2 — kanthi bener nyimpulake yen ana sing owah, nanging salah ngenali ing endi.
Cangkang mbalikke ana ing persis siji rilis. Rilis 1.0.2 ngemot 0.tcp.ngrok[.]io, baris log [C2] shell disambungake menyang 0.tcp.ngrok[.]io:19823, spanduk interaktif cangkang c2, lan terminator pigura __END__Rilis 1.0.3 lan sateruse ora ngemot kabeh mau lan malah tekan host HTTPS. Panjaluk takedown sing mung menehi jeneng rilis sing ditiket bakal nyebutake titik pungkasan TCP sing mati nalika ninggalake saluran HTTP langsung, sing ana ing enem rilis sabanjure, ora kasebut.
Rilis pungkasan mbusak verifikasi transportasi. Rilis 1.0.8 nambahake kelas sing ngimplementasikake javax.net.ssl.X509TrustManager sing metode pamriksan sertifikat ora nindakake apa-apa, verifikasi jeneng host sing tansah bener sing kadhaptar liwat setDefaultHostnameVerifier, Lan percayaKabeh rutinitas sing nginstal loro-lorone minangka standar JVM. Efeke yaiku kanggo sisa kompilasi kasebut, JVM nampa sertifikat apa wae saka host apa wae — ora mung kanggo lalu lintas payload dhewe, nanging kanggo apa wae sing ditindakake dening build liwat TLS sawise.
Saluran HTTP, ing kabeh enem rilis sing nggunakake, diurus dening siji host: tableful-fervor-crazed.ngrok-free[.]devSaben panjalukan nggawa header peringatan-browser-ngrok-skip, sing nyegah kaca interstisial sing dilayani trowongan ngrok gratis kanggo browser. Set jalur owah ing antarane rilis — /metu ilang ing 1.0.7, lan /cmd gantian karo /polling — nanging sing dadi tuan rumah ora tau owah.
Crita babagan pangecualian diri
Saben POM saka 1.0.1 lan sabanjure nyetel argumen kompiler kanggo bangunan artefak dhewe:
-proc:ora ana
Tandha kasebut mateni pangolahan anotasi. Efek ing kene wis ana sadurungecise: nalika proyèk sing ngemot prosesor kasebut dikompilasi, prosesor kasebut ora mlaku.
Flag iki nduweni kegunaan sing lumrah banget. Proyek sing ngirim prosesor anotasi asring kudu ngindhari aplikasi prosesor kasebut marang awake dhewe sajrone bootstrap, lan dokumentasi build-tool nyaranake persis iki. Yen dideleng dhewe, ora ana bukti apa-apa.
Digabungake karo apa sing ditindakake prosesor, nanging, iki nggambarake asimetri tartamtu: kode kasebut dieksekusi ing mesin saben wong sing ngompilasi nglawan artefak, lan dudu ing mesin sing nggawe artefak kasebut. Tandha kasebut katon ing rilis sing padha sing ngenalake file layanan — 1.0.1 — lan ing saben rilis sawise. Korelasi antarane "rilis ing ngendi eksekusi wektu kompilasi diwiwiti" lan "rilis ing ngendi eksekusi wektu kompilasi dipateni sacara lokal" minangka sinyal analitik sing paling migunani ing set artefak, lan katon ing POM teks biasa tanpa dekompilasi apa-apa.
Kita nyathet efek kasebut lan mandheg ing kono. Ora ana ing artefak sing nerangake kenapa gendera kasebut dipasang.
Ana metadata liyané sing pantes disebutaké, akèh-akèhé kanggo mbuwang. POM ngarani proyèk iki "C2 Lab Payload", njlèntrèhaké minangka "artefak payload lab C2", lan lisènsikaké MIT. Pelabelan dhéwé kaya iki kadhangkala ditawakaké minangka bukti yèn paket minangka latihan riset.cistinimbang ancaman langsung, lan kadhangkala macaan kasebut bener — kenari sing diumumake tanpa infrastruktur sing bisa dijangkau minangka obyek sing beda karo sing iki. Iki ora ditrapake ing kene. Implan fungsional sing diterbitake menyang repositori umum, sing bisa dijangkau dening konsumen apa wae, kanthi infrastruktur metu sing dibangun maneh kaping telu ing sangang rilis, minangka kemampuan langsung preduli saka apa sing diarani metadata. Jeneng ing POM ora ngganti apa-apa babagan apa sing kedadeyan ing mesin sing ngompilasi nglawan.
Indikator kanggo mbangun mesin
Yen host build dikompilasi nglawan artefak iki, bukti kasebut ana ing log build lan telemetri jaringan tinimbang ing implan persisten ing disk — payload mlaku ing njero proses kompiler lan metu karo iku.
Ing jar utawa cache repositori lokal
META-INF/services/javax.annotation.processing.Processorjenengio.github.davidtimur.c2lab.C2Processor- Berkas layanan md5
7d2a08a5c8869a47eea9fa62487dfbe4 - Kelas miturut
io/github/davidtimur/c2lab/:C2Processor,C2Task,Task, lan ing 1.0.8 kelas njeroTask$1
Ing output bangunan
[C2] compile-time execution complete[C2] callback sent → HTTP[C2] callback failed:[C2] shell connected to- Spanduk interaktif
c2-shell; penghenti rangka__END__
Telemetri sajrone proses
javacminangka wong tuwa saka/bin/sh -c(Unix) utawa penerjemah printah Windows- Perintah bocah
whoami,uname -a,pwd(Unix) utawatasklist(Windows) dikurung dening langkah kompilasi
Ing telemetri jaringan
- TCP metu menyang
0.tcp.ngrok[.]io:19823(rilis 1.0.2) - HTTPS menyang
tableful-fervor-crazed.ngrok-free[.]dev, dalan-dalan/register,/cmd,/poll,/out(rilis 1.0.3 nganti 1.0.8) - Panjaluk judhul
ngrok-skip-browser-warning: true - Panjaluk cocoging badan
{"host":...,"os":...,"user":...,"dir":...}or{"version":...,"host":...,"time":...,"output":...}
Ing konfigurasi
- Variabel lingkungan
CALLBACK,CALLBACK_URL; properti sistemcallback.url
Metadata penerbit
- Group
io.github.davidtimur; alamat penerbitdavudboi999@gmail[.]com; kunci penandatangananE520C345EF94423D
Build sing mbukak rilis 1.0.8 mbutuhake siji pamriksan tambahan. Amarga rilis kasebut nginstal manajer kepercayaan permisif minangka standar JVM-wide, sambungan TLS apa wae sing digawe mengko ing JVM sing padha — resolusi dependensi, unggahan artefak, langkah penyebaran — bakal diterusake tanpa validasi sertifikat. Lalu lintas saka jendela kasebut ora kudu dianggep diautentikasi.
Apa sebabe artefak sing dikompilasi butuh pemindaian sing beda-beda
JavacDoor minangka kasus uji coba sing migunani amarga bisa ngalahake rong asumsi umum sekaligus, lan ora ana kegagalan sing spesifik kanggo piranti vendor apa wae.
Asumsi pisanan yaiku kode mbebayani ngumumake awake dhewe ing manifes. Akèh piranti rantai pasokan diatur miturut siklus urip hooks, amarga kanggo npm lan PyPI biasane ana ing kono tumindake. JavacDoor ora duwe pengait. Pemicune yaiku file registrasi layanan sing jenenge antarmuka Java lan isine minangka jeneng kelas. Kanggo nyekel kanthi statis, sampeyan kudu ngolah META-INF/layanan/javax.annotation.processing.Processor minangka titik mlebu eksekusi dhewe, padha karo sawise instalasi skrip — banjur tindakake kelas sing dijenengi menyang bytecode. Ekosistem duwe mekanisme panemuan otomatis dhewe-dhewe kanthi bentuk iki, lan saben minangka titik mlebu preduli tooling nyathet minangka siji utawa ora.
Asumsi kapindho yaiku string manggon ing file sumber. Kanggo jar, titik pungkasan, printah shell, cithakan JSON, lan penanda log kabeh ana ing kolam konstan saka .kelas file. Piranti sing njupuk teks ora nemokake apa-apa — ora amarga string kasebut dikaburkan, nanging amarga ana ing wadhah binar terstruktur sing ora bisa diurai dening pindai teks. Saben indikator jaringan ing kiriman iki metu saka parsing kolam konstan. Salah sijine yaiku sing wis kabentuk kanthi lengkap https:// URL katon cetha ing njero file kelas; pindai teks saka isi toples sing bisa diwaca tetep ora bisa muncul. Ora ana encoding sing bisa dikalahake ing kene, mung format wadhah sing bisa diwaca.
Kaloro celah kasebut nduweni wujud sing padha: format artefak dianggep minangka tas file tinimbang minangka struktur kanthi semantik sing wis ditemtokake. Koreksi kasebut ora apik banget - parsing wadhah, enumerasi titik entri panemuan otomatis ekosistem dhewe, lan tindakake menyang kode sing dikompilasi. Kanggo vektor wektu mbangun khusus, pamriksan katelu murah lan nggumunake diagnostik: bandhingake apa sing ditindakake artefak marang konsumen karo apa sing dibebasake dhewe. Artefak sing ndhaftar prosesor wektu kompilasi lan bebarengan mateni proses wektu kompilasi kanggo mbangun dhewe wis ngandhani sampeyan babagan awake dhewe ing rong baris POM teks biasa.
Kanggo tim sing nggunakake artefak Maven saiki, ana telung langkah praktis sing kudu ditindakake:
- Anggep jalur annotation-processor minangka wates eksekusi. Dependensi sing ana ing kono bakal mbukak kode ing build sampeyan. Yen build ora mbutuhake pangolahan anotasi, -proc:ora ana iku migunani banget sacara defensif kaya sing katon sacara lokal ing kene; yen iya, pin set prosesor kanthi eksplisit tinimbang warisan saka classpath kompilasi.
- Subproses kompiler log. Langkah kompilasi sing ngasilake shell iku ora lumrah ing umume proyek lan gampang dielingake.
- Aja nganggep metadata minangka testimoni. "Lab", "test", "payload", lan "PoC" ing jeneng utawa katrangan paket dudu watesan ruang lingkup. Reachability lan prilaku kalebu watesan kasebut.
Artefak lan kabeh klompoke dicopot saka Maven Central ngetutake laporan kita; jalur artefak lan jalur grup saiki ngasilake 404, lan indeks Central ora nglaporake koordinat sing cocog. Iku nutup artefak iki. Iku ora nutup vektor, sing minangka fitur sing didokumentasikake saka kompiler Java lan kasedhiya kanggo sapa wae sing nerbitake toples.
Cathetan Suku
Kiriman iki ora nyebutake sumber eksternal. Kabeh temuan minangka analisis statis langsung saka sangang toples sing diterbitake, dijupuk saka Maven Central sadurunge dibusak. Ora ana kode saka artefak sing dieksekusi ing titik apa wae.







