JavacDoor, хөрвүүлэх хугацаанд ажилладаг Maven хортой програм хангамж

JavacDoor: Суулгалтын үед биш, харин эмхэтгэх явцад ажилладаг Maven-ийн эд өлгийн зүйл

TL, DR

Maven Central-ийн нэгэн олдворыг нийтэлсэн io.github.davidtimur:c2-lab есөн хувилбарыг илгээсэн бөгөөд үүнээс найм нь банкийг тэмдэглэгээ боловсруулагч зам дээр байрлуулсан аливаа дараагийн төслийг эмхэтгэх явцад алсаас хандах ачааллыг гүйцэтгэсэн. Ямар ч програмын код үүнийг импортлох шаардлагагүй байсан. Ямар ч эх сурвалжийн мөр үүнийг лавлах шаардлагагүй байсан. Суулгах скрипт, суулгасны дараах эквивалент, мөн шалгах хэрэгслүүдэд зориулсан ямар ч төрлийн амьдралын мөчлөгийн дэгээ байгаагүй.

Гүйцэтгэлийн вектор нь jar доторх 46 байттай ганц файл юм: хэрэгжүүлэгч классыг нэрлэдэг Java үйлчилгээ үзүүлэгчийн бүртгэл. javax.annotation.processing.ProcessorJava хөрвүүлэгч нь ийм бүртгэлийг автоматаар илрүүлдэг. Олдсоны дараа, javac Энэ нь классыг хөрвүүлэлтийн ердийн хэсэг болгон эхлүүлж, ажиллуулдаг. Энэ нь ашигтай ачааллын ажиллах хугацааны орчин нь бүтээх машин бөгөөд уг бүтээх машин нь одоо байгаа зүйлээ хийж байна гэсэн үг юм.

Есөн хувилбарын туршид команд болон удирдлагын сувгийг гурван удаа дахин бүтээсэн: операторын өгсөн буцах URL, дараа нь ngrok TCP туннел дээрх урвуу бүрхүүл, дараа нь зам нь хоёр дахин шилжсэн HTTP санал асуулгын суваг. Сүүлийн хувилбарт JVM-ийн анхдагч тохиргоо болгон no-op TLS итгэмжлэгдсэн менежерийг суулгасан, эмхэтгэх хугацаанд ямар ч гэрчилгээг хүлээн авах.

Энэхүү олдвор нь өөрийн POM болон MIT лиценздээ "C2 Lab Payload" гэсэн үгсийг агуулсан байсан. Бидний ажигласан бүх хугацаанд энэ нь Maven Central дээр ажиллаж байсан бөгөөд түүнээс хойш бүхэл бүтэн хамт хасагдсан io.github.davidtimur бүлэг.

Анатоми: Хөрвүүлэгчийг гүйцэтгэх хөдөлгүүр болгон ашиглах нь

Java-ийн тэмдэглэгээ боловсруулах хүрээ нь сангууд нь эмхэтгэх үед код үүсгэх боломжтой байхаар байдаг бөгөөд энэ нь Lombok, Dagger болон ORM болон сериалчлалын хэрэгслүүдийн урт жагсаалтын ард байгаа механизм юм. Процессор нь jar доторх энгийн текст файлаар өөрийгөө зарладаг:

META-INF/services/javax.annotation.processor

Тухайн файлын агуулга нь нөлөөлөлд өртсөн хувилбар бүрд үгчилсэн болон бүрэн гүйцэд байна:

io.github.davidtimur.c2lab.C2Processor

Файл нь md5-ийн 1.0.1-ээс 1.0.8 хүртэлх хувилбаруудад байтаар ижил байна. 7d2a08a5c8869a47eea9fa62487dfbe4. 1.0.0 хувилбарт үүнийг агуулаагүй байна.

үед Ява Ажиллаж байх үед энэ нь эдгээр үйлчилгээний оруулгуудын тэмдэглэгээ-процессорын замыг сканнердаж, олсон зүйлээ ачаалдаг. Хөрвүүлж буй төсөлд процессорыг дурдах, юу ч тэмдэглэх эсвэл юу ч тохируулах шаардлагагүй. Зам дээр байгаа нь хангалттай. Энэ нь JavacDoor-ийг ихэнх хэрэгслүүдийн эргэн тойронд бүтээгдсэн хангамжийн сүлжээний загвараас ялгадаг шинж чанар юм:

