This repository contains attacks against the IEC-104 protocol, which is often used in European electrical engineering and power system automation applications. We created Docker containers to help test the attacks, which have all the necessary tools prepared. This README.md
guides you on how to reproduce each attack scenario for yourself. The theoretical background of the attacks is explained in our paper Novel specific attack methods against the IEC 104 protocol
, which is yet to be published.
- Start the containers using
docker-compose build && docker-compose up
- Open 3 terminal and issue the following commands
docker exec -ti iecdocker-client-1 /bin/bash
docker exec -ti iecdocker-server-1 /bin/bash
docker exec -ti iecdocker-attacker-1 /bin/bash
- In the server container start the IEC-104 server using the
./run-scripts/j60870-sample-server
command. - In the client container start the IEC-104 client using the
./run-scripts/j60870-console-client -h server
command. - In your browser open the
http://localhost:5001
and thehttp://localhost:5002
URLs. - In the attacker container use the
./a1_unauthenticated.sh
command to start the attack- In the menu send a point-command using
p
. - Set the
IOA
to1000
and the value to42
.
- In the menu send a point-command using
- Refresh the pages in your browser. As you can see the attacker and the operator are in a race for controlling the station. They will continuously overwrite each-other's commands.
- Start the containers using
docker-compose build && docker-compose up
- Open 3 terminal and issue the following commands
docker exec -ti iecdocker-client-1 /bin/bash
docker exec -ti iecdocker-server-1 /bin/bash
docker exec -ti iecdocker-attacker-1 /bin/bash
- In the server container start the IEC-104 server using the
./run-scripts/j60870-sample-server
command. - In the attacker container use the
python3 a2_starvation.py <server ip>
command. Use thenslookup server
command to get the IP address of the server. - In the client container start the IEC-104 client using the
./run-scripts/j60870-console-client -h server
command. - All the available connections are exhausted, therefore the operator can not connect to the server.
- Start the containers using
docker-compose build && docker-compose up
- Open 3 terminal and issue the following commands
docker exec -ti iecdocker-client-1 /bin/bash
docker exec -ti iecdocker-server-1 /bin/bash
docker exec -ti iecdocker-attacker-1 /bin/bash
- In the server container start the IEC-104 server using the
./run-scripts/j60870-sample-server
command. - In the client container start the IEC-104 client using the
./run-scripts/j60870-console-client -h server
command. - In the attacker container use the
./mitm && python3 a3_tcp_poison.py <client ip> <server ip>
command. Use thenslookup server
command to get the IP address of the server and thenslookup client
to get the IP address of the client. - After the application starts write
stop
to inject an RST packet and terminate the connection of the participants.
- Start the containers using
docker-compose build && docker-compose up
- Open 3 terminal and issue the following commands
docker exec -ti iecdocker-client-1 /bin/bash
docker exec -ti iecdocker-server-1 /bin/bash
docker exec -ti iecdocker-attacker-1 /bin/bash
- In the server container start the IEC-104 server using the
./run-scripts/j60870-sample-server
command. - In the client container start the IEC-104 client using the
./run-scripts/j60870-console-client -h server
command. - In the attacker container use the
./mitm && python3 a4_iec_poison.py <client ip> <server ip>
command. Use thenslookup server
command to get the IP address of the server and thenslookup client
to get the IP address of the client. - After the application starts write
stop
to modify the sequence number of the next IEC packet and terminate the connection of the participants.
- Start the containers using
docker-compose build && docker-compose up
- Open 3 terminal and issue the following commands
docker exec -ti iecdocker-client-1 /bin/bash
docker exec -ti iecdocker-server-1 /bin/bash
docker exec -ti iecdocker-attacker-1 /bin/bash
- In the server container start the IEC-104 server using the
./run-scripts/j60870-sample-server
command. - In the client container start the IEC-104 client using the
./run-scripts/j60870-console-client -h server
command. - In the attacker container use the
./mitm && python3 a5_injection.py <client ip> <server ip>
command. Use thenslookup server
command to get the IP address of the server and thenslookup client
to get the IP address of the client. - After the application starts write
1000:12
command to inject a new packet to to set the value ofIOA 1000
to12
. - In your browser open the
http://localhost:5001
and thehttp://localhost:5002
URLs. - You can see that the server and the client see different values on the station.