Schneider Electric Remote Code Execution (CVE-2023-3001)

Schneider Electric’in IGSS (Intelligent Graphical Scada System) yazilimi, endustriyel otomasyon ve kontrol sistemleri icin kullanilan bir SCADA (Supervisory Control and Data Acquisition) platformudur.

Schneider Electric Dashboard

Ilk once IGSS’nin kendi processine bakiyorum IGSSMaster.exe dnspy ile biraz baktiktan sonra diger modullerine bakiyorum alarm,dashboard,job scheduler,maintenance vs…

IGSS

Dashboard.exe!

Bu exeyi biraz inceledigimde IGSS’nin .DASH adinda proje dosyasini editleme, yeniden olusturma, varolan bir dash dosyasini acma gibi ozellikleri var. Burada dikkat ceken yerler save ve load methodlaridir;

Save Methodu

SAVE

Save methodu neler yapiyor, disardan aldigi name parametresi pathFromName fonksiyonu ile kontrol ediyor, pathFromName fonksiyonu da Path.GetExtension’a soruyor Path.GetExtension’ fonksiyonu mscorlib dllinde System.IO namespace’nin bir fonksiyonudur bu fonksiyonda verdigimiz verinin dosya uzantisini cikartiyor ornek olarak abc.txt => .txt gibi. Tekrar pathFromName’e geri donelim verdigimiz verinin uzantisini kontrol ediyor verilen degerin uzantisi bossa direk .DASH olmaktadir.

string text = this.pathFromName(name);

public string pathFromName(string name)
		{
			string extension = Path.GetExtension(name);
			if (extension == null || extension == string.Empty)
			{
				name += ".DASH";
			}
			return Path.Combine(DashFiles.getDashTempPath(), name);
		}
  1. name parametresini pathFromName fonksiyonuna atiyor.
  2. name parametresi ile verileni File.OpenWrite yardimi ile aciyor.
  3. Serialize ediyor.

SoapFormatter, .NET Framework icerisinde yer alan bir serilestirme aracidir. Bu arac, nesneleri SOAP (Simple Object Access Protocol) formatinda serilestirip yani bir dizi byte donusturup depolamak veya ag uzerinden iletmek icin kullanilir. SoapFormatter, genellikle uzaktan prosedur cagri RPC ve web servisleri ile etkilesimde bulunmak icin kullanilir.

Load Methodu

LOAD

  1. WidgetContainer nesnesini null olarak tanimliyor.
  2. CGetGenFileData sinifindan bir nesne olusturuluyor m_conf.getGenFileDataSource methodu, gerekli ozelliklere gore veri kaynagi sagliyor.
  3. genFileDataSource.getGenFile name parametresinden aldigi .DASH uzantisi eklenerek olusturulan dosya adini temp file yolunu kullanarak dosyayi alir.
  4. Catch icerigini es geciyorum.
  5. name parametresini aliyor save methodundaki gibi kontrol vs.
  6. Eger dosya varsa dosyayi okuyor.
  7. Deserialize ediyor.

Bizim icin en onemli madde 7. maddedir, ozet olarak bir dosyayi aliyor kayit ediyor, duzenliyor, aciyor bunlari yaparken serialize ve deserialize islemi gerceklestiriyor.

Exploit7 Bolumu

SoapFormatter ile cmd.exe /c calc.exe calistiracagimiz gadgeti olusturuyoruz ve sonuc…

CALC