Quyidagi stsenariyni ko‘rib chiqaylik: assessment jarayonida biz apache2 serveri ochiq bo‘lgan Linux xostini aniqlaymiz. Web server ni enumerate qilgandan so‘ng, TCP 443 port da ishlayotgan CMS Made Simple 2.2.5 versiyasi o‘rnatilganligini aniqlaymiz. Ushbu versiya remote code execution zaifligiga ega bo‘lib, Exploit-DB da public exploit mavjud.

Garchi bu zaiflik post-authentication bo‘lsa ham, enumeration jarayonida boshqa mashinada to‘g‘ri application credentials (admin / HUYfaw763) topdik.

Rejamiz – umumiy public exploit ni bizning target ga moslashtirish, remote code execution ni amalga oshirish va nihoyat serverni boshqarish imkonini beruvchi web shell ni yuklash.

Kodni tekshirar ekanmiz, base_url o‘zgaruvchisini bizning muhitga moslashtirish kerakligini tushunamiz:

base_url = "<http://192.168.1.10/cmsms/admin>"

Ro‘yxat 25 - Asl exploit da belgilangan base_url o‘zgaruvchisi

IP address va protokolni bizning Debian VM target ga moslashtirish uchun HTTPS ga o‘zgartiramiz:

base_url = "<https://192.168.50.120/admin>"

Ro‘yxat 26 - Bizning holatga moslashtirilgan base_url o‘zgaruvchisi

Shuningdek, target veb-saytini ko‘rib chiqayotganda SEC_ERROR_UNKNOWN_ISSUER xatosi bilan duch kelamiz. Bu xato masofadagi xostdagi sertifikatni tasdiqlab bo‘lmasligini ko‘rsatadi. Bu holatni exploit kodida hisobga olishimiz kerak.

Xususan, exploit target bilan aloqa qilish uchun Pythonning requests kutubxonasidan foydalanmoqda. Kod 34, 55 va 80-qatorlarda uchta POST so‘rovini amalga oshiradi:

...
    response  = requests.post(url, data=data, allow_redirects=False)
...
    response = requests.post(url, data=data, files=txt, cookies=cookies)
...
    response = requests.post(url, data=data, cookies=cookies, allow_redirects=False)
...

Ro‘yxat 27 - Asl exploit da belgilangan uchta POST so‘rovi

Bundan tashqari, rasmiy hujjatlar SSL sertifikati verify parametrini "False" ga o‘rnatish orqali e’tiborsiz qoldirilishini ko‘rsatadi:

...
    response  = requests.post(url, data=data, allow_redirects=False, verify=False)
...
    response = requests.post(url, data=data, files=txt, cookies=cookies, verify=False)
...
    response = requests.post(url, data=data, cookies=cookies, allow_redirects=False, verify=False)
...

Ro‘yxat 28 - SSL tasdiqlashni e’tiborsiz qoldirish uchun o‘zgartirilgan POST so‘rovlari

Nihoyat, asl exploit da ishlatilgan credentials ni enumeration jarayonida topilganlarga moslashtirish uchun o‘zgartirishimiz kerak. Bular 15 va 16-qatorlarda username va password o‘zgaruvchilarida belgilangan:

username = "admin"
password = "password"

Ro‘yxat 29 - Asl exploit da belgilangan username va password o‘zgaruvchilari

Bu credentials ni osongina almashtirishimiz mumkin: