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.
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.
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).
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ó.
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.
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).
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.
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.
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,
}
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. . . .
Elkezdjük most részletesebben megismerni az nmap használatát. Az nmap nagyon fontos eszköz az IT biztonsággal, illetve az üzemeltetéssel foglalkozó szakembereknél. De hogyan működik? Hogyan lehet és érdemes a scannelési tulajdonságokat beállítani? M. . . .