loader
Foto

Ethernet/IP protokoll tesztelése a virtuális PLC-n

Az Ethernet/IP- t nagyon sok helyen alkalmazzák, az ipari rendszereknél elengedhetetlen. Ezért megnézzük ennek az ipari protokoll vizsgálatának az alapjait is. A korábban létrehozott Ubuntu virtuális gépen elindításra kerül az Ethernet/IP szerver (cpppo), és a Kali Linux operációs rendszeren végzünk különböző vizsgálatokat.

Indítsuk el a Kali Linux és az Ubuntu (IP cím: 192.168.1.108) virtuális gépeket, majd az Ubuntu virtuális gépen a terminálablakban írjuk be a követklező utasítást.

python3 -m cppppo.server.enip -v

Látható az első ábrán, hogy az Ethernet/IP szerver elindul. A "-v" kapcsolóval a "verbose" módot engedélyeztük, azzaz, a különböző műveletek látszani fognak a terminálablakban.

kep
1. ábra   Az EthernetIP szerver elindítása az Ubuntu 22.04-es virtuális gépen
 

A Kali Linux virtuális gép terminálablakában csináljunk egy teljes TCP port scan-t. Az "nmap" defualt portbeállításainál ugyanis nem található meg a 44818-as port, amely az Ethernet/IP default portja, ezért kell alkalmaznunk a "-p-" kapcsolót,

sudo nmap -p- 192.168.1.108

A port scan eredménye látható a 2. ábrán, és itt találjuk meg a nyitott 44818-as portot is.

kep
2. ábra   Full port scan alkalmazása a virtuális gépre
 

Szeretnénk minél több ismeretet szerezni erről a szolgáltatásról, azaz az EthernetIP szerverről. Erre több lehetőségünk is van. Alkalmazhatjuk az "nmap" port scannerhez tartozó script-ek egyikét, de akár egy python utasítással is lekérhetők a keresett adatok.

Először alkalmazzuk az "nmap" egyik script-jét, amelyet az Ethernet/IP szerver tulajdonságainak a lekéréséért felel. Adjuk ki a következő utasítást, hogy megtudjuk, melyik script-et kell alkalmazni.

locate *.nse

Ekkor az összes script megjelenítésre kerül (3. ábra).

kep
3. ábra   Az összes nmap script megjelenítése (részlet)
 

Szűkítsük a keresést, adjuk ki a következő utasítást.

locate *.nse | grep -e enip

Látható a 4. ábrán, hogy az Ethernet/IP vizsgálatához csak az "enip-info.nse" script használható.

kep
4. ábra   Az EthernetIP-vel kapcsolatos nmap script-ek keresése
 

Futtassuk újra a port scan-t úgy, hogy megadjuk az Ethernet/IP portszámát, illetve a használni kívánt script nevét is.

sudo nmap -p 44818 --script=enip-info 192.168.1.108

Ennek a script-nek a hatására megkapjuk a virtuális PLC-n lévő Ethernet/IP szerver főbb adatait.

kep
5. ábra   A virtuális PLC EthernetIP szerverén történ enumeration eredménye
 

A port scan eredménye alapján tudhatjuk, hogy a default beállításnál a gyártó a "Rockwell Automation/Allen-Bradley", és a kérdéses termék egy PLC (Programmable Logic Controller). Honnan ismerte fel ezeket az "enip-info" script? És megváltoztatható-e a konkrét eszköz neve, típusa, sorozatszáma, stb?
Nézzük meg a Kali Linux alatt egy szövegszerkesztő (pl.: leafpad) segítségével az "enip-info.nse" file tartalmát, a 67. sortól a gyártók neveit tartalmazó listát látjuk (részlet).

