OSED / Exp-301 – Training, Ervaring en Examen
Op 1,2,3 en 4 mei heb ik mijn OSED examen gedaan… en boy-o-boy wat was dat pittig! OSED staat voor “Offensive Security Windows User Mode Exploit Development” waarvan de training bekent staat als “EXP-301”. OSED is een 300 level course wat betekent dat deze onder de hoogst mogelijke moeilijkheidsgraad valt samen met trainingen als OSEP en OSWE. Er is tegenwoordig nog 1 cursus van Offsec welke nog moeilijker is en dat is EXP-401 – Advanced Windows Exploitation (OSEE). OSED is de aanloop training voor OSEE en een basistraining als het gaat over modern exploit development. De hoge moeilijkheidsgraad komt door de hoge mate van kennis die nodig is van onderdelen waar niet iedere pentester dagelijks mee te maken heeft. Zo is een diepgaande kennis nodig van o.a. “memory management”, “Low Level Programming” en “Assembly”. Zoals je zult lezen ben ik over het algemeen zeer positief. Echter heb ik het OSED examen ervaren als een verschrikkelijk lastig examen waarbij out-of-the-box denken een understatement is. In deze post leg ik je uit hoe ik tot mijn conclusie van de training en het examen gekomen ben.
De motivatie om de OSED training te volgens kwam voort uit 2 primaire wensen:
1. Meer kennis verkrijgen m.b.t. reverse engineering en binary exploitation
2. Het behalen van mijn OSCE (Offensive Security Certified Expert) certificering
Omdat ik mijn OSEP en OSWE certificeringen al had was ik al erg dicht bij het behalen van het OSCE certificaat. Voor dit certificaat moet je namelijk alle 3 de expert (level 300) trainingen gedaan hebben. Wat miste was dus mijn OSED certificering.
Kijkende naar de inhoud is deze kennis niet dagelijks toepasbaar in mijn werkveld. Er zijn echter momenten waarbij deze kennis ontzettend waardevol kan zijn en op dat moment, vaak in een korte tijdsspanne wat lastiger te verkrijgen en leren zijn. Denk hierbij aan een red-team engagement waarbij een potentieel kwetsbare binary wellicht de enige mogelijkheid is om “lateral movement” of privilege escalation te bewerkstellen. Of wanneer je een exploit hebt welke niet functioneert en je wilt achterhalen en testen waarom dit is zodat je de exploit kunt tweaken. Dit zijn usecases welke makkelijker zijn met meer reverse-engineering / exploit-development kennis.
De training
De training volgt eenzelfde opzet als alle andere trainingen van Offensive Security. Je koopt de OSED course voor 3 maanden of voor een jaar. Ik heb gekozen voor 3 maanden omdat ik de verwachting had dat het met mijn basiskennis wel goed zat (maar daar heb ik mezelf wel een beetje op verkeken). Wanneer je de training koopt krijg je hiervoor grofweg:
- Studieboek
- Instructie video’s
- Lab omgeving
- 1x een examen
Persoonlijk vind ik de instructie video’s relatief overbodig. Ik leer toch fijner uit een boek dan van een video. De video’s vertellen ook niets nieuws t.o.v. het boek dus mijn advies is “stick tot he book”… maar mocht je bewegende beelden fijner vinden dan is dat uiteraard ook een optie. Het OSED boek is niet zo groot, slechts 600+ pagina’s. Dat is voor een studieboek van Offensive Security niet ontzettend groot. Zeker niet wanneer je weet dat er veel voorbeeldcode in staat en dat “reverse engineering / exploit development” sowieso al een zeer groot onderwerp is. De kwaliteit van het boek is overigens erg goed! Later kom ik nog even terug op de “Try Harder” mentaliteit van Offsec… maar in de basis is het boek gewoon ontzettend goed. Alle stappen worden duidelijk uitgelegd inclusief het “hoe en waarom”. Daarnaast wordt alles geïllustreerd met voorbeelden en kun je alle stappen gemakkelijk zelf volgen.
Helaas kom je er met dit onderwerp niet wanneer je alleen gaat volgen. Je moet doen en begrijpen. Begrijp je niet waarom er iets gebeurt of veranderd… duik erin en zorg dat je het gaat begrijpen! Soms helpt het boek je hier enorm goed bij maar vaak zul je toch even Google of ChatGPT moeten raadplegen. Sowieso is het handig om je vragen aan AI te stellen. Deze geeft vaak net wat gerichter antwoord dan wanneer je zelf alles op Google moet doorlezen. Voor mezelf vond ik het erg fijn om bepaalde opcodes beter te begrijpen. ChatGPT gaf hier perfecte uitleg over.
Verder kent het boek “challenges” en “extra challenges”. De meeste “normale “challenges” kun je relatief gemakkelijk oplossen met de informatie uit het boek en een beetje Googlen. Maar de : Extra Challenges” zijn van een hele andere orde. Deze zijn significant moeilijker en dwingen je om zelf veel research te doen.
Alsof dat nog niet genoeg is krijg je ook nog 3 lab challenges. Deze lab challenges kennen een gemiddelde moeilijkheidsgraad en vereisen zeker ook wat eigen research.
Mijn aanpak is altijd als volgt:
- Lees het boek
- Lees het boek nogmaals, maak je eigen cheatsheets en scripts en doe de challenges
- Focus op de labs
- Probeer de “extra challenges” op te lossen
Bovenstaande aanpak werkt voor mezelf altijd erg goed. Om meer te oefenen zijn er wel wat resources beschikbaar. Ook deze heb ik allemaal gedaan en gedocumenteerd alvorens ik “met een veilig gevoel” aan het examen kon beginnen. Dit zijn prachtige oefen binaries:
- https://github.com/stephenbradshaw/vulnserver
- https://github.com/bmdyy/quote_db
- https://github.com/bmdyy/signatus
- https://github.com/patrickhener/invictus
Maar, wat leer je allemaal tijdens deze training? In essentie ga je aan de slag met “binary exploitation” en globaal bestrijkt dat de volgende zaken:
1. Het kunnen vinden van een buffer overflow (vulnerable functie / fstring etc).
2. Het kunnen uitvoeren van een buffer overflow (stack-based en SEH-based).
3. Het kunnen exploiten van een buffer overflow (direct, via een egghunter, via een ROPChain).
4. Het kunnen bypassen van Data Execution Prevention (DEP) en Address Space Layout Randomization (ASLR).
5. Het kunnen schrijven van Shellcode en het kunnen aanroepen van functies via deze shellcode.
Je gebruikt bij al deze processen 3 primaire applicaties, WinDBG als dynamische debugger, IDA als statische debugger en rp++ om ROP gadgets te achterhalen. Dit alles doe je op x86 Windows binaries.
Hoewel dit allemaal nog niet zo veel is gaat er, zelfs met een relatief mooie basiskennis best veel tijd in zitten. Ik ben begonnen in Januari met deze cursus. Dit was nog niet met de stof uit het boek maar wel met het leren van assembly. Ik wist dat dit een belangrijke pre-requisite was. De cursus zelf ben ik begin februari gestart en mezelf ten doel gesteld om na 3 maanden een examen te plannen. Deze heb ik dus meteen vastgezet voor 1,2 en 3 mei. Het is altijd goed om een stok achter de deur te hebben!
In deze 3 maanden ben ik ongeveer elke week 20 uur bezig geweest met studeren. Denk aan research, challenges, de labs en de extra-mile challenges (welke ik overigens niet allemaal gedaan heb). Ook heb ik diverse andere binaries (waarvan een aantal al eerder vermeld) volledig geexploit als extra oefening. Wat ook hielp was dat ik in deze periode actief ben geweest in de OSED chat zowel voor het vragen als het bieden van hulp. Dit werkte goed en relatief snel. Het is mooi om te zien dat er zoveel enthousiastelingen welwillend zijn om je te helpen en het e.e.a. uit te leggen. Iets wat, naar mijn mening kenmerkend is voor het vak an-sich!
Er zitten dus, excl. voorbereiding zeker tussen de 200 en 250 studie-uren in OSED alvorens het examen om de hoek kwam kijken. Ik was in de veronderstelling helemaal klaar te zijn en binnen 24 uur alle opdrachten gemaakt te hebben. Boy… what was I wrong…
Het Examen
Normaliter begin ik mijn examens graag rond 8:30 zodat je lekker fris aan het examen kunt beginnen. Helaas was dit tijdens de planning niet nodig en begon ik om 13:00 ’s middags. Helemaal niet erg en misschien wel beter. Je bent in de avond nog niet zo afgebrand als wanneer je ’s ochtends begint dus misschien dat ik dit een volgende keer weer op dezelfde manier ga plannen!
Het examen volgt de “bekende stappen”. Je hebt 48 uur voor het examen en daaropvolgend nog 24 uur voor het afmaken en inleveren van je rapportage. Dit betekent dat de deadline voor het inleveren van mijn rapportage dus zaterdagmiddag 13:00 is.
Dikke tip, probeer als zoveel mogelijk informatie en screenshots in je rapportage te verwerken tijdens je examen. Deze tip is op elk Offsec examen van toepassing en zo ook op deze. Het zorgt ervoor dat je niets vergeet en dat je later alleen wat zaken moet aanvullen of re-dirigeren.
Helaas kan ik over het examen niet al te veel spoilen omdat dit tegen de regels van Offsec is. In essentie krijg je een examen-set van 3 opdrachten. Deze opdrachten kunnen variëren van het volledig exploiten van een DEP/ASLR binary tot het schrijven van custom shellcode.
Op woensdagavond legde ik de hand aan mijn eerste exploit, in dit geval een stukje custom shellcode. Ik had dit goed geoefend en was hier dan ook betrekkelijk snel klaar mee. Met een goed gevoel ging ik de nacht in alwaar ik challenge 1 en 3 gestart heb en al wat research had gedaan. Rond 01:30 vond ik het mooi en ging ik met een redelijk gerust gevoel naar bed om een prima nachtje te pakken. Na 5 uurtjes slaap ben ik gaan ontbijten om vervolgens weer verder te gaan. Helaas betekende “verder gaan” ook niet echt “verder komen”.
Ik zou zo graag vertellen waar ik op vastliep… maar ook dat kan ik helaas niet doen. Gedurende de dag maakte ik voor beide challenges kleine vorderingen. Op de momenten dat ik vastzat (lees, al een uur bezig het hetzelfde) ging ik de documentatie op orde maken of even een korte pauze nemen. De vorderingen kwamen echter te langzaam. Uiteindelijk een ropchain gemaakt met de info uit een memory leak om er vervolgens achter te komen dat de doelapplicatie maar 1 adres lekt welke hetzelfde is bij beide endpoints, dus terug naar de ontwikkeltafel om een compleet nieuwe chain te maken. Dit alles koste aardig wat tijd. Ondertussen is het vrijdagochtend 02:30. Lezen wordt lastig en de moeheid en lange focus op de beeldschermen begint zijn tol te eisen. Toch maar proberen wat te slapen. Deze keer 3 uurtjes en weer vroeg zonder ontbijt achter de computer. Aangezien mijn exploit werkte op mijn doelmachine en op andere virtuele machines maar niet op de doelmachine heb ik een supportticket gemaakt om te vragen of alles wel in orde was op de doelmachine. Klaarblijkelijk was dit het geval en heb ik deze machine niet kunnen exploiten. Ik vraag me echt ontzettend af wat ik hierin niet goed gedaan heb? Maar dat zal ik nooit weten vrees ik 😉
Dus dan maar terug naar de andere opdracht waar ik vast zat. Een uur voor tijd had ik een doorbraak… en lukte het me om een exploitscript te schrijven.
Aangezien je 2 van de 3 opdrachten moet halen om te slagen (en een goede rapportage moet inleveren) voelde dit als een enorme overwinning. Ik heb in het laatste half uur nog even gekeken naar het andere exploitscript maar ik heb deze nooit werkend gekregen op de doelmachine.
Nadat de proctoring-sessie was afgesloten ben ik gaan lunchen en door gaan werken aan mijn rapportage. Nadat deze af was en gefinetuned was heb ik ook mijn exploitscripts wat beter gefinetuned zodat ook deze netjes, met de juiste comments ingeleverd kon worden. Rond 19:00 op vrijdagavond heb ik alles ingeleverd en begon het duimendraaien en continue verversen van de e-mail om te kijken of ik al een uitslag had.
Gelukkig kwam de uitslag al vrij snel en wist ik op zaterdagochtend dat ik geslaagd was!!
Als ik terugkijk op het examen dan waren het 2 ontzettend ingewikkelde binaries. Ik vind de “try-harder” mentaliteit normaal wel lekker. Ik zoek graag het e.e.a. uit en vind de wat moeilijkere puzzels vaak erg leuk om op te lossen. Mijn examen binaries voldoen wat mij betreft niet aan een “try harder” standaard maar gaan daar ver buiten. De uiteindelijke oplossing was zwaar out-of-the-box bedacht en komt in de verste verte niet voor in het boek en alle andere challenges welke ik gedurende de voorbereiding gedaan heb. Het vervelende hiervan is ook dat je de binary niet mag downloaden / houden en je dus na het examen dit niet meer kunt oefenen. En hoe oefen je dan? Gelukkig had ik een ingeving welke ik kon laten werken. Maar dit had net zo goed kunnen mislukken. Tot op heden heb ik elk examen van Offsec relatief eerlijk gevonden. Je moet toepassen wat je geoefend hebt met misschien een beetje out-of-the-box denken. Zeker als je alle extra challenges en de labs gedaan hebt zijn de examens prima haalbaar. OSED is hierop een uitzondering en liet me voor het eerst achter met het gevoel van “oneerlijkheid”.
Een gouden tip:
Zoals al gezegd is het lastig om je voor te bereiden op het examen. Voor dit examen zijn alle voorgaande tips van toepassing. Neem voldoende pauzes, neem ook je slaap (deze keer zelf een slecht voorbeeld), eet en drink afdoende en zorg dat je goed voorbereid ben. Doe inderdaad de labs, de eerder genoemde binaries en de extra challenges. Zorg dat je scripts hebt om b.v. gemakkelijk custom shellcode te kunnen schrijven. Zo heb ik als basis het fantastische “shellcoder.py” script gebruikt van Epi052 (https://github.com/epi052/osed-scripts) en hier had ik nog wat eigen functies aan toegevoegd. Zorg ook dat je weet hoe je bepaalde characters in je shellcode kunt omzeilen en hoe je omgaat met het reserveren van geheugen om data in op te slaan.
De allerbelangrijkste gouden tip welke ik echter kan meegeven voor OSED is “zorg dat je je ROP-chaining technieken kent”. Sta zo lang als je kunt stil bij ROP chains. Wat doen ze en wat kun je doen als een bepaalde opcode niet voorhanden is. Wat zijn alternatieven? Hoe kun je b.v. ESP naar een bepaald register verplaatsen (of andersom). En wat als er nu geen enkele opcode is om dit te doen (direct of in meerdere stappen)…? Denk hier over na en oefen dit. Want zelfs dan zijn er mogelijkheden… maar die leer je niet in het boek!
It’s a ROP:
Uiteindelijk heb ik ontzettend veel plezier gehad met OSED. Het trainingsmateriaal was erg goed en ik heb met veel plezier alle challenges gedaan en alle stof tot me genomen. Ik heb weer ontzettend veel geleerd en vond het een super waardevolle investering. Wat me opviel is dat de labs uitblinken in kwaliteit maar niet in kwantiteit. Er zijn op moment van schijven slechts 3 labs om te oefenen. Het enige waar ik helaas niet over te spreken ben is het examen. Ik ben van mening dat Offsec hier echt te veel moeilijkheid bovenop gooit t.o.v. alles dat ze je aanbieden in de training. Try harder is leuk… maar niet op een examen en niet in deze mate. Maar… misschien ligt het ook wel aan mijn eigen kennis? Over het algemeen wordt het OSED examen wel als moeilijkste gezien van de 3 (OSEP OSWE en OSED) examens en nu snap ik ook waarom.
Ik ben ontzettend blij dat ik niet op vrijdagochtend heb opgegeven (geloof me… die gedachte speelde door mijn hoofd) en toch heb doorgezet. Onderstaande bevestiging maakte alles meer dan goed!!
Ik ben ontzettend trots om mijn OSED certificering te hebben behaald maar eerlijk is eerlijk… ik ben nog trotser met de OSCE3 certificering. Want dat was uiteindelijk een van de primaire redenen om aan OSED te beginnen!!
Wat ik nu ga doen weet ik nog niet. Wellicht ooit EXP-401. Maar voor nu ga ik even naast Offsec kijken wat voor moois er allemaal nog meer interessant is om te trainen 😉