ХээTriggerХарагдахуйц
npm суулгах дэгээnpm installscripts.postinstall тунхаглалд
Python импортлох хугацааны ачаалалмодулийн анхны импортэх сурвалж дахь модулийн түвшний мэдэгдэл
JavacDoorjavac аливаа дараагийн төсөл дээрүйлчилгээний бүртгэлийн файлын нэр

Суулгах дэгээ нь манифест дэх мэдэгдэл бөгөөд манифест нь хүн бүрийн хамгийн түрүүнд уншдаг зүйл юм. Импортын үеийн ачаалал дор хаяж уншигдахуйц эх сурвалжид байрладаг. Үйлчилгээний бүртгэл нь аль нь ч биш: энэ нь файлын нэр дээр классын нэр бүхий нэг мөр бөгөөд зан төлөв нь хөрвүүлэгдсэн байткод дотор, санд байрладаг.

Ачааллын анги нь өөрөө бөмбөгдөлтөөр эзэнт гүрний тагнуулын ажлыг гүйцэтгэдэг. Хөрвүүлсэн ангиудын тогтмол сангууд нь дараах зүйлсийг агуулна /bin/sh, би хэн бэ, uname –а, ширхэг Unix зам дээр болон даалгаврын жагсаалт Windows зам дээр, хамтдаа дахин чиглүүлэх алдааны урсгал хүүхдийн процессын алдааны гаралтыг авсан урсгал руу нэгтгэх. Хоёр JSON загвар нь хостоос үр дүнг авч явдаг - бүртгэлийн дохио:

{"host":"%s","os":"%s","user":"%s","dir":"%s"}

хүн амтай хостын нэр тушаал болон os.name, хэрэглэгчийн нэрБолон хэрэглэгчийн.dir системийн шинж чанарууд болон үр дүнгийн буцаан дуудалт:

{"version":"%s","host":"%s","time":"%s","output":"%s"}

Хөрвүүлэгчийн өөрийн гаралтад үлдээсэн явцын тэмдэглэгээ нь ер бусын ил тод байна: [C2] эмхэтгэх хугацааны гүйцэтгэл дууссан, [C2] буцаан дуудлага илгээгдсэн → HTTP , [C2] бүрхүүл холбогдсон .

Есөн хувилбар, гурван C2 үе

Хувилбарууд нь нэг ашигтай ачааллын есөн хувь биш юм. Эдгээр нь давталтын бүртгэл бөгөөд тэдгээрийг дарааллаар нь унших нь хүргэлтийн вектор тогтмол хэвээр байх үед суваг дахин бүтээгдэж байгааг харуулж байна.

ХувилбарынХөрвүүлэх үед автоматаар гүйцэтгэгдэнэсуваг
1.0.0үгүй (үйлчилгээний файл байхгүй)Зөвхөн операторын өгсөн буцаан дуудлагын URL
1.0.1тийм (векторыг танилцуулсан)Операторын өгсөн буцаан дуудлагын URL
1.0.2Тийм ээУрвуу бүрхүүл, ngrok TCP туннель
1.0.3Тийм ээHTTP суваг, /register /cmd /out
1.0.4Тийм ээHTTP суваг, /register /cmd /out
1.0.5Тийм ээHTTP суваг, /бүртгүүлэх /санал асуулга /гарах
1.0.6Тийм ээHTTP суваг, /бүртгүүлэх /санал асуулга /гарах
1.0.7Тийм ээHTTP суваг, /register /cmd
1.0.8Тийм ээHTTP суваг + TLS баталгаажуулалтыг идэвхгүй болгосон

Тэр хүснэгтэд байгаа гурван дэлгэрэнгүй мэдээлэл нь олдворын багцыг хэрхэн уншихыг өөрчилдөг тул тэдгээрийг зурах нь зүйтэй.

Вектор нь 1.0.2 биш, харин 1.0.1 дээр ирдэг. 1.0.0 хувилбар нь ижил тагнуул болон буцаан дуудах логикийг агуулдаг боловч үйлчилгээний файл болон тэмдэглэгээ боловсруулалтын импорт байхгүй; энэ нь зөвхөн ямар нэгэн зүйл дуудсан тохиолдолд л ажилладаг. 1.0.1 хувилбараас үйлчилгээний файл байгаа бөгөөд эмхэтгэсэн классууд импортлогддог. javax.annotation.processing.SupportedSourceVersionХоёр хувилбар болох 1.0.0 болон 1.0.2 хувилбаруудыг харьцуулсан аливаа үнэлгээ нь ямар нэгэн зүйл өөрчлөгдсөн гэж зөв дүгнэж байгаа боловч хаана өөрчлөгдсөнийг буруу тодорхойлж байна.

Урвуу бүрхүүл нь яг нэг хувилбарт байдаг. 1.0.2 хувилбар нь дараахыг агуулна 0.tcp.ngrok[.]io, лог шугам [C2] бүрхүүл нь 0.tcp.ngrok[.]io:19823 руу холбогдсон, интерактив баннер c2-бүрхүүлболон фрэймийн терминатор __ТӨГСГӨЛ__1.0.3-аас хойших хувилбарууд эдгээрийн аль нь ч агуулаагүй бөгөөд HTTPS хост руу хүрдэг. Зөвхөн баталгаажсан хувилбаруудыг нэрлэсэн устгах хүсэлт нь зургаан дараагийн хувилбарт байгаа шууд HTTP сувгийг дурдаагүй байхад үхсэн TCP төгсгөлийн цэгийг дурдсан байх болно.

Эцсийн хувилбар нь тээврийн баталгаажуулалтыг арилгана. 1.0.8 хувилбар нь хэрэгжүүлэгч классыг нэмсэн. javax.net.ssl.X509TrustManager гэрчилгээ шалгах аргууд нь юу ч хийдэггүй, үргэлж үнэн байдаг хост нэрийн баталгаажуулагчаар бүртгэгдсэн setDefaultHostnameVerifier, А Бүх хүнд итгэх хоёуланг нь JVM-ийн анхдагч тохиргоо болгон суулгадаг rutin. Үүний үр дүнд уг хөрвүүлэлтийн үлдсэн хугацаанд JVM нь аливаа хостоос ямар ч гэрчилгээг хүлээн авдаг - зөвхөн ашигтай ачааллын өөрийн урсгалын хувьд төдийгүй, дараа нь бүтээх нь TLS-ээр дамжуулан хийдэг бусад бүх зүйлийн хувьд.

HTTP суваг нь үүнийг ашигладаг зургаан хувилбарын бүгдэд нь ганц хостоор урд нь байрладаг: ширээ дүүрэн хүсэл тэмүүлэлтэй галзуурсан.ngrok-free[.]devХүсэлт бүр толгой хэсгийг агуулдаг. ngrok-алгасах-хөтөчийн-анхааруулга, энэ нь үнэгүй ngrok хонгилууд хөтөчүүдэд үйлчилдэг завсрын хуудсыг дардаг. Замын багцууд хувилбаруудын хооронд шилждэг — /гарах 1.0.7 дээр алга болдог ба /cmd -тай ээлжлэн солигддог /санал асуулга - гэхдээ эзэн хэзээ ч өөрчлөгддөггүй.

Өөрийгөө тусгаарлах нь хэлж өгдөг

1.0.1 хувилбараас хойшхи POM бүр нь артефактын өөрийн бүтээлтийн хувьд хөрвүүлэгчийн аргументыг тохируулдаг:

-proc:байхгүй

Энэ туг нь тэмдэглэгээ боловсруулалтыг идэвхгүй болгодог. Үүний энд үзүүлэх нөлөө нь урьдчилан байнаcise: процессорыг агуулсан төсөл өөрөө хөрвүүлэгдсэн үед процессор ажиллахгүй.