-- @key vennum Vendor number parsed out of the EtherNet/IP packet
local vendor_id = {
    [0] = "Reserved",
    [1] = "Rockwell Automation/Allen-Bradley",
    [2] = "Namco Controls Corp.",
    [3] = "Honeywell Inc.",
    [4] = "Parker Hannifin Corp. (Veriflo Division)",
    [5] = "Rockwell Automation/Reliance Elec.",
    [6] = "Reserved",
    [7] = "SMC Corporation",
    [8] = "Molex Incorporated",
    [9] = "Western Reserve Controls Corp.",
    [10] = "Advanced Micro Controls Inc. (AMCI)",
    [11] = "ASCO Pneumatic Controls",
    [12] = "Banner Engineering Corp.",

 

Az "enip-info.nse" file 1576. sorától kezdve találjuk meg a különböző eszközök neveit.

-- @key devtype Device ID  number parsed out of the EtherNet/IP packet
local device_type = {
    [0] = "Generic Device (deprecated)",
    [1] = "Control Station (deprecated)",
    [2] = "AC Drive Device",
    [3] = "Motor Overload",
    [4] = "Limit Switch",
    [5] = "Inductive Proximity Switch",
    [6] = "Photoelectric Sensor",
    [7] = "General Purpose Discrete I/O",
    [8] = "Encoder (deprecated)",
    [9] = "Resolver",
    [10] = "General Purpose Analog I/O (deprecated)",
    [12] = "Communications Adapter",
    [13] = "Barcode Scanner (deprecated)",
    [14] = "Programmable Logic Controller",
    [16] = "Position Controller",

 

Az előbbi port scan (5. ábra) hálózati forgalmát is érdemes megnézni. Ehhez célszerű alkalmazni a Wireshark hálózati monitort, a grafikus felületén írjuk be a következő filtert.

enip

A port scan művelet két csomagot generált a hálózati forgalomban (6. ábra).

kep
6. ábra   Enumeration művelet a hálózati forgalomban
 

A második "enip" csomag tartalmazza a kérésre adott választ (Response). Itt találjuk meg a kérdéses szerver adatait. Látható, hogy sem a kérés, illetve a válasz sem titkosított, azaz, az érzékeny adatok könnyen megismerhetők, és akár manipulálhatók is.  

kep
7. ábra   Enumeration művelet eredménye a hálózati forgalomban
 

Az 5. ábrán látható volt a keresett Ethernet/IP szerver adatai. Viszont ezeket az adatokat nem mi adtuk meg, ezek default beállításból ("https://github.com/pjkundert/cpppo/blob/master/cpppo.cfg") származnak. Változtassuk meg ezeket, ehhez szükség van a "cpppo.cfg" file-ra, amelynek a tartalma a következő.

[Identity]
# Generally, strings are not quoted
Vendor ID = 1
Device Type = 14
Product Code Number = 123
Product Revision = 321
Status Word = 0123
Serial Number = 4321
Product Name = Micro820 Controller 2080-LC20-20QWB
State = 255
[TCPIP]
# However, some complex structures require JSON configuration:
Interface Configuration = {
"ip_address": "192.168.1.108",
"network_mask": "255.255.255.0",
"dns_primary": "8.8.8.8",
"dns_secondary": "8.8.4.4",
"domain_name": "industrial.webelektronika.lab"
}
Host Name = controller

 

Hozzuk létre tehát a "cpppo.cfg" file-t a fenti tartalommal, mentsük el, és ezután indítsuk el újra a virtuális PLC-n az Ethernet/IP szolgáltatást, majd a Kali Linux-on újra futtassunk egy port scan-t a kérdéses script-tel együtt.

sudo nmap -p 44818 --script=enip-info 192.168.1.108

A 8. ábrán látható, hogy az Ethernet/IP szerver adatai megváltoztak a "cpppo.cfg" file tartalmának megfelelően.

kep
8. ábra   Újabb enumeration eredmény a port scan művelet után
 

Az enumeration, azaz a kérdéses szolgáltatás minél több tulajdonságának a megismerése nem csak az "nmap" port scan adott script-jének az alkalmazásával érhető el, hanem a "cpppo" könyvtár használatával is.

Telepítsük most a "cpppo" könyvtárat a Kali Linux virtuális gépre (ha még nem tettük volna meg korábban: "pip3 install cpppo"), és ezután adjuk ki a következő utasítást.

python3 -m cpppo.server.enip.list_services -vv -a 192.168.1.108 --list-identity

Ennek az utasításnak a hatására kapjuk a következő eredményt. Most nem alkalmaztuk az "nmap" port scan-t és az adott nmap script-et, hanem a fenti utasítással használatával kaptuk meg az Ethernet/IP szerver adatait.

{
    'peer':                         ('192.168.1.108', 44818),
    'enip.command':                 4,
    'enip.length':                  25,
    'enip.session_handle':          1291510738,
    'enip.status':                  0,
    'enip.sender_context.input':    array( 'B', hexload(r'''
        00000000:  00 00 00 00 00 00 00 00                            |........|
    ''')),
    'enip.options':                 0,
    'enip.input':                   array( 'B', hexload(r'''
        00000000:  01 00 00 01 13 00 01 00  20 00 43 6f 6d 6d 75 6e   |........ .Commun|
        00000010:  69 63 61 74 69 6f 6e 73  00                        |ications.|
    ''')),
    'enip.CIP.list_services.CPF.count': 1,
    'enip.CIP.list_services.CPF.item[0].type_id': 256,
    'enip.CIP.list_services.CPF.item[0].length': 19,
    'enip.CIP.list_services.CPF.item[0].communications_service.version': 1,
    'enip.CIP.list_services.CPF.item[0].communications_service.capability': 32,
    'enip.CIP.list_services.CPF.item[0].communications_service.service_name': 'Communications',
}
{
    'peer':                         ('192.168.1.108', 44818),
    'enip.command':                 99,
    'enip.length':                  75,
    'enip.session_handle':          1291510738,
    'enip.status':                  0,
    'enip.sender_context.input':    array( 'B', hexload(r'''
        00000000:  00 00 00 00 00 00 00 00                            |........|
    ''')),
    'enip.options':                 0,
    'enip.input':                   array( 'B', hexload(r'''
        00000000:  01 00 0c 00 45 00 01 00  00 02 af 12 7f 00 00 01   |....E...........|
        00000010:  00 00 00 00 00 00 00 00  01 00 0e 00 7b 00 41 01   |............{.A.|
        00000020:  7b 00 e1 10 00 00 23 4d  69 63 72 6f 38 32 30 20   |{.....#Micro820 |
        00000030:  43 6f 6e 74 72 6f 6c 6c  65 72 20 32 30 38 30 2d   |Controller 2080-|
        00000040:  4c 43 32 30 2d 32 30 51  57 42 ff                  |LC20-20QWB.|
    ''')),
    'enip.CIP.list_identity.CPF.count': 1,
    'enip.CIP.list_identity.CPF.item[0].type_id': 12,
    'enip.CIP.list_identity.CPF.item[0].length': 69,
    'enip.CIP.list_identity.CPF.item[0].identity_object.version': 1,
    'enip.CIP.list_identity.CPF.item[0].identity_object.sin_family': 2,
    'enip.CIP.list_identity.CPF.item[0].identity_object.sin_port': 44818,
    'enip.CIP.list_identity.CPF.item[0].identity_object.sin_addr': '127.0.0.1',
    'enip.CIP.list_identity.CPF.item[0].identity_object.vendor_id': 1,
    'enip.CIP.list_identity.CPF.item[0].identity_object.device_type': 14,
    'enip.CIP.list_identity.CPF.item[0].identity_object.product_code': 123,
    'enip.CIP.list_identity.CPF.item[0].identity_object.product_revision': 321,
    'enip.CIP.list_identity.CPF.item[0].identity_object.status_word': 123,
    'enip.CIP.list_identity.CPF.item[0].identity_object.serial_number': 4321,
    'enip.CIP.list_identity.CPF.item[0].identity_object.product_name': 'Micro820 Controller 2080-LC20-20QWB',
    'enip.CIP.list_identity.CPF.item[0].identity_object.state': 255,
}

 



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. . . .