loader
Foto

A Siemens S7 protokolljának tesztelése a virtuális PLC-n

A Siemens ipari eszközök nagyon elterjedtek az automatizálásban. Szinte minden gyártónak, így a Siemensnek is saját protokollja van. A mostani cikkben pár mondat erejéig kitérünk az "S7" ipari protokoll alapjaira, majd az Ubuntu virtuális gép segítségével előállítunk egy olyan (virtuális) PLC-t, pontosabban egy S7 szervert, amely azt állítja magáról, hogy ő egy Siemens 300-as PLC. A célunk nem az, hogy feltörjük ezt a PLC-t, ezért például a Metasploit használatát nem nézzük meg. A cél az, hogy az OT (ipari) hálózat forgalmában ki tudjuk szűrni, tudjuk vizsgálni ezt az ipari protokollt.

Az S7 (S7 Communication, Wireshark filter: s7comm) a Siemensnek a saját protokollja, amely a Siemens S7-300/400 család programozható logikai vezérlői (PLC-k) között alkalmazható, de ugyanakkor a későbbi PLC-éknél, az S7-1200, S7-1500-as családoknál is használható. Sajnos nagyon kevés (érdemi) információ van az Interneten erről az ipari protokollról, szinte mindent tapasztalat, illetve mérések útján lehet "beszerezni".

Az S7 protokoll (protokollazonosító: 0x32) funkció/parancs alapú, amely azt jelenti, hogy az átvitel általában egy S7 kérésből és egy (ahhoz tartozó) megfelelő válaszból áll. Ezt a protokollt a PLC programozásra, PLC-k közötti adatcserére, SCADA (felügyeleti vezérlő és adatgyűjtő) rendszerek PLC-adatainak elérésére és diagnosztikai célokra használják.

Az S7 kommunikáció (legalább) a következő protokollokból áll:

  1. COTP: ISO 8073 COTP Kapcsolatorientált szállítási protokoll (specifikáció elérhető RFC905 néven).
  2. TPKT: RFC1006 "ISO szállítási szolgáltatások a TCP tetején: 3. verzió", amelyet az RFC2126 frissített.
  3. TCP: A TPKT jellemzően a TCP-t használja szállítási protokollként. A TPKT-forgalom TCP-portja a 102-es.

 

Ahhoz, hogy a PLC-hez kapcsolódni lehessen, három lépés szükséges.

  1. Csatlakozni kell a PLC-hez a 102-es porton.
  2. Csatlakozni kell az ISO rétegen (COTP Connect Request)
  3. Csatlakozni kell az S7Comm rétegen. Ez a lépés nyomon követhető a „s7comm.param.func==0xf0” filter alkalmazásával. Ez a lépés az S7comm protokoll részletek megadására szolgál, például a PDU (Protocol Data Unit) mérete is itt kerül átadásra.

 

A protokoll ID egységesen 0x32, ezt követi az üzenet típusa, amelyet ROSCTR típusnak is neveznek. Az üzenetnek négy típusa lehet:

  1. 0x01: Job request. Ezt küldi a master.
    kep1
    1. ábra   Job request
     
  2. 0x02: Ack. A slave küldi masternek, nincs ekkor adatmező.
    kep
    2. ábra   Slave válasza
     
  3. 0x03: Ack-Data. Nyugtázás, de itt már van adatmező.
    kep
    3. ábra   Nyugtázás a hálózati forgalomban
     
  4. 0x07: Userdata. A paramétermező tartalmazza a kérés/válasz azonosítóját. Ez már az eredeti protokoll kiterjesztése.
    kep
    4. ábra   Userdata
     

Indítsuk el az Ubuntu virtuális gépet (IP: 192.168.1.108), illetve a Kali Linux-ot is. Ezután az Ubuntu virtuális gépen (amely a PLC-t emulálja), indítsuk el a Python-t, és írjuk be a következő sorokat.
A "sudo" a root jog miatt kell, ugyanis a hálózati kártya csak ezzel a jogosultsággal érhető el.

sudo Python3

Importáljuk a "snap7" könyvtárat, amely a Siemens kommunikációs protokolljának implementálásáért felel.

import snap7

Állítsuk be az S7 szervert.

s7s = snap7.server.Server()

Hozzuk létre a szervert.

s7s.create()

Indítsuk el a szervert.

s7s.start()

A "get_status()" függvénnyel lekérdezhető a szerver állapota.

kep
5. ábra   S7 szerver létrehozása és elindítása
 

Futtassunk most a Kali Linux-on egy teljes port scan-t (-p-), hogy vizsgálatra kerüljenek olyan portok is, amelyek nem default-ak az "nmap" port scan-nél. 

sudo nmap -p- 192.168.1.108

A port scan futási eredménye látható a következő ábrán.

kep
6. ábra   A port scan eredménye, látható, hogy a TCP 102-es port nyitott

Látható a port scan eredményén, hogy a TCP 102--es port nyitott állapotban van, ezért érdemes futtatni az "s7-info" nmap script-et.

sudo nmap -p 102 --script=s7-info 192.168.1.108

Ennek a script-nek az alkalmazásával megismerhető a kérdéses IP címen lévő Siemens PLC neve, konkrét típusa, verziószáma, stb. Ezek érzékeny adatok, és a későbbiekben láthatő lesz a Wireshark grafikus felületén az, hogy ezek nem titkosítottak.

kep
7. ábra   Az "s7-info" script futási eredménye, megismerésre került a "PLC" konkrét típusa is

A port scan futása során keletkező hálózati forgalomban keressük meg az S7 kommunikációs protokollt. Ehhez alkalmazzuk a következő filtert a Wireshark-on.

s7comm

A Wireshark grafikus ablakában már csak a kérdéses csomagok láthatók (8.ábra).

kep
8. ábra   A script futása során keletkezett hálózati forgalom (részlet)

Ha most a kapcsolat felépítését szeretnénk megkeresni a hálózati forgalomban, akkor a funkciókód alapján tudunk keresni. A funkciókód értéke 0xf0, ezért a következő filter alkalmazása szükséges.

s7comm.param.func == 0xf0

Látható a 9. ábrán a "Job", illetve az arra adott válasz.

kep
9. ábra   A kapcsolat kiépítése a Kali Linux és a virtuális PLC között

Végül könnyen megtalálhatók a kérdéses érzékeny adatok is, amelyeknek az ismerete megkönnyti az esetleges támadás kivitelezését is.

s7comm

Az érzékeny adatok könnyen megtalálhatók az OT hálózati forgalomban.

kep
10. ábra   Az érzékeny adatok az OT hálózaton, titkosítás nélkül
 

 

 



Egyéb cikkek

További cikkeink ebben a témakörben

Régebbi cikkeink

Az nmap (grafikus megjelenítésnél a ZenMap) használata az IT biztonság, illetve az üzemeltetés területén dolgozó szakembereknél szinte elkerülhetetlen. Az ingyenes szoftver segítségével tesztelhetők a számítógépeink, a számítógéphálózatunk, vizsgálha. . . .

A Python programozási nyelv nagyon elterjedt a fejlesztők körében. Használják beágyazott rendszereknél, webes alkalmazásoknál, IT biztonság különböző területein, stb. Látható, hogy nagyon széles a felhasználási területe ennek a nyelvnek, ideje volt m. . . .

Bemutatjuk most a saját (!) Wifi-s hálózatunk tesztelésének az alapjait. Megnézzük, hogy hogyan lehet biztonságos jelszót választani. Feltörhetetlen rendszer nem létezik, de megismerve a tesztelés folyamatát, válaszokat kaphatunk arra vonatkozólag, h. . . .