Jarm – Detektera C2 infrastruktur
I dagens blogg kommer jag att testa JARM som är ett verktyg för att skanna TLS-signaturer och se hur det kan användas. Men vad är egentligen JARM och hur kan det hjälpa oss i incidenthantering och detektioner?
JARM är ett verktyg för att skanna TLS-signaturer. JARM tillåter oss att exempelvis:
- Gruppera servrar som har samma TLS konfiguration, exempelvis Google, Facebook, etc.
- Identifiera applikationer eller infrastruktur
- Identifiera Command and Control servrar eller annan infrastruktur på internet.
Så hur fungerar egentligen JARM?
JARM skapar sin signatur utifrån TCP-handskakning och hur TLS Client/Server Hello sker.
Detta illustreras i bilden nedan:
Bilden är tagen från: https://www.cloudflare.com/learning/ssl/what-happens-in-a-tls-handshake/
En server med TLS skapar Server Hello paketet beroende av TLS Client Hello samt hur servern är konfigurerad, detta kan bland annat bero på:
- Operativsystem och olika version på dessa
- Bibliotek som används på servern
- Systemspecifika konfigurationer
Alla de olika faktorerna leder till att alla TLS Servrar svarar på sina unika sätt. I och med detta är det osannolikt att servrar i olika organisationer svarar på samma sätt.
JARM skickar 10 TLS Client Hello paket och dessa svar skapar en hash för att skapa en JARM-signatur. En JARM signatur ser ut som följande:
27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d
I och med detta kan olika signaturer tas fram:
Låter intresant men låt oss köra igång
För att installera JARM python eller .sh från salesforce kör:
git clone https://github.com/salesforce/jarm.git
Eller om du föredrar GO:
git clone https://github.com/RumbleDiscovery/jarm-go
$ python3 jarm.py google.com
Domain: google.com
Resolved IP: 216.58.207.206
JARM: 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d
Sedan kan en skanning köras enligt nedan:
Samt för gmail:
python3 jarm.py gmail.com
Domain: gmail.com
Resolved IP: 172.217.20.37
JARM: 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d
Så vad har JARM för användingsområden?
Shodan har implementerat JARM i sina skanningar och en sökning kan ske i shodan för att söka efter jarm-signaturer.
För att söka efter en jarm-signatur används:
ssl.jarm:”signatur”
Finns även en sammanställning på vanliga signaturer på följande sida:
https://beta.shodan.io/search/facet?query=http&facet=ssl.jarm
Hur ska vi då egentligen använda JARM?
För att verktyget ska få ett riktigt värde behöver vi ett use-case. Som vi skrev i inledningen så är det att leta efter C2-kanaler. Som tur är har vi redan en samling av JARM-signaturer för det på https://github.com/cedowens/C2-JARM
C2/RED TEAM TOOL | SSL IMPLEMENTATION TESTED | JARM HASH | LINK TO TOOL |
Mythic | python 3 w/aiohttp 3 | 2ad2ad0002ad2ad00042d42d000000ad9bf51cc3f5a1e29eecb81d0c7b06eb | https://github.com/its-a-feature/Mythic |
Metasploit ssl listener | ruby 2.7.0p0 | 07d14d16d21d21d00042d43d000000aa99ce74e2c6d013c745aa52b5cc042d | https://github.com/rapid7/metasploit-framework |
Metasploit ssl listener | ruby | 07d14d16d21d21d07c42d43d000000f50d155305214cf247147c43c0f1a823 | https://github.com/rapid7/metasploit-framework |
Cobalt Strike | Java 11 | 07d14d16d21d21d07c42d41d00041d24a458a375eef0c576d23a7bab9a9fb1 | https://www.cobaltstrike.com/ |
Merlin | go 1.15.2 linux/amd64 | 29d21b20d29d29d21c41d21b21b41d494e0df9532e75299f15ba73156cee38 | https://github.com/Ne0nd0g/merlin |
Deimos | go 1.15.2 linux/amd64 with github.com/gorilla/websocket package | 00000000000000000041d00000041d9535d5979f591ae8e547c5e5743e5b64 | https://github.com/DeimosC2/DeimosC2 |
MacC2 | python 3.8.6 w/aiohttp 3 | 2ad2ad0002ad2ad22c42d42d000000faabb8fd156aa8b4d8a37853e1063261 | https://github.com/cedowens/MacC2 |
MacC2 | python 3.8.2 w/aiohttp 3 | 2ad2ad0002ad2ad00042d42d000000ad9bf51cc3f5a1e29eecb81d0c7b06eb | https://github.com/cedowens/MacC2 |
MacShellSwift | python 3.8.6 socket | 2ad000000000000000000000000000eeebf944d0b023a00f510f06a29b4f46 | https://github.com/cedowens/MacShellSwift |
MacShell | python 3.8.6 socket | 2ad000000000000000000000000000eeebf944d0b023a00f510f06a29b4f46 | https://github.com/cedowens/MacShellSwift |
Sliver | go 1.15.2 linux/amd64 | 2ad2ad0002ad2ad00041d2ad2ad41da5207249a18099be84ef3c8811adc883 | https://github.com/BishopFox/sliver |
EvilGinx2 | go 1.10.4 linux/amd64 | 20d14d20d21d20d20c20d14d20d20daddf8a68a1444c74b6dbe09910a511e6 | https://github.com/kgretzky/evilginx2 |
Shad0w | python 3.8 flask | 2ad2ad0002ad2ad00042d42d000000ad9bf51cc3f5a1e29eecb81d0c7b06eb | https://github.com/bats3c/shad0w |
Get2 | N/A | 07d19d12d21d21d07c07d19d07d21da5a8ab90bcc6bf8bbc6fbec4bcaa8219 | |
GRAT2 C2 | python3 http.server | 2ad2ad0002ad2ad00042d42d000000ad9bf51cc3f5a1e29eecb81d0c7b06eb | https://github.com/r3nhat/GRAT2 |
Covenant | ASP.net core | 21d14d00000000021c21d14d21d21d1ee8ae98bf3ef941e91529a93ac62b8b | https://github.com/cobbr/Covenant |
SILENTRINITY | ironpython | 2ad2ad0002ad2ad00042d42d000000ad9bf51cc3f5a1e29eecb81d0c7b06eb | https://github.com/byt3bl33d3r/SILENTTRINITY |
PoshC2 | python3 http.server | 2ad2ad0002ad2ad22c42d42d000000faabb8fd156aa8b4d8a37853e1063261 | https://github.com/nettitude/PoshC2 |
Så om vi vill kan vi nu skanna efter EvilGinx2 ett annat verktyg som kan användas för att stjäla access-tokens som Peter visade i förra bloggen. Detta genom att antingen att söka efter signaturen via shodan eller enbart skanna domäner/ip adresser vi vill undersöka. Genom detta skulle vi kunna skapa en lista för att blockera trafik mot servrar med denna signatur eller söka efter dessa domäner/ip-addresser i våra loggar.
Inget verktyg är helt perfekt och det skapas självklart ett antal false positives från JARM, om vi exempelvis söker på Covenant C2 ovan får vi ett antal träffar. Varvid ett antal är false positives, exempelvis har https://emby.media/ samma signatur som Covenant. Detta genom att det är byggt på .net core precis som Covenant, varvid samma jarm-signatur skapas för detta. Samma sak gäller för de flesta av de andra C2-framworken.
En sak som också är bra att tänka på är att om C2 kör bakom en Proxy exempelvis Nginx kommer signaturen komma från Nginx och inte från det som finns bakom proxyn.
Jag vill veta mer?
Det finns ett antal olika användningsområden för JARM som vi visat i denna blogg. Men idag kommer vi inte gå igenom mer än så här. Men om allt går enligt planen kommer en del 2 lanseras i min nästa blogg och då kommer vi djupdyka lite mer i verktyget och använda det för att jaga skurkar och banditer i nätverket.