Энэ туг нь ердийн хэрэглээтэй. Тэмдэглэгээний процессорыг илгээдэг төсөл нь bootstrap-ийн үед тухайн процессорыг өөртөө хэрэглэхээс зайлсхийх шаардлагатай байдаг бөгөөд build-tool баримт бичигт яг үүнийг зөвлөж байна. Ганцаараа авч үзвэл энэ нь юу ч батлаагүй.

Гэхдээ процессорын хийдэг зүйлтэй хамт авч үзвэл энэ нь тодорхой тэгш бус байдлыг тодорхойлдог: код нь артефактын эсрэг эмхэтгэдэг хүн бүрийн машин дээр ажилладаг бөгөөд артефактыг бүтээдэг машин дээр биш. Энэ туг нь үйлчилгээний файлыг танилцуулдаг ижил хувилбар болох 1.0.1-д болон түүний дараах хувилбар бүрт гарч ирдэг. "Эмхэтгэх үеийн гүйцэтгэл эхэлдэг хувилбар" болон "эмхэтгэх үеийн гүйцэтгэлийг орон нутагт унтраасан хувилбар"-ын хоорондох хамаарал нь артефактын багц дахь хамгийн ашигтай цорын ганц аналитик дохио бөгөөд энэ нь юу ч задлахгүйгээр энгийн текст POM-д харагддаг.

Бид үр нөлөөг нь анзаараад тэндээ зогсов. Олдворуудад яагаад туг далбааг байрлуулсан талаар юу ч хэлээгүй.

Өөр нэг мета өгөгдлийг дурдах нь зүйтэй бөгөөд голчлон үүнийг устгах хэрэгтэй. POM нь төслийг "C2 Lab Payload" гэж нэрлэж, "C2 лабораторийн ачааллын артефакт" гэж тодорхойлж, MIT-ийн лицензээр олгодог. Энэ төрлийн өөрийгөө шошголох нь заримдаа багц нь судалгааны ажил гэдгийг нотлох баримт болгон санал болгодогcisамьд аюул заналхийлэл гэхээсээ илүүтэй, заримдаа энэ уншилт зөв байдаг - хүрэх боломжтой дэд бүтэцгүй зарлагдсан канарей нь үүнээс өөр объект юм. Энэ нь энд хамаарахгүй. Олон нийтийн санд нийтлэгдсэн, ямар ч хэрэглэгч хүрэх боломжтой, есөн хувилбарын турш гурван удаа дахин бүтээгдсэн гадагш чиглэсэн дэд бүтэцтэй функциональ суулгац нь мета өгөгдөл нь юу гэж нэрлэснээс үл хамааран амьд чадвар юм. POM дахь нэр нь түүний эсрэг эмхэтгэдэг машин дээр юу болж байгааг юу ч өөрчилдөггүй.

Барилгын машинуудын үзүүлэлтүүд

Хэрэв уг бүтээх хост энэ олдворын эсрэг эмхэтгэсэн бол нотолгоо нь дискэн дээрх байнгын суулгацад биш харин бүтээх бүртгэл болон сүлжээний телеметрт байрладаг - ашигтай ачаалал нь хөрвүүлэгч процесс дотор ажиллаж, түүнтэй хамт гардаг.

jar эсвэл орон нутгийн репозиторын кэш дотор

  • META-INF/services/javax.annotation.processing.Processor нэрлэх io.github.davidtimur.c2lab.C2Processor
  • Үйлчилгээний файл md5 7d2a08a5c8869a47eea9fa62487dfbe4
  • Доорх ангиуд io/github/davidtimur/c2lab/: C2Processor, C2Task, Task, мөн 1.0.8 хувилбарт дотоод анги Task$1

Бүтээцийн гаралтад

  • [C2] compile-time execution complete
  • [C2] callback sent → HTTP
  • [C2] callback failed:
  • [C2] shell connected to
  • Интерактив баннер c2-shell; хүрээний төгсгөл __END__

Үйл явцын телеметр

  • javac эцэг эхийн хувьд /bin/sh -c (Unix) эсвэл Windows командын тайлбарлагч
  • Хүүхдийн тушаалууд whoami, uname -a, pwd (Unix) эсвэл tasklist (Windows) нь эмхэтгэх алхамаар эцэг эх болсон

