{"id":15483717,"url":"https://github.com/thesp0nge/hackinbosafeedition","last_synced_at":"2025-03-15T02:24:38.096Z","repository":{"id":137434326,"uuid":"265848942","full_name":"thesp0nge/HackInBoSafeEdition","owner":"thesp0nge","description":"Materiale per il talk ad HackInBo - 2020","archived":false,"fork":false,"pushed_at":"2020-05-30T15:20:28.000Z","size":1121,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-21T18:17:08.675Z","etag":null,"topics":["asm","asm86","hackinbo","hackinbosafeedition","shellcoding","talk"],"latest_commit_sha":null,"homepage":null,"language":"Assembly","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thesp0nge.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-05-21T12:57:56.000Z","updated_at":"2020-06-18T13:21:35.000Z","dependencies_parsed_at":"2023-07-21T08:00:53.270Z","dependency_job_id":null,"html_url":"https://github.com/thesp0nge/HackInBoSafeEdition","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesp0nge%2FHackInBoSafeEdition","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesp0nge%2FHackInBoSafeEdition/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesp0nge%2FHackInBoSafeEdition/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesp0nge%2FHackInBoSafeEdition/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thesp0nge","download_url":"https://codeload.github.com/thesp0nge/HackInBoSafeEdition/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243673238,"owners_count":20328907,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asm","asm86","hackinbo","hackinbosafeedition","shellcoding","talk"],"created_at":"2024-10-02T05:20:30.788Z","updated_at":"2025-03-15T02:24:38.067Z","avatar_url":"https://github.com/thesp0nge.png","language":"Assembly","funding_links":[],"categories":[],"sub_categories":[],"readme":"# x86 shellcoding cakestar\n\n## Introduzione\n\nQuando facciamo un penetration test, il più delle volte utilizziamo exploit già\npronti o usiamo strumenti come msvfenom per creare un payload con qualche\nopzione particolare.\n\nEsistono situazioni dove hai bisogno di essere più creativo: devi evitare\nl'antivirus, devi nasconderti dall'IDS o semplicemente vuoi divertirti un po'\ned avere il pieno controllo del codice che sarà eseguito sulla macchina.\n\nEcco, in questo talk vedremo come fare evolvere uno shellcode in ambiente Linux\nx86 aggiungendo riscrittura nel nostro codice e creando un encoder custom.\n\nIl bypass dell'antivirus forse non sarà garantito, ma il divertimento... quello\nsì.\n\n## Slide\n\nLe slide sono disponibili [qui](https://docs.google.com/presentation/d/1IbfUypkz_y0By-lPAp0EZFMTUz8DsI6-G2jQcqt6wKU)\n\n## A chi è rivolto?\n\n* Penetration tester \n* Analisti SOC \n* Sviluppatori\n\n## Livello di difficoltà\n\nBASSO\n\n## Skill richieste\n\n* Conoscenze base di assembler x86\n* Sapere cos'è una _system call_\n* Un pizzico di python o ruby o il linguaggio che più vi piace a cui accodare\n  il nostro shellcode.\n\n## Cosa mi serve\n\n* Una macchina virtuale Linux per lo sviluppo (scriveremo assembler per x86, quindi a 32 bit).\n  * Ubuntu 20.04\n  * apt install apt install python3 gcc-multilib nasm gdb\n  * peda: https://github.com/longld/peda\n  * clonate l'archivio https://github.com/thesp0nge/HackInBoSafeEdition\n  * Disabilito ASLR \"echo 0 \u003e /proc/sys/kernel/randomize_va_space\"\n\n## Preparo la vittima\n\nHo bisogno di compilare il programma vittima per iniziare le esercitazioni.\n\n``` sh\n$ cd victim\n$ ./compile.sh pwnme.c\n$ sudo \"chown root:root pwnme\"\n$ sudo \"chmod +s pwnme\"\n```\n\n## L'inizio della nostra storia\n\nDa una analisi precedente sappiamo che il software pwnme è vulnerabile a buffer\noverflow. Il contenuto del file pwnme.txt, necessario al funzionamento del\nnostro tool, vieme copiato in una variabile, purtroppo senza fare un controllo\nsulla lunghezza dei dati letti da file.\n\nNel caso il file di testo sia costituito da troppi caratteri, dopo 84 byte\navremmo la sovrascittura del registro EIP e di fatto, l'inizio della nostra\nstoria.\n\nIl PoC del nostro exploit sarà questo:\n``` python\n#!/usr/bin/env python3\n\nimport os;\n\neip=\"BBBB\"\nshellcode = \"A\"*84+eip+\"C\"*200\nf = open(\"pwnme.txt\",\"w\")\nf.write(shellcode)\nf.close()\n```\n\nAbbiamo provato con metasploit a generare un payload con il comando:\n\n```sh\n$ msfvenom -p linux/x86/exec CMD=/bin/sh -f elf -o a.out\n```\n\nPurtroppo veniamo individuati da alcuni antivirus, quindi dobbiamo trovare un\naltro modo per scrivere il nostro shellcode.\n\n![Il payload di msfvenom su VirusTotal](/images/msfvenom.png)\n\n### Disclaimer\n\nQuesto talk non è su come trovare un buffer overflow ma su come customizzare il\nnostro shellcode. Il programma vulnerabile quindi è stato scritto introducendo\nla vulnerabilità in maniera forzata, in particolare:\n\n* è stato aggiunto dell'inline assembler per mettere a disposizione\n  l'istruzione JMP ESP\n* avendo disattivato la randomizzazione dello stack, ho il nuovo valore del\n  registro EIP sempre fisso\n\nQueste tecniche possono ingannare strumenti basati su signature. Strumenti\nevoluti che provano ad eseguire il codice in sandbox potrebbero comunque\nriconoscere i nostri payload. Un security engineer che troverà il payload e ne\nfarà il reverse sarà comunque in grado di riconoscerne il contenuto malevolo.\n\n## Shellcode\n\nAndremo ad analizzare lo shellcode che esegue \"/bin/sh\" e queste saranno le tappe del nostro viaggio:\n* v1.0: da dove arriva\n   \"\\x31\\xc0\\x50\\x68\\x2f\\x2f\\x73\\x68\\x68\\x2f\\x62\\x69\\x6e\\x89\\xe3\\x31\\xc9\\x31\\xd2\\xb0\\x0b\\xcd\\x80\"?\n   (https://www.virustotal.com/gui/file/d2b927c46e08ddb7f4d8471247e7008f7200ca24962094d343248e9a7a0fe870/detection)\n* v2.0: manovre evasive! (https://www.virustotal.com/gui/file/93f5fc907caa0a5e00e320b59a13059e28c243f13c75ef5c5309eff23dfe15be/detection)\n* v2.1: diamoci dei privilegi (https://www.virustotal.com/gui/file/1596d2642b5656ee0e8cf137c097a308329d3cbdcb238c921a605e0b148b9959/detection)\n* v2.5: togliamo i null byte (https://www.virustotal.com/gui/file/d98b0c36e6dacd22f4f5b1192b7d630221346fb5b2a177eaa00dc1a944aa232f/detection)\n* v3.0: torniamo all'alfabeto\n  + prendo il mio shellcode e lo scrivo con un set ristretto di operazioni\n  + allineo il mio shellcode in modo che sia composto da un numero intero di\n    parole a 32 bit. Nel caso appendo tanti \\x90 alla bisogna.\n  + per impostare un registro a 0 posso scegliere un numero a 32 bit a caso,\n    calcolarne il NOT e poi fare l'AND tra il registro e questi due valori.\n    Come risultato avremmo che il registro sarà sempre a 0 qualsiasi sia il suo\n    valore iniziale.\n  * per scrivere una parola da 32bit, la scriverò come somma di 2 interi che ho\n    \"estratto\" a caso\n  * ogni volta mi sottrarrò 4 a EBX che sarà il mio puntatore all'inizio dello\n    shellcode.\n  * JMP EBX alla fine ed inizierà il mio shellcode che ho decodificato\n    direttamente nello stack\n\n  \u003e L'ispirazione per questo shellcode è presa da [questo articolo su\n  \u003e Phrack](http://phrack.org/issues/57/15.html#article) e da [questo\n  \u003e talk](https://www.youtube.com/watch?v=gHISpAZiAm0) di Mati Aharoni tenuto a\n  \u003e Defcon16\n* v4.0: nascondino (bonus tip: il mistero del segfault solitario) (https://www.virustotal.com/gui/file/9de443e65e82833c66910bbdee23b1bfea7635adcb5c8cc5a6d7cccd04d47a22/detection)\n  + uso un loop di XOR dove decodifico lo shellcode con la chiave 0xdeadbeef\n    usata per offuscare il codice\n  + faccio uno swap tra la prima e la seconda metà di ogni word\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthesp0nge%2Fhackinbosafeedition","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthesp0nge%2Fhackinbosafeedition","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthesp0nge%2Fhackinbosafeedition/lists"}