Сүлжээний телеметрийн хувьд

  • Гарах TCP руу 0.tcp.ngrok[.]io:19823 (1.0.2 хувилбар)
  • HTTPS руу tableful-fervor-crazed.ngrok-free[.]dev, замууд /register, /cmd, /poll, /out (1.0.3-аас 1.0.8 хувилбарууд)
  • Хүсэлтийн толгой хэсэг ngrok-skip-browser-warning: true
  • Биеийн тааруулалт хүсэх {"host":...,"os":...,"user":...,"dir":...} or {"version":...,"host":...,"time":...,"output":...}

Тохиргоонд

  • Хүрээлэн буй орчны хувьсагчид CALLBACK, CALLBACK_URL; системийн шинж чанар callback.url

Хэвлэн нийтлэгчийн мета өгөгдөл

  • Group io.github.davidtimur; нийтлэгчийн хаяг davudboi999@gmail[.]comгарын үсэг зурах түлхүүр E520C345EF94423D

1.0.8 хувилбарыг ажиллуулсан угсралт нь нэг нэмэлт шалгалт шаарддаг. Тухайн хувилбар нь JVM-ийн хэмжээнд зөвшөөрөгдсөн итгэмжлэлийн менежерийг анхдагчаар суулгадаг тул дараа нь ижил JVM дээр хийгдсэн аливаа TLS холболт - хамаарлын шийдэл, эд өлгийн зүйл байршуулах, байршуулах алхам - гэрчилгээ баталгаажуулалтгүйгээр үргэлжилсэн. Энэ цонхноос ирсэн урсгалыг баталгаажуулсан гэж үзэж болохгүй.

Эмхэтгэсэн эд өлгийн зүйлс яагаад өөр сканнердах шаардлагатай вэ

JavacDoor нь хоёр нийтлэг таамаглалыг нэг дор няцаадаг тул ашигтай туршилтын тохиолдол бөгөөд аль ч алдаа нь аль нэг үйлдвэрлэгчийн хэрэгсэлд хамаарахгүй.

Эхний таамаглал бол аюултай код өөрийгөө манифестэд зарладаг гэсэн үг юм. Нийлүүлэлтийн сүлжээний хэрэгслүүдийн ихэнх нь амьдралын мөчлөгийн дагуу зохион байгуулагддаг. hooks, учир нь npm болон PyPI-ийн хувьд үйлдэл нь ихэвчлэн тэнд байдаг. JavacDoor нь дэгээгүй. Үүний триггер нь Java интерфэйс нэртэй, контент нь класс нэртэй үйлчилгээний бүртгэлийн файл юм. Үүнийг статик байдлаар барихын тулд та дараахыг боловсруулах хэрэгтэй META-INF/services/javax.annotation.processor гүйцэтгэлийн эхлэлийн цэг болгон, a-тай адил суулгасны дараах скрипт — тэгээд нэрлэсэн классыг байткод руу дагана уу. Экосистемүүд нь энэ хэлбэрийн өөрийн гэсэн автомат илрүүлэлтийн механизмтай бөгөөд багаж хэрэгсэл нь үүнийг нэг болгон тоолсон эсэхээс үл хамааран тус бүр нь оролтын цэг юм.

Хоёр дахь таамаглал бол тэмдэгт мөрүүд нь эх файлуудад байдаг гэсэн үг юм. jar-ийн хувьд төгсгөлийн цэгүүд, бүрхүүлийн командууд, JSON загварууд болон лог тэмдэглэгээнүүд бүгд тогтмол санд байдаг .анги файлууд. Текстийг greps хийдэг хэрэгсэл нь юу ч олдоггүй - мөрүүд нь бүдгэрсэн учраас биш, харин тэдгээр нь текст сканнердсанаар задлан шинжилдэггүй бүтэцлэгдсэн хоёртын саванд байгаа учраас. Энэ бичлэг дэх сүлжээний индикатор бүр тогтмол сангийн задлан шинжилгээс гарсан. Тэдгээрийн нэг нь бүрэн хэлбэртэй https:// URL нь ангийн файл дотор энгийн харагдаж байна; jar-ийн уншигдахуйц контентын текст сканнердсан ч гэсэн үүнийг ил гаргахгүй байна. Энд кодчилол байхгүй, зөвхөн унших контейнер формат байна.

Хоёр цоорхой хоёулаа ижил хэлбэртэй байна: олдворын форматыг тодорхойлсон семантик бүтэцтэй бүтэц гэж үзэхийн оронд файлын уут гэж үзсэн. Залруулга нь тааламжгүй юм - контейнерыг задлан шинжилж, экосистемийн өөрийн автомат илрүүлэлтийн оролтын цэгүүдийг тоолж, тэдгээрийг хөрвүүлсэн код руу оруулна уу. Бүтээх хугацааны векторуудын хувьд гурав дахь шалгалт нь хямд бөгөөд гайхалтай оношлогоотой байдаг: олдвор нь хэрэглэгчдэд юу хийж байгааг өөрийгөө чөлөөлдөг зүйлтэй харьцуулдаг. Хөрвүүлэх хугацааны процессорыг бүртгэж, өөрийн бүтээхдээ хөрвүүлэх хугацааны боловсруулалтыг нэгэн зэрэг идэвхгүй болгодог олдвор нь энгийн текст POM-ийн хоёр мөрөнд өөрийнхөө тухай ямар нэгэн зүйлийг хэлж өгсөн.

Өнөөдөр Maven эд өлгийн зүйлсийг ашиглаж буй багуудын хувьд дараах гурван практик арга хэмжээг авч үзэж байна.

  • Тэмдэглэгээ боловсруулагчийн замыг гүйцэтгэлийн хил хязгаар гэж үз. Тэнд байрласан хамаарлууд нь таны бүтээн байгуулалтад код ажиллуулдаг. Хэрэв бүтээн байгуулалт нь тэмдэглэгээ боловсруулах шаардлагагүй бол, -proc:байхгүй нь энд орон нутагт байсан шигээ хамгаалалтын хувьд ашигтай байдаг; хэрэв хэрэгтэй бол процессорын багцыг эмхэтгэх классын замаас өвлөхийн оронд тодорхой пин хийнэ.
  • Лог хөрвүүлэгчийн дэд процессууд. Бүрхүүл үүсгэдэг эмхэтгэх алхам нь ихэнх төслүүдэд хэвийн бус бөгөөд анхааруулга багатай байдаг.
  • Мета өгөгдлийг гэрчлэл гэж үзэж болохгүй. Багцын нэр эсвэл тайлбар дахь “Лаборатори”, “туршилт”, “ачаалал” болон “PoC” нь хамрах хүрээний хязгаар биш юм. Хүрэх боломж болон зан төлөв нь хязгаарлагдмал.

Олдвор болон түүний бүхэл бүтэн бүлгийг зайлуулав Модон Манай тайлангийн дараа Central; олдворын зам болон бүлгийн зам хоёулаа одоо 404-г буцаадаг бөгөөд Central индекс нь тохирох координат байхгүй гэж мэдээлсэн. Энэ нь энэ олдворыг хаадаг. Энэ нь векторыг хаадаггүй бөгөөд энэ нь Java хөрвүүлэгчийн баримтжуулсан шинж чанар бөгөөд jar нийтэлсэн хүн бүрт боломжтой.

Ашигласан материал

Энэ бичлэгт гадны эх сурвалж дурдаагүй болно. Бүх олдворууд нь Maven Central-аас устгахаас өмнө авсан есөн хэвлэгдсэн савны статик шинжилгээ юм. Эд өлгийн зүйлсээс ямар ч кодыг гүйцэтгээгүй.

sca-tools-програм хангамжийн-бүтцийн-шинжилгээний-хэрэгсэл
Програм хангамжийн эрсдэлээ эрэмбэлэх, засах, аюулгүй болгох
Үнэгүй бүртгэлээ аваарай.
Зээлийн картын шаардлагагүй.

Програм хангамж хөгжүүлэлт болон хүргэлтээ аюулгүй байлгаарай

Xygeni Product Suite-тэй хамт